我听说谷歌应用引擎可以运行任何可以通过它JVM
转换为Java字节码的编程语言。我想知道是否可以将LLVM字节码转换为Java字节码,因为运行LLVM
在Google App Engine JVM
中支持的语言会很有意思。
答案 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可执行文件的一般过程 可以概括如下。
- 生成LLVM中间人的可读表示 表示(ll文件)
- 将此ll文件作为参数传递给 proteus编译系统
- 以上将生成一个Java jar文件 可以执行或用作库
醇>
我已经延长了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允许全方位的低级不安全“做你想要的但我们不会清理乱七八糟”的功能,从直接的,原始的,无构造函数的内存分配到完全不受控制的强制转换 - 真正的强制转换,而不是转换 - 如果您愿意,可以将i32
和bitcast
转到%stuff *
。此外,JVM主要面向对象和方法,而LLVM家伙很幸运,他们有函数指针和结构。
另一方面,似乎C can be compiled to Java bytecode和LLVM 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/。我不确定它会对你有所帮助,但它似乎是相关的。
注意:此项目不再维护。