Frage

Welche Tipps können Sie einer Person geben, die eine Programmier- oder Skriptsprache schreiben möchte?Ich mache mir weder Sorgen, wie man einen Compiler programmiert noch entwirft, sondern wie man einen schnell mit Tools und Codegeneratoren entwickelt.

Als ich es das letzte Mal versucht habe, habe ich es in C++ codiert und die Zustände und die Syntax haben fast so lange gedauert wie das Schreiben der eigentlichen Logik.Ich weiß, dass die folgenden Tools helfen würden.

Ich dachte, ich könnte C++-Code generieren und ihn von gcc kompilieren lassen.Wie lange würden Sie schätzen, wenn Sie mit den oben genannten Tools ein Programm oder eine Skriptsprache schreiben würden?


Variationen dieser Frage wurden schon immer wieder gestellt Lernen, einen Compiler zu schreiben. Hier ist eine unvollständige Liste der SO-Ressourcen zum Thema.

War es hilfreich?

Lösung

Einschätzen, wie lange so etwas dauern könnte, ist abhängig von vielen verschiedenen Faktoren ab. Zum Beispiel kann ein erfahrener Programmierer Knockout leicht eine einfache Arithmetik Ausdrucksauswertung in ein paar Stunden, mit Unit-Tests. Aber ein Anfänger-Programmierer müssen möglicherweise über Parsing-Techniken, rekursiven Abstieg, abstrakte Darstellung des Ausdruck Bäume, Tree-Walking-Strategien lernen, und so weiter. Dies könnte leicht Wochen oder mehr, nur für arithmetischen Ausdrücke.

Doch lassen Sie sich nicht, dass Sie entmutigen. Als Jeff und Joel wurden auf einem den letzten Stack Overflow Podcast mit Eric Sink diskutieren, ist ein Compiler schreibt ein hervorragende Möglichkeit, über viele verschiedene Aspekte der Programmierung zu lernen. Ich habe ein paar Compiler erzeugt und sie gehören zu meinen denkwürdigsten Programmierprojekte.

Einige klassische Bücher auf Gebäude Compiler sind:

Andere Tipps

Dave Hanson, der mit Chris Fraser 10 Jahre Gebäude einer der weltweit sorgfältig gearbeitete Compiler , hat mir einmal erzählt, dass eines der wichtigsten Dinge, die er aus der Erfahrung gelernt hat, war nicht zu versuchen, einen Compiler in C oder C ++ zu schreiben.

Wenn Sie möchten, schnell etwas entwickeln, erzeugen keine nativen Code; eine vorhandene virtuelle Maschine Ziel wie die CLR, JVM oder der Lua virtuelle Maschine. Code generiert mit maximal Munch.

Eine weitere gute Option, wenn Sie einen Dolmetscher gerade schreiben ist nur die Speicherverwaltung und andere Einrichtungen der zugrunde liegend Programmiersprache zu verwenden. Parsen zu einem AST und dann von Baum zu Fuß von dem AST interpretieren. Dadurch werden Sie aus dem Boden schnell. Die Leistung ist nicht die beste, aber es ist akzeptabel. (Mit dieser Technik, die ich einmal eine Postscript-Interpreter in Modula-3 geschrieben. Die erste Implementierung eine Woche nahm, und obwohl es später einig Performance-Tuning unterzogen, vor allem im Lexer, hatte es nie ersetzt werden.)

LALR Parser-Generatoren vermeiden; verwenden etwas, das Ihre Zeit spart, wie ANTLR oder der Elkhound GLR-Parser-Generator.

Die klassischen Bücher über Compiler Design sind

"Principles of Compiler Design" von Alfred V. Aho und Jeffrey D. Ullman. Es ist schon einige Zeit jetzt und seine rosa Ritter und grünen Drachen sind gut zu mindestens ein paar Generationen von CS Studenten bekannt.

Auch ...

"Compilers: Grundsätze, Verfahren und Tools" von Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman

Wenn Sie beim Schreiben eines Compilers interessiert sind, dann sind dies zweifellos die besten Plätze zu starten.

  

Als Person, die C ++ weiß sehr gut,   Welche Tipps können Sie eine Person geben, die   sucht eine Programmier- oder Skriptsprache?

schreiben

Sie es nicht tun. (Oder zumindest denken lange und hart, bevor Sie tun!)

Wenn Sie versuchen, eine Skriptsprache zu schreiben, um die Methoden / Eigenschaften einiger speziell geschriebenen Objekte aufzudecken, wäre es besser, die in Java zu implementieren (oder .NET / VB oder all diese ekligen Microsoftisms) und verwenden Sie dann Scripting-Framework eine der Bean Sprachen als Skriptsprache. (Mit dem, was das äquivalent ist auf dem Microsoft Ende.)

