¿Es posible compilar Java en código máquina? (No bytecode)

32

¿Puedes tener Java compilado directamente en el código de la máquina?

Quiero hacer esto para tener control sobre las plataformas en las que se usa y no sé C, C ++, etc.

Russell
fuente

Respuestas:

36

Parece que el compilador GNU para Java puede convertir el código fuente de Java en código de bytes de Java o código de máquina. También puede convertir el bytecode de Java existente en código de máquina. Sin embargo, las últimas noticias son de 2009, por lo que no estoy seguro de qué tan actual sea y si puede manejar las últimas características del lenguaje Java.

Thomas Owens
fuente
1
Si el código de bytes de Java no ha cambiado desde 2009, esto debería funcionar sin que los desarrolladores agiten las banderas "¡Hey! Todavía estoy aquí" sobre el software.
Robert Harvey
@RobertHarvey Creo que Java 7 introdujo algunos conceptos de lenguaje nuevos, por lo que podría fallar al convertir los archivos fuente en código de máquina. Si el código de bytes también ha cambiado con estas nuevas características, entonces eso también fallaría
Thomas Owens
1
Excelsior JET parece estar todavía activo (comercial). Estaba Fujitsu TowerJ, pero parece haber muerto hace una década y era bastante inútil en ese entonces.
Tom Hawtin - tackline
Estoy usando Java 6, así que Java 7 no es un problema en mi caso
Russell
1
El sitio web de GCJ dice que no era totalmente compatible con Java 1.5. Ver este hilo: stackoverflow.com/a/4040404/1257384
GregT
13

No respondiendo directamente al OP, pero quizás sea un lado interesante. Java se puede ejecutar en tres modos:

  1. Mixto (predeterminado): una combinación de código compilado interpretado y máquina (máquina compilada == compilada por JIT en tiempo de ejecución)
  2. Con -Xintindicador - Interpretado - Solo código de bytes
  3. Con -Xcompbandera - Compilado - compilado a máquina
Martijn Verburg
fuente
1
@Martjin ¿Es esto para el HotSpot? Por casualidad, tiene una referencia para el -Xcompporque no pude encontrarlo en la documentación de JDK 7 o en la documentación de opciones de HotSpot y no estoy seguro si tiene algunos secretos ocultos en la lista de correo que nosotros, los simples mortales, no conocemos :-)
edalorzo
2
Es una opción deliberadamente oculta sí :-). Hay varias listas de correo de openjdk (openjdk.java.net) desde las que puede obtener este tipo de información, o leer el código fuente :-)
Martijn Verburg
Tenga en cuenta que, según mis pruebas, -Xcomp puede tener un rendimiento inferior (en un factor de dos) en algunos casos.
Daniel Lemire
Bueno sí. Las optimizaciones justo a tiempo son difíciles de hacer cuando el JIT ni siquiera se está ejecutando. Puede tener! = Tendrá.
candied_orange
ummm entonces estas son opciones para javac? cuando se usa -Xcomp, ¿genera de manera predeterminada un solo archivo binario?
Alexander Mills
7

Sería mejor detectar el sistema operativo usando System.getProperty ("os.name") . Eso le permitiría elegir admitir más de un sistema operativo, pero excluir otros.

Karl Bielefeldt
fuente
¿Hay alguna manera de que esto pueda ser engañado / engañado?
FrustratedWithFormsDesigner
@ Frustrado, probablemente, pero suponía que su intención era evitar admitir oficialmente los sistemas operativos que no ha probado. De lo contrario, no tiene sentido deshabilitar intencionalmente la portabilidad que obtienes esencialmente gratis.
Karl Bielefeldt
También puede ser que quiera vincular el programa a un hardware específico de una manera independiente del sistema operativo.
FrustratedWithFormsDesigner
Puede forzar "os.name" propiedad del sistema mediante el uso de argumentos especiales para la JVM: java -Dos.name=MacOS.
SkyDan
2

Ahora es: GraalVM le permite compilar sus programas con anticipación en un ejecutable nativo. Eche un vistazo a la función de imagen nativa :

Pregunta relacionada: '¿Puedo compilar Java en código nativo?' https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ ya no se mantiene.
Fuente: 'The Deletion of gcj' http://tromey.com/blog/?p=911

Vlad Zamskoi
fuente