根据我的阅读,有一个 llvm 程序可以将 java 字节码转换为 llvm 的中间形式,称为 class2llvm。我的问题是,我如何访问它。我必须安装什么前端才能访问它。
VMkit 是他们对 JVM 的实现,但我正在寻找如何使用 llvm 编译 java 源代码,而不是如何运行它。
Java 前端将 Java 字节码(.class 文件)转换为 LLVM 字节码。看看这个链接:
https://llvm.org/svn/llvm-project/java/trunk/docs/java-frontend.txt
你可以看看dragonegg,它使 llvm 能够使用 gcc 的前端。由于 gcc 已经有一个 java 前端,称为gcj,也许 llvm 可以使用它来编译 java 代码。但我不确定 llvm 与 gcc 前端的接口有多好,所以这可能行不通。
我已经使用基于 LLVM 的vmkit ( http://vmkit.llvm.org/ ) 执行了一个 java 类。它使用 LLVM 将高级语言编译和优化为机器代码。J3 是一个带有 VMKit 的 JVM 实现。
[注意:从 2015 年 11 月开始,它不再是开源的,所以这个 hack 基本上是没用的。]
RoboVM可能会成为您正在寻找的解决方案。它是开源的,将 JVM 字节码(.class 文件)编译为机器码。
我假设他们使用 class2llvm 之类的东西来做到这一点。
不幸的是,它仍处于 alpha 阶段。我刚刚在 HelloWorld.java 上对其进行了测试。它使在单核上运行的加载时间提高了 5 倍。(大部分运行时间是加载时间。)
echo Hello World! : <1 ms : 31K
(/usr/bin/echo 二进制文件)
java HelloWorld : ~70 ms : 0.4K
(HelloWorld.class JVM 字节码)
./HelloWorld : ~13 ms : 9.4MB
(9.3MB 二进制 + 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 ......不知道它们是否重要)。