从Java生成LLVM代码

21

我希望能够从Java中使用LLVM代码生成框架。

也就是说,我不想将Java代码编译成LLVM,而只是想要一个用于代码生成的LLVM库,可以从Java中调用。通常的LLVM库是C语言编写的,所以我不能直接使用它。

是否有任何Java版本的LLVM库?如果没有,最简单的方法是什么?将API封装到JNI中吗?


1
重新实现整个LLVM代码库(或至少是其中的大部分)的端口将是一种巨大的浪费。像其他人一样,只需调用C API即可。 - user395760
但我正在处理的程序是Java,而且我没有权限更改它。我从来没有写过重新实现所有内容的内容。这不是我的意图,我在这里寻求更简单的方法。 - gexicide
这不是我想表达的意思。例如,人们正在从O'Caml和Python调用LLVM。那么从Java调用C代码有多难呢? - user395760
那么,你的答案是在JNI中编写一个包装器? - gexicide
我不熟悉Java生态系统,因此我没有资格推荐任何特定的选项(或答案)。但是,无论如何都要进行包装。这是一个明智的选择。我知道的另一个明智的选择是生成文本,该文本恰好是有效的IR汇编代码,并在其上调用命令行工具。但是不鼓励使用,因为很难做到并且格式经常发生变化。 - user395760
3个回答

19

快速搜索 LLVM Java API绑定,发现有几个看起来适合的项目:

这些库都使用JNI访问C-API,所以在任何情况下您都需要LLVM本身的DLL或SO文件。


8
为了回答问题并提供更加实时的信息,基于当前的LLVM v3.6,您有以下几个选择:
  • RoboVM是RoboVM项目的一部分,支持当前的LLVM v3.6 (GPL许可证)。
  • LLVM-J已经转移到Github并支持LLVM v3.0 (MIT许可证)。
  • JLLVM支持LLVM v3.2 (LGBL许可证)。
如果您可以接受GPL许可证,那么您应该绝对选择RoboVM。它是一个活跃的项目,对最新的LLVM版本有强大的支持。JLLVM和LLVM-J已不再活跃,因此您需要额外的工作才能使用它们。

5
使用JNA是从Java访问C库最简单的方法。您创建一个与您希望使用的C API部分同构的Java接口,然后JNA完成其余部分。这意味着当API更改时,您只需直接更新与您相关的方法即可。

https://github.com/twall/jna/blob/master/README.md

SWIG使用较为困难,但如果需要提高性能,JNA可能会成为死胡同。 JLLVM是基于SWIG的工具,因此您可以考虑引用它或将其分叉以适应自己的目的。
不要使用基本JNI-选择SWIG或JNA之间的一个。
盲目依赖历史记录最少的第三方包装器是有风险的,但如果您有意将这样的项目视为起点,那么就不会出错。
对于这两种技术,您偶尔需要查找枚举常量。 如果它们无法从头文件中轻松读取,则需要编写一个简单的C程序来打印您感兴趣的常量,以便您可以手动将它们复制到Java接口中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接