language agnostic - Einen Compiler schreiben lernen

Translate

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

Ich suche nach hilfreichen Büchern / Tutorials, wie Sie Ihren eigenen Compiler nur zu Bildungszwecken schreiben können. Ich bin mit C / C ++, Java und Ruby am besten vertraut, daher bevorzuge ich Ressourcen, die eine dieser drei beinhalten, aber jede gute Ressource ist akzeptabel.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Große Liste von Ressourcen:

Legende:

  • ¶ Link zu einer PDF-Datei
  • $ Link zu einem gedruckten Buch
Quelle
Allen Lee
Translate

Das 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 untere. Die obere Hälfte nimmt im Allgemeinen die Ausgangssprache und konvertiert sie in eine Zwischendarstellung, und die untere Hälfte kümmert sich um die plattformspezifische Codegenerierung.

Eine Idee für eine einfache Herangehensweise an dieses Thema (die wir zumindest in meiner Compiler-Klasse verwendet haben) besteht darin, den Compiler in den beiden oben beschriebenen Teilen zu erstellen. Insbesondere erhalten Sie eine gute Vorstellung vom gesamten Prozess, indem Sie nur die obere Hälfte erstellen.

Wenn Sie nur die obere Hälfte ausführen, können Sie den lexikalischen Analysator und den Parser schreiben und einen "Code" (die von mir erwähnte Zwischendarstellung) generieren. Es wird also Ihr Quellprogramm nehmen und es in eine andere Darstellung konvertieren und einige Optimierungen vornehmen (wenn Sie möchten), was das Herz eines Compilers ist. Die untere Hälfte nimmt dann diese Zwischendarstellung und generiert die Bytes, die zum Ausführen des Programms auf einer bestimmten Architektur erforderlich sind. In der unteren Hälfte wird beispielsweise Ihre Zwischendarstellung verwendet und eine ausführbare PE-Datei generiert.

Einige Bücher zu diesem Thema, die ich besonders hilfreich fand, warenPrinzipien und Techniken der Compiler(oder das Drachenbuch, wegen des niedlichen Drachen auf dem Cover). Es hat eine großartige Theorie und deckt definitiv kontextfreie Grammatiken auf wirklich zugängliche Weise ab. Zum Erstellen des lexikalischen Analysators und Parsers werden Sie wahrscheinlich die * nix-Tools lex und yacc verwenden. Und uninteressant genug, das Buch mit dem Titel "Lex und Yacc"hat dort angefangen, wo das Drachenbuch für diesen Teil aufgehört hat.

Quelle
Translate

Meiner Ansicht nachModerne Compiler-Implementierung in MList der beste einführende Compiler, der Text schreibt. Da ist einJava-Versionund einC-VersionAuch beides ist aufgrund Ihres Sprachhintergrunds möglicherweise leichter zugänglich. Das Buch enthält viele nützliche Grundmaterialien (Scannen und Parsen, semantische Analyse, Aktivierungsdatensätze, Anweisungsauswahl, native RISC- und x86-Codegenerierung) und verschiedene "erweiterte" Themen (Kompilieren von OO- und Funktionssprachen, Polymorphismus, Speicherbereinigung, Optimierung und einzelnes statisches Zuweisungsformular) auf relativ wenig Platz (~ 500 Seiten).

Ich bevorzuge die Modern Compiler-Implementierung gegenüber dem Dragon-Buch, da die Modern Compiler-Implementierung weniger Feldforschung betreibt - stattdessen werden alle Themen, die Sie zum Schreiben eines seriösen, anständigen Compilers benötigen, wirklich solide abgedeckt. Nachdem Sie dieses Buch durchgearbeitet haben, können Sie Forschungsarbeiten bei Bedarf direkt vertiefen.

