Frage

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

Ich suche nach hilfreichen Büchern/Tutorials zum Schreiben eines eigenen Compilers, einfach für Bildungszwecke.Ich kenne mich am besten mit C/C++, Java und Ruby aus, daher bevorzuge ich Ressourcen, die eine dieser drei beinhalten, aber jede gute Ressource ist akzeptabel.

War es hilfreich?

Lösung

Große Ressourcenliste:

Legende:

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

Andere Tipps

Das ist eine ziemlich vage Frage, denke ich;einfach wegen der Tiefe des Themas.Ein Compiler kann jedoch in zwei separate Teile zerlegt werden;eine obere 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.

Dennoch besteht eine Idee für eine einfache Annäherung an dieses Thema (zumindest die, die wir in meinem Compilerkurs verwendet haben) darin, den Compiler in den beiden oben beschriebenen Teilen zu erstellen.Insbesondere erhalten Sie einen guten Überblick über den gesamten Prozess, indem Sie nur die obere Hälfte erstellen.

Wenn Sie nur die obere Hälfte ausführen, können Sie die Erfahrung machen, den lexikalischen Analysator und den Parser zu schreiben und mit der Generierung von „Code“ (der Zwischendarstellung, die ich erwähnt habe) fortfahren.Es nimmt also Ihr Quellprogramm, konvertiert es in eine andere Darstellung und führt (falls gewünscht) eine Optimierung durch, die das Herzstück eines Compilers ist.Die untere Hälfte übernimmt dann diese Zwischendarstellung und generiert die Bytes, die zum Ausführen des Programms auf einer bestimmten Architektur erforderlich sind.Die untere Hälfte übernimmt beispielsweise Ihre Zwischendarstellung und generiert eine ausführbare PE-Datei.

Es gab einige Bücher zu diesem Thema, die ich besonders hilfreich fand Compilerprinzipien und -techniken (oder das Drachenbuch, wegen des niedlichen Drachen auf dem Cover).Es enthält eine großartige Theorie und behandelt auf jeden Fall kontextfreie Grammatiken auf wirklich verständliche Weise.Außerdem werden Sie zum Erstellen des lexikalischen Analysators und Parsers wahrscheinlich die *nix-Tools lex und yacc verwenden.Und uninteressanterweise heißt das Buch „Lex und Yacc„Fang dort an, wo das Drachenbuch für diesen Teil aufgehört hat.

Ich finde Moderne Compiler-Implementierung in ML ist der beste Einführungs-Compiler zum Schreiben von Texten.Da ist ein Java-Version und ein C-Version Beides könnte angesichts Ihres Sprachhintergrunds leichter zugänglich sein.Das Buch enthält eine Menge nützliches Basismaterial (Scannen und Parsen, semantische Analyse, Aktivierungsdatensätze, Befehlsauswahl, Generierung von nativem RISC- und x86-Code) und verschiedene „fortgeschrittene“ Themen (Kompilieren von OO und funktionalen Sprachen, Polymorphismus, Garbage Collection, Optimierung usw.). einzelnes statisches Aufgabenformular) auf relativ kleinem Raum (~500 Seiten).

Ich bevorzuge „Modern Compiler Implementation“ gegenüber dem Dragon-Buch, weil „Modern Compiler Implementation“ weniger über das Fachgebiet hinausgeht – stattdessen bietet es eine wirklich solide Abdeckung aller Themen, die Sie zum Schreiben eines seriösen, anständigen Compilers benötigen würden.Nachdem Sie dieses Buch durchgearbeitet haben, sind Sie bereit, sich bei Bedarf direkt mit Forschungsarbeiten zu befassen, um mehr Tiefe zu erlangen.

