Nach dem, was ich gelesen habe, gibt es ein llvm-Programm, das Java-Bytecode in die Zwischenform von llvm namens class2llvm konvertiert. Meine Frage ist, wie greife ich darauf zu. Welches Frontend muss ich installieren, um darauf zugreifen zu können?
VMkit ist ihre Implementierung einer JVM, aber ich suche, wie man den Java-Quellcode mit llvm kompiliert, nicht, wie man ihn ausführt.
Das Java-Frontend übersetzt Java-Bytecode (.class-Dateien) in LLVM-Bytecode. Schau dir mal diesen Link an:
https://llvm.org/svn/llvm-project/java/trunk/docs/java-frontend.txt
Kannst du dir mal anschauen Drachenei, wodurch llvm die Frontends von gcc verwenden kann. Da gcc bereits ein Frontend für Java hat, genannt gcj, vielleicht kann llvm es verwenden, um Java-Code zu kompilieren. Ich bin mir jedoch nicht sicher, wie gut llvm mit dem gcc-Frontend interagiert, daher funktioniert dies möglicherweise nicht.
Ich habe eine Java-Klasse mit vmkit ausgeführt ( http://vmkit.llvm.org/ ) basierend auf LLVM. Es verwendet LLVM zum Kompilieren und Optimieren von Hochsprachen für Maschinencode. J3 ist eine Implementierung einer JVM mit VMKit.
[NOTE: From November 2015 it is no longer open source, so this hack is mostly useless.]
RoboVM könnte die Lösung werden, nach der Sie suchen. Es ist Open Source und kompiliert JVM-Bytecode (.class-Dateien) in Maschinencode.
Ich nehme an, sie tun es mit so etwas wie class2llvm.
Leider ist es noch in der Alpha. Ich habe es gerade auf HelloWorld.java getestet. Es gab eine 5-fache Beschleunigung der Ladezeit auf einem einzelnen Kern. (Der größte Teil der Laufzeit ist Ladezeit.)
echo Hello World! : <1 ms : 31K
(/usr/bin/echo binär)
java HelloWorld : ~70 ms : 0.4K
(HelloWorld.class JVM-Bytecode)
./HelloWorld : ~13 ms : 9.4MB
(9,3 MB Binärdatei + 57 KB robovm-rt.jar)
Beachten Sie, dass Java eine 32 MB große $JAVA_HOME/lib/rt.jar-Datei (und vielleicht mehr) aufruft. Das Suchen in einer so großen Datei muss ein Grund dafür sein, dass Java so langsam geladen wird. Wenn RoboVM intelligenter wird, kann es vielleicht den größten Teil der 9,3-MB-Binärdatei für ein noch schnelleres Laden wegwerfen?
Die Website erwähnt iOS, aber ich denke, das liegt daran, dass sie ihre Add-On-UI-Bibliotheken verkaufen. RoboVM wurde für mich auf einem Ubuntu-Geschmack gut kompiliert. Stellen Sie einfach sicher, dass Sie dies tun
$ sudo apt-get install g++-multilib
zuerst (und vielleicht libpthread-stubs0-dev und libpthread-workqueue0 installieren … weiß nicht, ob sie eine Rolle spielten).
Sie verstehen, dass Sie verwenden können
javac
(der Standard-Java-Compiler), um dies zu tun? Sie brauchen nichts von llvm – Sie können einfach das Orakel-jdk installieren (und ich stelle mir vor, dass Sie so Java-Dateien für class2llvm vorbereiten sollen, aber das ist nur eine Vermutung)– Andreas Koch
29. Mai 2012 um 18:09 Uhr
@andrewcooke- Tut es
javac
wirklich LLVM-Bytecode ausgeben? Kannst du einen Link geben, wie man das macht?– Vorlagentypdef
29. Mai 2012 um 18:11 Uhr
Basierend auf dem, was ich gerade über VMkit gelesen habe, unterstützt es die vorzeitige Kompilierung. Ist das nicht im Wesentlichen das, was Sie brauchen?
– Benutzer377628
29. Mai 2012 um 18:14 Uhr
vielleicht verstehe ich nicht. Javac geht von der Java-Quelle zum Bytecode. dann wechselt class2llvm von Bytecode zu llvm. Das bringt Sie von Java Source zu llvm. willst du das nicht?
– Andreas Koch
29. Mai 2012 um 18:22 Uhr
ah, ok, ich glaube, ich verstehe, was alle verwirrt hat. Als ich sagte “Sie brauchen nichts von llvm”, wollte ich von der Quelle zum Bytecode gehen (nicht von der Quelle zu llvm). Verzeihung.
– Andreas Koch
29. Mai 2012 um 18:56 Uhr