Ich muss gestehen, dass ich eine ernsthafte Schwäche für Niklaus Wirth habeCompilerkonstruktion.Es istOnline verfügbarals PDF. Ich finde Wirths Programmierästhetik einfach wunderschön, aber einige Leute finden seinen Stil zu minimal (zum Beispiel bevorzugt Wirth Parser für rekursiven Abstieg, aber die meisten CS-Kurse konzentrieren sich auf Parser-Generator-Tools; Wirths Sprachdesigns sind ziemlich konservativ.) Die Compiler-Konstruktion ist eine sehr prägnante Destillation von Wirths Grundideen, also ob Sie seinen Stil mögen oder nicht, ich empfehle dringend, dieses Buch zu lesen.

Quelle
Brian Lee
Translate

Ich stimme der Referenz zum Drachenbuch zu. IMO, es ist der endgültige Leitfaden für die Compilerkonstruktion. Machen Sie sich jedoch bereit für eine Hardcore-Theorie.

Wenn Sie ein Buch wollen, das theoretisch leichter ist,Game Scripting Masterykönnte ein besseres Buch für Sie sein. Wenn Sie ein absoluter Neuling in der Compilertheorie sind, bietet dies eine sanftere Einführung. Es werden keine praktischeren Parsing-Methoden behandelt (die sich für einen nicht vorhersagenden rekursiven Abstieg entscheiden, ohne das LL- oder LR-Parsing zu diskutieren), und wie ich mich erinnere, wird nicht einmal irgendeine Optimierungstheorie diskutiert. Anstatt zu Maschinencode zu kompilieren, wird zu einem Bytecode kompiliert, der auf einer VM ausgeführt werden soll, die Sie auch schreiben.

Es ist immer noch eine anständige Lektüre, besonders wenn Sie es günstig bei Amazon kaufen können. Wenn Sie nur eine einfache Einführung in Compiler wünschen, ist Game Scripting Mastery kein schlechter Weg. Wenn Sie von vornherein Hardcore spielen möchten, sollten Sie sich mit nichts weniger als dem Drachenbuch zufrieden geben.

Quelle
RBz
Translate

"Lassen Sie uns einen Compiler erstellen"ist großartig, aber etwas veraltet. (Ich sage nicht, dass es dadurch noch ein bisschen weniger gültig wird.)

Oder auscheckenSLANG. Dies ähnelt "Let's Build a Compiler", ist jedoch eine viel bessere Ressource, insbesondere für Anfänger. Dies wird mit einem PDF-Tutorial geliefert, das einen 7-stufigen Ansatz zum Unterrichten eines Compilers verfolgt. Hinzufügen des Quora-Links, da er die Links zu allen verschiedenen Ports von SLANG in C ++, Java und JS enthält, sowie Interpreter in Python und Java, die ursprünglich mit C # und der .NET-Plattform geschrieben wurden.

Quelle
Translate

Wenn Sie leistungsstarke Tools auf höherer Ebene verwenden möchten, anstatt zu erstellenallessich selbst durch die Projekte und Lesungen fürdieser Kursist 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 erhaltendie Pragmatischen Programmierer.

Der Kurs behandelt die Standard-Compiler-Compiler-Inhalte, die Sie an anderer Stelle sehen würden: Parsen, Typen- und Typprüfung, Polymorphismus, Symboltabellen und Codegenerierung. Das einzige, was nicht behandelt wird, sind Optimierungen. Das endgültige Projekt ist ein Programm, daskompiliert 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 Existenznachweis dafür, obwohl ich ~ 24 Stunden meine). Es ist schwer in der praktischen Technik mit modernen Werkzeugen, etwas leichter in der Theorie.

LLVM ist übrigens einfach fantastisch. In vielen Situationen, in denen Sie normalerweise bis zur Assembly kompilieren, ist das Kompilieren viel besserZwischenvertretung von LLVMstattdessen. Es ist übergeordnet, plattformübergreifend und LLVM ist ziemlich gut darin, daraus eine optimierte Montage zu generieren.

Quelle
Translate

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

Quelle
Elijah Lee
Translate

Vielleicht möchten Sie sich Lex / Yacc ansehen (oder Flex / Bison, wie auch immer Sie sie nennen möchten). Flex ist ein lexikalischer Analysator, der die semantischen Komponenten ("Token") Ihrer Sprache analysiert und identifiziert. Mit Bison wird definiert, was passiert, wenn jedes Token analysiert wird. Dies könnte sein, ist aber definitiv nicht darauf beschränkt, C-Code für einen Compiler auszudrucken, der zu C kompiliert werden würde, oder die Anweisungen dynamisch auszuführen.

