编译器在运行时之前将Java字节码转换为与平台无关的C代码?

时间:2009-12-21 16:49:55

标签: java c compiler-construction

我正在寻找一个编译器,用于在运行时(Ahead-of-Time编译)之前将Java字节码转换为与平台无关的C代码。

然后,我应该能够使用标准C编译器将C代码编译为目标平台的可执行文件。我知道这种方法仅适用于不经常修改的某些Java应用程序。

那么Java-to-C编译器是什么?

7 个答案:

答案 0 :(得分:8)

我可以推荐一个名为JCGO的工具,它是C语言翻译器的Java源代码。如果需要转换字节码,则可以通过某种工具(例如,JadRetro + Jad)对类文件进行反编译,并将源文件传递给JCGO。该工具一次翻译java程序的所有类,并生成C文件(每个类一个.c和.h),可以进一步编译(通过第三方工具)为高度优化的本机代码。目标平台。 Java泛型尚不支持。支持AWT / Swing和SWT。

答案 1 :(得分:3)

为什么这样? Java虚拟机包括运行时Java到程序集编译器。

运行时编译可以产生更好的性能,因为有关运行时值的所有信息都可用。虽然提前编译必须对运行时值进行假设,因此可能会发出较少的代码。有关详细信息,请参阅Cliff Click Java vs C performance

答案 2 :(得分:3)

GCJ具有此功能,但它对1.4版本的Java功能没有得到很好的支持,而Swing支持很可能会很麻烦。但实际上,HotSpot JIT编译器胜过Java的所有先期编译器。请参阅Excelsior JET的benchmarks澄清:GCJ将java源/字节码转换为本机编译的代码

Toba会将(旧的)Java字节码转换为C源代码。但是,自Java 1.1以来,它还没有更新。部分简化移植可能会有所帮助,但它无法处理Java所拥有的所有复杂库。

答案 3 :(得分:2)

(我一直在谷歌搜索这些东西,这就是我在SO上提出这个问题的方式。)

答案 4 :(得分:1)

AFAIK,没有这样的产品,但你有两个选择:

  • 为C语言转换器实现自己的字节码。 Byte-code很简单,这不太难。

  • 如果您只想要一个原生二进制文件(即当您不需要C源代码时),那么请尝试GCJ

注意:如果出于性能原因这样做,那么你会感到很失望。 Java通常和C / C ++一样快。此外,对VM的改进将使所有Java代码更快,但不是您的本机二进制代码。编译代码只会让你有更好的启动时间。

答案 5 :(得分:1)

不是我自己的问题的答案,但Oracle是如何做到的?

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

答案 6 :(得分:0)

曾经有一种名为TowerJ的产品,它本质上是Java的“via C”静态编译器,但它早已不复存在。

有人告诉我,Sun Labs在Sun SPOT项目中创建了类似的东西,但我不确定它是否公开。

@BobMcGee:在您提到的基准测试中,GCJ确实输了,但 Excelsior JET(32位AOT编译器)在所有三个测试系统上击败了32位HotSpot ,所以我不确定你的观点是什么。

但是,毕竟有谎言,该死的谎言和 benchmarks 。 :)