是否可以将Java编译为机器代码?(不是字节码)


32

您可以将Java直接编译成机器代码吗?

我想这样做,所以我可以控制它在什么平台上使用,并且不了解C,C ++等。

Answers:


36

看来JavaGNU编译器可以将Java源代码转换为Java字节码或机器代码。它还可以将现有的Java字节码转换为机器代码。但是,最后一条消息来自2009年,所以我不确定它的最新情况以及它是否可以处理Java语言的最新功能。


1
如果Java字节码自2009年以来没有发生变化,那么在开发人员无需对该软件挥舞“嘿!我还在这里”标志的情况下,它仍然可以正常工作。
罗伯特·哈维

@RobertHarvey我相信Java 7引入了一些新的语言概念,因此它可能无法将源文件转换为机器代码。如果字节码也随着这些新功能而改变,那也将失败
Thomas Owens

1
Excelsior JET似乎仍处于活动状态(商业)。那里有Fujitsu TowerJ,但那似乎已经死于十年前了,那时还没有意义。
汤姆·哈特芬

我使用的是Java 6,因此在我的情况下,Java 7没问题
Russell

1
GCJ的网站表示,它甚至没有完全支持Java 1.5。看到这个线程:stackoverflow.com/a/4040404/1257384
GregT

13

并不是直接回答OP,而是一个有趣的地方。Java可以三种方式运行:

  1. 混合(默认)-解释和机器编译代码的组合(机器编译==在运行时由JIT编译)
  2. -Xint标志-已解释-仅字节码
  3. -Xcomp标志-编译-机器编译

1
@Martjin这是热点吗?偶然地您有参考,-Xcomp因为我在JDK 7文档或HotSpot选项文档中找不到那个,并且不确定您是否有一些隐藏的邮件列表秘密,我们这些凡人都不知道:-)
edalorzo 2012年

2
这是一个故意隐藏的选项,是的:-)。有各种openjdk(openjdk.java.net)邮件列表,您可以从-或阅读源代码中收集此类信息:-)
Martijn Verburg,2012年

请注意,根据我的测试,在某些情况下-Xcomp的性能可能较差(两倍)。
Daniel Lemire 2014年

好吧 当JIT甚至没有运行时,很难及时进行优化。可以有!=将有。
candied_orange

嗯,所以这些是选择javac吗?使用-Xcomp时,默认情况下是否输出单个二进制文件?
Alexander Mills

7

使用System.getProperty(“ os.name”)检测操作系统可能会更好。这样一来,您就可以选择支持多个操作系统,而排除其他操作系统。


有什么办法可以欺骗/游戏吗?
FrustratedWithFormsDesigner 2012年

@可能很沮丧,但我以为他的意图是避免正式支持尚未测试的操作系统。否则故意禁用可移植性实际上是没有意义的。
Karl Bielefeldt

他可能还想以一种独立于OS的方式将程序绑定到特定的硬件。
FrustratedWithFormsDesigner 2012年

您可以通过对JVM使用特殊参数来强制使用“ os.name”系统属性java -Dos.name=MacOS
SkyDan 2012年

2

现在是:GraalVM允许您提前将程序编译为本地可执行文件。看一下本机图像功能:

相关问题:“我可以将Java编译为本机代码吗?” https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ不再维护。
资料来源:“ gcj的删除” http://tromey.com/blog/?p=911

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.