¿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?


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.


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:


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


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.


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é

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.