Ich muss gestehen, dass ich eine echte Schwäche für Niklaus Wirth habe Compiler-Konstruktion. Es ist Online verfügbar als PDF.Ich finde Wirths Programmierästhetik einfach wunderschön, allerdings finden einige Leute seinen Stil zu minimalistisch (Wirth bevorzugt zum Beispiel rekursive Abstiegsparser, 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 Grundideen. Ob Ihnen also sein Stil gefällt oder nicht, ich kann Ihnen die Lektüre dieses Buchs nur wärmstens empfehlen.

Ich stimme der Referenz zum Drachenbuch zu;Meiner Meinung nach ist es der definitive Leitfaden zum Compiler-Aufbau.Machen Sie sich jedoch auf etwas Hardcore-Theorie gefasst.

Wenn Sie ein Buch wollen, das weniger theoretisch ist, Beherrschung des Game Scripting könnte ein besseres Buch für Sie sein.Wenn Sie ein absoluter Neuling in der Compiler-Theorie sind, bietet es einen sanfteren Einstieg.Praktischere Parsing-Methoden werden nicht behandelt (die Entscheidung für einen nicht prädiktiven rekursiven Abstieg, ohne das LL- oder LR-Parsing zu diskutieren), und soweit ich mich erinnere, wird nicht einmal irgendeine Art von Optimierungstheorie besprochen.Außerdem wird nicht in Maschinencode kompiliert, sondern in einen Bytecode, der auf einer VM ausgeführt werden soll, die Sie ebenfalls schreiben.

Es ist immer noch eine gute Lektüre, besonders wenn man es günstig bei Amazon kaufen kann.Wenn Sie nur einen einfachen Einstieg in Compiler wünschen, ist Game Scripting Mastery kein schlechter Weg.Wenn Sie ganz vorne mitmachen wollen, sollten Sie sich mit nichts Geringerem als dem Dragon Book zufrieden geben.

„Lasst uns einen Compiler bauen“ ist großartig, aber etwas veraltet.(Ich sage nicht, dass es dadurch noch ein bisschen weniger gültig wird.)

Oder schauen Sie vorbei SLANG.Dies ähnelt „Let's Build a Compiler“, ist jedoch insbesondere für Anfänger eine viel bessere Ressource.Im Lieferumfang ist ein PDF-Tutorial enthalten, das Ihnen in sieben Schritten den Umgang mit dem Compiler beibringt.Hinzufügen des Quora-Links, da er Links zu allen verschiedenen SLANG-Ports 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.

Wenn Sie leistungsstarke Tools auf höherem Niveau verwenden möchten, anstatt etwas zu bauen alles sich selbst, indem Sie die Projekte und Lesungen für durchgehen dieser Kurs ist eine ziemlich gute Option.Es handelt sich um einen Sprachkurs des Autors der Java-Parser-Engine ANTLR.Das Buch zum Kurs erhalten Sie als PDF unter die Pragmatischen Programmierer.

Der Kurs behandelt die Standard-Compiler-Compiler-Sachen, die Sie anderswo sehen würden:Parsing, Typen und Typprüfung, Polymorphismus, Symboltabellen und Codegenerierung.So ziemlich das Einzige, was nicht abgedeckt wird, sind Optimierungen.Das Abschlussprojekt ist ein Programm, das kompiliert eine Teilmenge von C.Da Sie Tools wie ANTLR und LLVM verwenden, ist es möglich, den gesamten Compiler an einem einzigen Tag zu schreiben (ich habe einen Existenzbeweis dafür, obwohl ich damit etwa 24 Stunden meine).Der Schwerpunkt liegt auf praktischer Technik unter Verwendung moderner Werkzeuge, etwas weniger auf Theorie.

LLVM ist übrigens einfach fantastisch.In vielen Situationen, in denen Sie normalerweise bis zur Assembly kompilieren, ist das Kompilieren viel besser LLVMs Zwischendarstellung stattdessen.Es ist eine höhere Ebene, plattformübergreifend und LLVM ist ziemlich gut darin, daraus optimierte Assemblys zu generieren.

Wenn Sie wenig Zeit haben, empfehle ich Niklaus Wirths „Compiler Construction“ (Addison-Wesley.1996), eine winzige kleine Broschüre, die Sie an einem Tag lesen können, in der jedoch die Grundlagen erklärt werden (einschließlich der Implementierung von Lexern, Parsern für rekursive Abstiege und Ihrer eigenen stapelbasierten virtuellen Maschinen).Wenn Sie danach tiefer eintauchen möchten, führt kein Weg an dem Drachenbuch vorbei, wie andere Kommentatoren vorschlagen.

Vielleicht möchten Sie sich Lex/Yacc (oder Flex/Bison, wie auch immer Sie sie nennen möchten) ansehen.Flex ist ein lexikalischer Analysator, der die semantischen Komponenten („Tokens“) Ihrer Sprache analysiert und identifiziert, und Bison wird verwendet, um zu definieren, was passiert, wenn jedes Token analysiert wird.Dies kann das Ausdrucken von C-Code für einen Compiler, der nach C kompiliert, oder das dynamische Ausführen der Anweisungen sein, ist aber definitiv nicht darauf beschränkt.

Diese FAQ sollte dir helfen, und dieses Tutorial sieht ganz nützlich aus.

Im Allgemeinen gibt es kein fünfminütiges Tutorial für Compiler, da es sich um ein kompliziertes Thema handelt und das Schreiben eines Compilers Monate dauern kann.Sie müssen Ihre eigene Suche durchführen.

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

Der erste Schritt besteht darin, eine formale Sprachbeschreibung, die Grammatik Ihrer Programmiersprache, zu verfassen.Anschließend müssen Sie den Quellcode, den Sie kompilieren oder entsprechend der Grammatik interpretieren möchten, in einen abstrakten Syntaxbaum umwandeln, eine interne Form des Quellcodes, die der Computer versteht und mit der er arbeiten kann.Dieser Schritt wird normalerweise als Parsen bezeichnet, und die Software, die den Quellcode analysiert, wird als Parser bezeichnet.Häufig wird der Parser von einem Parser-Generator generiert, der eine formale Grammatik in Quell- oder Maschinencode umwandelt.Für eine gute, nicht-mathematische Erklärung des Parsens empfehle ich „Parsing Techniques – A Practical Guide“.Wikipedia bietet einen Vergleich von Parser-Generatoren, aus dem Sie den für Sie passenden auswählen können.Abhängig davon, für welchen Parser-Generator Sie sich entschieden haben, finden Sie im Internet Tutorials und für wirklich beliebte Parser-Generatoren (wie GNU Bison) gibt es auch Bücher.

Einen Parser für Ihre Sprache zu schreiben kann sehr schwierig sein, aber das hängt von Ihrer Grammatik ab.Daher empfehle ich, Ihre Grammatik einfach zu halten (im Gegensatz zu C++).Ein gutes Beispiel hierfür ist LISP.

Im zweiten Schritt wird der abstrakte Syntaxbaum von einer Baumstruktur in eine lineare Zwischendarstellung transformiert.Als gutes Beispiel hierfür wird oft der Bytecode von Lua genannt.Aber die Zwischendarstellung hängt wirklich von Ihrer Sprache ab.

Wenn Sie einen Interpreter erstellen, müssen Sie lediglich die Zwischendarstellung interpretieren.Sie können es auch Just-in-Time kompilieren.Für die Just-in-Time-Kompilierung empfehle ich LLVM und libjit.Um die Sprache nutzbar zu machen, müssen Sie auch einige Ein- und Ausgabefunktionen und möglicherweise eine kleine Standardbibliothek einbinden.

Wenn Sie die Sprache kompilieren, wird es komplizierter.Sie müssen Backends für verschiedene Computerarchitekturen schreiben und Maschinencode aus der Zwischendarstellung in diesen Backends generieren.Für diese Aufgabe empfehle ich LLVM.

Es gibt einige Bücher zu diesem Thema, aber ich kann keines davon für den allgemeinen Gebrauch empfehlen.Die meisten von ihnen sind zu akademisch oder zu praktisch.Es gibt kein „Bringen Sie sich das Compiler-Schreiben in 21 Tagen bei“ und daher müssen Sie mehrere Bücher kaufen, um ein gutes Verständnis des gesamten Themas zu erlangen.Wenn Sie im Internet suchen, werden Sie auf einige Online-Bücher und Vorlesungsskripte stoßen.Vielleicht gibt es in Ihrer Nähe eine Universitätsbibliothek, in der Sie Bücher über Compiler ausleihen können.

Ich empfehle außerdem gute Hintergrundkenntnisse in theoretischer Informatik und Graphentheorie, wenn Sie Ihr Projekt ernst nehmen wollen.Ein Abschluss in Informatik wäre ebenfalls hilfreich.

Ein Buch wurde noch nicht empfohlen, ist aber sehr wichtig „Linker und Loader“ von John Levine.Wenn Sie keinen externen Assembler verwenden, benötigen Sie eine Möglichkeit, eine Objektdatei auszugeben, die in Ihr endgültiges Programm eingebunden werden kann.Selbst wenn Sie einen externen Assembler verwenden, müssen Sie wahrscheinlich die Verschiebungen und die Funktionsweise des gesamten Programmladevorgangs verstehen, um ein funktionierendes Tool zu erstellen.Dieses Buch sammelt viele zufällige Hintergrundinformationen zu diesem Prozess für verschiedene Systeme, einschließlich Win32 und Linux.

Das Drachenbuch ist definitiv das Buch zum Erstellen von Compilern, aber wenn Ihre Sprache nicht ganz so kompliziert ist wie die aktuelle Generation von Sprachen, sollten Sie sich vielleicht das Interpreter-Muster von ansehen Designmuster.

Das Beispiel im Buch entwirft eine Sprache, die einem regulären Ausdruck ähnelt, und ist gut durchdacht, aber wie es im Buch heißt, eignet es sich gut zum Durchdenken des Prozesses, ist aber eigentlich nur bei kleinen Sprachen effektiv.Es ist jedoch viel schneller, mit diesem Muster einen Interpreter für eine kleine Sprache zu schreiben, als sich mit den verschiedenen Parsertypen, Yacc und Lex usw. vertraut zu machen ...

Wenn Sie bereit sind, LLVM zu verwenden, sehen Sie sich Folgendes an: http://llvm.org/docs/tutorial/.Es zeigt Ihnen, wie Sie mithilfe des LLVM-Frameworks einen Compiler von Grund auf schreiben, und setzt nicht voraus, dass Sie über Kenntnisse zu diesem Thema verfügen.

Das Tutorial schlägt vor, dass Sie Ihren eigenen Parser, Lexer usw. schreiben, aber ich rate Ihnen, sich mit Bison und Flex zu befassen, sobald Sie die Idee haben.Sie machen das Leben so viel einfacher.

Ich fand das Dragon-Buch viel zu schwer zu lesen und konzentrierte sich zu sehr auf die Sprachtheorie, die zum Schreiben eines Compilers in der Praxis nicht wirklich erforderlich ist.

Ich würde das hinzufügen Oberon Buch, das den vollständigen Quellcode eines erstaunlich schnellen und einfachen Oberon-Compilers enthält Projekt Oberon.

Alt text

Ich erinnere mich, dass ich diese Frage vor etwa sieben Jahren gestellt habe, als ich noch relativ neu im Programmieren war.

Ich war sehr vorsichtig, als ich gefragt habe, und überraschenderweise habe ich nicht so viel Kritik geerntet, wie Sie hier bekommen.Sie zeigten mir jedoch die Richtung „Drachenbuch„Das ist meiner Meinung nach ein wirklich tolles Buch, das alles erklärt, was man wissen muss, um einen Compiler zu schreiben (man muss natürlich ein oder zwei Sprachen beherrschen).Je mehr Sprachen Sie beherrschen, desto besser.

Und ja, viele Leute sagen, dass es verrückt sei, dieses Buch zu lesen, und dass man daraus nichts lernen würde, aber dem stimme ich überhaupt nicht zu.

Viele Leute sagen auch, dass das Schreiben von Compilern dumm und sinnlos sei.Nun, es gibt eine Reihe von Gründen, warum die Compilerentwicklung nützlich ist:

  • Weil es Spaß macht.
  • Es ist lehrreich. Wenn Sie lernen, wie man Compiler schreibt, lernen Sie viel über Informatik und andere Techniken, die beim Schreiben anderer Anwendungen nützlich sind.
  • Wenn niemand Compiler schreiben würde, würden die vorhandenen Sprachen nicht besser werden.

Ich habe nicht sofort meinen eigenen Compiler geschrieben, aber nachdem ich gefragt hatte, wusste ich, wo ich anfangen sollte.Und jetzt, nachdem ich viele verschiedene Sprachen gelernt und das Drachenbuch gelesen habe, ist das Schreiben kein so großes Problem mehr.(Ich studiere auch Informatik, aber das meiste, was ich über Programmierung weiß, habe ich mir selbst beigebracht.)

Zusammenfassend lässt sich sagen, dass das Drachenbuch ein großartiges „Tutorial“ ist.Nehmen Sie sich jedoch etwas Zeit, um ein oder zwei Sprachen zu beherrschen, bevor Sie versuchen, einen Compiler zu schreiben.Erwarten Sie jedoch nicht, innerhalb des nächsten Jahrzehnts oder so ein Compiler-Guru zu sein.

Das Buch ist auch gut, wenn Sie lernen möchten, wie man Parser/Interpreter schreibt.

„...Lasst uns einen Compiler bauen ...“

Ich würde es unterstützen http://compilers.iecc.com/crenshaw/ von @sasb.Vergessen Sie im Moment, weitere Bücher zu kaufen.

Warum?Werkzeuge und Sprache.

Die erforderliche Sprache ist Pascal und basiert, wenn ich mich richtig erinnere, auf Turbo-Pascal.Es passiert einfach so, wenn du dorthin gehst http://www.freepascal.org/ und laden Sie den Pascal-Compiler herunter. Alle Beispiele funktionieren direkt von der Seite ~ http://www.freepascal.org/download.var Das Schöne an Free Pascal ist, dass Sie es fast mit jedem Prozessor oder Betriebssystem verwenden können, das Ihnen in den Sinn kommt.

Sobald Sie die Lektionen gemeistert haben, versuchen Sie es mit den fortgeschritteneren Lektionen "Drachenbuch" ~ http://en.wikipedia.org/wiki/Dragon_book

Ich untersuche das gleiche Konzept und habe diesen vielversprechenden Artikel von Joel Pobar gefunden:

Erstellen Sie einen Sprachcompiler für das .NET Framework – ich bin mir nicht sicher, wo das geblieben ist

Erstellen Sie einen Sprachcompiler für das .NET Framework – PDF-Kopie des Originaldokuments

Er bespricht ein High-Level-Konzept eines Compilers und erfindet dann seine eigene Sprache für das .Net-Framework.Obwohl es auf das .Net Framework abzielt, sollten viele der Konzepte reproduziert werden können.Der Artikel behandelt:

  1. Sprachdefinition
  2. Scanner
  3. Parser (der Teil, der mich hauptsächlich interessiert)
  4. Ausrichtung auf das .Net Framework
  5. Code Generator

Es gibt noch andere Themen, aber du bekommst das Richtige.

Es richtet sich an Anfänger und ist in C# (nicht ganz Java) geschrieben.

HTH

Knochen

Eine einfache Möglichkeit, einen Compiler zu erstellen, besteht darin, Bison und Flex (oder ähnliches) zu verwenden, einen Baum (AST) zu erstellen und Code in C zu generieren.Dabei ist die Generierung von C-Code der wichtigste Schritt.Durch die Generierung von C-Code funktioniert Ihre Sprache automatisch auf allen Plattformen, die über einen C-Compiler verfügen.

Das Generieren von C-Code ist genauso einfach wie das Generieren von HTML (verwenden Sie einfach print oder ein gleichwertiges Mittel), was wiederum viel einfacher ist als das Schreiben eines C-Parsers oder HTML-Parsers.

Von dem FAQ zu comp.compilers:

"Programmieren eines PC" von pro Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

In diesem Buch mit dem Titel wird das Design und die Erstellung einer Einzelbenutzer-Programmierumgebung für Micros unter Verwendung einer pascalähnlichen Sprache namens Edison erklärt.Der Autor präsentiert alle Quellcode und Erläuterungen für die Schritt-für-Schritt-Implementierung eines Edison-Compilers und einfachen unterstützenden Betriebssystems, die alle in Edison selbst geschrieben wurden (mit Ausnahme eines kleinen unterstützenden Kernels in einem symbolischen Assembler für PDP 11/23;Die vollständige Quelle kann auch für den IBM -PC bestellt werden).

Das Interessanteste an diesem Buch ist:1) Seine Fähigkeit, zu demonstrieren, wie ein vollständiges, in sich geschlossenes, selbstverständlicher, nützlicher Compiler und Betriebssystem erstellt werden kann, und 2) Die interessante Diskussion über Probleme und Spezifikationsprobleme und -verschreibungen in Kapitel 2.

"Brinch Hansen über Pascal Compiler" von pro Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Ein weiteres Licht-auf-theory-Schwere-Pragmatik hier ist wie das Buch.Der Autor präsentiert den Entwurf, die Implementierung und den vollständigen Quellcode für einen Compiler- und P-Code-Interpreter für Pascal- (Pascal "minus"), eine Pascal-Untergruppe mit Booleschen und ganzzahligen Typen (aber keine Zeichen, Real, untergelegt oder aufgezählt) , Konstante und variable Definitionen sowie Array- und Datensatztypen (aber keine verpackten, varianten, festgelegten, zeigeren, namenlosen, umbenannten oder Dateitypen), Ausdrücke, Zuweisungsanweisungen, verschachtelte Prozedurdefinitionen mit Wert und variablen Parametern, wenn Anweisungen, während Aussagen, Anweisungen, und Beginn-End-Blöcke (jedoch keine Funktionsdefinitionen, Verfahrensparameter, GOTO-Anweisungen und -bezeichnungen, Fallanweisungen, Wiederholungsanweisungen, für Anweisungen und mit Aussagen).

Der Compiler und der Dolmetscher sind in Pascal* (Pascal "Stern") geschrieben, einer Pascal-Untergruppe mit einigen Funktionen im Edison-Stil für die Erstellung von Softwareentwicklungssystemen.Ein Pascal* Compiler für den IBM-PC wird vom Autor verkauft, aber es ist einfach, den Pascal-Compiler des Buches auf jede bequeme Pascal-Plattform zu portieren.

