Dies ist ein VIM -Skriptport von 8cc, der auf ELVM basiert. Mit anderen Worten, dies ist ein vollständiger C -Compiler, der in VIM -Skript geschrieben wurde.
8cc ist ein schön geschriebener kleiner C-Compiler für x86_64 Linux. Es ist C11-bewusst und selbst veranstaltet.
ELVM ist ein so l ang v irtual m achine. ELVM rettzargetiert 8cc, um eine eigene Zwischendarstellung, EIR, zu emittieren. ELVM kompiliert C -Code in EIR mit dem Retargeted 8cc als Frontend. Und übersetzt EIR dann in verschiedene Ziele (Python, Ruby, C, Brainfxxk, Piet, Befunge, EMACS Lisp, ...) im Backend. Die Architektur ähnelt LLVM. Diese Präsentation ist ein gutes Zeug, um die ELVM -Architektur weiter zu kennen (wenn auch auf Japanisch).
ELVM kann sich zu verschiedenen Zielen kompilieren. Also habe ich ein neues Backend "VIM Skript" hinzugefügt und es verwendet, um C -Code von 8cc in Vim -Skript zu übersetzen.
Jetzt ist 8cc.vim in reinem Vim -Skript geschrieben. 8cc.vim besteht aus Frontend (angepasst 8cc) und Backend (ELC). Es kann C -Code in VIM -Skript kompilieren. Und natürlich kann Vim den generierten VIM -Skriptcode bewerten.
Beachten Sie, dass dies ein Spielzeugprojekt ist. 8cc.vim ist viel langsamer. Es dauert 824 (Frontend: 430 + Backend: 396) Sekunden, um das einfachste putchar() -Programm auf MacBook Pro Anfang 2015 (2,7 GHz Intel Core i5) zu kompilieren. Aber eigentlich funktioniert es!
Da VM auf VIM -Skript ausgeführt wird, arbeitet 8cc.vim unter Linux, OS X und (hoffentlich) Windows.
Bitte klonen Sie dieses Repository und :packadd (siehe :help pack-add ).
Oder verwenden Sie Ihren bevorzugten Plugin-Manager (vim-plug, dein.vim usw.).
:EccCompile:EccRuneightcc#compile()eightcc#run()Bereiten Sie Ihren C -Code im aktuellen Puffer vor. Im Folgenden finden Sie ein Beispiel für die Hello World.
int putchar ( int x );
int main () {
const char * p = "Hello, world!n" ;
for (; * p ; p ++ )
putchar ( * p );
return 0 ;
} Dann führen Sie aus :EccCompile -Befehl. Beachten Sie, dass Sie dafür mehrere Optionen wie --verbose verwenden können. Bitte siehe :EccCompile --help für weitere Details.
Es dauert lange 20 Minuten oder länger. Lassen Sie uns eine Pause einlegen und etwas holen.
Als Ergebnis wird neuer Puffer mit VIM -Skriptcode geöffnet, der aus C -Code zusammengestellt wurde. Laden Sie es nach :w putchar.vim und :source putchar.vim .
Führen Sie schließlich den folgenden VIM -Skriptcode von Ihrer Hand aus. Der kompilierte Code wird auf VM auf VIM -Skript ausgeführt. Die Funktion SetupVM() erstellt eine VM -Instanz.
:let vm = SetupVM()
:call vm.run()
Wenn Sie nur das Ergebnis des Ausführens von VIM -Skript sehen möchten, können Sie :EccRun zum Überspringen des Vorgangs verwenden.
Entsprechend :EccCompile und :EccRun können Sie eightcc#compile() und eightcc#run() -Funktionen verwenden. Sie können ein Wörterbuch für Ausführungsoptionen einnehmen.
MIT -Lizenz
Copyright (C) 2016 Rhysd
Die Erlaubnis wird hiermit einer Person, die eine Kopie dieser Software und zugehörigen Dokumentationsdateien (der "Software") erhält, kostenlos erteilt, um die Software ohne Einschränkung zu behandeln, einschließlich ohne Einschränkung der Rechte, zu verwenden, zu kopieren, zu modifizieren, zusammenzufassen, zu veröffentlichen, zu veröffentlichen, zu verteilen, zu verteilt, und/oder Kopien der Software zu ermöglichen, um Personen zu beanstanden, an denen die Software zugänglich ist, um die folgenden Bedingungen zu beantragen.
Die oben genannte Copyright -Mitteilung und diese Erlaubnisbekanntmachung müssen in alle Kopien oder wesentlichen Teile der Software enthalten sein.
Die Software wird "wie es ist" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf die Gewährleistung der Handelsfähigkeit, die Eignung für einen bestimmten Zweck und die Nichtverletzung. In keinem Fall sind die Autoren oder Urheberrechtsinhaber für Ansprüche, Schäden oder andere Haftungen haftbar, sei es in einer Vertragsklage, unerbittlich oder auf andere Weise, die sich aus oder im Zusammenhang mit der Software oder anderen Geschäften in der Software ergeben.