从Java生成LLVM代码

我想使用Java的LLVM代码生成框架。

即,我不想将Java代码编译成LLVM。 我只想要一个用于代码生成的LLVM库,我可以从Java调用它。 通常的LLVM库是C,所以我不能使用它。

有没有Java端口? 如果不是,那么最简单的方法是什么呢? 将API包装到JNI中?

快速搜索llvm java api绑定发现了几个看起来很合适的项目:

  • LLVM-J
  • JLLVM
  • LAJ

所有这些库都使用JNI来访问C-API,因此在任何情况下都有LLVM本身的DLL或SO文件。

使用基于当前LLVM v3.6的更新信息回答问题。 你的选择是:

  • RoboVM LLVM Java绑定是RoboVM项目的一部分,支持当前的LLVM v3.6(GPL许可证)。
  • LLVM-J移动到Github并支持LLVM v3.0(MIT许可证)。
  • JLLVM,支持LLVM v3.2(LGBL许可证)。

如果GPL许可对你好,那么你一定要去RoboVM。 这是一个活跃的项目,对最新的LLVM版本提供强大的支持。 JLLVM和LLVM-J不再处于活动状态,因此您需要使用它们进行一些额外的工作。

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

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

SWIG更难使用,但如果您发现自己需要提高性能,JNA可能是一个死胡同。 JLLVM是一个基于SWIG的工具,因此您可以考虑引用它或为自己的目的分配它。

不要使用基本的JNI – 在SWIG或JNA之间进行选择。

盲目地依赖历史最少的第三方包装是一个冒险的主张,但如果你故意把这样一个项目当作一个起点,你就不会出错。

使用这两种技术,您偶尔会不得不四处寻找枚举常数。 如果从头文件中读取它们并不容易,那么您将需要编写一个简单的C程序来打印出您感兴趣的常量,这样您就可以手动将它们复制到Java接口中。