- Crafting Interpreters ist ein Buch, das so aufgebaut ist, dass Leser, die selbst eine Sprache entwickeln möchten, die vollständige Implementierung einer Skriptsprache von Anfang bis Ende nachvollziehen können
- Es behandelt in einem durchgängigen Zusammenhang Konzepte des Sprachdesigns wie Parsing und Semantik bis hin zu Aspekten der Laufzeitimplementierung wie Bytecode-Darstellung und Garbage Collection
- Leser beginnen bei
main()und implementieren selbst eine Sprache mit dynamischer Typisierung, lexikalischem Scope, First-Class-Funktionen, Closures, Klassen und Vererbung - Da einige tausend Zeilen sauberer und schneller Code vollständig selbst geschrieben werden, liegt der Schwerpunkt stärker auf dem Verständnis der internen Funktionsweise als auf dem Endergebnis
- Verfügbar als Druckausgabe, eBook, PDF und im Web; im Web können alle Kapitel, ergänzende Texte und Illustrationen kostenlos gelesen werden
Umfang der Implementierung im Buch
- Crafting Interpreters richtet sich an Leser, die ihre eigene Programmiersprache entwickeln möchten oder verstehen wollen, wie Sprachen entworfen und implementiert werden
- Das Buch behandelt gemeinsam die zentralen Themen, die für die Implementierung einer voll funktionsfähigen Skriptsprache nötig sind
- Parsing
- Semantik
- Bytecode-Darstellung
- Garbage Collection
- Die Implementierung beginnt bei
main()und wird schließlich zu einer Sprache mit den folgenden Funktionen erweitert- umfangreiche Syntax
- dynamische Typisierung
- lexikalischer Scope
- First-Class-Funktionen
- Closures
- Klassen
- Vererbung
Leseweise und Ergebnis
- Statt den Beispielcode nur anzusehen, schreiben Leser jede Zeile selbst und verfolgen so die interne Struktur des Sprachprozessors
- Der endgültige Code umfasst einige tausend Zeilen und ist auf eine saubere und schnelle Implementierung ausgelegt
- Anstatt übergeordnete Konzepte und Low-Level-Implementierung getrennt zu erklären, ist das Buch so gestaltet, dass beides gemeinsam im Prozess der Fertigstellung einer Sprache verstanden wird
Verfügbare Formate
-
Druckausgabe
- Eine 640-seitige Druckausgabe mit hochauflösenden handgezeichneten Illustrationen und vom Autor selbst gesetzter Typografie
- Amazon.com
- Barnes and Noble
- Download Sample PDF
-
eBook
- Bietet CSS, das an eBook-Reader und Bildschirmgrößen angepasst ist, vollfarbiges Syntax-Highlighting und Live-Hyperlinks
- Kindle Amazon.com
- Apple Books
- Play Books Google
- Nook B&N
- EPUB Smashwords
-
PDF
- Spiegelt den handgesetzten Satz und die klaren Illustrationen der Druckausgabe unverändert wider und wird zugleich in leicht transportierbarer Form angeboten
- Buy from Payhip
- Download Free Sample
-
Web
- Mit responsivem Design für Geräte vom Desktop bis zum Mobiltelefon; alle Kapitel, ergänzende Texte und Illustrationen können kostenlos gelesen werden
- Read Now
1 Kommentare
Hacker-News-Kommentare
Ich bin der Autor. Die positive Resonanz auf mein Buch zu sehen, wärmt mir wirklich das Herz. Ich habe viel Zeit und Liebe hineingesteckt, und zu sehen, dass es die erhoffte Wirkung hatte, ist sehr erfüllend.
Dieses Material hat mir enorm viel Selbstvertrauen gegeben, und ich erinnere mich bis heute an dieses Projekt als eine meiner liebsten Arbeiten.
Ich frage mich auch, ob du darüber nachdenkst, ein Folgebuch zu einem Compiler oder JIT für Lox zu schreiben. Und der lexical analygator ist großartig; er ist mit Quellenangabe mehrfach in internen Präsentationen bei uns aufgetaucht, und eine Zeit lang gab es sogar Whiteboard-Fanart dazu.
Manche Autoren scheinen zu glauben, sie müssten so tun, als sei dieses Feld reine schwarze Magie; vielleicht war ich aber auch einfach nicht gut genug, um die GoF-Design-Patterns zu verstehen.
Beim Erstellen von Crumb (https://github.com/liam-ilan/crumb) habe ich Crafting Interpreters gelesen, und besonders die Abschnitte zu Scopes und lokalen Variablen waren unverzichtbar.
Die Balance zwischen technischer Umsetzung und konzeptuellem Verständnis ist sehr gut, sodass es auch dann enorm hilft, wenn man vom vorgegebenen Pfad des Buchs abweichen möchte. Diese Art technischer Texte ist so hochwertig, dass sie als Zielbild dienen kann.
Die Dokumentation ist gut, und das Projekt ist klasse.
Was mir an diesem Buch am besten gefallen hat, ist, dass es einen dazu bringt, zwei unterschiedliche Interpreter für dieselbe Sprache zu schreiben.
Dadurch versteht man die komplexeren und subtileren Teile des Entstehungsprozesses einer Programmiersprache deutlich besser. In der ersten Hälfte des Buchs begegnet man den großen Ideen zuerst und macht sich mit ihnen vertraut; wenn sie im zweiten Interpreter erneut auftauchen, kann man die interessanten Teile wirklich aufnehmen. Ein wirklich erstaunliches Buch.
Da hier auch andere Compiler-Ressourcen erwähnt werden: Ich habe es noch nicht ganz durchgesehen, aber die Videos von Immo Landwerth, in denen er einen Compiler in C# baut und dabei IL, Debug-Symbole usw. erzeugt, fand ich ebenfalls gut.
Das Material ist etwa fünf Jahre alt, daher ist es nicht die neueste C#-Syntax und dürfte etwa aus der Zeit von .NET Core 3 stammen, aber für die meisten Arbeiten sollte das kein großes Problem sein. Allerdings können viele Warnungen zur Nullable-Referenztypen-Thematik auftauchen.
https://www.youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu...
Ich finde, die meisten Programmierer sollten dieses Buch irgendwann einmal vollständig durcharbeiten. Als ich das getan habe, habe ich sehr viel besser verstanden, was intern in Compilern oder Sprachwerkzeugen tatsächlich passiert.
Es gehört zu den am besten geschriebenen technischen Guides, denen ich je gefolgt bin, und hat mir sehr geholfen, die Konzepte wirklich zu verinnerlichen. Diese Konzepte sind nicht nur bei Compilern nützlich, sondern auch an vielen anderen Stellen.
Ein nebensächlicher, aber vielleicht ebenso wichtiger Vorteil dieses Buchs ist, dass es Klarheit lehrt.
Text, Code, Struktur und Tempo sind alle klar und auf den Punkt. Das Wort „Crafting“ passt genau: Es fühlt sich an wie ein Buch, das ein Handwerker für Handwerker geschrieben hat.
Meiner Ansicht nach sollte dieses Buch der zweite oder dritte Schritt auf der Reise zu Programmiersprachen-Compilern sein.
Der erste Schritt ist, ohne Wissen über Interpreter oder Sprachdesign selbst einen Interpreter für eine einfache, selbst entworfene Sprache zu schreiben. Der zweite Schritt ist, ihn erneut zu schreiben und dabei weniger Fehler zu machen.
Wenn man das nicht tut, ist es schwer, die Feinheiten des Themas wirklich zu würdigen, und man geht leicht über Konzepte hinweg, die zunächst nicht wichtig aussehen.
Es ist in Ordnung, nicht jede Technik von Grund auf selbst neu zu erfinden. Auf den Schultern von Riesen zu stehen, ist etwas Natürliches.
Hätte ich nicht zuerst etwas wie CI gelesen, hätte ich wahrscheinlich nie versucht, selbst einen Interpreter zu schreiben, und wäre nicht bis zum dritten Schritt gekommen.
Es gab keine Rekursion; ich habe Dinge direkt auf einen Stack gelegt und wieder heruntergenommen. Das Problem war, dass ich Parsing nicht richtig verstand und den Großteil der Sprache mit string.split und string.replace implementierte. Wie zu erwarten entstanden dadurch Konzepte, die sich nicht verschachteln ließen. Schade, dass ich den Quellcode nicht aufgehoben habe.
Nach nur wenigen Tagen stieß ich auf so viele Bugs, dass ich eine etwas akademischere Haltung einnahm und anfing, Bücher zu lesen. Trotzdem war es ein großartiger erster Schritt; ohne diesen Versuch hätte ich vielleicht nicht einmal erkannt, dass dieses Thema ein ganzes Buch füllen kann.
Ich habe wirklich großen Respekt vor Menschen mit so viel Hingabe und vor allen, die die Entwicklungsinfrastruktur am Laufen halten, aber ich bin froh, dass meine Phase „Ich will eine Sprache bauen“ nur ein kurzes Interesse geblieben ist.
Der Arbeitsaufwand ist wirklich enorm.
Ich frage mich, ob jemand gute Ressourcen kennt, um eine statisch typisierte Sprache mit Dingen wie parametrischem Polymorphismus und grundlegender Typinferenz zu bauen.
Bei Crafting Interpreters hatte ich das Gefühl, eine kleine, in sich geschlossene Sprache bauen zu können, die fast alle Konzepte enthält, die ich vermitteln wollte: Variablenscopes, Funktionen, Closures, Klassen und dynamisches Dispatch, Kontrollfluss usw.
Bei Typsystemen gibt es dagegen zu viele Abzweigungen im Designraum und keinen klaren „besten“ Weg. Ob es Subtyping gibt, ob Generics gelöscht oder reifiziert werden, ob generischer Code zur Compile-Zeit spezialisiert wird, ob Typinferenz lokal ist oder Hindley-Milner folgt – all das sind Verzweigungen.
Egal, wofür man sich entscheidet, man verpasst wichtige Inhalte der nicht gewählten Zweige und kann Leser enttäuschen, die einen anderen Weg erwartet haben. Vielleicht wäre ein breiter angelegtes Überblicksbuch wie Types and Programming Languages passender, aber dann verliert man den Spaß daran, eine einzige konsistente Sache aufzubauen.
Es gibt auch C- und Java-Ausgaben desselben Buchs, aber ich halte sie für schwächer. Ich würde eher mit der ML-Ausgabe arbeiten.
Ich habe gesehen, dass die Implementierung unter https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... in einem sehr alten Stil geschrieben war, habe sie modernisiert und aufgeräumt und daraus https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459... gemacht. Danach habe ich mehrere Teile absichtlich „kaputtgemacht“, um zu sehen, wie der Algorithmus bricht.
Ich kann sehr empfehlen, eine Informatikaufgabe, von der man glaubt, sie sei nur für Zauberer machbar, auf zugängliche Weise selbst auszuprobieren. Wenn man ein oder zwei davon geschafft hat, merkt man, dass es zwar schwierig ist, aber meist vor allem darum geht, sich Stück für Stück durchzukämpfen – und das gibt enorm viel Selbstvertrauen. Wer diesen Weg gehen möchte, kann mich unter zellyn@(most things) kontaktieren.
Ich habe gerade Teil 2 abgeschlossen, und es ist wirklich ein gutes Buch. Es hilft enorm beim Verständnis, wenn man pro Kapitel ein oder zwei der vorgeschlagenen Aufgaben selbst macht.