我可以将Java编译为本机代码吗?


81

有什么方法可以从Java编译为独立的(或库)机器代码,而无需JVM?


3
“编译”是您要查找的词(而不是“编译”)。
TJ Crowder 2010年

6
如果您对速度感兴趣,请不要担心,除非您正在寻找HotSpot(Sun的JVM)不支持的平台。HotSpot会在执行路径的“热点”(经常运行的东西)出现的任何地方即时将字节码编译为本地代码,这非常好。但是,如果您希望避免需要JVM,可以的,请看James指出的gcj。
TJ Crowder 2010年

3
另一个原因是防止Java反编译器。至于HotSpot与本机编译器(与JRockit,IBM,GCC,Visual C ++和手写CPU-in-hex指令)的性能,则取决于应用程序,因此取决于YMMV。
德米特里·莱斯科夫

1
我发现甲骨文针对其中一个名为JServer Accelerator的Oracle数据库开发了一个有趣的开发。通过不编译为字节码而是编译为C代码,它还以某种方式依赖于平台。 docs.oracle.com/cd/A87860_01/doc/java.817/a83727/jtools5.htm
supernova

6
我不明白主持人为什么关闭了这个问题。对我来说似乎很清楚。如果他们不理解,那么问题可能出在他们身上。
isapir '16

Answers:


40

曾经有一个称为GCJ的工具是GCC的一部分,但已被删除。现在,GCC站点中的所有链接都重定向到其非GCJ等效项。

注意:所有注释均引用了我的原始答案,表示您可以使用GCJ将Java编译为本机代码。


2
是的,gcj是最著名的。@ isola009:请记住,编译为本机代码时,您可能会使用Java通常默认具有的的子集(可能是很小的子集)。从所有方面来看,Gnu的表现都不错,但远远落后于当前的JDK。
TJ Crowder 2010年

从1.2开始,它远远落后于所有JDKS。我遇到了很多支持问题,因为人们不小心运行了GNU classpath而不是Java,并且通过卸载并使用Sun JDK可以解决所有问题。
罗恩侯爵

Excelsior JET包含Java SE 6标准库的许可实现,并已通过官方合规性测试(JCK)。现在是6u18级别,下一版本预计将支持6u20。
德米特里·莱斯科夫

27

是!

Oracle一直在开发支持本机映像的GraalVm。检查这里:https : //www.graalvm.org/

本机映像 与GraalVM SDK原生图像特征有助于提高Java应用程序的启动时间,让他们有一个更小的空间。实际上,它会将在JVM(在任何平台上)上运行的字节码转换为特定OS /平台的本机代码,这正是性能的来源。它使用积极的提前(AOT)优化来获得良好的性能。

查看更多:


不幸的是,即使这个项目对于生产来说也是不稳定的,并且仍然不支持/使用Swing API:github.com/oracle/graal/issues/1327
BullyWiiPlaza

“ GraalVM 19.0发行版:“ GraalVM终于成熟并可以投入生产了。”当然会有错误和一些尚未完成的功能。但是twitter将其用于他们的生产系统,所以我不同意您的第一个权利要求。
RobAu

我的个人经验是,Windows只有玩具程序可以工作,但是任何更高级的东西和/或使用a时还GUI没有。Twitter可能Linux没有使用任何功能,GUI但当我仅尝试使用社区版本时,他们也可能也使用了商业版本。它可能适用于某些用例,但JavaWindows桌面应用程序不是其中之一,这仍然使项目有些令人失望。Excelsior JET可以可靠地做到这一点,但现在已停产。
BullyWiiPlaza


11

是的,JVM中的JIT正是为您完成的。

实际上,它可以生成比预先编译代码更快的代码,因为它可以基于在运行时使用代码的方式生成针对特定平台优化的代码。

即使将非常高的百分比编译为本机代码,也始终会涉及JVM,因为您可以动态加载和运行字节码。


18
是的,您是正确的,JIT可以做到并做得很好。它没有一个独立的可执行文件,但随后的OP不是问有关....
比尔ķ

2
您似乎建议仅JIT可以进行特定于平台的优化。我认为每当您发送字节码时就有可能。ART在安装时会将字节码编译为本机代码,它不是JIT。彼得,您对此有何评论?
Janus Troelsen

2
OP提到独立的,它散发出任何一种JIT:尽管JIT可以即时生成本机代码,但它绝不是独立的。
StormByte

1
@KurtFitzner我认为您对JIT编译器的功能有完全不同的想法,它确实可以编译为不涉及解释的本机代码。
彼得·劳瑞

2
我不认为JIT编译器可以提供像本机AOT编译器/链接器那样的深度优化:完全优化的编译和链接应该使任何计算机都屈服;如果不是,则编译器不会尽最大努力进行优化。
约翰·布勒(JohanBoulé)

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.