是否可以将LLVM字节码转换为Java字节码?

时间:2011-02-08 15:06:38

标签: java compiler-construction llvm

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

4 个答案:

答案 0 :(得分:28)

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

来自Disqus comment的Grzegorz有一个有趣的kraytracing.com(21/03/11),它与代码一起解释了他如何修改LLJVM的Java类输出例程以发出非单一的Java类它与输入的C / C ++模块一致。他建议他的技术似乎避免了LLJVM通常生成的过长的“复合”Java Constructor方法参数签名,并提供了他的修改和示例的链接。

尽管LLJVM看起来好像已经在积极开发中使用了几年,但它仍然在Github上托管,并且仍然可以在其以前的GoogleCode存储库中找到一些文档:

LLJVM @ Github
LLJVM documentation @ GoogleCode

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

  

然后使用Proteus生成Java可执行文件的一般过程   可以概括如下。

     
      
  1. 生成LLVM中间人的可读表示   表示(ll文件)
  2.   
  3. 将此ll文件作为参数传递给   proteus编译系统
  4.   
  5. 以上将生成一个Java jar文件   可以执行或用作库
  6.   

我已经延长了a bash script to compile the latest versions of LLVM and Clang on Ubuntu,它可以被发现为Github Gist,here

[更新31/03/14 ] - LLJVM似乎已经死了一段时间,但是Howard Chu(https://github.com/hyc)看起来已经{{3}与最新版本的LLVM(3.3)兼容。见LLJVM

答案 1 :(得分:7)

我怀疑你是否可以,至少在没有大量努力和运行时抽象的情况下(例如,建立半个Von Neumann机器来执行某些操作码)。 LLVM bitcode允许全方位的低级不安全“做你想要的但我们不会清理乱七八糟”的功能,从直接的,原始的,无构造函数的内存分配到完全不受控制的强制转换 - 真正的强制转换,而不是转换 - 如果您愿意,可以将i32bitcast转到%stuff *。此外,JVM主要面向对象和方法,而LLVM家伙很幸运,他们有函数指针和结构。

另一方面,似乎C can be compiled to Java bytecodeLLVM bitcode can be compiled to Javascript(尽管缺少许多功能,例如动态加载和stdlib功能),所以只要付出足够的努力就应该可行。

答案 2 :(得分:5)

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

答案 3 :(得分:0)

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

注意:此项目不再维护。