Dieses Buch macht den Entwurf und die Implementierung eines Compilers einfach.Ich mag besonders die Art und Weise, wie sich der Autor mit Qualität, Zuverlässigkeit und Tests befasst.Der Compiler und der Dolmetscher können problemlos als Grundlage für ein involviertes Sprach- oder Compiler -Projekt verwendet werden, insbesondere wenn Sie dazu gedrückt werden, schnell etwas in Betrieb zu nehmen.

Sie sollten sich Darius Bacons „ichbins", ein Compiler für einen kleinen Lisp-Dialekt, der auf C abzielt, in etwas mehr als 6 Seiten Code.Der Vorteil gegenüber den meisten Spielzeug-Compilern besteht darin, dass die Sprache so vollständig ist, dass der Compiler darin geschrieben werden kann.(Der Tarball enthält auch einen Interpreter, um das Ding zu booten.)

Es gibt noch mehr darüber, was ich beim Erlernen des Schreibens eines Compilers auf meinem Computer nützlich fand Ur-Schema Website.

Python wird mit einem in Python geschriebenen Python-Compiler geliefert.Sie können den Quellcode sehen und er umfasst alle Phasen, vom Parsen über den abstrakten Syntaxbaum bis zur Codeausgabe usw.Hack es.

Der LCC-Compiler (Wikipedia) (Projekthomepage) von Fraser und Hanson wird in ihrem Buch „A Retargetable C Compiler“ beschrieben:Design und Umsetzung“.Es ist gut lesbar und erklärt den gesamten Compiler bis hin zur Codegenerierung.

