Ich werde versuchen, einen Compiler für eine dynamische Sprache zu schreiben. Vorzugsweise zu einer vorhandenen virtuellen Maschine --- Ich möchte mich (noch) nicht mit der Garbage-Collection beschäftigen und den unzähligen anderen Bedenken, die eine gute VM für Sie bereithält. Welche VMs empfehlen Sie?
Ich bin auf Linux, also weiß ich nicht, ob .NET (über Mono) so eine gute Idee ist. Ich habe gehört, dass Parrot gut für dynamische Sprachen ist, aber ich habe noch nie von irgendwelchen Sprachen gehört. Soll ich mein eigenes erfinden? Zählt LLVM sogar als eine VM, gegen die ich kompilieren sollte, oder ist es so hart wie x86?
Welche Vor- und Nachteile gibt es auch für stackbasierte vs registerbasierte VMs?
Leistung und Werkzeugunterstützung wären wichtig. Ich werde den Compiler in Haskell schreiben, also ist eine gute Schnittstelle dazu ein Plus.
JVM (Java) und die CLR (.NET) scheinen die zwei häufigsten Ziele dafür zu sein, da beide die meisten dieser Probleme für Sie behandeln. Beide bieten relativ einfache Befehlssätze, mit denen gearbeitet werden kann.
Die CLR hat einen Vorteil - sie wurde wirklich mit dem Ziel entworfen, mehrere Sprachen von Anfang an zu unterstützen, und es ist (IMO) etwas einfacher, mit ihnen zu arbeiten, besonders wenn Sie keine Sprache schreiben, in die sie passt die ursprüngliche "Form" der ursprünglichen Sprachen, die auf diese Laufzeit abzielen. Mono funktioniert gut genug, dass ich deswegen nicht vor einem CLR-Ziel zurückschrecken würde.
LLVM bietet ein viel besseres Programmiermodell als eine gerade x86-Baugruppe. Ja, es ist Low-Level. Sie müssen sich jedoch keine Gedanken über die Ablaufplanung oder die Optimierung Ihrer Ausgabe machen. Während Sie noch Ihr Front-End schreiben, können Sie das Typsystem nutzen, um mögliche Fehler zu erkennen.
Das heißt, Sie müssen Ihre eigene Runtime-Ebene entwickeln, um sich um die "dynamischen" Teile Ihrer Sprache zu kümmern. Nur für diesen Teil allein, könnte ich dazu neigen, mit CLR zu bleiben.
.NET hat die Dynamic Language Runtime, wie von Reed Copsey erwähnt. Aber ich kenne nicht einmal die CLR, schon gar nicht das DLR - über beides kann ich nichts sagen. Das LLVM sollte netter sein als reines x86, aber es ist immer noch ein niedriges Niveau. Aber ich kann auch nicht viel darüber erzählen - nur ein paar Blicke.
Ich habe allerdings in Parrot geschaut. Die Idee selbst ist ziemlich gut und die Implementierung sieht gut aus. Wenn ich jemals eine dynamische Sprache entwickle, wäre ich mir ziemlich sicher, dass es Papageien als Ziel haben wird. Die PIR (Parrot-Zwischendarstellung) ist sehr hoch für eine VM. Sie haben syntaktischen Zucker (arimethic Operatoren, Aufgaben, Aufruf von Subroutinen und Rückkehr von ihnen ist ein Kinderspiel, ...), verwirren Sie nicht mit den genauen Registerzahlen, sondern nehmen Sie einfach so viele wie Sie wollen und vergeben Sie eine beliebige Anzahl an ihnen und haben sogar benannte Variablen!
Wenn ich wählen müsste, würde ich eine registerbasierte VM bevorzugen. Forschung zeigt, dass diese Bytecode-Größe für die Ausführungsgeschwindigkeit, die mir gut passt. Außerdem tendieren zu komplexe Stack-Operationen dazu, mein Gehirn zu verschmelzen, wenn ich versuche, sie zu verstehen - registerbasierte Operationen kommen natürlicher zu Imho.
Tags und Links compiler-construction