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

2022-09-01 00:37:16

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


答案 1

现在看来,使用LLJVM解释器可以将LLVM IR字节码转换为Java字节码。

kraytracing.com 的Grzegorz有一个有趣的Disqus评论(21/03/11),它解释了他如何修改LLJVM的Java类输出例程以发出与输入C / C++模块在数量上一致的非整体Java类。他认为他的技术似乎避免了通常由LLJVM生成的过长的“复合”Java构造函数方法参数签名,并且他提供了指向他的修改和示例的链接。

尽管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. 将此 ll 文件作为参数传递给变形虫编译系统
  3. 以上将生成一个Java jar文件,可以执行或用作库

我已经扩展了一个bash脚本来编译Ubuntu上最新版本的LLVM和Clang,它可以在这里找到Github Gist

[更新 31/03/14]- LLJVM似乎已经死了一段时间,但是Howard Chu(https://github.com/hyc)似乎已经使LLJVM与最新版本的LLVM(3.3)兼容。请参阅 Howard 在 Github 的 LLJVM-LLVM3.3 分支,请单击此处


答案 2

我怀疑你能做到,至少在没有大量努力和运行时抽象的情况下是行不通的(例如,构建半个冯·诺依曼机器来执行某些操作码)。LLVM位码允许全方位的低级不安全“做你想做的事,但我们不会清理混乱”功能,从直接的,原始的,无构造函数的内存分配到完全未经检查的转换 - 真正的转换,而不是转换 - 如果你愿意,你可以采取它到一个。此外,JVM主要面向对象和方法,而LLVM人员很幸运,他们有函数指针和结构。i32bitcast%stuff *

另一方面,C似乎可以编译为Java字节码LLVM位码可以编译为Javascript(尽管缺乏许多功能,例如动态加载和stdlib函数),所以只要有足够的努力,它应该是可能的。


推荐