Leider ist es auf Spanisch, aber dies ist die Bibliographie eines Kurses namens „Compiladores e Intérpretes“ (Compiler und Dolmetscher) in Argentinien.

Der Kurs befasste sich mit der formalen Sprachtheorie und der Compilerkonstruktion. Dies sind die Themen, die Sie benötigen, um zumindest einen einfachen Compiler zu erstellen:

  • Compiler-Design in C.
    Allen I.Holub

    Prentice-Hall.1990.

  • Compiladores.Teoría y Construcción.
    Sanchís llorca, fj, Galán Pascual, C.Redaktionelle Paraninfo.1988.

  • Compiler-Konstruktion.
    Niklaus Wirth

    Addison-Wesley.1996.

  • Sprachen, Grammatiken und Automaten.Ein praktischer Leitfaden.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán.Addison-Wesley Iberoamericana (España).1997.

  • Die Kunst des Compiler-Designs.Theorie und Praxis.
    Thomas Pittman, James Peters.

    Prentice-Hall.1992.

  • Objektorientierte Compilerkonstruktion.
    Jim Holmes.
    Prentice Hall, Englewood Cliffs, NJ1995

  • Compiladores.Conceptos Fundamentales.
    B.Teufel, S.Schmidt, T.Teufel.

    Addison-Wesley Iberoamericana.1995.

  • Einführung in die Automatentheorie, Sprachen und Berechnung.

    John E.Hopcroft.Jeffref D.Ullmann.
    Addison-Wesley.1979.

  • Einführung in formale Sprachen.
    György E.Révész.

    Mc Graw Hill.1983.

  • Parsing-Techniken.Ein praktischer Leitfaden.
    Dick Grune, Ceriel Jacobs.
    Impreso por los Autores.1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc:Noch ein Compiler-Compiler.
    Stephen C.Johnson
    Technischer Bericht von Computing Science Nr. 32, 1975.Glockenlabors.Murray Hill, Neu
    Jersey.

  • Lex:Ein lexikalischer Analysatorgenerator.
    M.E.Lesk, E.Schmidt.Technischer Bericht von Computing Science Nr. 39, 1975.Bell Laboratories.Murray Hill, New Jersey.

  • Lex & Yacc.
    John R.Levine, Tony Mason, Doug Brown.
    O’Reilly & Associates.1995.

  • Elemente der Berechnungstheorie.
    Harry R.Lewis, Christos H.Papadimitriou.Zweite Ausgabe.Prentice Hall.1998.

  • Ein effizienter Algorithmus für die Konstruktion des Abhängigkeitsdiagramms.
    Salvador V.Cavadini.
    Trabajo Final de Grado, um den Titel des Ingenieurs in der Informatik zu erhalten.
    Facultad de Matemática Aplicada.U.C.S.E.2001.

  1. Das ist ein umfangreiches Thema.Unterschätzen Sie diesen Punkt nicht.Und unterschätzen Sie nicht meinen Standpunkt, es nicht zu unterschätzen.
  2. Ich höre das Drachenbuch ist neben der Suche ein (der?) Ausgangspunkt.:) Werde besser im Suchen, irgendwann wird es dein Leben sein.
  3. Eine eigene Programmiersprache zu entwickeln ist absolut eine gute Übung!Aber seien Sie sich darüber im Klaren, dass es am Ende nie für einen praktischen Zweck verwendet wird.Ausnahmen hiervon gibt es nur wenige und sehr weit dazwischen.