Diese FAQsollte Ihnen helfen, unddieses Tutorialsieht sehr nützlich aus.

Quelle
Zenobia Lee
Translate

Im Allgemeinen gibt es kein fünfminütiges Tutorial für Compiler, da es 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. Es ist im Allgemeinen 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, den der Computer versteht und verarbeiten kann. Dieser Schritt wird normalerweise als Parsing bezeichnet, und die Software, die den Quellcode analysiert, wird als Parser bezeichnet. Oft 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 denen Sie den für Sie geeigneten auswählen können. Abhängig vom gewählten Parser-Generator finden Sie im Internet Tutorials und für sehr beliebte Parser-Generatoren (wie GNU Bison) gibt es auch Bücher.

Das Schreiben eines Parsers für Ihre Sprache kann sehr schwierig sein, dies hängt jedoch von Ihrer Grammatik ab. Daher schlage ich vor, 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 hierfür wird häufig der Bytecode von Lua angeführt. 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. Ich empfehle LLVM und libjit für die Just-in-Time-Kompilierung. Um die Sprache nutzbar zu machen, müssen Sie auch einige Eingabe- und Ausgabefunktionen und möglicherweise eine kleine Standardbibliothek enthalten.

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. Ich empfehle LLVM für diese Aufgabe.

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

Ich empfehle auch gute Hintergrundkenntnisse in theoretischer Informatik und Graphentheorie, wenn Sie Ihr Projekt ernst nehmen wollen. Ein Abschluss in Informatik wird ebenfalls hilfreich sein.

Quelle
Deborah Lee
Translate

Ein Buch, das noch nicht vorgeschlagen, aber sehr wichtig ist, ist"Linker und Lader"von John Levine. Wenn Sie keinen externen Assembler verwenden, benötigen Sie eine Möglichkeit, eine Objektdatei auszugeben, die mit Ihrem endgültigen Programm verknüpft 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 Informationen über diesen Prozess für verschiedene Systeme, einschließlich Win32 und Linux.

Quelle
Cliff Lee
Translate

Das Drachenbuchist definitiv das Buch "Compiler erstellen", aber wenn Ihre Sprache nicht ganz so kompliziert ist wie die aktuelle Sprachgeneration, sollten Sie sich das Interpreter-Muster von ansehenDesignmuster.

Das Beispiel im Buch entwirft eine Sprache, die einem regulären Ausdruck ähnelt, und ist gut durchdacht, aber wie es im Buch heißt, ist es gut, um den Prozess zu durchdenken, aber es ist wirklich nur bei kleinen Sprachen wirksam. Es ist jedoch viel schneller, einen Interpreter für eine kleine Sprache mit diesem Muster zu schreiben, als sich mit den verschiedenen Arten von Parsern, Yacc und Lex usw. vertraut zu machen.

Quelle
Esther Lee
Translate

Wenn Sie bereit sind, LLVM zu verwenden, überprüfen Sie Folgendes:http://llvm.org/docs/tutorial/. Es zeigt Ihnen, wie Sie mit dem LLVM-Framework einen Compiler von Grund auf neu schreiben, und setzt nicht voraus, dass Sie über Kenntnisse zu diesem Thema verfügen.

Das Tutorial schlägt vor, dass Sie Ihren eigenen Parser und 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.

Quelle
Translate

Ich fand das Dragon-Buch viel zu schwer zu lesen, da ich mich zu sehr auf die Sprachtheorie konzentrierte, die nicht wirklich erforderlich ist, um einen Compiler in der Praxis zu schreiben.

Ich würde das hinzufügenOberonBuch, das die vollständige Quelle eines erstaunlich schnellen und einfachen Oberon-Compilers enthältProjekt Oberon.

Alt text

Quelle
Translate

Ich erinnere mich, dass ich diese Frage vor etwa sieben Jahren gestellt habe, als ich noch nicht mit dem Programmieren vertraut war.

