62

根据我的阅读,有一个 llvm 程序可以将 java 字节码转换为 llvm 的中间形式,称为 class2llvm。我的问题是,我如何访问它。我必须安装什么前端才能访问它。

VMkit 是他们对 JVM 的实现,但我正在寻找如何使用 llvm 编译 java 源代码,而不是如何运行它。

4

4 回答 4

34

Java 前端将 Java 字节码(.class 文件)转换为 LLVM 字节码。看看这个链接:

https://llvm.org/svn/llvm-project/java/trunk/docs/java-frontend.txt

于 2012-11-29T20:48:59.850 回答
6

你可以看看dragonegg,它使 llvm 能够使用 gcc 的前端。由于 gcc 已经有一个 java 前端,称为gcj,也许 llvm 可以使用它来编译 java 代码。但我不确定 llvm 与 gcc 前端的接口有多好,所以这可能行不通。

于 2012-05-30T11:25:11.903 回答
3

我已经使用基于 LLVM 的vmkit ( http://vmkit.llvm.org/ ) 执行了一个 java 类。它使用 LLVM 将高级语言编译和优化为机器代码。J3 是一个带有 VMKit 的 JVM 实现。

于 2013-01-16T20:46:59.320 回答
2

[注意:从 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 ......不知道它们是否重要)。

于 2014-11-15T03:13:28.833 回答