Kein Buch, sondern ein Fachartikel und eine enorm unterhaltsame Lernerfahrung, wenn Sie mehr über Compiler (und Metacompiler) erfahren möchten ...Diese Website führt Sie durch den Aufbau eines vollständig eigenständigen Compilersystems, das sich selbst und andere Sprachen kompilieren kann:

Lernprogramm:Metacompiler Teil 1

Dies alles basiert auf einem erstaunlichen kleinen 10-seitigen technischen Artikel:

Val Schorre META II:Eine syntaxorientierte Compiler-Schreibsprache

von Ehrlich-zu-Gott 1964.Ich habe daraus bereits 1970 gelernt, wie man Compiler baut.Es gibt einen überwältigenden Moment, wenn Sie endlich verstehen, wie sich der Compiler selbst regenerieren kann ...

Ich kenne den Website-Autor aus meiner Studienzeit, habe aber nichts mit der Website zu tun.

Hier gibt es viele gute Antworten, daher dachte ich, ich füge der Liste noch eine hinzu:

Ich habe mir vor mehr als einem Jahrzehnt ein Buch mit dem Titel „Project Oberon“ besorgt, das einige sehr gut geschriebene Texte auf dem Compiler enthält.Das Buch zeichnet sich wirklich dadurch aus, dass die Quelle und die Erklärungen sehr praxisnah und lesbar sind.Der vollständige Text (Ausgabe 2005) steht im PDF-Format zur Verfügung, sodass Sie ihn jetzt herunterladen können.Der Compiler wird in Kapitel 12 besprochen:

