我正在寻找一个编译器,用于在运行时(Ahead-of-Time编译)之前将Java字节码转换为与平台无关的C代码。
然后,我应该能够使用标准C编译器将C代码编译为目标平台的可执行文件。我知道这种方法仅适用于不经常修改的某些Java应用程序。
那么Java-to-C编译器是什么?
答案 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)
https://github.com/badlogic/jack - Java to C ++转换器,忽略内存模型和其他内容,使用Boehm GC进行额外的缓慢和GC暂停
我不清楚许可证。
http://ptolemy.eecs.berkeley.edu/publications/papers/03/java-2-C/ - 针对嵌入式系统的可重定向优化Java-to-C编译器
一篇论文,不确定该程序是否可用。
(我一直在谷歌搜索这些东西,这就是我在SO上提出这个问题的方式。)
答案 4 :(得分:1)
AFAIK,没有这样的产品,但你有两个选择:
注意:如果出于性能原因这样做,那么你会感到很失望。 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 。 :)