2010-01-05 14 views
23

Ich bin Bootstrapping ein Programmiersprache Compiler auf LLVM. Momentan schreibe ich meistens einen Compiler für eine Teilmenge von C, die sich selbst kompiliert. Wenn ich damit fertig bin, werde ich meine Sprache weg von C booten und die Selbstkompilierung beibehalten, während ich fortfahre.Bootstrapping einer Sprache auf LLVM

Da der Compiler sich selbst kompiliert, müssen alle Features von C, die ich verwende, implementiert werden. Es ist also ein konstantes Gleichgewicht: Wenn ich zu viele Funktionen verwende, muss ich mehr implementieren, als ich möchte, aber wenn ich nicht genügend Funktionen implementiere, wird es schwierig sein, Code zu schreiben.

Ein solches Merkmal ist die LLVM-Bindungen. Das Generieren einer LLVM-Zwischendarstellung ohne die LLVM C-Bindungen ist schwierig. Wenn ich jedoch die LLVM-Bindungen verwende, muss ich sie wieder implementieren, wenn ich von C abzweige.

Ich habe hier einige Schwierigkeiten, also suche ich nach alternativen Lösungen. Irgendwelche Ideen?

+0

Was Sie in Ihrem complier schreiben? C? Sie verwenden LLVM dann für die Kompilierung des Maschinencodes? –

+0

Mein Compiler wird in die Teilmenge von C geschrieben, die er kompiliert. Entschuldigung, das habe ich nicht gut erklärt. Mein aktueller Plan ist, LLVM Zwischenrepräsentation in eine Datei zu schreiben und dann LLVM zu verwenden, um es zu kompilieren, aber das ist kompliziert, und ich suche nach einer saubereren Lösung. – Imagist

+0

LLVM ist übrigens eine gute Wahl für das Backend. Ich hatte großes Glück damit. –

Antwort

10

Sie könnten die LLVM C-Bindungen verwenden, aber das erfordert Ihre Sprache genug C zu verstehen, um das zu tun.

Eine weitere Alternative ist, LLVM Assemblersprache (eine Textdatei) zu schreiben und llvm-as zu verwenden, um diese in Bitcode umzuwandeln.


Bearbeite:

Ich lese Sie erneut Frage, ich denke, Sie verstehen bereits die llvm-as vs bindenden Sachen.

Ihre Sprache wird wahrscheinlich in der Lage sein wollen, C für Support-Bibliotheken usw. zu binden. Verwenden Sie die C-Bindungen für jetzt und schreiben Sie Ihre eigenen Bindungen, wenn Sie weiterkommen.

+0

Ich hatte nicht gedacht, dass die C-Bindungen eine * temporäre * Lösung sein könnten. Gute Idee. – Imagist

1

Irgendwann werden Sie wahrscheinlich eine API zum Umschließen von C-Bibliotheken als Erweiterungsmodule bereitstellen wollen. LLVM unterstützt dies möglicherweise bereits (ich weiß, dass der Papagei vm dies tut). Warum verwenden Sie nicht jedes Extension-System, das Sie verwenden, um die LLVM-eigene API zu umbrechen? Vielleicht unterstützen sie das auch schon. :)