Alle Fragen zu Compilern erhalten in wenigen Minuten eine Antwort auf SO, unabhängig von ihrem Inhalt: „Lesen Sie das Drachenbuch, lesen Sie dieses Buch, dieses Buch ...“.Deshalb überspringe ich diesen Teil (wie ich es bereits gesagt habe).Das Lesen dieser Bücher, um zu lernen, wie man die gewünschten Werkzeuge benutzt, ist ungefähr so ​​nützlich wie das Lesen über Drehimpuls, um zu lernen, wie man Fahrrad fährt.

Um Ihre Frage zu beantworten, ohne Ihre Absicht in Frage zu stellen, kann ich Antlr und Antlrworks für den Anfang empfehlen.Sie können Ihren AST ganz einfach generieren (wo die wahre Magie passiert, glaube ich) und Ihre Grammatik visuell debuggen.Es generiert einen guten Teil eines funktionierenden Compilers für Sie.

Wenn Sie sich auskennen und mehr Kontrolle haben möchten oder AntLR nicht mögen, können Sie es verwenden Zitrone Parser-Generator und Ragel State-Machine-Compiler (mit spezieller Unterstützung für Lexing) zusammen.

Wenn Sie nicht zu viel Leistung benötigen und planen, C/C++-Code zu generieren, können Sie die Optimierungen selbst überspringen und diese Arbeit Ihrem C/C++-Compiler überlassen.

Wenn Sie mit einer langsamen Laufzeit leben können, können Sie Ihren Entwicklungsaufwand durch reine Interpretation weiter verkürzen, da sich dynamische Funktionen auf diese Weise oft einfacher implementieren lassen.

Ich denke, jeder einen sehr wichtigen Punkt fehlt.

haben Sie einen Compiler / Interpreter schreiben wollen / Parser etc.

Dies wird ernsthaft eine Menge bestimmen, was Sie tun.

Ich habe auf ganz wenige Sprachimplementierungen gearbeitet, einige ziemlich seltsam, einige domänenspezifische, einige einfach scripted Fortschritt durch Befehl Umgebungen (oft, wo die Befehlsumgebung wurde später versteckt). Jede erforderlich verschiedenen Ebenen der Geschicklichkeit.

Viele Bücher zur Verfügung. Eine, die ich liebte, war ein BYTE Buch: Threaded Sprachen gedolmetscht - wetten, dass es vergriffen ist.

Einfache Skriptmodule können mit wenigen Abend Denken und ein bisschen von Versuch und Irrtum gefertigt werden.

Aber ich wette, es gibt jetzt Online-Kurse, dass sparen Sie eine Menge Zeit.

Ich würde dringend empfehlen bei bestehenden Bytecode Dolmetscher suchen. Wenn Sie Ihre Sprache passen in CIL (.NET) oder Java (oder auch andere wie Python oder Parrot) machen, werden Sie sich alle Mühe sparen eine tragfähige Unterstützung Umwelt zu machen und mit Experimentieren mit Sprache Konzepte auskommen kann.

Wenn Sie sich auf das Schreiben eines Dolmetschers oder Compiler planen, tun es nicht, weil Sie das nächste große Ding schreiben wollen. Schreiben Sie es, weil Sie bereits einen Zweck für sie im Sinn oder zu lernen. Wenn Sie dies tun können Sie feststellen, dass Sie versehentlich das nächste große Ding geschrieben haben.

Ein gutes Werkzeug, das ich für LALR verwendet habe, ist das GOLD Parsing-System . Es ist kostenlos, das ist GRAMMER Backus-Naur-Form, und es gibt mehrere Beispiele, einschließlich Motoren geschrieben in C #, VB.NET, Java und anderen. Auf diese Weise können Sie einen grammer schreiben, übersetzen Sie die grammer in eine Datei, und dann einen Motor verwenden, um den grammer zu analysieren.

Wie oben empfohlen, würde ich empfehlen, einen Byte-Code von einer Art, wie IL-Targeting. Dies ermöglicht es Ihnen, die enormen Mengen an bestehenden Strukturen zu nutzen.

Good Luck

Wenn Sie einen Compiler nicht bekommen, in dem Schreiben Ihre Sprache Montage / Maschine zu reduzieren, dann die nächste Möglichkeit ist, einen Compiler zu einer Byte-Code Sprache virtuellen Maschine, wie die JVM, PVM oder zu schreiben. NET.

Natürlich, wenn Sie nicht einmal das tun wollen - Sie wollen nur Ihre eigene „domänenspezifische Sprache“ zu schaffen, ich habe es in Common Lisp bauen würde. Lisp-Makros bieten eine ziemlich straight-forward Methode zur Erstellung von was auch immer Syntax Sie wollen und es in Lisp Parsen. Und Sie müssen sich keine Sorgen über Byte-Code oder einer Baugruppe. Natürlich müssen Sie Lisp lernen.

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