2010-07-11 18 views
14

Ich habe noch keine Erfahrung mit llvm oder clang. Von dem, was ich gelesen habe, wird gesagt, dass clam leicht einbindbar ist Wikipedia-Clang, jedoch habe ich keine Tutorials darüber gefunden, wie das zu erreichen ist. Ist es also möglich, den Benutzer einer C++ - Anwendung mit Skripten zu versehen, indem JIT während der Laufzeit benutzerdefinierten Code kompiliert und ausführt? Wäre es möglich, die Anwendungen eigene Klassen und Methoden aufzurufen und Objekte zu teilen?Ein Tutorial zum Einbetten von Clang als Skript-Interpreter in C++ Code?

edit: Ich würde eine C-ähnliche Syntax für den Script-languge (oder auch C++ selbst) bevorzuge

Antwort

10

Ich weiß nicht, von jedem Tutorial, aber es ist ein Beispiel C-Interpreter in der Clang Quelle das könnte hilfreich sein. Sie können es hier finden: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

Sie haben wahrscheinlich nicht viel Auswahl der Syntax für Ihre Skriptsprache, wenn Sie diese Route gehen. Clang analysiert nur C, C++ und Objective C. Wenn Sie Variationen wünschen, können Sie Ihre Arbeit für sich erledigen lassen.

+0

Vielen Dank. Es hat eine ganze Weile gedauert, bis ich es fertiggestellt habe - im Grunde, weil ich die ausführbare Datei nicht gefunden habe. Jetzt, nachdem ich sie angeschaut habe, würde ich sagen, dass es auf halbem Wege ist. Jetzt muss ich herausfinden, wie man Funktionen aufruft, die im Nicht-Jitted-Teil definiert sind. ... irgendwelche Ideen dazu? – FFox

+0

Ich bin mir nicht sicher, was du meinst. Sie sollten in der Lage sein, einen Zeiger auf jede Funktion zu erhalten, die Sie kompiliert haben. Vielleicht wäre dieses allgemeine LLVM-Tutorial hilfreich: http://llvm.org/docs/tutorial/ (insbesondere Kapitel 4). Ich erwarte nicht, dass Sie diesen Interpreter so verwenden können, wie er ist, aber er sollte Ihnen eine Vorstellung davon geben, wie Sie einen C/C++ - Interpreter in Ihre Anwendung einbetten können. (Ich habe es nicht einmal selbst benutzt; ich erinnere mich nur daran, es gesehen zu haben.) –

+1

Ok, hier ist, was ich getan habe: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ... und es hat tatsächlich mit Hilfe der netten Leute von der cfe-dev Mailingliste geklappt. Warum kann dieser Interpreter nicht in einer App verwendet werden? – FFox

0

Ich weiß nicht, über Clang aber Sie könnten bei Ch aussehen wollen:

http://www.softintegration.com/

Dies als integrierbare beschrieben oder Standalone-C/C++ Interpreter. Es gibt einen Dr. Dobbs Artikel mit Beispielen hier Einbetten:

http://www.drdobbs.com/architecture-and-design/212201774

Ich habe nicht mehr getan, als mit ihm zu spielen, aber es scheint ein stabiles und ausgereiftes Produkt zu sein. Es ist kommerziell, Closed-Source, aber die "Standard" -Version wird als frei für den persönlichen und kommerziellen Gebrauch beschrieben. Betrachtet man jedoch die Lizenz, so scheint es, dass "kommerziell" nur die firmeninterne Nutzung umfasst und nicht in ein Produkt eingebettet ist, das dann verkauft oder vertrieben wird. (Ich bin kein Anwalt, also sollte man sich bei SoftIntegration nach den Lizenzbedingungen erkundigen.)

5

Sie können clang als Bibliothek verwenden, um die JIT-Kompilierung wie in anderen Antworten beschrieben zu implementieren. Dann müssen Sie das kompilierte Modul laden (sagen wir, eine .so-Bibliothek).

Um dies zu erreichen, können Sie standard dlopen (unix) oder LoadLibrary (windows) verwenden, um es zu laden, dann dlsym (unix) verwenden, um kompilierte Funktionen dynamisch zu referenzieren, sagen wir eine "main()" - ähnliche Funktion dessen Name bekannt ist. Beachten Sie, dass Sie für C++ verstümmelte Symbole verwenden müssen. Eine tragbare Alternative ist z.B. GNUs libltdl.

Als Alternative kann das "Skript" automatisch zur Ladezeit ausgeführt werden, indem Modul-Init-Funktionen implementiert werden oder statischer Code eingefügt wird (der Konstruktor eines C++ - global definierten Objekts würde sofort aufgerufen).

Das geladene Modul kann direkt in der Hauptanwendung alles aufrufen. Natürlich sind die Symbole zum Zeitpunkt der Kompilierung bekannt, wenn die Header-Dateien der Haupt-App verwendet werden.

Wenn Sie einfach C++ "Plugins" zu Ihrem Programm hinzufügen möchten und die Komponentenschnittstelle a priori kennen (sagen Sie, dass Ihre Hauptanwendung den Namen und die Schnittstelle einer geladenen Klasse von ihrer .h kennt, bevor das Modul in den Speicher geladen wird)), nachdem Sie die Bibliothek dynamisch geladen haben, ist die Klasse verfügbar, als ob sie statisch verknüpft wäre. Sei nur sicher, dass du nicht versuchst, das Objekt einer Klasse zu instanziieren, bevor du sein Modul dlopen().

Die Verwendung von statischem Code ermöglicht es, auch automatische automatische Registrierungsmechanismen zu implementieren.

0

Ich bin nicht sicher, dass eine C- oder C++ Compiler Einbettung wie Clang eine gute Idee, in Ihrem Fall ist. Denn das "Skript", also der (C- oder C++ -) Code, kann (zur Laufzeit!) Beliebig sein, um die gesamte Anwendung abstürzen zu können. Normalerweise möchten Sie nicht, dass fehlerhafte Benutzereingaben Ihre Anwendung zum Absturz bringen können.

Wenn Sie einen Interpreter einbetten möchten, wählen Sie etwas für diesen Zweck, wie Guile oder Lua, und seien Sie vorsichtig, dass Fehler im Skript nicht die gesamte Anwendung abstürzen. Eine ausführlichere Beschreibung der Interpreter-Einbettung finden Sie unter this answer.