Ich war sehr vorsichtig, als ich fragte, und überraschenderweise bekam ich nicht so viel Kritik wie Sie hier. Sie wiesen mich jedoch in Richtung "Drachenbuch"Das ist meiner Meinung nach ein wirklich großartiges Buch, das alles erklärt, was Sie wissen müssen, um einen Compiler zu schreiben (Sie müssen natürlich ein oder zwei Sprachen beherrschen. Je mehr Sprachen Sie kennen, desto besser.).

Und ja, viele Leute sagen, dass das Lesen dieses Buches verrückt ist und Sie nichts daraus lernen werden, aber ich stimme dem überhaupt nicht zu.

Viele Leute sagen auch, dass das Schreiben von Compilern dumm und sinnlos ist. 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. (Ich studiere auch Computertechnik atm, aber das meiste, was ich über Programmierung weiß, ist Autodidakt.)

Zusammenfassend ist das Drachenbuch ein großartiges "Tutorial". Aber verbringen Sie einige Zeit damit, eine oder zwei Sprachen zu beherrschen, bevor Sie versuchen, einen Compiler zu schreiben. Erwarten Sie jedoch nicht, in den nächsten zehn Jahren ein Compiler-Guru zu sein.

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

Quelle
Translate

"... Lassen Sie uns einen Compiler erstellen ..."

Ich würde zweitenshttp://compilers.iecc.com/crenshaw/durch@ Sasb. Vergessen Sie für den Moment, mehr Bücher zu kaufen.

Warum? Werkzeuge & Sprache.

Die erforderliche Sprache ist Pascal und wenn ich mich richtig erinnere, basiert sie auf Turbo-Pascal. Es passiert einfach so, wenn du gehsthttp://www.freepascal.org/und laden Sie den Pascal-Compiler herunter. Alle Beispiele funktionieren direkt von der Seite ~http://www.freepascal.org/download.varDas Schöne an Free Pascal ist, dass Sie es fast mit jedem Prozessor oder Betriebssystem verwenden können, für das Sie sich interessieren.

Wenn Sie die Lektionen gemeistert haben, probieren Sie die fortgeschritteneren aus"Drachenbuch"~http://en.wikipedia.org/wiki/Dragon_book

Quelle
Translate

Ich beschäftige mich mit dem gleichen Konzept und habe diesen vielversprechenden Artikel von Joel Pobar gefunden.

Erstellen Sie einen Sprachcompiler für .NET Framework - nicht sicher, wohin dies geführt hat

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

Er diskutiert ein übergeordnetes Konzept eines Compilers und erfindet seine eigene Sprache für das .Net-Framework. Obwohl es auf das .NET Framework abzielt, sollten viele der Konzepte reproduzierbar sein. Der Artikel umfasst:

  1. Langauge Definition
  2. Scanner
  3. Parser (das bisschen interessiert mich hauptsächlich)
  4. Targeting des .Net Frameworks
  5. Code Generator

Es gibt andere Themen, aber Sie bekommen die gerechte.

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

HTH

Knochen

Quelle
Mike Lee
Translate

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. Das Generieren von C-Code ist der wichtigste Schritt. Durch das Generieren von C-Code funktioniert Ihre Sprache automatisch auf allen Plattformen mit einem C-Compiler.

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

Quelle
Translate

Von demcomp.compilers FAQ:

"Programmieren eines Personal Computers" von Per Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

Dieses leider betitelte Buch erklärt das Design und die Erstellung einer Einzelbenutzer-Programmierumgebung für Mikros unter Verwendung einer Pascal-ähnlichen Sprache namens Edison. Der Autor präsentiert den gesamten Quellcode und Erklärungen für die schrittweise Implementierung eines Edison-Compilers und eines einfachen unterstützenden Betriebssystems, die alle in Edison selbst geschrieben sind (mit Ausnahme eines kleinen unterstützenden Kernels, der in einem symbolischen Assembler für PDP 11/23 geschrieben ist; Die vollständige Quelle kann auch für den IBM PC bestellt werden.

Die interessantesten Dinge an diesem Buch sind: 1) seine Fähigkeit zu demonstrieren, wie ein vollständiges, in sich geschlossenes, sich selbst wartendes, nützliches Compiler- und Betriebssystem erstellt werden kann, und 2) die interessante Diskussion über Sprachdesign- und Spezifikationsprobleme und Handel - Offs in Kapitel 2.

