- Jack Crenshaws „Let’s Build a Compiler“-Tutorial, das zwischen 1988 und 1995 veröffentlicht wurde, wurde in Python und WebAssembly nachgebaut.
- Das Original nutzte Pascal und Motorola 68000-Assembler, doch diese Umsetzung überführt es in Code, der in einer modernen Umgebung ausführbar ist.
- Kern des Tutorials ist es, einen rekursiven Abwärts-Parser (recursive-descent parser) selbst zu implementieren und schon in frühen Phasen echten Assembler-Code zu erzeugen.
- Crenshaws Ansatz nutzt syntax-direktierte Übersetzung (syntax-directed translation), zeigt dabei aber Grenzen bei der Typverarbeitung.
- Diese Neuimplementierung ist deshalb bedeutsam, weil das klassische Tutorial in einer Form neu aufgebaut wurde, in der moderne Entwickler es selbst ausführen und ausprobieren können.
Hintergrund des klassischen Tutorials
- Jack Crenshaws „Let’s Build a Compiler“ ist ein Einsteiger-Tutorial zur Compiler-Entwicklung, das zwischen 1988 und 1995 erschien und bis heute häufig genannt wird.
- Die Originalfassung war in Pascal verfasst und erzeugte Motorola 68000-Assemblercode.
- Auch 2025 wird es, 35 Jahre später, weiterhin regelmäßig auf Plattformen wie Hacker News diskutiert.
- Der Autor ist diesem Tutorial erstmals 2003 begegnet und wurde stark beeindruckt; 2025 hat er es auf Python und WebAssembly übertragen.
Neuimplementierung mit Python und WebAssembly
- Er beschränkte sich nicht aufs Lesen, sondern implementierte den Tutorial-Compiler in Python und so, dass er WebAssembly (WASM) ausgibt.
- Das Ergebnis ist im GitHub-Repository (eliben/letsbuildacompiler) veröffentlicht.
- In der Datei
TUTORIAL.md wird erklärt, wie jeder Teil des Originals auf Python-Code abgebildet wird.
- Leser können den Original-Tutorialtext verfolgen und dabei direkt lauffähigen Code ausprobieren.
KISS-Sprachbeispiel und WASM-Ausgabe
- Es werden die Ergebnisse der Kompilierung eines Beispielprogramms in der von Crenshaw entworfenen KISS-Sprache mit dem Python-Compiler gezeigt.
- Das Beispiel enthält
procedure, while-Schleifen sowie Wert- und Referenzübergabe.
- Der ausgegebene WASM-Text enthält Logik zur Behandlung von by-reference Parameters, wobei kaum Optimierungen durchgeführt wurden.
- Der Teil, in dem die globale Variable
X implizit aus main zurückgegeben wird, dient der Testbequemlichkeit.
- Der erzeugte WASM-Code wird für Tests eingesetzt, bei denen erwartete Ergebnisse durch tatsächliche Ausführung verifiziert werden.
Stärken des Tutorials
- Crenshaws Tutorial baut schrittweise einen rekursiven Abwärts-Parser auf und legt den Fokus auf eine funktionierende Codeerzeugung statt auf komplexe Theorie.
- Damals galten
lex und yacc als Standard, doch die Schlichtheit und Klarheit eines selbstgeschriebenen Parsers hatten großen Einfluss.
- In den folgenden 20 Jahren entwickelte der Autor eine Vorliebe für handgeschriebene rekursive Abwärts-Parser.
- Während die meisten Lehrinhalte seinerzeit auf Parsing fokussiert waren, behandelt Crenshaw bereits früh die Codeerzeugung in den ersten Phasen.
Grenzen und Verbesserungspotenzial
- Das Tutorial verwendet syntax-direktierte Übersetzung und erzeugt Code direkt während des Parsings.
- Dieser Ansatz ist für das Lernen nützlich, hat aber die Grenze, dass Typinformationen vorher nicht bekannt sind und dadurch Optimierung schwierig wird.
- Besonders ab dem 14. Teil mit der Einführung von Typen wird deutlich, dass ein strukturierterer Ansatz mit Zwischencode (IR) oder AST notwendig ist.
- Warum Crenshaw das Tutorial nach Teil 14 abbrach, ist nicht dokumentiert, doch es wird die Möglichkeit erwähnt, dass dies mit dieser Grenze zusammenhängt.
- Der Autor hält es für sinnvoller, ab diesem Wendepunkt erst einen AST zu erzeugen und danach eine Typprüfung sowie Codegenerierung vorzunehmen.
Fazit
- Das Original-Tutorial bleibt ein exzellenter Einstieg in den Compilerbau mit ausgezeichneter Lesbarkeit und Praxisnähe.
- Diese Python- und WASM-Version ergänzt es so, dass heutige Entwickler ohne veraltete Technik lernen können.
- Über das GitHub-Repository ist es für alle erprobbarkeit und stellt eine moderne Neuinterpretation dar, die ein direktes Erleben der Compilerstruktur ermöglicht.
Noch keine Kommentare.