2009-07-30 6 views
5

In meiner fortwährenden Bemühung, meinen unsterblichen Durst nach mehr Programmierwissen zu löschen, bin ich auf die Idee gekommen, eine (zumindest für jetzt) ​​einfache Programmiersprache zu schreiben, die in Bytecode kompiliert. Das Problem ist, dass ich das erste über das Sprachdesign nicht weiß. Hat jemand einen Ratschlag zu einer Methodik zum Aufbau eines Parsers und zu den grundlegenden Funktionen, die jede Sprache haben sollte? Welche Lektüre würden Sie für das Sprachdesign empfehlen? Wie hoch sollte ich schießen? Ist es unrealistisch zu hoffen, in der Lage zu sein, ein Feature einzuschließen, das es einem erlaubt, Bytecode in einer Weise zu inline zu schreiben, die gcc ähnlich ist, was Inline-Assembler erlaubt? Wenn ich sehe, dass ich hauptsächlich in C und Java code, was wäre besser für Compiler schreiben?Methodiken zum Entwerfen einer einfachen Programmiersprache

+0

Dupe von http://stackoverflow.com/questions/479013/requirements-for-compiler-design/479048 unter vielen anderen. Außerdem stellen Sie zu viele Fragen - eine nach der anderen ist eine gute Regel. –

+1

Und diese http://stackoverflow.com/questions/1669/learning-to-write-a-compiler ist die endgültige SO-Antwort auf dem Themengebiet. –

+0

ok Es tut mir leid, dass ich nicht gesehen habe, dass es ein Duplikat war, sollte es einfach als Duplikat geschlossen werden oder sollte ich die Frage löschen? –

Antwort

3

Es gibt so viele Möglichkeiten ...

Sie in Stapel Sprachen aussehen könnte und Forth. Es ist nicht sehr nützlich, wenn es um die Gestaltung anderer Sprachen geht, aber es ist etwas, das sehr schnell erledigt werden kann.

Sie könnten in funktionale Sprachen suchen. Die meisten von ihnen basieren auf ein paar einfachen Konzepten und haben einfaches Parsen. Und dennoch sind sie sehr mächtig.

Und dann die traditionellen Sprachen. Sie sind am schwersten. Sie müssen etwas über lexikalische Analysatoren, Parser, LALR-Grammatiken, LL-Grammatiken, EBNF und reguläre Sprachen lernen, nur um über das Parsing hinaus zu kommen.

Einen Bytecode anzusteuern ist nicht nur eine gute Idee - sonst ist es in einer Lernübung nur wahnsinnig und meistens nutzlos.

Tun Sie sich einen Gefallen und suchen Sie nach Büchern und Tutorials über Compiler.

Entweder C oder Java wird tun. Java hat wahrscheinlich einen Vorteil, da die Objektorientierung für diese Art von Aufgabe gut geeignet ist. Meine persönliche Empfehlung ist Scala. Es ist eine gute Sprache, um diese Art von Dingen zu tun, und es wird Ihnen interessante Dinge über Sprachdesign auf dem Weg lehren.

+0

* "Einen Bytecode anzusprechen ist nicht einfach eine gute Idee" * Im Gegensatz dazu auf eine echte Maschine (z. B.x86), einen Dolmetscher schreiben oder etwas anderes? Ist das Schreiben eines Compilers, der selbst auf eine "ideale" virtuelle Maschine abzielt (im Gegensatz zu einer CPU, bei der man sich um Registerzuordnung kümmern muss), wesentlich schwieriger als das Schreiben eines Interpreters? Ich könnte mir vorstellen, dass man die Kompilierung relativ einfach machen kann, indem man statt einer flachen Byte-Kette einen Baum kompiliert, aber ich habe es noch nie zuvor gemacht, und ich würde gerne wissen, was andere dazu sagen. –

+0

@Joey Im Gegensatz zu einer realen Maschine. Sogar Compiler, die Maschinencode erzeugen, erzeugen oft eine intermediäre Bytecode-Ausgabe (obwohl die High-End-Compiler dies möglicherweise vermeiden, um maximale Kompilierungsgeschwindigkeit und verfügbare Optimierungen zu erreichen). Das Schreiben eines Interpreters ist in der Tat einfacher, besonders wenn Sie eine dynamische Sprache schreiben. Wie in einem Baum zu kompilieren, ist ein Baum der _output_ von Parsing, so ist es definitiv einfacher - obwohl nicht wirklich so viel. –

+0

Ups, ich war verwirrt von Ihrem Satz (sah aus, als ob Sie sagen Targeting Bytecode ist verrückt und nutzlos, aber Sie sagten das Gegenteil). Außerdem sprach ich mehr über die Linien eines Baumes, der für die Ausführung abgestimmt ist, und unterscheidet sich von der grundlegenden Parser-Ausgabe (obwohl sie in einfachen Einstellungen ungefähr die gleiche Struktur haben). –

1

Sie möchten zuerst a book on compilers lesen.

Für wirklich zu verstehen, was los ist, werden Sie wahrscheinlich wollen Sie den Code in C

Java wäre keine schlechte Wahl zu schreiben, wenn Sie eine interpretierte Sprache, wie Jython schreiben wollte. Aber da es klingt wie Sie in Maschinencode kompilieren nach unten wollen, könnte es einfacher sein, in C.

1

Ich empfehle folgende Bücher zu lesen:

ANTLR

Language Design Patterns

Dies wird Ihnen geben Tools und Techniken zum Erstellen von Parsern, Lexern und Compilern für benutzerdefinierte Sprachen.