"Brinch Hansen on Pascal Compilers" von Per Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Ein weiteres leichtes, theoretisches und pragmatisches Buch ist das How-to-Code-It-Buch. Der Autor präsentiert das Design, die Implementierung und den vollständigen Quellcode für einen Compiler und einen P-Code-Interpreter für Pascal- (Pascal "minus"), eine Pascal-Teilmenge mit booleschen und ganzzahligen Typen (aber keine Zeichen, Reals, untergeordneten oder aufgezählten Typen). , Konstanten- und Variablendefinitionen sowie Array- und Datensatztypen (jedoch keine gepackten, Varianten-, Mengen-, Zeiger-, namenlosen, umbenannten oder Dateitypen), Ausdrücke, Zuweisungsanweisungen, verschachtelte Prozedurdefinitionen mit Wert- und Variablenparametern, if-Anweisungen, while-Anweisungen, und Anfang-Ende-Blöcke (aber keine Funktionsdefinitionen, Prozedurparameter, goto-Anweisungen und Beschriftungen, case-Anweisungen, Wiederholungsanweisungen, für Anweisungen und mit Anweisungen).

Der Compiler und der Interpreter sind in Pascal * (Pascal "Stern") geschrieben, einer Pascal-Teilmenge, die um einige Funktionen im Edison-Stil zum Erstellen von Softwareentwicklungssystemen erweitert wurde. 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 das Design und die Implementierung eines Compilers einfach. Mir gefällt besonders, wie sich der Autor mit Qualität, Zuverlässigkeit und Tests befasst. Der Compiler und der Interpreter können leicht als Grundlage für ein komplexeres Sprach- oder Compilerprojekt verwendet werden, insbesondere wenn Sie gezwungen sind, schnell etwas zum Laufen zu bringen.

Quelle
Adelaide Lee
Translate

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

Es gibt mehr Dinge darüber, was ich nützlich fand, um zu lernen, einen Compiler auf meinem zu schreibenUr-SchemaWebsite.

Quelle
Translate

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 hin zum Ausgeben von Code usw. Hacken Sie ihn.

Quelle
mfx
Translate

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

Quelle
Archer Lee
Translate

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

Der Kurs war von der formalen Sprachtheorie bis zur Compilerkonstruktion, und 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. Editorial Paraninfo. 1988.

  • Compilerkonstruktion.
    Niklaus Wirth

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas y Autómatas. Un enfoque práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán. Addison-Wesley Iberoamericana (España). 1997.

  • Die Kunst des Compilerdesigns. Theorie und Praxis.
    Thomas Pittman, James Peters.

    Prentice-Hall. 1992.

  • Objektorientierte Compilerkonstruktion.
    Jim Holmes.
    Prentice Hall, Englewood Cliffs, NJ 1995

  • 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. Ullman.
    Addison-Wesley. 1979.

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

    Mc Graw Hill. 1983.

  • Analysetechniken. 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
    Computer Science Technical Report Nr. 32, 1975. Bell Laboratories. Murray Hill, Neu
    Jersey.

  • Lex: Ein Lexical Analyzer Generator.
    ME Lesk, E. Schmidt. Computing Science Technical Report Nr. 39, 1975. Bell Laboratories. Murray Hill, New Jersey.

  • lex & yacc.
    John R. Levine, Tony Mason und Doug Brown.
    O'Reilly & Associates. 1995.

  • Elemente der Berechnungstheorie.
    Harry R. Lewis, Christos H. Papadimitriou. Segunda Edición. Prentice Hall. 1998.

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
    Salvador V. Cavadini.
    Trabajo Finale de Grado für obtener el Título de Ingeniero en Computación.
    Facultad de Matemática Aplicada. UCSE 2001.

