2012-09-10 312 views
17

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

即,我做不是想要將Java代碼編譯成LLVM。我只想要一個用於代碼生成的LLVM庫,我可以從Java調用它。通常的LLVM庫是C,所以我不能使用它。

有沒有Java端口?如果否,那麼最簡單的方法是什麼呢?將API包裝到JNI中?

+0

重新實現整個LLVM代碼庫(或者至少是它的一大部分子集)會導致巨大的工作量浪費。只需像其他人一樣調用C API即可。 – delnan

+0

但我正在使用的程序是Java,並且我不允許更改它。我從來沒有寫過關於重新實現它的所有內容。這不是我的意圖,我在這裏要求更簡單的方法。 – gexicide

+0

這不是我的意思。例如,人們從O'Caml和Python調用LLVM。從Java調用C代碼有多難? – delnan

回答

15

llvm java api bindings快速搜索原來,這似乎是一個不錯的選擇幾個項目:

所有這些庫的使用JNI來訪問C-API,所以你有一個DLL或SO文件的LLVM它任何情況下都是自我。

5

從Java訪問C庫最簡單的方法是JNA。您可以創建一個與您希望使用的C API部分同構的Java接口,然後由JNA完成剩下的工作。這意味着您只需在API更改時更新與您直接相關的方法。

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

痛飲更難使用,但可以JNA是死路,如果你發現自己需要提高性能。 JLLVM是一個基於SWIG的工具,因此您可能會考慮引用它或爲了您自己的目的將其分叉。

不要使用基本的JNI - 在SWIG或JNA之間選擇。

盲目依賴於第三方包裝,其歷史最少是一個冒險的主張,但如果你故意將這樣的項目作爲一個起點,那麼你就不會出錯。

使用這兩種技術,你偶爾都會去查找枚舉常量。如果它們不容易從頭文件中讀取,那麼您將需要編寫一個簡單的C程序來打印出您感興趣的常量,以便您可以手動將它們複製到Java接口。

7

基於當前的LLVM v3.6以更新的信息回答問題。您的選擇是:

  • RoboVM LLVM Java綁定了支持當前LLVM v3.6(GPL許可證)的RoboVM項目的一部分。
  • LLVM-J轉移到Github並支持LLVM v3.0(MIT許可證)。
  • 支持LLVM v3.2(LGBL許可證)的JLLVM。

如果GPL授權對您有用,那麼您一定要去RoboVM。這是一個積極的項目,對最新的LLVM版本提供強大的支持。 JLLVM和LLVM-J不再處於活動狀態,因此您需要使用它們做一些額外的工作。

+1

該死的......連RoboVM都不見了...... – Silverclaw