据我所了解,有一个名为class2llvm的llvm程序可以将java字节码转换为llvm的中间形式。我的问题是如何访问它。我需要安装哪个前端来访问它。
VMkit是他们实现的JVM,但我想知道如何使用llvm编译java源代码,而不是运行它。
Java前端将Java字节码(.class文件)转换为LLVM字节码。请查看此链接:
https://llvm.org/svn/llvm-project/java/trunk/docs/java-frontend.txt
我使用基于LLVM的vmkit(http://vmkit.llvm.org/)执行了一个Java类。它使用LLVM将高级语言编译和优化为机器代码。J3是使用VMKit实现的JVM。
[注意:自2015年11月起,RoboVM不再开源,因此此方法大多已失效。]
RoboVM 可能是你正在寻找的解决方案。它是开源的,并将JVM字节码(.class文件)编译为机器码。
我认为他们使用了类似class2llvm的东西来实现它。
不幸的是,它仍处于alpha版。我刚刚在HelloWorld.java上进行了测试。在单核上运行时,它使加载时间加快了5倍。(大部分运行时间都是加载时间。)
echo Hello World! : <1 ms : 31K
(/usr/bin/echo binary)
java HelloWorld : ~70 ms : 0.4K
(HelloWorld.class JVM bytecode)
./HelloWorld : ~13 ms : 9.4MB
(9.3MB binary + 57K robovm-rt.jar)
请注意,Java调用一个32MB的$JAVA_HOME/lib/rt.jar文件(也可能更多)。在这样一个大文件中搜索必须是Java加载非常缓慢的原因之一。如果RoboVM变得更聪明,也许它可以丢掉大部分的9.3MB二进制文件,以实现更快的加载速度?
该网站提到了iOS,但我认为这是因为他们正在销售附加的UI库。RoboVM在我使用的Ubuntu版本上编译得很好。只需确保首先执行
$ sudo apt-get install g++-multilib
(也许还要安装libpthread-stubs0-dev和libpthread-workqueue0...不知道它们是否有影响)。
javac
(标准的Java编译器)来做这件事吗?你不需要使用llvm的任何东西 - 你只需安装Oracle JDK即可(我想这就是你预期为class2llvm准备Java文件的方式,但这只是猜测)。 - andrew cooke