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

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

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

那么Java-to-C编译器可用?

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

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

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

GCJ具有这种function,但它并没有得到1.4以上Javafunction的强大支持,而且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代码更快,但不会使您的本机二进制代码更快。 编译代码只会给你一些更好的启动时间。

这不是我自己问题的答案,但甲骨文是如何做到的?

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 ,所以我不确定你的观点是什么。

但是,毕竟有谎言,该死的谎言和基准 。 🙂