2011-02-08 174 views
30

我听说谷歌应用程序引擎可以运行任何编程语言,通过它的JVM可以转换为Java字节码。我想知道是否可以将LLVM字节码转换为Java字节码,因为运行LLVM在Google App Engine JVM中支持的语言会很有趣。是否可以将LLVM字节码转换为Java字节码?

+0

AFAIK LLVM是一个硬件/操作系统抽象层次库,而不是字节码虚拟机。它提供了一些相同的优点,但需要从源代码针对每个目标平台进行编译。 – 2011-02-08 15:09:50

+3

@Peter:不,你可以解释它,然后JIT编译它(`lli`)。但是,是的,指令的方式更低级,并且与其他虚拟机并不相似。 – delnan 2011-02-08 15:15:02

+0

@Ben,请根据我在http://stackoverflow.com/a/13540256/304330中提到的内容重新考虑接受的答案,谢谢。 – 2013-07-04 15:38:31

回答

25

现在可以使用LLJVM interpreter将LLVM IR字节码转换为Java字节码。

有一个有趣的Disqus comment(21/03/11)从kraytracing.com这也解释了,用代码一起,他是如何修改LLJVM的Java类输出程序发出与该输入同意在一些非单片Java类的Grzegorz C/C++模块。他建议他的技术似乎避免了通常由LLJVM生成的过长的“复合”Java构造器方法参数签名,并且他提供了他的修改和示例的链接。

虽然LLJVM看起来并不像它一直在积极发展了几年了,它仍托管在Github上和一些文档仍然可以在昔日的仓库处的googlecode上发现:

LLJVM @ Github
LLJVM documentation @ GoogleCode

我还遇到了'Proteuscc'项目,它也利用LLVM输出Java字节代码(这表明这是专门针对C/C++的,尽管我假设该项目可以修改或反馈LLVM中间表示法(IR) )。从http://proteuscc.sourceforge.net

产生Java可执行文件与变形的一般过程,然后 可以概括为以下。

  1. 生成LLVM中间 表示(LL文件)的人类可读表示
  2. 通过这个LL文件作为参数传递给 变形杆菌编译系统
  3. 上面将产生一个Java jar文件 其可以被执行或用作图书馆

我已经扩展a bash script to compile the latest versions of LLVM and Clang on Ubuntu,它可以发现是为Github Gist,here

[UPDATE 31/03/14] - LLJVM已经似乎已经死了间或,但是霍华德楚(https://github.com/hyc)看起来已经取得了LLJVM与LLVM的最新版本(3.3)兼容。请参阅Howard's LLJVM-LLVM3.3 branch at Github, here

7

我怀疑你是否可以,至少不是没有很大的努力和运行时抽象(例如,构建半个冯诺依曼机器来执行某些操作码)。 LLVM bitcode允许从直接的,原始的,无构造函数的内存分配到完全未经检查的强制转换 - 真正的强制转换而不是转换 - 的所有低级别不安全的“做你想要的但我们不会清理混乱”如果您愿意,您可以将i32bitcast转换为%stuff *。另外,JVM很重视对象和方法,而LLVM家伙很幸运,他们有函数指针和结构。

另一方面,似乎C can be compiled to Java bytecodeLLVM bitcode can be compiled to Javascript(虽然许多功能,如动态加载和stdlib函数缺乏),所以它应该是可能的,给予足够的努力。

0

阅读方式:http://vmkit.llvm.org/。我不确定它会对你有帮助,但似乎是相关的。

注意:这个项目没有更多的维护。

0

讨论后期:Sulong在JVM上执行LLVM IR。它从LLVM IR创建可执行节点(即Java对象),而不是将LLVM IR转换为Java字节码。这些可执行节点组成一个AST解释器。您可以在https://github.com/graalvm/sulong处查看该项目,或在http://dl.acm.org/citation.cfm?id=2998416阅读关于该项目的文章。免责声明:我正在处理这个项目。