有没有一种 LLVM Java 前端可以将 Java 源代码转换为 LLVM 的中间形式?

66

据我所了解,有一个名为class2llvm的llvm程序可以将java字节码转换为llvm的中间形式。我的问题是如何访问它。我需要安装哪个前端来访问它。

VMkit是他们实现的JVM,但我想知道如何使用llvm编译java源代码,而不是运行它。


1
你知道可以使用javac(标准的Java编译器)来做这件事吗?你不需要使用llvm的任何东西 - 你只需安装Oracle JDK即可(我想这就是你预期为class2llvm准备Java文件的方式,但这只是猜测)。 - andrew cooke
4
@andrewcooke- javac真的会产生LLVM字节码吗?你能提供一份如何做到这一点的链接吗? - templatetypedef
1
根据我刚刚阅读的关于VMkit的内容,它支持预编译。这不正是你所需要的吗? - user377628
4
也许我理解有误。javac将Java源代码转换为字节码,然后class2llvm将字节码转换为LLVM。这样你就可以从Java源代码得到LLVM。这不是你想要的吗? - andrew cooke
1
啊,好的,我想我明白了是什么让大家困惑了。当我说“你不需要从LLVM获取任何东西”时,我指的是从源代码到字节码(而不是从源代码到LLVM)。抱歉。 - andrew cooke
显示剩余4条评论
4个回答

35

1
这个Java前端尚未完成,请参见https://dev59.com/Irnoa4cB1Zd3GeqPVK5h。 - Alexey Stepanov
9
链接失效了 @Ashkan - Niton

8
您可以查看 DragonEgg,它使得LLVM能够使用GCC的前端。由于GCC已经有了一个名为gcj的Java前端,因此或许LLVM可以使用它来编译Java代码。但我不确定LLVM与GCC前端的接口情况如何,所以这可能行不通。

1
从GCC 7开始,GCC Java前端和相关的libjava运行时库已经从GCC中删除。 - user

3

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


问题要求将源代码转换,而不是字节码。 - Martin Schröder

2

[注意:自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...不知道它们是否有影响)。


1
问题要求将源代码进行转换,而不是字节码。 - Martin Schröder
4
@Martin,很明显Java编译器会将源代码转换为JVM字节码,然后可以进一步转换。这可能是得到最多票数答案的原因,因为它也解释了字节码的转换过程。 - expz
1
截至2015年11月,RoboVM不再是开源的,即公司开发的代码不再作为开源代码发布。 - Nishant George Agrwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接