Quelle
Translate
  1. Dies ist ein großes Thema. Unterschätzen Sie diesen Punkt nicht. Und unterschätze meinen Standpunkt nicht, ihn nicht zu unterschätzen.
  2. Ich höre dasDrachenbuchist ein (der?) Ort, um zusammen mit der Suche zu beginnen. :) Werden Sie besser in der Suche, irgendwann wird es Ihr Leben sein.
  3. Das Erstellen einer eigenen Programmiersprache ist eine absolut gute Übung! Aber wissen Sie, dass es am Ende niemals für einen praktischen Zweck verwendet wird. Ausnahmen gibt es nur wenige undsehrweit dazwischen.
Quelle
Translate

Kein Buch, sondern ein technisches Dokument 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:

Tutorial: Metacompiler Teil 1

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

Val Schorre META II: Eine syntaxorientierte Compiler-Schreibsprache

Ich habe 1970 gelernt, wie man Compiler daraus baut. Es gibt einen atemberaubenden Moment, in dem man endlich darüber nachdenkt, wie sich der Compiler selbst regenerieren kann ...

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

Quelle
Translate

Hier gibt es viele gute Antworten, daher dachte ich, ich würde der Liste noch eine hinzufügen:

Ich habe vor mehr als einem Jahrzehnt ein Buch namens Project Oberon bekommen, das einen sehr gut geschriebenen Text auf dem Compiler enthält. Das Buch zeichnet sich wirklich dadurch aus, dass die Quelle und die Erklärungen sehr praktisch und lesbar sind. Der vollständige Text (Ausgabe 2005) wurde als PDF zur Verfügung gestellt, sodass Sie ihn jetzt herunterladen können. Der Compiler wird in Kapitel 12 erläutert:

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 ich kann das Drachenbuch unterstützen. Die Zeit, die ich für dieses Buch aufgewendet habe, ist sehr lohnenswert.

Quelle
Jamie Lee
Translate

Wenn Sie daran interessiert sind, einen Compiler für eine funktionale Sprache (und nicht für eine prozedurale) zu schreiben, schreiben Simon Peyton-Jones und David Lester "Funktionssprachen implementieren: ein Tutorial"ist ein ausgezeichneter Führer.

Die konzeptionellen Grundlagen der Funktionsweise der Funktionsbewertung werden anhand von Beispielen in einer einfachen, aber leistungsstarken Funktionssprache namens "Core" geleitet. Zusätzlich wird jeder Teil des Core Language Compilers mit Codebeispielen in Miranda (einer reinen Funktionssprache, 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, haben Sie ein hervorragendes Verständnis dafür, wie funktionale Programmierung funktioniert.

Quelle
Translate

Sie können verwendenBCELvon der Apache Software Foundation. Mit diesem Tool können Sie Assembler-ähnlichen Code generieren, aber es ist Java mit der BCEL-API. Sie können lernen, wie Sie einen 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 der Bytecode MyClass.java erstellt wird). Der Code für die Funktion lautet:

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();
}
Quelle
Translate

ich mochte dasCrenshaw-Tutorialauch, weil es absolut klar macht, dass ein Compiler nur ein anderes Programm ist, das einige Eingaben liest und einige Ausgaben ausgibt.

Lies es.

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

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

Quelle
Borg Lee
Translate

Dieses Buch ist bisher nicht in der Liste enthalten:

Grundlagen des Compilerdesigns (Torben Mogensen)(von der Fakultät für Informatik der Universität Kopenhagen)

Ich bin auch daran interessiert, etwas über Compiler zu lernen und plane, in den nächsten Jahren in diese Branche einzusteigen. Soweit ich sehen kann, ist dieses Buch das ideale Theoriebuch, um Compiler zu lernen. Es ist KOSTENLOS zu kopieren und zu reproduzieren, sauber und sorgfältig geschrieben und wird Ihnen in einfachem Englisch ohne Code zur Verfügung gestellt, präsentiert aber dennoch die Mechanik anhand von Anweisungen und Diagrammen usw. Einen Blick wert.

Quelle