Ich habe einen Compiler in C (mit Lex & Bison) für eine dynamisch typisierte Programmiersprache erstellt, die Schleifen, Funktionsdeklarationen innerhalb von Funktionen, rekursive Aufrufe usw. unterstützt. Außerdem habe ich eine virtuelle Maschine erstellt, die den vom Compiler erstellten Zwischencode ausführt.
Ich dachte jetzt, anstatt zu meinem eigenen Zwischencode zu kompilieren, kompiliere ihn zu Java-Byte-Code.
Ich habe gesehen, dass die Frage zum Erstellen einer JVM-Sprache bereits gestellt wurde , aber ich finde die Antwort nicht sehr informativ.
Also hier sind meine Fragen:
- Ich denke, um eine Sprache für JVM zu erstellen, muss man unbedingt das JVM-Spezifikationsbuch lesen. Welche anderen Bücher können Sie vorschlagen (außer natürlich Dragon Book)? Ich mache mir hauptsächlich Sorgen um Bücher oder Tutorials zum Erstellen einer JVM-Sprache, nicht um einen Compiler im Allgemeinen.
- Es gibt viele Java-Bibliotheken zum Lesen, Schreiben und Ändern von .class-Dateien wie jclasslib , bcel , gnu- Bytecode usw. Welche würden Sie vorschlagen? Kennen Sie auch C-Bibliotheken, die den gleichen Job machen?
- Ich dachte darüber nach, mir vielleicht eine andere Sprache anzuschauen, die auf die JVM abzielt, wie Clojure, Jython oder JRuby. Aber all diese Sprachen sind sehr hoch und kompliziert (um einen Compiler für sie zu erstellen). Ich suchte nach einer einfacheren Programmiersprache (es macht mir nichts aus, wenn sie unbekannt oder nicht verwendet wird), die auf die JVM abzielt und deren Compiler Open Source ist. Irgendwelche Ideen?
quelle
Letztes Semester habe ich einen "Compiler Construction" -Kurs besucht. Unser Projekt war genau das, was Sie tun möchten.
Die Sprache, in der ich meine Sprache geschrieben habe, war Scala . Es läuft auf einer JVM, unterstützt jedoch viele erweiterte Funktionen, die Java nicht bietet (immer noch vollständig kompatibel mit einer reinen Java-JVM).
Zur Ausgabe von Java-Bytecode habe ich die Scala CAFEBABE-Bibliothek verwendet . Gut dokumentiert und Sie müssen nicht tief in Java-Klassen eintauchen, um zu verstehen, was zu tun ist.
Ich denke, Sie können neben dem Buch viele Informationen finden, indem Sie die Labore durchgehen, die wir während des Kurses durchgeführt haben.
quelle
ASM kann eine Lösung zum Generieren von Bytecode sein. Überprüfen Sie zunächst die Themen zum Generieren von Elementen aus dem Handbuch .
quelle
Vorschlag: Sie können sich die Lua-Programmiersprache ansehen , es gibt JVM-Implementierungen wie LuaJ .
(Nicht zu verwechseln mit LuaJava, das native Bibliotheken mit JNI-Ansatz verwendet.)
quelle
Letztes Wochenende habe ich mir die gleiche Frage gestellt, um meine Spielzeugsprache auf die JVM zu portieren.
Ich verbringe nur wenige Stunden damit, Informationen zu suchen. Nehmen Sie diese Referenzen also mit einem Körnchen Salz.
Sprachimplementierungsmuster . Ich hasse Antlr, aber dieses Buch sieht sehr gut aus. Wenn Sie Antlr auch nicht mögen, ist das Parsen von "Parsing-Techniken. Ein praktischer Leitfaden" sehr gut.
Kapitel 10 behandelt diese Themen auf 30 Seiten (um IMO zu beschleunigen). Aber es gibt noch andere Kapitel, die Sie wahrscheinlich interessieren werden.
Die Implementierung von Lua 5.0 Dies ist ein großartiges Dokument über registrierungsbasierte Bytecode-Maschinen. Lesen Sie es auch noch einmal.
Lisp in kleinen Stücken. In diesem Buch lernen Sie, wie man 2 Schme Compailer schreibt, die zu C kompiliert werden. Aus diesem Buch können so viele Lektionen gelernt werden. Ich besitze eine Kopie dieses Buches und es ist wirklich gut für jeden, der interessant ist, ist lispeln, aber vielleicht nicht Ihre Tasse Tee.
http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473
Überprüfen Sie die Dalvik7-VM, eine registergestützte VM. Der DVM verarbeitet Bytecodes, die aus den von einem Java-Compiler kompilierten Java-Klassendateien transformiert werden.
Es gibt eine Mailingliste zum Thema JVM-Sprachen.
Planen Sie, den Code an einen beliebigen Ort hochzuladen? Ich würde gerne einen Blick darauf werfen.
quelle
Are you planning to upload the code to anyplace?
Ich bin nicht stolz auf diesen Code :( ... Ich würde vielleicht das Ganze umschreiben. Wie auch immer, wenn ich es tue, werde ich es dich wissen lassen. Vielen Dank für deine Vorschläge.Ich würde empfehlen, dass Sie zuerst lernen, wie die JVM-Assembly funktioniert, wenn Sie es noch nicht wissen.
Viele Anweisungen haben die Form
?name
, in der angegeben?
wird,i
ob die Anweisung mit einem ganzzahligen Typ unda
mit einem Referenztyp arbeitet.Grundsätzlich ist JVM eine Stapelmaschine ohne Register, sodass alle Anweisungen mit Daten direkt auf dem Stapel arbeiten. Sie können Daten mit
?push/?pop
lokalen Variablen (Stapelpositionen, auf die durch Offsets verwiesen wird) und der Oberseite des Stapels mithilfe von Daten verschieben / verschieben und zwischen diesen verschieben?store/?load
. Einige andere wichtige Anweisungen sindinvoke???
undif_???
.Für den Compilerkurs meiner Universität haben wir Jasmin verwendet , um die Programme zusammenzustellen. Ich weiß nicht, ob dies der beste Weg ist, aber zumindest ist es ein einfacher Anfang.
Hier ist eine Anweisungsreferenz für eine alte Version der JVM, die möglicherweise weniger Anweisungen als eine neue enthält.
quelle
Zuerst würde ich mich zurückziehen, meinen Compiler so ändern, dass er tatsächlich Java anstelle von Java-Bytecodes ausgibt (was bedeutet, dass mehr Übersetzer als Compiler erstellt werden), und die Java-Ausgabe mit einer beliebigen Java-Umgebung kompilieren (was wahrscheinlich einen besseren Objektcode generieren würde) als mein eigener Compiler).
Sie können dieselbe Technik verwenden (z. B. nach C # kompilieren), um CLI-Bytecodes zu generieren, oder nach Pascal kompilieren, um P-Code usw. zu generieren.
Es ist nicht klar, warum Sie Java-Codes in Betracht ziehen, anstatt Ihre eigene VM zu verwenden, aber wenn dies der Leistung dient, sollten Sie natürlich auch in Betracht ziehen, auf tatsächlichen Maschinencode zu kompilieren.
quelle
Natürlich könnte man einmal Java verwenden, um eine neue Sprache zu schreiben. Mit der Java Reflection-API können Sie eine Menge erreichen. Wenn Geschwindigkeit nicht allzu wichtig ist, würde ich Java anstelle von ASM den Vorzug geben. Die Programmierung ist in Java (IMHO) einfacher und weniger fehleranfällig . Schauen Sie sich die 7. RPN-Sprache an . Es ist vollständig in Java geschrieben.
quelle