我聽說谷歌應用程序引擎可以運行任何編程語言,通過它的JVM
可以轉換爲Java字節碼。我想知道是否可以將LLVM字節碼轉換爲Java字節碼,因爲運行LLVM
在Google App Engine JVM
中支持的語言會很有趣。是否可以將LLVM字節碼轉換爲Java字節碼?
回答
現在可以使用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可執行文件與變形的一般過程,然後 可以概括爲以下。
- 生成LLVM中間 表示(LL文件)的人類可讀表示
- 通過這個LL文件作爲參數傳遞給 變形桿菌編譯系統
- 上面將產生一個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
我懷疑你是否可以,至少不是沒有很大的努力和運行時抽象(例如,構建半個馮諾依曼機器來執行某些操作碼)。 LLVM bitcode允許從直接的,原始的,無構造函數的內存分配到完全未經檢查的強制轉換 - 真正的強制轉換而不是轉換 - 的所有低級別不安全的「做你想要的但我們不會清理混亂」如果您願意,您可以將i32
和bitcast
轉換爲%stuff *
。另外,JVM很重視對象和方法,而LLVM傢伙很幸運,他們有函數指針和結構。
另一方面,似乎C can be compiled to Java bytecode和LLVM bitcode can be compiled to Javascript(雖然許多功能,如動態加載和stdlib函數缺乏),所以它應該是可能的,給予足夠的努力。
閱讀方式:http://vmkit.llvm.org/。我不確定它會對你有幫助,但似乎是相關的。
注意:這個項目沒有更多的維護。
討論後期:Sulong在JVM上執行LLVM IR。它從LLVM IR創建可執行節點(即Java對象),而不是將LLVM IR轉換爲Java字節碼。這些可執行節點組成一個AST解釋器。您可以在https://github.com/graalvm/sulong處查看該項目,或在http://dl.acm.org/citation.cfm?id=2998416閱讀關於該項目的文章。免責聲明:我正在處理這個項目。
- 1. 寫llvm字節碼
- 2. 將MSISDN號碼轉換爲字節
- 3. C++將字節轉換爲操作碼?
- 4. 如何將Java源代碼轉換爲字節代碼?
- 5. 字節碼是否必須轉換爲機器碼?
- 6. 在編譯器將其轉換爲字節碼之前,是否可以從jython中找到java源代碼?
- 7. 是否可以將HHVM字節碼存儲爲文件?
- 8. 是否可以修改字節碼並將其保存爲javassist?
- 9. Java - 將字節[]轉換爲字符串
- 10. Python 3.4將字節字節字節轉換爲字節對象
- 11. 字節碼轉換DEX
- 12. 可以使用LLVM字節碼作爲Z3輸入嗎?
- 13. 將字節轉換爲字節[]
- 14. 如何將字節[]轉換爲字節[]
- 15. Java字節碼
- 16. 是否可以將python中的數字整數轉換爲1字節字符
- 17. 通過反轉字節將小字節轉換爲大字節
- 18. 將Java字符串轉換爲16字節的字節數組
- 19. 將源代碼轉換爲Java字節碼的實用程序是什麼
- 20. 可以使用PHP APC將源代碼轉換爲字節碼嗎?
- 21. char轉換爲字節? (JAVA)
- 22. 是否有可能使用pypy將Java字節碼編譯爲本地代碼?
- 23. 將視頻轉換爲字節數組的java代碼
- 24. 從多字節編碼轉換爲Unicode
- 25. Java:將字節轉換爲整數
- 26. 將字節數組轉換爲.wav java
- 27. Java將int隱式轉換爲字節
- 28. Java將長轉換爲4字節
- 29. 將int轉換爲java中的字節
- 30. 將Java字節數組轉換爲Python字節數組
AFAIK LLVM是一個硬件/操作系統抽象層次庫,而不是字節碼虛擬機。它提供了一些相同的優點,但需要從源代碼針對每個目標平臺進行編譯。 – 2011-02-08 15:09:50
@Peter:不,你可以解釋它,然後JIT編譯它(`lli`)。但是,是的,指令的方式更低級,並且與其他虛擬機並不相似。 – delnan 2011-02-08 15:15:02
@Ben,請根據我在http://stackoverflow.com/a/13540256/304330中提到的內容重新考慮接受的答案,謝謝。 – 2013-07-04 15:38:31