Frage

Ich bin im Begriff, eine Cross-Plattform (Mac OS X, Windows und Linux) Anwendung der Implementierung, die viele CPU-Kapazität Analyse der Finanzdaten tun. Der Großteil der Analyse-Engine wird in C ++ aus Geschwindigkeitsgründen geschrieben werden, mit einer benutzerzugänglichen Scripting-Engine mit der C ++ Schnittstelle Test Engine. Ich mag mehr scripting-Frontends im Laufe der Zeit schreiben, zu emulieren anderer beliebter Software mit bestehenden großer Nutzerbasis. Die erste Front wird eine Visualbasic-ähnliche Skriptsprache.

Ich denke, dass LLVM würde für meine Bedürfnisse perfekt sein. Die Leistung ist sehr wichtig, weil die schiere Menge der Daten; es kann Stunden oder Tage dauert einen einzigen Lauf von Tests ausführen, um eine Antwort zu bekommen. Ich glaube, dass LLVM verwendet, wird auch erlauben Sie mir eine einzige Back-End-Lösung zu verwenden, während ich verschiedene Frontends für verschiedene Aromen der Skriptsprache im Laufe der Zeit implementieren.

Der Test Engine selbst wird von der Schnittstelle getrennt werden und die Prüfung wird auch in einem separaten Prozess nimmt mit Fortschritt und die Ergebnisse an die Testmanagementschnittstelle gemeldet. Tests werden Scripting-Code bestehen aus mit dem Test-Engine-Code integriert.

In einer früheren Umsetzung eines ähnlichen kommerziellen Testsystem Ich schrieb, baute ich einen schnellen Interpreter, die leicht mit dem Test-Bibliothek angeschlossen, weil es in C ++ und verknüpft direkt mit dem Test Engine Bibliothek geschrieben wurde. Rückrufe von Script-Code zu testen Bibliothek beteiligte Objekte übersetzen zwischen den Formaten mit erheblichen Mehraufwand.

Ich stelle mir vor, dass mit LLVM, ich die Rückrufe in C ++ direkt so umsetzen konnte, dass ich die Script-Code Arbeit machen könnte fast, als ob es in C geschrieben worden war ++. Ebenso, wenn der gesamte Code auf LLVM Bytecode-Format erstellt wurde, scheint es, wie die LLVM Optimizern über die Grenzen zwischen der Skriptsprache und der Test Engine Code optimieren könnte, die in C geschrieben wurde ++.

Ich will nicht den Test Engine jedes Mal haben zu kompilieren. Im Idealfall würde ich nur der Script-Code zu JIT Kompilierung mag. Für kleine Tests, würde ich einige Optimierungsläufe, während für große Tests überspringen, ich voll Optimierungen während der Verbindung führen würde.

So ist das möglich? Kann ich den Test Engine auf eine .o Objektdatei oder .a Bibliotheksdatei und verknüpfen Sie dann im Script-Code mit dem JIT vorkompilieren?

Schließlich, im Idealfall würde Ich mag den Script-Code haben spezifische Methoden als Unterklassen für eine bestimmte C ++ Klasse implementieren. So ist die C ++ Motorprüfzentrums sehen würde, nur C ++ Objekte, während der Code JIT-Setup-Scripting-Code kompiliert, die einige der Methoden für die Objekte implementiert. Es scheint, dass, wenn ich den richtigen Namen Algorithmus verwendet Mangeln es relativ einfach sein würde, die LLVM Generation für die Skriptsprache aussehen wie ein C ++ Methodenaufruf einzurichten, die dann in den Test Engine verknüpft werden könnten.

So ist die Verknüpfung der Bühne in zwei Richtungen gehen würde, für Anrufe aus der Skriptsprache in die Test-Engine-Objekte Preisinformationen und Teststatusinformationen und Anrufe aus dem Test Engine von Methoden von einer bestimmten C abzurufen ++ Objekten, wo der Code geliefert wurde nicht von C ++, sondern aus der Skriptsprache.

Zusammenfassung:

1) Kann ich Link in vorkompilierte (entweder .bc, .o oder .a) Dateien als Teil der JIT-Kompilierung Codegenerierungsprozess?

2) Kann ich Link in Code, um den Prozess in 1) oben in einer solchen Art und Weise mit, dass ich im Stande bin, Code zu erstellen, die als wirkt, wenn sie alle in C geschrieben wurde ++?

War es hilfreich?

Lösung

  1. Yes we can! Je nach Version von LLVM verwenden Sie gibt es verschiedene API-Aufrufe. Sie werden llvm :: getBitcodeModuleProvider auf 2.5 benötigen.
  2. Der einfachste Weg, C ++ Funktionen zu nennen, ist eine Funktion (llvm :: Funktion :: Create) zu erstellen, die die Flagge llvm mit :: Funktion :: ExternalLinkage und dann addGlobalMapping, um es zu Ihrer C ++ Funktion zu machen verweisen.

Andere Tipps

  1. Ich glaube schon.
  2. Dies ist behaart. Sie müssen die C ++ ABI der Funktionen passen in die Sie anrufen, und müssen sicherstellen, dass der generierte Code verwendet die gleichen Datenstrukturen, Klassen, Layout usw. (über ein Äquivalent von Header-Dateien). Das C ++ ABI hat eine ganze Reihe von Nuancen und Portabilität Fragen. Vielleicht Prototyp mit ersten mit C tun Interop. clang hat begrenzte Unterstützung für C ++ jetzt.

1) Sie können .bc-Dateien laden und verknüpfen, .o-Dateien, wenn sie zu einem .so Archiv comnpiled wurden sollten in ihnen belastbare und die Symbole sollten verwendet werden können.

2) Solange Sie schreckliche Dinge nicht mit dem Callbacks tun mögen, können Sie wahrscheinlich passieren nur Standard-C-Funktionszeiger und tun Rückrufe von Funktionszeigern. Sie können auch bestimmte andere Dinge tun, aber den Umgang mit dem Versuch, C ++ Objekte oder Vorlagen oder Call-Elementfunktionen während kein C ++ Compiler zu sein ist etwas, was Sie wollen nicht tun.

zu definieren,

Sie müssen die C ++ ABI wissen, müssen Sie über die Plattform kennen Sie zielen, können Sie alle möglichen Dinge wissen, müssen Sie effektiv ein C ++ Compiler sein muss, um Code zu generieren, dass sieht aus wie es ist C ++. Der Name Mangler ist einer der ärgerlichsten Teile.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top