【问题标题】:Generating LLVM Code from Java [closed]从 Java 生成 LLVM 代码 [关闭]
【发布时间】:2012-09-03 17:34:56
【问题描述】:

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

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

是否有任何 Java 端口?如果不是,那么最简单的方法是什么?将 API 封装到 JNI 中?

【问题讨论】:

  • 重新实现整个 LLVM 代码库(或至少是其中的一个大子集)的移植将是极大的浪费。只需像其他人一样调用 C API。
  • 但我正在开发的程序是 Java,我不允许更改它。我从来没有写过关于重新实现所有这些的文章。这不是我的意图,我在这里要求更简单的方法。
  • 我不是这个意思。例如,人们从 O'Caml 和 Python 调用 LLVM。从 Java 调用 C 代码有多难?
  • 那么,你的答案是在 JNI 中编写一个包装器?
  • 我不了解 Java 生态系统,因此我没有资格推荐任何特定的选项(或答案,就此而言)。但是,是的,以某种方式包装它。这是一个明智的选择。我知道的另一个明智的选择是生成恰好是有效 IR 汇编代码的文本并在其上调用命令行工具。但是因为很难做好,而且格式经常变化,所以气馁。

标签: java code-generation llvm


【解决方案1】:

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

所有这些库都使用 JNI 来访问 C-API,因此无论如何您都有 LLVM 本身的 DLL 或 SO 文件。

【讨论】:

    【解决方案2】:

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

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

    如果您可以接受 GPL 许可,那么您绝对应该选择 RoboVM。这是一个活跃的项目,对最新的 LLVM 版本提供强大的支持。 JLLVM 和 LLVM-J 不再处于活动状态,因此您需要使用它们做一些额外的工作。

    【讨论】:

      【解决方案3】:

      从 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 接口中。

      【讨论】:

        猜你喜欢
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 2012-04-07
        • 2012-12-02
        相关资源
        最近更新 更多