我听说谷歌应用程序引擎可以运行任何编程语言,通过它的JVM
可以转换为Java字节码。我想知道是否可以将LLVM字节码转换为Java字节码,因为运行LLVM
在Google App Engine JVM
中支持的语言会很有趣。是否可以将LLVM字节码转换为Java字节码?
回答
现在可以使用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可执行文件与变形的一般过程,然后 可以概括为以下。
- 生成LLVM中间 表示(LL文件)的人类可读表示
- 通过这个LL文件作为参数传递给 变形杆菌编译系统
- 上面将产生一个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
我怀疑你是否可以,至少不是没有很大的努力和运行时抽象(例如,构建半个冯诺依曼机器来执行某些操作码)。 LLVM bitcode允许从直接的,原始的,无构造函数的内存分配到完全未经检查的强制转换 - 真正的强制转换而不是转换 - 的所有低级别不安全的“做你想要的但我们不会清理混乱”如果您愿意,您可以将i32
和bitcast
转换为%stuff *
。另外,JVM很重视对象和方法,而LLVM家伙很幸运,他们有函数指针和结构。
另一方面,似乎C can be compiled to Java bytecode和LLVM bitcode can be compiled to Javascript(虽然许多功能,如动态加载和stdlib函数缺乏),所以它应该是可能的,给予足够的努力。
阅读方式:http://vmkit.llvm.org/。我不确定它会对你有帮助,但似乎是相关的。
注意:这个项目没有更多的维护。
讨论后期:Sulong在JVM上执行LLVM IR。它从LLVM IR创建可执行节点(即Java对象),而不是将LLVM IR转换为Java字节码。这些可执行节点组成一个AST解释器。您可以在https://github.com/graalvm/sulong处查看该项目,或在http://dl.acm.org/citation.cfm?id=2998416阅读关于该项目的文章。免责声明:我正在处理这个项目。
- 1. 写llvm字节码
- 2. 如何将Java源代码转换为字节代码?
- 3. 字节码是否必须转换为机器码?
- 4. 在编译器将其转换为字节码之前,是否可以从jython中找到java源代码?
- 5. 是否可以将HHVM字节码存储为文件?
- 6. 是否可以修改字节码并将其保存为javassist?
- 7. Java - 将字节[]转换为字符串
- 8. 字节码转换DEX
- 9. 如何将字节[]转换为字节[]
- 10. 是否可以将python中的数字整数转换为1字节字符
- 11. 将Java字符串转换为16字节的字节数组
- 12. 将源代码转换为Java字节码的实用程序是什么
- 13. 可以使用PHP APC将源代码转换为字节码吗?
- 14. char转换为字节? (JAVA)
- 15. 将视频转换为字节数组的java代码
- 16. 是否有可能使用pypy将Java字节码编译为本地代码?
- 17. 字节顺序:将java字节转换为c#
- 18. 将Java字节数组转换为Python字节数组
- 19. 将java字节转换为c#字节(序列化问题)
- 20. 如何将Java字节数组转换为Scala字节数组?
- 21. Java:将字节转换为整数
- 22. Java将int隐式转换为字节
- 23. 将字节数组转换为.wav java
- 24. 将BCI(字节码索引)转换为源代码行号
- 25. 如何将字节码转换为机器本机代码
- 26. 将字节转换为字节到字节
- 27. 将字节转换为位
- 28. 将字节[]转换为int
- 29. 将IRandomAccessStreamWithContentType转换为字节[]
- 30. 将字节[]转换为SAFEARRAY
AFAIK LLVM是一个硬件/操作系统抽象层次库,而不是字节码虚拟机。它提供了一些相同的优点,但需要从源代码针对每个目标平台进行编译。 – 2011-02-08 15:09:50
@Peter:不,你可以解释它,然后JIT编译它(`lli`)。但是,是的,指令的方式更低级,并且与其他虚拟机并不相似。 – delnan 2011-02-08 15:15:02
@Ben,请根据我在http://stackoverflow.com/a/13540256/304330中提到的内容重新考虑接受的答案,谢谢。 – 2013-07-04 15:38:31