http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknecht

(Die Behandlung ist nicht so umfangreich wie sein Buch über Compiler)

Ich habe mehrere Bücher über Compiler gelesen und kann mich dem Drachenbuch anschließen. Die Zeit, die ich in dieses Buch investiert habe, ist sehr lohnenswert.

Wenn Sie daran interessiert sind, einen Compiler für eine funktionale Sprache (und nicht für eine prozedurale) zu schreiben, lesen Sie Simon Peyton-Jones und David Lesters „Funktionale Sprachen implementieren:ein Tutorial„ist ein ausgezeichneter Ratgeber.

Die konzeptionellen Grundlagen der Funktionsweise der funktionalen Bewertung werden durch Beispiele in einer einfachen, aber leistungsstarken funktionalen Sprache namens „Core“ vermittelt.Darüber hinaus wird jeder Teil des Core-Sprachcompilers anhand von Codebeispielen in Miranda (einer rein funktionalen Sprache, die Haskell sehr ähnlich ist) erklärt.

Es werden verschiedene Arten von Compilern beschrieben, aber selbst wenn Sie nur dem sogenannten Template-Compiler für Core folgen, werden Sie ein hervorragendes Verständnis dafür haben, was funktionale Programmierung ausmacht.

ich mochte Crenshaw-Tutorial auch, weil es absolut klar macht, dass ein Compiler nur ein weiteres Programm ist, das einige Eingaben liest und einige Ausgaben schreibt.

