Compiler lernen [geschlossen]

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

    Ich bin auf der Suche nach hilfreichen Büchern / Tutorials wie Sie Ihren eigenen Compiler einfach zu Lernzwecken schreiben. Ich bin am besten mit C / C ++, Java und Ruby vertraut, daher ziehe ich Ressourcen vor, die eine dieser drei Funktionen umfassen, aber jede gute Ressource ist akzeptabel.

    01 March 2014
    Ashish Patel
27 answers
  • Dies ist eine ziemlich vage Frage, denke ich. nur wegen der Tiefe des Themas. Ein Compiler kann jedoch in zwei separate Teile zerlegt werden. eine obere Hälfte und eine unterste. Die obere Hälfte übernimmt im Allgemeinen die Quellsprache und konvertiert sie in eine Zwischendarstellung, und die untere Hälfte kümmert sich um die plattformspezifische Codegenerierung.

    Eine Idee für eine einfache Sache Um dieses Thema anzugehen (das wir zumindest in meiner Compiler-Klasse verwendet haben), besteht der Compiler aus den beiden oben beschriebenen Teilen. Insbesondere erhalten Sie eine gute Vorstellung von dem gesamten Prozess, indem Sie einfach die obere Hälfte erstellen.

    Wenn Sie nur die obere Hälfte ausführen, können Sie das lexikalische Analysegerät und das Schreiben in Erfahrung bringen den Parser und erzeugen einige "Code" (diese Zwischendarstellung, die ich erwähnt habe). Das Quellprogramm wird also in eine andere Darstellung konvertiert und (wenn Sie möchten) einige Optimierungen vorgenommen, die das Herz eines Compilers bilden. Die untere Hälfte nimmt dann diese Zwischendarstellung und generiert die für die Ausführung des Programms in einer bestimmten Architektur erforderlichen Bytes. In der unteren Hälfte wird beispielsweise Ihre Zwischenrepräsentation verwendet und eine ausführbare PE-Datei generiert.

    Einige Bücher zu diesem Thema, die ich besonders hilfreich fand, waren Compilers Principles and Techniques (oder das Drachenbuch, aufgrund des niedlichen Drachen auf dem Cover). Es hat einige großartige Theorien und behandelt definitiv kontextfreie Grammatiken auf eine wirklich zugängliche Weise. Für die Erstellung des lexikalischen Analysators und des Parsers verwenden Sie wahrscheinlich auch die * nix-Tools lex und yacc. Und uninteressanterweise hat das Buch mit dem Titel " lex and yacc " dort angefangen, wo das Drachenbuch aufgehört hat für diesen Teil ausschalten.

    21 July 2009
    mrduclaw
  • Ich denke, Moderne Compiler-Implementierung in ML ist der beste Einführungs-Compiler, der Text schreibt. Es gibt eine Java-Version und eine C-Version . Beide Optionen sind möglicherweise für Ihre Sprachen zugänglich Hintergrund. Das Buch enthält eine Menge nützliches Grundmaterial (Scannen und Analysieren, semantische Analyse, Aktivierungsdatensätze, Befehlsauswahl, Erzeugung von nativem RISC- und x86-Code) sowie verschiedene "erweiterte" Themen (Kompilierung von OO- und Funktionssprachen, Polymorphismus, Speicherbereinigung, Optimierung und (statisches Zuweisungsformular) auf relativ wenig Speicherplatz (~ 500 Seiten).

    Ich bevorzuge die Modern Compiler-Implementierung dem Dragon-Buch, da die Modern Compiler-Implementierung weniger des Feldes untersucht hat eine solide Abdeckung aller Themen, die Sie benötigen, um einen seriösen, anständigen Compiler zu schreiben. Nachdem Sie dieses Buch durchgearbeitet haben, sind Sie bereit, die Forschungsarbeiten direkt zu bearbeiten, falls Sie es benötigen.

    Ich muss gestehen, dass ich ein ernstes Faible für Niklaus Wirth Compiler-Konstruktion. Es ist online verfügbar als PDF. Ichth finde die Programmierästhetik von Wirth einfach schön, aber einige Leute finden seinen Stil zu minimal (zum Beispiel bevorzugt Wirth rekursive Abstiegs-Parser, aber die meisten CS-Kurse konzentrieren sich auf Parser-Generator-Tools; die Sprachentwürfe von Wirth sind ziemlich konservativ.)

    10 August 2008
    Dominic Cooney
  • Ich stimme der Dragon Book-Referenz zu. IMO, es ist der endgültige Leitfaden für die Compilerbauweise. Machen Sie sich jedoch bereit für einige Hardcore-Theorien.

    Wenn Sie ein Buch wünschen, das theoretisch leichter ist, Game Scripting Mastery könnte ein besseres Buch für Sie sein. Wenn Sie ein Neuling in der Compilertheorie sind, bietet dies eine sanftere Einführung. Es werden keine praktischeren Parsing-Methoden behandelt (Entscheidung für einen nicht-prädiktiven rekursiven Abstieg, ohne auf das LL- oder LR-Parsing einzugehen). Soweit ich mich erinnere, wird hier nicht auf irgendeine Art von Optimierungstheorie eingegangen. Außerdem kompiliert es nicht zu Maschinencode, sondern zu einem Bytecode, der auf einer VM ausgeführt werden soll, die Sie auch schreiben.

    Es ist immer noch ein anständiger Lesevorgang, insbesondere wenn Sie können Bei Amazon günstig abholen. Wenn Sie nur eine einfache Einführung in Compiler wünschen, ist Game Scripting Mastery kein schlechter Weg. Wenn Sie im Vorfeld hardcore gehen wollen, sollten Sie sich mit nichts weniger als dem Drachenbuch zufrieden geben.

    05 August 2008
    grawity
  • "Lassen Sie uns einen Compiler erstellen" ist fantastisch, aber etwas veraltet. (Ich sage nicht, das macht es sogar ein bisschen weniger gültig.)

    Oder probieren Sie SLANG . Dies ähnelt "Let's Build a Compiler", ist jedoch vor allem für Anfänger eine viel bessere Ressource. Dies wird mit einem PDF-Tutorial geliefert, das Sie in 7 Schritten einem Compiler beibringt. Hinzufügen des Quora-Links, da er die Links zu allen verschiedenen SLANG-Ports hat, in C ++, Java und JS, auch Interpreter in Python und Java, die ursprünglich mit C # und der .NET-Plattform geschrieben wurden.

    16 August 2016
    4 revs, 4 users 40%RBz
  • Wenn Sie leistungsfähige Tools auf höherer Ebene verwenden möchten, anstatt alles selbst zu erstellen, gehen Sie die Projekte und Lesungen für dieser Kurs ist eine ziemlich gute Option. Es ist ein Sprachkurs des Autors der Java Parser Engine ANTLR. Sie können das Buch für den Kurs als PDF von den Pragmatischen Programmierern .

    Der Kurs behandelt die üblichen Compiler-Compiler-Funktionen, die Sie an anderer Stelle sehen würden: Analyse, Typen- und Typüberprüfung, Polymorphie, Symboltabellen und Code-Generierung. Das Einzige, was nicht abgedeckt wird, sind Optimierungen. Das Abschlussprojekt ist ein Programm, das eine Teilmenge von C kompiliert. Da Sie Tools wie ANTLR und LLVM verwenden, ist es möglich, den gesamten Compiler an einem einzigen Tag zu schreiben (ich habe einen Existenznachweis dafür, obwohl ich ~ 24 Stunden meine). Es ist schwer in der praktischen Entwicklung mit modernen Werkzeugen, etwas weniger in der Theorie.

    Übrigens ist LLVM einfach fantastisch. In vielen Situationen, in denen Sie normalerweise bis zur Assembly kompilieren, ist es viel besser, wenn Sie eine Kompilierung für die LLVM-Zwischendarstellung . Es ist eine übergeordnete Plattform, plattformübergreifend, und LLVM ist ziemlich gut darin, eine optimierte Baugruppe daraus zu generieren.

    05 August 2008
    Steve M
  • Wenn Sie wenig Zeit haben, empfehle ich Niklaus Wirths "Compiler Construction" ( Addison-Wesley (1996) , ein kleines kleines Booklet, das Sie an einem Tag lesen können, aber es erklärt die Grundlagen (einschließlich der Implementierung von Lexern, rekursiven Abstiegsparsern und Ihren eigenen stapelbasierten virtuellen Maschinen). Wenn Sie danach einen tiefen Tauchgang wünschen, gibt es keine Möglichkeit, sich um das Dragon-Buch herum zu bewegen, wie andere Kommentatoren vermuten.

    18 October 2011
    2 revs, 2 users 67%Matthieu
  • Vielleicht möchten Sie Lex / Yacc (oder Flex / Bison, wie auch immer Sie es nennen wollen) sehen. Flex ist ein lexikalischer Analysator, der die semantischen Komponenten ("Token") Ihrer Sprache analysiert und identifiziert. Mit Bison wird festgelegt, was passiert, wenn ein Token analysiert wird. Dies kann sein, ist aber definitiv nicht darauf beschränkt, C-Code auszudrucken, für einen Compiler, der zu C kompiliert werden würde, oder die Anweisungen dynamisch auszuführen.

    : //tldp.org/HOWTO/Lex-YACC-HOWTO-5.html "rel =" noreferrer "> Diese FAQ sollte Ihnen helfen, und dieses Tutorial sieht sehr nützlich aus.

    21 July 2009
    Zachary Murray
  • Im Allgemeinen gibt es keine fünfminütige Anleitung für Compiler, da dies ein kompliziertes Thema ist und das Schreiben eines Compilers Monate dauern kann. Sie müssen Ihre eigene Suche durchführen.

    Python und Ruby werden normalerweise interpretiert. Vielleicht möchten Sie auch mit einem Dolmetscher beginnen. Im Allgemeinen ist es einfacher.

    Der erste Schritt besteht darin, eine formale Sprachbeschreibung zu schreiben, die Grammatik Ihrer Programmiersprache. Dann müssen Sie den Quellcode, den Sie gemäß der Grammatik kompilieren oder interpretieren möchten, in einen abstrakten Syntaxbaum umwandeln, eine interne Form des Quellcodes, die der Computer versteht und verarbeiten kann. Dieser Schritt wird normalerweise als Parsing bezeichnet und die Software, die den Quellcode analysiert, wird Parser genannt. Oft wird der Parser von einem Parser-Generator generiert, der eine formale Grammatik in Quellcode oder Maschinencode umwandelt. Für eine gute, nicht mathematische Erklärung des Parsens empfehle ich Parsing-Techniken - Ein praktischer Leitfaden. Wikipedia bietet einen Vergleich von Parser-Generatoren, aus denen Sie den für Sie passenden auswählen können. Je nach gewähltem Parser-Generator finden Sie Tutorials im Internet, und für wirklich beliebte Parser-Generatoren (wie GNU-Bisons) gibt es auch Bücher kann sehr schwer sein, aber das hängt von Ihrer Grammatik ab. Ich empfehle daher, Ihre Grammatik einfach zu halten (im Gegensatz zu C ++). Ein gutes Beispiel dafür ist LISP.

    Im zweiten Schritt wird der abstrakte Syntaxbaum von einer Baumstruktur in eine lineare Zwischendarstellung umgewandelt. Als gutes Beispiel dafür wird häufig Luas Bytecode genannt. Die Zwischendarstellung hängt jedoch von Ihrer Sprache ab.

    Wenn Sie einen Interpreter erstellen, müssen Sie lediglich die Zwischendarstellung interpretieren. Sie können es auch gerade zeitlich kompilieren. Ich empfehle LLVM und Libjit für die Just-In-Time-Kompilierung. Um die Sprache nutzbar zu machen, müssen Sie auch etwas eingeben und ou eingeben

    21 July 2009
    user141335
  • Schauen Sie sich das untenstehende Buch an. Der Autor ist der Schöpfer von ANTLR .

    Sprachimplementierungsmuster: Erstellen Sie eigene domänenspezifische und allgemeine Programmiersprachen .

    Compiler lernen [geschlossen]

    27 December 2014
    2 revs, 2 users 95%Taylor Leese
  • Ein Buch, das noch nicht vorgeschlagen wurde, aber sehr wichtig ist, ist

19 August 2008
Ben Combee