Is there any way to compile from Java to standalone (or library) machine code without requiring a JVM?
There used to be a tool called GCJ that was part of GCC, but it's been removed. Now, all the links in the GCC site re-direct to their non-GCJ equivalents.
NB: the comments all refered to my original answer saying you can compile Java to native code with GCJ.
Yes!
Oracle has been working on the GraalVm, which supports Native Images. Check here: https://www.graalvm.org/
Native Image The native image feature with the GraalVM SDK helps improve the startup time of Java applications and gives them a smaller footprint. Effectively, it's converting bytecode that runs on the JVM (on any platform) to native code for a specific OS/platform — which is where the performance comes from. It's using aggressive ahead-of-time (AOT) optimizations to achieve good performance.
See more:
Summary
https://www.graalvm.org/docs/getting-started/#native-imagesDemos: Native images for faster startup
https://www.graalvm.org/docs/examples/native-list-dir/Detailed: 'Ahead-of-time Compilation'
https://www.graalvm.org/docs/reference-manual/aot-compilation/
The Micronaut platform uses GraalVM to make native microservices:
Simple example
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Native World!");
}
}
Compiling java:
javac HelloWorld.java
Compiling to native:
native-image HelloWorld
Running (only the executable is needed):
./HelloWorld
Output
Hello, Native World!
Windows
only toy programs work but anything more advanced and/or when using a GUI
isn't quite there yet. Twitter
probably uses Linux
without any GUI
but they probably use the commercial version as well while I only tried the community one. It may work for some use cases but Java Windows
desktop applications aren't one of them which still makes the project slightly disappointing. Excelsior JET
could do this reliably but it is discontinued now. –
Nebulize Excelsior JET is a commercial Java to native code compiler. However, it was discontinued in May 2019.
Yes, the JIT in the JVM does exactly that for you.
In fact it can produce faster code than compiling the code in advance as it can generate code optimised for the specific platform based on how the code is used at runtime.
The JVM is always involved even if a very high percentage is compiled to native code as you could load and run byte code dynamically.
Another possibility would be RoboVM
.
However, it only seems to work on Linux
, iOS
and Mac OS X
.
As of today, the project still seems somewhat alive contrary to some posts online claiming the project to be dead.
© 2022 - 2024 — McMap. All rights reserved.