Ich habe mir eine Herausforderung gestellt: in 10 Stunden einen selbsthostenden C-Compiler schreiben. Das ist das Ergebnis, plus jede Menge Aufräumarbeiten (siehe „Releases“ für die 10-Stunden-Version).
Durchführung:
Sprache:
if
, while
, do``while
, return
.=
, ?:
(ternär), ||
, &&
, ==
, !=
, <
, >=
, +
, -
, *
, ++
, --
(Post-Ops), !
, -
(unär), []
, ()
true
und false
Literale. String-Literale mit automatischer Verkettung. Die allgemeine Philosophie war: Fügen Sie eine Funktion nur dann ein, wenn sie die Gesamtcodegröße verringert. Im insane
wird dies auf die Spitze getrieben.
git clone http://github.com/Fedjmike/mini-c
cd mini-c
make selftest
Dadurch wird zunächst cc
erzeugt, indem mini-c mit GCC kompiliert wird. Dann erstellt es ccself
, indem es mini-c mit cc
kompiliert. Schließlich wird test/triangular
mithilfe von ccself
erstellt und das Ergebnis überprüft. Sie sollten so etwas erhalten:
$ make selftest
gcc -std=c11 -Werror -Wall cc.c -o cc
cc cc.c
gcc -m32 a.s -o ccself
ccself tests/triangular.c
gcc -m32 a.s -o triangular; triangular 5; [ $? -eq 15 ]
Wenn Sie Windows verwenden, müssen Sie den windows
Zweig auschecken. Unter 64-Bit-Linux müssen Sie möglicherweise sudo apt-get install gcc-multilib
ausführen, um den 32-Bit-Code kompilieren und ausführen zu können.
Ein weiterer mikroskopischer C-Compiler ist c4 von rswier
. Er hat mehr C implementiert, aber ich würde sagen, meines ist einfacher :). Außerdem generiert c4 Code für seine eigene VM, während meines die erhebliche Schwierigkeit hat, mit x86-Assembly und cdecl zu arbeiten.
Ich habe einen anderen, viel fortgeschritteneren C-Compiler geschrieben. Hör zu. Es ist ebenfalls selbsthostend, verfügt jedoch über einen viel umfassenderen Funktionsumfang und sogar einige experimentelle Ergänzungen wie Lambdas.
Copyright (c) 2015 Sam Nipps
Hiermit wird jeder Person, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die „Software“) erhält, kostenlos die Erlaubnis erteilt, mit der Software ohne Einschränkung zu handeln, einschließlich und ohne Einschränkung der Rechte zur Nutzung, zum Kopieren, Ändern und Zusammenführen , Kopien der Software zu veröffentlichen, zu verteilen, unterzulizenzieren und/oder zu verkaufen und Personen, denen die Software zur Verfügung gestellt wird, dies zu gestatten, vorbehaltlich der folgenden Bedingungen:
Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein.
DIE SOFTWARE WIRD „WIE BESEHEN“ ZUR VERFÜGUNG GESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNG. IN KEINEM FALL SIND DIE AUTOREN ODER URHEBERRECHTSINHABER HAFTBAR FÜR JEGLICHE ANSPRÜCHE, SCHÄDEN ODER ANDERE HAFTUNG, WEDER AUS EINER VERTRAGLICHEN HANDLUNG, AUS HANDLUNG ODER ANDERWEITIG, DIE SICH AUS, AUS ODER IN ZUSAMMENHANG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN HANDELN IN DER SOFTWARE ERGEBEN SOFTWARE.