Ich bin an ein Projekt gebunden, um einen Interpreter in eine vorhandene Anwendung zu integrieren. Die zu interpretierende Sprache ist eine Ableitung von Lisp mit anwendungsspezifischen Builtins. Einzelne 'Programme' werden im Batch-Stil in der Anwendung ausgeführt.Für die Implementierung eines Interpreters in C/C++ benötigte Referenzen
Ich bin überrascht, dass ich im Laufe der Jahre ein paar Compiler und mehrere datensprachliche Übersetzer/Parser geschrieben habe, aber ich habe noch nie einen Interpreter geschrieben. Der Prototyp ist ziemlich weit, implementiert als Syntax-Baum-Walker, in C++. Ich kann wahrscheinlich die Architektur jenseits des Prototyps beeinflussen, aber nicht die Implementierungssprache (C++). So, Einschränkungen:
- Implementierung in C++
- Parsing wird wahrscheinlich mit einer yacc/Bison Grammatik behandelt werden (es ist jetzt)
- Vorschläge von vollständigen VM/Dolmetscher ecologies wie NekoVM und LLVM sind wahrscheinlich nicht praktisch für dieses Projekt. Self-contained ist besser, auch wenn dies wie NIH klingt.
Was ich wirklich suche, liest Material über die Grundlagen der Implementierung von Dolmetschern. Ich habe ein wenig über SO geblättert und eine andere Seite, die als Lambda the Ultimate bekannt ist, obwohl sie mehr auf Programmiersprachen-Theorie ausgerichtet sind.
Einige der tidbits ich bisher gesammelt habe:
Lisp in Small Pieces, von Christian Queinnec. Die Person, die es empfohlen hat, sagte, dass es "vom trivialen Interpreter zu fortgeschritteneren Techniken geht und die Darstellung von Bytecode und 'Scheme to C' Compilern beendet."
NekoVM. Wie ich oben erwähnt habe, bezweifle ich, dass wir ein vollständiges VM-Framework zur Unterstützung dieses Projekts integrieren könnten.
Structure and Interpretation of Computer Programs. Ursprünglich habe ich vorgeschlagen, dass dies vielleicht zu viel ist, aber nachdem ich einen gesunden Brocken durchgearbeitet habe, stimme ich @JBF zu. Sehr informativ und bewusstseinserweiternd.
On Lisp von Paul Graham. Ich habe das gelesen, und obwohl es eine informative Einführung in Lisp-Prinzipien ist, reicht das nicht aus, um mit der Konstruktion eines Interpreters zu beginnen.
Parrot Implementation. Das scheint eine lustige Lektüre zu sein. Nicht sicher, dass es mir die Grundlagen liefern wird.
Scheme from Scratch. Peter Michaux greift verschiedene Implementierungen von Scheme an, von einem schnellen, in C geschriebenen Scheme-Interpreter (zur Verwendung als Bootstrap in späteren Projekten) bis zum kompilierten Scheme-Code. Sehr interessant bis jetzt.
Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages, empfohlen im Kommentar-Thread für Books On Creating Interpreted Languages. Das Buch enthält zwei Kapitel, die sich mit der Praxis befassen, Dolmetscher zu bauen, also füge ich es meiner Leseschleife hinzu.
- New (und noch Old, das heißt 1979): Writing Interactive Compilers and Interpreters von P. J. Brown. Dies ist lange nicht mehr möglich, aber es ist interessant, einen Überblick über die verschiedenen Aufgaben zu geben, die mit der Implementierung eines Basic-Interpreters verbunden sind.Ich habe gemischte Kritiken für dieses Thema gesehen, aber da es billig ist (ich habe es auf Bestellung für ca. $ 3.50 verwendet), werde ich es drehen.
Wie wäre es damit? Gibt es ein gutes Buch, das den Neuling an die Hand nimmt und zeigt, wie man einen Interpreter in C/C++ für eine Lisp-ähnliche Sprache erstellt? Haben Sie eine Präferenz für Syntax-Tree-Walker oder Bytecode-Interpreter?
@JBF zu beantworten:
der aktuelle Prototyp ist ein Interpreter, und es macht Sinn für mich, wie wir einen Pfad zu einer beliebigen Code-Datei zu akzeptieren und sie in unserer Anwendungsumgebung ausgeführt wird. Die Builtins werden verwendet, um unsere In-Memory-Datendarstellung zu beeinflussen.
sollte es nicht schrecklich langsam sein. Der aktuelle Baumläufer scheint akzeptabel.
Die Sprache ist basiert auf Lisp, ist aber nicht Lisp, also keine Einhaltung der Standards erforderlich.
- Wie oben erwähnt, ist es unwahrscheinlich, dass wir ein vollständiges externes VM/Interpreter-Projekt hinzufügen können, um dieses Problem zu lösen.
Zu den anderen Plakaten werde ich auch Ihre Zitate überprüfen. Danke, alles!
Der Vollständigkeit halber hinzugefügt. Kanonische Frage http://stackoverflow.com/questions/1669/learning-to-write-a-compiler. Ja, der Titel sagt "Compiler", aber die Grundlagen sind für Dolmetscher gleich. – dmckee