Lies es.

Arbeiten Sie daran, wenn Sie möchten, aber schauen Sie sich dann eine andere Referenz an, die zeigt, wie größere und vollständigere Compiler wirklich geschrieben werden.

Und lese Über vertrauensvolles Vertrauen, um einen Hinweis auf die nicht offensichtlichen Dinge zu bekommen, die in diesem Bereich getan werden können.

Sie können verwenden BCEL von der Apache Software Foundation.Mit diesem Tool können Sie Assembler-ähnlichen Code generieren, allerdings ist es Java mit der BCEL-API.Sie können lernen, wie Sie Zwischensprachencode (in diesem Fall Bytecode) generieren können.

Einfaches Beispiel

  1. Erstellen Sie eine Java-Klasse mit dieser Funktion:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Führen Sie nun BCELifier mit dieser Klasse aus

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

Sie können das Ergebnis auf der Konsole für die gesamte Klasse sehen (wie man den Bytecode MyClass.java erstellt).Der Code für die Funktion lautet wie folgt:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

Bisher nicht in der Liste enthalten ist dieses Buch:

Grundlagen des Compiler-Designs (Torben Mogensen)(aus der Abt.für Informatik, Universität Kopenhagen)

Ich bin auch daran interessiert, etwas über Compiler zu lernen und habe vor, in den nächsten Jahren in diese Branche einzusteigen.Meiner Meinung nach ist dieses Buch das ideale Theoriebuch, um mit dem Erlernen von Compilern zu beginnen.Es ist KOSTENLOS zu kopieren und zu reproduzieren, sauber und sorgfältig geschrieben und wird Ihnen in einfachem Englisch ohne jeglichen Code zur Verfügung gestellt, stellt aber dennoch die Mechanik anhand von Anweisungen und Diagrammen usw. dar.Meiner Meinung nach einen Blick wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top