webentwicklung-frage-antwort-db.com.de

Ist es möglich, LLVM-Bytecode in Java-Bytecode umzuwandeln?

Ich habe gehört, dass die Google App Engine jede Programmiersprache ausführen kann, die über ihre JVM in Java-Bytecode umgewandelt werden kann. Ich habe mich gefragt, ob es möglich ist, LLVM-Bytecode in Java-Bytecode zu konvertieren, da es interessant wäre, Sprachen auszuführen, die LLVM in der Google App Engine JVM unterstützt.

33
Ben Page

Es scheint nun möglich zu sein, LLVM-IR-Bytecode mit dem LLJVM-Interpreter in Java-Bytecode umzuwandeln.

Es gibt einen interessanten Disqus-Kommentar (21/03/11) von Grzegorz von kraytracing.com , der zusammen mit dem Code erklärt, wie er die Java-Klassenausgaberoutine von LLJVM so geändert hat, dass sie nicht-monolithische Java-Klassen ausgibt die in der Anzahl mit den eingegebenen C/C++ Modulen übereinstimmen. Er schlägt vor, dass seine Technik die übermäßig langen, zusammengesetzten Java Constructor-Methodensignaturen vermeidet, die normalerweise von LLJVM generiert werden, und stellt Links zu seinen Modifikationen und Beispielen bereit.

Obwohl LLJVM nicht mehr so ​​aussieht, als wäre es seit ein paar Jahren in der aktiven Entwicklung, wird es immer noch auf Github gehostet und einige Dokumentationen finden Sie immer noch in seinem früheren Repository bei GoogleCode:

LLJVM @ Github
LLJVM-Dokumentation @ GoogleCode

Ich bin auch auf das Projekt ' Proteuscc ' gestoßen, das auch LLVM zur Ausgabe von Java-Byte-Code verwendet (dies deutet darauf hin, dass dies speziell für C/C++ ist, obwohl ich davon ausgehe, dass das Projekt geändert oder mit LLVM Intermediate Representation (IR) gespeist werden könnte. ). Von http://proteuscc.sourceforge.net :

Der allgemeine Prozess der Erstellung einer ausführbaren Java-Datei mit Proteus kann wie folgt zusammengefasst werden.

  1. Generieren einer lesbaren Darstellung der LLVM-Zwischendarstellung (ll-Datei)
  2. Übergeben Sie diese ll-Datei als Argument an das Proteus-Kompilierungssystem
  3. Das Obige erzeugt eine Java-JAR-Datei, die ausgeführt oder als Bibliothek verwendet werden kann

Ich habe ein Bash-Skript zum Kompilieren der neuesten Versionen von LLVM und Clang auf Ubuntu erweitert, es kann als Github Gist hier gefunden werden.

[ UPDATE 31/03/14 ] - LLJVM schien für irgendetwas tot zu sein, aber Howard Chu ( https://github.com/hyc ) sieht aus zu haben LLJVM kompatibel mit der neuesten Version von LLVM (3.3). Siehe Howard's LLJVM-LLVM3.3 Zweigstelle in Github, hier

25
Big Rich

Ich bezweifle, dass Sie zumindest nicht ohne erheblichen Aufwand und Laufzeitabstraktionen (z. B. den Bau einer halben Von Neumann-Maschine zur Ausführung bestimmter Opcodes) können. LLVM-Bitcode ermöglicht die vollständige Palette von unsicheren Funktionen auf niedriger Ebene, die "tun, was Sie wollen, aber wir werden das Durcheinander nicht beseitigen", von direkter, unformatierter, konstruktorfreier Speicherzuweisung bis zu vollständig ungeprüften Besetzungen - echte Besetzungen, keine Konvertierungen - Sie können i32 und bitcast zu einem %stuff * machen, wenn Sie möchten. Außerdem sind JVMs stark auf Objekte und Methoden ausgerichtet, während die LLVM-Leute das Glück haben, über Funktionszeiger und -strukturen zu verfügen.

Andererseits scheint es, dass C zu Java-Bytecode kompiliert werden kann und LLVM-Bitcode kann zu Javascript kompiliert werden (obwohl viele Funktionen, z. B. dynamisches Laden und stdlib-Funktionen, fehlen), also sollte es möglich sein, bei genügend Aufwand.

7
user395760

Spät zur Diskussion: Sulong führt LLVM IR auf der JVM aus. Es werden ausführbare Knoten (Java-Objekte) aus dem LLVM-IR erstellt, anstatt den LLVM-IR in Java-Bytecode zu konvertieren. Diese ausführbaren Knoten bilden einen AST Interpreter. Sie können sich das Projekt unter https://github.com/graalvm/sulong ansehen oder einen Artikel darüber unter http://dl.acm.org/citation.cfm?id=2998416 lesen. . Haftungsausschluss: Ich arbeite an diesem Projekt.

3
box

Lesen Sie dies: http://vmkit.llvm.org/ . Ich bin mir nicht sicher, ob es Ihnen helfen wird, aber es scheint relevant zu sein.

Hinweis: Dieses Projekt wird nicht mehr gepflegt.

0
AlexR