¿Puedo compilar Java en código nativo?

81

¿Hay alguna forma de compilar desde Java a código de máquina independiente (o biblioteca) sin requerir una JVM?

barroco
fuente
3
"compilar" es la palabra que está buscando (en lugar de "compilar").
TJ Crowder
6
Si lo que le interesa es la velocidad, no se moleste a menos que esté mirando una plataforma que HotSpot (JVM de Sun) no es compatible. HotSpot compila código de bytes en código nativo sobre la marcha dondequiera que aparezca un "punto de acceso" de la ruta de ejecución (algo que se ejecuta mucho), y es muy bueno en eso. Pero si está buscando evitar requerir una JVM, sí, mire el gcj que James le indicó.
TJ Crowder
3
Otra razón más es la protección contra los descompiladores de Java. En cuanto al rendimiento de HotSpot vs compilador nativo (vs JRockit vs IBM vs GCC vs Visual C ++ vs hand-writing-CPU-instructions-in-hex), depende de la aplicación, entonces YMMV.
Dmitry Leskov
1
Encontré un desarrollo interesante de Oracle para su base de datos Oracle llamada JServer Accelerator. También fue diseñado para ser dependiente de la plataforma de alguna manera compilando no en códigos de bytes sino en código C. docs.oracle.com/cd/A87860_01/doc/java.817/a83727/jtools5.htm
supernova
6
No entiendo por qué los moderadores cerraron esta pregunta. Me parece perfectamente claro. Si no lo entienden, quizás el problema sea con ellos.
isapir

Respuestas:

40

Solía ​​haber una herramienta llamada GCJ que formaba parte de GCC, pero ha sido eliminada . Ahora, todos los enlaces en el sitio de GCC redirigen a sus equivalentes que no son de GCJ.

NB: todos los comentarios se referían a mi respuesta original que decía que puede compilar Java en código nativo con GCJ.

James Kingsbery
fuente
2
Sí, gcj es el más conocido. @ isola009: tenga en cuenta que al compilar en código nativo, probablemente trabajará con un subconjunto (posiblemente un subconjunto dramáticamente pequeño) de las bibliotecas que Java normalmente tiene por defecto. Gnu's es bastante bueno, según todas las cuentas, pero muy por detrás del JDK actual.
TJ Crowder
Está muy por detrás de todos los JDKS que comienzan con 1.2. He encontrado muchos problemas de soporte con personas que ejecutan accidentalmente GNU classpath en lugar de Java, y todos se solucionaron sin excepción al desinstalarlo y usar un Sun JDK.
Marqués de Lorne
Excelsior JET incluye una implementación con licencia de la biblioteca estándar Java SE 6 y ha pasado las pruebas de cumplimiento oficiales (JCK). Ahora está en el nivel 6u18, se espera que la próxima versión admita 6u20.
Dmitry Leskov
27

¡Si!

Oracle ha estado trabajando en GraalVm, que admite imágenes nativas. Consulte aquí: https://www.graalvm.org/

Imagen nativa La función de imagen nativa con GraalVM SDK ayuda a mejorar el tiempo de inicio de las aplicaciones Java y les da una huella más pequeña. Efectivamente, está convirtiendo el código de bytes que se ejecuta en la JVM (en cualquier plataforma) en código nativo para un sistema operativo / plataforma específico, que es de donde proviene el rendimiento. Utiliza optimizaciones agresivas anticipadas (AOT) para lograr un buen rendimiento.

Ver más:

RobAu
fuente
Lamentablemente, incluso este proyecto no es estable para la producción y el uso de la API Swing aún no es compatible / con errores: github.com/oracle/graal/issues/1327
BullyWiiPlaza
"Lanzamiento de GraalVM 19.0:" GraalVM finalmente está maduro y listo para su uso en producción ". Por supuesto, habrá errores y algunas funciones aún no completas. Pero Twitter lo usa para sus sistemas de producción, por lo que no estoy de acuerdo con su primera reclamar.
Robau
Mi experiencia personal es que Windowssolo funcionan los programas de juguetes, pero cualquier cosa más avanzada y / o cuando se usa un GUItodavía no funciona. Twitterprobablemente use Linuxsin ninguno, GUIpero probablemente también usen la versión comercial, mientras que yo solo probé la comunitaria. Puede funcionar para algunos casos de uso, pero Windowslas aplicaciones de escritorio Java no son una de ellas, lo que aún hace que el proyecto sea un poco decepcionante. Excelsior JETpodría hacer esto de manera confiable, pero ahora está descontinuado.
BullyWiiPlaza
19

Excelsior JET es un compilador comercial de Java a código nativo. Sin embargo, se suspendió en mayo de 2019.

marca
fuente
3
Por si acaso, existen licencias gratuitas para proyectos no comerciales.
Dmitry Leskov
1
¿Cómo se compara con RoboVM?
Janus Troelsen
El 15 de mayo de 2019, Excelsior JET se suspendió. Ver: en.wikipedia.org/wiki/Excelsior_JET
Stephan
11

Sí, el JIT en la JVM hace exactamente eso por usted.

De hecho, puede producir código más rápido que compilar el código por adelantado, ya que puede generar código optimizado para la plataforma específica en función de cómo se usa el código en tiempo de ejecución.

La JVM siempre está involucrada incluso si se compila un porcentaje muy alto en código nativo, ya que podría cargar y ejecutar código de bytes de forma dinámica.

Peter Lawrey
fuente
18
Sí, tienes razón en que el JIT lo hace y lo hace muy bien. No tiene un ejecutable independiente, pero entonces el PO no estaba preguntando por que ....
Bill K
2
Parece sugerir que solo los JIT pueden realizar una optimización específica de la plataforma. Creo que es posible siempre que envíe un bytecode. ART compila código de bytes en código nativo durante la instalación y no es un JIT. Peter, ¿tienes algún comentario sobre esto?
Janus Troelsen
2
OP menciona, independiente, que simplemente elimina cualquier tipo de JIT: si bien JIT produce código nativo sobre la marcha, nunca es independiente.
StormByte
1
@KurtFitzner Creo que tienes una idea muy diferente de lo que hace el compilador JIT, compila en código nativo donde la interpretación no está involucrada.
Peter Lawrey
2
No creo que un compilador JIT pueda permitirse tantas optimizaciones profundas como lo hacen los compiladores / enlazadores nativos de AOT: compilar y vincular con optimización completa debería poner a cualquier computadora de rodillas; si no, el compilador no está haciendo el mejor esfuerzo para optimizar.
Johan Boulé
0

Otra posibilidad sería RoboVM. Sin embargo, sólo parece funcionar en Linux, iOSy Mac OS X.

A día de hoy, el proyecto todavía parece algo vivo, contrariamente a algunas publicaciones en línea que afirman que el proyecto está muerto .

BullyWiiPlaza
fuente