Ich habe eine Erfahrung über die Compiler-Sätze und ich interessiere mich für Programmiersprachen & Compiler Feld und ich hoffe, jemand gibt mir eine Erklärung darüber, was ist der gute Ansatz, einen neuen Compiler von Grund auf für eine neue Programmiersprache zu schreiben? (Ich meine STEPS).Was ist der gute Ansatz, um einen neuen Compiler zu erstellen?
Antwort
Der erste Schritt ist das Lesen der .
Es bietet eine gute Einführung in das gesamte Gebiet des Compiler-Buildings, aber geht auch in genügend Details, um tatsächlich Ihre eigenen zu bauen.
Für die folgenden Schritte schlage ich vor, die Kapitel des Buches zu folgen. Es ist nicht als Tutorial geschrieben, bietet aber viele praktische Ratschläge, was es zu einem idealen Zentrum für eigene Ideen und Forschung macht.
Ich würde versuchen, Ihre Sprache/Front-End mit dem GNU-Compiler-Framework zu integrieren.
So müssen Sie nur (NUR!) Den Parser und den Übersetzer in das portable Objektformat von gcc schreiben. Sie erhalten den Optimierer, Objektcode-Generierung für den Chip der Wahl, Linker usw. kostenlos.
Eine andere Alternative wäre, eine Java JVM zu targetieren, die virtuelle Maschine ist gut dokumentiert und der JVM-Befehlssatz ist wesentlich fortschrittlicher als der x86-Maschinencode.
Hängt davon ab, was Sie tun möchten. Wenn Sie wirklich wissen wollen, wie alles von Grund auf funktioniert, ist GCC ein sehr verwirrender Weg. –
Bitte verwenden Sie nicht das Dragon Book, es ist alt und meist veraltet (und verwendet seltsame Namen für die meisten Sachen).
Für Bücher würde ich Apples Tiger Book oder Cooper's Engineering einen Compiler empfehlen. Ich würde Ihnen dringend einen Rahmen wie llvm verwenden vorschlagen, so dass Sie müssen ein paar Sachen nicht neu implementieren für die Codegenerierung usw.
Hier ist die Anleitung für den Aufbau Ihrer Sprache mit llvm: http://llvm.org/docs/tutorial/
Es gelang mir, einen Compiler ohne ein bestimmtes Buch zu schreiben (obwohl ich einige Compiler-Bücher in der Vergangenheit gelesen hatte, nur nicht in jedem Detail).
Das erste, was Sie tun sollten, ist mit einem der "Compiler Compiler" -Tools (Flex, Bison, Antlr, Javacc) zu spielen und Ihre Grammatik funktioniert. Grammatiken sind meistens geradlinig, aber es gibt immer Kleinigkeiten, die in die Quere kommen und alles ruinieren. Vor allem Dinge wie Ausdrücke, Vorrang, usw.
Einige der älteren einfacheren Sprache sind aus einem bestimmten Grund einfacher. Es macht die Parser "Just Work". Stellen Sie sich eine Pascal-Variante vor, die nur durch rekursives Verhalten verarbeitet werden kann.
Ich erwähne das, weil Sie ohne Ihre Grammatik keine Sprache haben. Wenn Sie es nicht richtig parsen und lexieren können, kommen Sie nicht sehr schnell voran. Und ein Dutzend Zeilen Beispielcode in Ihrer neuen Sprache zu sehen, die in eine Menge Token und Syntaxknoten umgewandelt werden, ist wirklich wirklich erstaunlich. In einem "Wow, es funktioniert wirklich" Art und Weise. Es ist buchstäblich fast ein "es funktioniert alles" oder "nichts davon funktioniert" Art der Sache, besonders am Anfang. Sobald es tatsächlich funktioniert, hast du das Gefühl, dass du es wirklich schaffen kannst.
Und in gewissem Maße ist das wahr, denn sobald Sie diesen Teil fertig haben, müssen Sie Ihre grundlegende Laufzeit in Gang bringen. Sobald Sie "a = 1 + 1" kompiliert haben, ist der Großteil der neuen Arbeit hinter Ihrem und jetzt müssen Sie nur den Rest der Operatoren implementieren.Es wird im Grunde eine Übung, Lookup-Tabellen und Referenzen zu verwalten und eine Vorstellung davon zu haben, wo Sie sich gerade befinden.
Sie können mit einer brandneuen Syntax, innovativer Laufzeit usw. selbständig arbeiten. Aber wenn Sie Zeit haben, ist es wahrscheinlich am besten, eine bereits fertiggestellte Sprache zu verwenden, nur um alle Schritte zu verstehen und umzusetzen und denke darüber nach, ob du die Sprache schreibst, die du wirklich willst, wie du das, was du mit diesem existierenden tust, anders machen würdest.
Es gibt viele Mechaniker zum Schreiben von Compilern und wenn Sie den Prozess einmal erfolgreich durchführen, werden Sie viel mehr Selbstvertrauen haben, wenn Sie zurückkommen und es wieder mit Ihrer eigenen, neuen Sprache machen wollen.
- 1. Was ist der empfohlene Ansatz, um ein SlickGrid zu stylen?
- 2. Was ist eine gute Methode, um einen Befehlsnamen zu erfinden?
- 3. Was ist der richtige Ansatz, um SPOJ DIEHARD zu lösen?
- 4. Was ist der bevorzugte Weg, um einen neuen Thread zu erstellen?
- 5. Was ist eine gute Bibliothek, um Apache2-Konfigurationsdateien zu manipulieren?
- 6. Was ist eine gute funktionale Sprache, um einen Webservice zu erstellen?
- 7. Was ist eine gute Möglichkeit, einen Vektor * vorübergehend * zu sortieren?
- 8. Was ist ein guter Ansatz, um OpenGLES 2.0 zu studieren?
- 9. Welcher Ansatz ist besser, um einen JDBC-Treiber zu laden?
- 10. Was ist eine gute Beispielklasse, um TDD zu demonstrieren?
- 11. Wie erstellt man einen neuen Compiler config.json Web Compiler (Extension)?
- 12. Was ist der beste Weg, um einen Index zu erstellen, um die schnellste Leseantwort zu erhalten?
- 13. Was ist eine gute Methode, um ASP.NET-Verbindungsprobleme zu diagnostizieren?
- 14. Was ist der beste Ansatz, um von der relationalen OLTP-Datenbank zum OLAP-Cube zu gelangen?
- 15. Wissen über die Grundlagen von Java, was ist der richtige Ansatz, um Groovy zu lernen?
- 16. Was ist der beste Ansatz, um Anfangsdaten in Backbone.js zu laden?
- 17. Was ist der beste Ansatz, um zwei Spalten mit Daten in einer Tabelle zu vergleichen?
- 18. Was ist der richtige Weg, um Controller-Aktionen zu erstellen?
- 19. Lazy Loading - was ist der beste Ansatz?
- 20. Was ist der allgemeinste Ansatz, um eine Struktur in den Flash (Mikrocontroller) zu setzen
- 21. Was ist der beste Ansatz für statische Ressourcen im Precache?
- 22. Was ist der richtige Weg, um einen 3-Knoten-Cluster zu erstellen?
- 23. Der richtige Ansatz, um Benutzersitzungen zu behalten
- 24. Was ist der einfachste Weg, um einen Ausdruck in Scala zu verwenden, um einen AST zu erhalten?
- 25. Was ist der einfachste Weg, um einen leeren Iterable mit Ausbeute in Python zu erstellen?
- 26. Was ist der zusammenhängendste Ort, um einen Logger zu verwenden?
- 27. MD5 ist eine gute Möglichkeit, einen Kontobestätigungscode zu erstellen
- 28. Was ist der effizienteste Weg, um leere ListBuffer zu erstellen?
- 29. Was ist der beste Weg, um eine Sitemap zu erstellen?
- 30. Newbie möchte einen PDF-Reader für iPod Touch erstellen - was ist der beste Ansatz?
Bitte Jungs, ihr solltet * wirklich * aufhören, das Drachenbuch zu zitieren ... Es ist eines der schlechtesten Compilerbücher überhaupt. Man kann Appel's, Cooper usw. nennen. Aber * bitte * nicht das Dragon Book. – tonfa
"Moderne Compiler-Implementierung" (Appel) ist sehr schlecht geschrieben und "Engineering ein Compiler" (Cooper) ist nicht sehr geeignet für Anfänger. –
Es kann nicht schlimmer sein als das arkane Drachenbuch. Ich persönlich habe das Tigerbuch nicht schlecht geschrieben, obwohl ich es nie von Anfang bis Ende gelesen habe, ich habe festgestellt, dass es sehr gute Einsichten hat. – tonfa