2011-02-08 83 views
30

我聽說谷歌應用程序引擎可以運行任何編程語言,通過它的JVM可以轉換爲Java字節碼。我想知道是否可以將LLVM字節碼轉換爲Java字節碼,因爲運行LLVM在Google App Engine JVM中支持的語言會很有趣。是否可以將LLVM字節碼轉換爲Java字節碼?

+0

AFAIK LLVM是一個硬件/操作系統抽象層次庫,而不是字節碼虛擬機。它提供了一些相同的優點,但需要從源代碼針對每個目標平臺進行編譯。 – 2011-02-08 15:09:50

+3

@Peter:不,你可以解釋它,然後JIT編譯它(`lli`)。但是,是的,指令的方式更低級,並且與其他虛擬機並不相似。 – delnan 2011-02-08 15:15:02

+0

@Ben,請根據我在http://stackoverflow.com/a/13540256/304330中提到的內容重新考慮接受的答案,謝謝。 – 2013-07-04 15:38:31

回答

25

現在可以使用LLJVM interpreter將LLVM IR字節碼轉換爲Java字節碼。

有一個有趣的Disqus comment(21/03/11)從kraytracing.com這也解釋了,用代碼一起,他是如何修改LLJVM的Java類輸出程序發出與該輸入同意在一些非單片Java類的Grzegorz C/C++模塊。他建議他的技術似乎避免了通常由LLJVM生成的過長的「複合」Java構造器方法參數簽名,並且他提供了他的修改和示例的鏈接。

雖然LLJVM看起來並不像它一直在積極發展了幾年了,它仍託管在Github上和一些文檔仍然可以在昔日的倉庫處的googlecode上發現:

LLJVM @ Github
LLJVM documentation @ GoogleCode

我還遇到了'Proteuscc'項目,它也利用LLVM輸出Java字節代碼(這表明這是專門針對C/C++的,儘管我假設該項目可以修改或反饋LLVM中間表示法(IR) )。從http://proteuscc.sourceforge.net

產生Java可執行文件與變形的一般過程,然後 可以概括爲以下。

  1. 生成LLVM中間 表示(LL文件)的人類可讀表示
  2. 通過這個LL文件作爲參數傳遞給 變形桿菌編譯系統
  3. 上面將產生一個Java jar文件 其可以被執行或用作圖書館

我已經擴展a bash script to compile the latest versions of LLVM and Clang on Ubuntu,它可以發現是爲Github Gist,here

[UPDATE 31/03/14] - LLJVM已經似乎已經死了間或,但是霍華德楚(https://github.com/hyc)看起來已經取得了LLJVM與LLVM的最新版本(3.3)兼容。請參閱Howard's LLJVM-LLVM3.3 branch at Github, here

7

我懷疑你是否可以,至少不是沒有很大的努力和運行時抽象(例如,構建半個馮諾依曼機器來執行某些操作碼)。 LLVM bitcode允許從直接的,原始的,無構造函數的內存分配到完全未經檢查的強制轉換 - 真正的強制轉換而不是轉換 - 的所有低級別不安全的「做你想要的但我們不會清理混亂」如果您願意,您可以將i32bitcast轉換爲%stuff *。另外,JVM很重視對象和方法,而LLVM傢伙很幸運,他們有函數指針和結構。

另一方面,似乎C can be compiled to Java bytecodeLLVM bitcode can be compiled to Javascript(雖然許多功能,如動態加載和stdlib函數缺乏),所以它應該是可能的,給予足夠的努力。

0

閱讀方式:http://vmkit.llvm.org/。我不確定它會對你有幫助,但似乎是相關的。

注意:這個項目沒有更多的維護。

0

討論後期:Sulong在JVM上執行LLVM IR。它從LLVM IR創建可執行節點(即Java對象),而不是將LLVM IR轉換爲Java字節碼。這些可執行節點組成一個AST解釋器。您可以在https://github.com/graalvm/sulong處查看該項目,或在http://dl.acm.org/citation.cfm?id=2998416閱讀關於該項目的文章。免責聲明:我正在處理這個項目。