697 Stimmen

Lernen, einen Compiler zu schreiben

Bevorzugte Sprachen : C/C++, Java und Ruby.

Ich bin auf der Suche nach hilfreichen Büchern/Tutorials über das Schreiben eines eigenen Compilers, einfach zu Ausbildungszwecken. Ich kenne mich am besten mit C/C++, Java und Ruby aus, daher bevorzuge ich Quellen, die eine dieser drei beinhalten, aber jede gute Quelle ist akzeptabel.

1200voto

Michael Stum Punkte 172055

Große Liste von Ressourcen:

Legende:

  • ¶ Link zu einer PDF-Datei
  • $ Link zu einem gedruckten Buch

75voto

mrduclaw Punkte 3814

Das ist eine ziemlich vage Frage, denke ich, allein schon wegen der Tiefe des Themas. Ein Compiler kann jedoch in zwei separate Teile zerlegt werden: eine obere Hälfte und eine untere Hälfte. Die obere Hälfte nimmt im Allgemeinen die Quellsprache und wandelt sie in eine Zwischendarstellung um, und die untere Hälfte kümmert sich um die plattformspezifische Codegenerierung.

Nichtsdestotrotz ist eine Idee für einen einfachen Weg, sich diesem Thema zu nähern (zumindest die, die wir in meinem Compiler-Kurs verwendet haben), den Compiler in den beiden oben beschriebenen Teilen zu bauen. Insbesondere erhalten Sie einen guten Überblick über den gesamten Prozess, wenn Sie nur die obere Hälfte bauen.

Wenn Sie nur die obere Hälfte machen, können Sie die Erfahrung sammeln, wie man den lexikalischen Analysator und den Parser schreibt, und dann mit der Erzeugung von "Code" beginnen (die erwähnte Zwischendarstellung). Es nimmt also Ihr Quellprogramm und konvertiert es in eine andere Repräsentation und führt einige Optimierungen durch (wenn Sie wollen), was das Herzstück eines Compilers ist. Die untere Hälfte nimmt dann diese Zwischendarstellung und erzeugt die Bytes, die benötigt werden, um das Programm auf einer bestimmten Architektur auszuführen. Die untere Hälfte nimmt zum Beispiel Ihre Zwischendarstellung und erzeugt eine ausführbare PE-Datei.

Einige Bücher zu diesem Thema, die ich besonders hilfreich fand, waren Compiler - Prinzipien und Techniken (oder das Drachenbuch, wegen des niedlichen Drachens auf dem Umschlag). Es enthält einige großartige Theorien und behandelt kontextfreie Grammatiken auf eine wirklich zugängliche Weise. Für die Erstellung des lexikalischen Analysators und Parsers werden Sie wahrscheinlich die *nix-Tools lex und yacc verwenden. Und uninteressanterweise heißt das Buch " lex und yacc " knüpft dort an, wo das Drachenbuch mit diesem Teil aufgehört hat.

63voto

Dominic Cooney Punkte 6010

Ich denke Moderne Compiler-Implementierung in ML ist der beste einführende Text zum Schreiben von Compilern. Es gibt eine Java-Version und eine Version C die für Sie mit Ihrem Sprachhintergrund leichter zugänglich sein könnten. Das Buch packt viel nützliches Grundlagenmaterial (Scannen und Parsen, semantische Analyse, Aktivierungssätze, Befehlsauswahl, RISC- und x86-Native-Code-Generierung) und verschiedene "fortgeschrittene" Themen (Kompilieren von OO- und funktionalen Sprachen, Polymorphismus, Garbage Collection, Optimierung und einzelne statische Zuweisungsform) auf relativ wenig Platz (~500 Seiten).

Ich ziehe Modern Compiler Implementation dem Dragon-Buch vor, weil Modern Compiler Implementation weniger das Feld überblickt - stattdessen deckt es wirklich solide alle Themen ab, die man braucht, um einen ernsthaften, anständigen Compiler zu schreiben. Nachdem Sie dieses Buch durchgearbeitet haben, werden Sie bereit sein, Forschungsarbeiten direkt in Angriff zu nehmen, um mehr Tiefe zu erhalten, wenn Sie dies benötigen.

Ich muss gestehen, dass ich eine große Schwäche für Niklaus Wirths Compilerbau. Sie ist online verfügbar als PDF-Datei. Ich finde Wirths Programmierästhetik einfach schön, aber manche Leute finden seinen Stil zu minimalistisch (Wirth bevorzugt zum Beispiel rekursive Descent-Parser, aber die meisten CS-Kurse konzentrieren sich auf Parser-Generator-Tools; Wirths Sprachdesigns sind ziemlich konservativ). Compiler Construction ist eine sehr prägnante Zusammenfassung von Wirths grundlegenden Ideen, so dass ich die Lektüre dieses Buches sehr empfehle, unabhängig davon, ob Sie seinen Stil mögen oder nicht oder nicht.

47voto

Ich stimme mit dem Dragon Book überein; IMO ist es der endgültige Leitfaden für den Compilerbau. Machen Sie sich allerdings auf einige knallharte Theorie gefasst.

Wenn Sie ein Buch suchen, das weniger theoretisch ist, Game Scripting Mastery könnte ein besseres Buch für Sie sein. Wenn Sie ein völliger Neuling in der Compiler-Theorie sind, bietet es eine sanftere Einführung. Es behandelt keine praktischeren Parsing-Methoden (es entscheidet sich für nicht-prädiktiven rekursiven Abstieg, ohne LL- oder LR-Parsing zu diskutieren), und wenn ich mich recht erinnere, wird nicht einmal irgendeine Art von Optimierungstheorie diskutiert. Außerdem wird nicht in Maschinencode kompiliert, sondern in einen Bytecode, der auf einer VM laufen soll, die Sie ebenfalls schreiben.

Es ist immer noch eine gute Lektüre, vor allem, wenn man es günstig bei Amazon kaufen kann. Wenn Sie nur einen einfachen Einstieg in Compiler suchen, ist Game Scripting Mastery keine schlechte Wahl. Wenn Sie von vornherein auf Hardcore setzen wollen, dann sollten Sie sich mit nichts Geringerem als dem Dragon Book zufrieden geben.

32voto

saniul Punkte 2973

"Lasst uns einen Compiler bauen" ist großartig, aber ein bisschen veraltet. (Ich sage nicht, dass es dadurch auch nur ein bisschen weniger gültig ist.)

Oder besuchen Sie SLANG . Dies ist ähnlich wie "Let's Build a Compiler", aber eine viel bessere Ressource, besonders für Anfänger. Dazu gibt es ein pdf-Tutorial, das in 7 Schritten einen Compiler erklärt. Ich füge den Quora-Link hinzu, da er die Links zu den verschiedenen Ports von SLANG in C++, Java und JS sowie zu Interpretern in Python und Java enthält, die ursprünglich mit C# und der .NET-Plattform geschrieben wurden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X