簡體   English   中英

編譯器在運行時之前將Java字節碼轉換為與平台無關的C代碼?

[英]Compiler to translate Java bytecode to platform-independent C code before runtime?

我正在尋找一個編譯器,在運行時(Ahead-of-Time編譯)之前將Java字節碼轉換為與平台無關的C代碼。

然后,我應該能夠使用標准C編譯器將C代碼編譯為目標平台的可執行文件。 我知道這種方法僅適用於不經常修改的某些Java應用程序。

那么Java-to-C編譯器可用?

我可以建議一個名為JCGO的工具,它是C語言翻譯器的Java源代碼。 如果需要轉換字節碼,則可以通過某種工具(例如,JadRetro + Jad)對類文件進行反編譯,並將源文件傳遞給JCGO。 該工具一次翻譯java程序的所有類,並生成C文件(每個類一個.c和.h),可以進一步編譯(通過第三方工具)為高度優化的本機代碼。目標平台。 Java泛型尚不支持。 支持AWT / Swing和SWT。

為什么這樣? Java虛擬機包括運行時Java到程序集編譯器。

運行時編譯可以產生更好的性能,因為有關運行時值的所有信息都可用。 雖然提前編譯必須對運行時值進行假設,因此可能會發出較少的代碼。 有關詳細信息,請參閱Cliff Click的Java vs C性能

GCJ具有這種功能,但它對1.4版本的Java功能沒有很大的支持,而Swing的支持很可能很麻煩。 但實際上,HotSpot JIT編譯器勝過Java的所有先期編譯器。 請參閱Excelsior JET的基准測試 澄清一下:GCJ將java源/字節碼轉換為本機編譯的代碼

Toba將(舊)Java字節碼轉換為C源。 但是,自Java 1.1以來它還沒有更新。 部分方便移植可能會有所幫助,但它無法處理Java所擁有的所有復雜庫。

(我一直在谷歌搜索這些東西,這就是我在SO處提出的這個問題。)

AFAIK,沒有這樣的產品,但你有兩個選擇:

  • 將您自己的字節碼實現到C語言轉換器。 字節碼非常簡單,這不是太難。

  • 如果您只想要一個原生二進制文件(即當您不需要C源代碼時),那么請嘗試GCJ

注意:如果出於性能原因這樣做,那么你會感到很失望。 Java通常和C / C ++一樣快。 此外,對VM的改進將使所有Java代碼更快,但不是您的本機二進制代碼。 編譯代碼只會給你一個更好的啟動時間。

這不是我自己問題的答案,但Oracle是如何做到的?

http://download.oracle.com/docs/cd/B28359_01/java.111/b31225/chone.htm#BABCIHGA

曾經有一種名為TowerJ的產品,它本質上是Java的“via C”靜態編譯器,但它早已不復存在。

有人告訴我,Sun Labs已經創建了這樣的東西,作為Sun SPOT項目的一部分,但我不確定它是否公開。

@BobMcGee:在你提到的基准測試中,GCJ確實輸了,但Excelsior JET(32位AOT編譯器)在所有三個測試系統上擊敗了32位HotSpot ,所以我不確定你的觀點是什么。

但是,畢竟有謊言,該死的謊言和基准 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM