Wie sinnvoll ist es, eine C ++ - Anwendung mithilfe von LLVM (ich denke LLJVM) auf Java-Bytecode zu portieren?
Die Sache ist, dass wir derzeit einen Prozess in C ++ geschrieben haben, aber ein neuer Client hat vorgeschrieben, dass das Programm plattformübergreifend ausgeführt werden kann, wobei die Java Virtual Machine ohne nativen Code (ohne JNI) verwendet wird. Die Idee ist, in der Lage zu sein, das generierte JAR zu nehmen und es dann auf verschiedene Systeme (Linux, Win, 32 Bit - 64 Bit) zu kopieren, und es sollte einfach funktionieren.
Wenn Sie sich umschauen, ist es möglich, C ++ in LLVM-IR-Code und dann diesen Code in Java-Bytecode zu kompilieren. Der generierte Code muss nicht lesbar sein.
Ich habe ein bisschen mit ähnlichen Dingen mit emscripten getestet, dies nimmt C ++ - Code und kompiliert ihn zu JavaScript. Das Ergebnis ist gültiges JS, aber völlig unlesbar (sieht aus wie Assambler).
- Hat jemand mit dieser Technik einen Port einer Anwendung von C ++ auf Java-Bytecode erstellt?
- Vor welchen Problemen könnten wir stehen?
- Ist ein gültiger Ansatz für Produktionscode?
Um meinen Standpunkt nach einigen Kommentaren klarer zu machen: Vielleicht wird der Port nicht gut genutzt. Ich erwarte daher keinen lesbaren Quellcode, sondern nur Java-Bytecode. Es handelt sich also nicht mehr um einen 'Port', für den der Port entwickelt wird Zielplattform muss die Java-JVM sein, nicht der native Assamblear.
Hinweis: Mir ist bekannt, dass wir derzeit einige nicht standardmäßige C ++ - und Close Source-Bibliotheken haben. Wir möchten diesen nicht standardmäßigen Code und alle Close Source-Bibliotheken entfernen und die Open Source-Software Free Libre verwenden. Nehmen wir also an, der gesamte Code ist Standard-C ++ - Code mit Der gesamte Code ist zur Kompilierungszeit verfügbar.
Hinweis 2: Es ist keine Option, portablen C ++ - Code zu schreiben und ihn dann auf die gewünschte Zielplattform zu kompilieren. Das kompilierte Programm muss plattformübergreifend sein, daher die Verwendung von JVM.
Anmerkung 3: Im Moment untersuchen wir keine ähnlichen Lösungen für Python oder andere Sprachgrundlagen, aber ich würde auch gerne davon hören. Damit meine ich, dass unsere ausführbare Zieldatei Java-Bytecode sein muss, aber wenn es Optionen zum Kompilieren von C ++ zu gültigem Python-kompiliertem Code gibt, würde ich auch gerne davon hören.
Antworten:
Ich bezweifle wirklich, dass dies funktionieren wird. Möglicherweise können Sie Ihren Code in Java-Bytecode übersetzen, aber Bibliotheksaufrufe werden nicht auf magische Weise in entsprechende Aufrufe der Java-Laufzeit und der Bibliotheken übersetzt. Möglicherweise gibt es nicht einmal gleichwertige Java-Laufzeitaufrufe! Selbst wenn Sie alle proprietären Bibliotheken entfernen, bleibt Ihnen die C ++ - Standardbibliothek erhalten.
Um dies konkret zu machen: Ihr C ++ - Programm enthält möglicherweise einen Aufruf von fprintf (). Diese Funktion ist in der C-Standardbibliothek implementiert und für ein C ++ - Programm absolut legitim. Der LLVM-zu-LLJVM-Übersetzer wird wahrscheinlich nicht auf magische Weise die Reihenfolge der Java-Laufzeitaufrufe herausfinden, die das zu fprintf () äquivalente Ergebnis liefern, und diese ersetzen. Um diese Funktion bereitzustellen, müsste die C- und C ++ - Laufzeit in Java im Wesentlichen neu implementiert werden Bytecode.
Es gibt einige Tools , die eine Übersetzung von C ++ nach Java durchführen, aber nur eine Handvoll der einfacheren Aufrufe der Laufzeitbibliothek konvertieren. Der Rest bleibt Ihnen überlassen, um herauszufinden.
quelle
apr
oder ähnlichem)