2011-02-15 7 views
8

Me pregunto cómo puedo deshacerme de la dependencia java jre y producir código nativo y entregar el código compilado como la aplicación?Teóricamente hablando, ¿puedo obtener OpenJDK JIT y compilar mi código java a native?

¿Es posible?

P.S. Sé sobre el compilador gcj ¿es lo que está haciendo?

+0

¿Necesita usar la construcción Class.forName()? –

+0

Puede entregar un código compilado y se ejecutará en cualquier sistema con la versión correcta de Java instalada. No importa cómo lo haga en cualquier idioma, asumirá que se instaló algún sistema operativo/software. –

+0

Un tiempo de ejecución de Java puede manejar Class.forName() en código nativo simplemente cortando el circuito a clases precompiladas, pero por supuesto también debe incluir un JIT o intérprete para las clases que no fueron precompiladas (proxies dinámicos, complementos de terceros , etc.) –

Respuesta

1

Excelsior tiene un muy buen compilador Java2Native. Me encantaría usarlo, pero lamentablemente nuestro proyecto tarda 8 horas en compilarse con este compilador. La velocidad resultante de la aplicación es un pensamiento impresionante.

+3

¿Eso es realmente un problema? Desarrolla contra el JDK pero sus compilaciones nocturnas automatizadas salen del compilador. QA se ejecuta en contra de las compilaciones automáticas. Tendría que decir que la mayoría de los sistemas en los que he trabajado eran al menos tan complejos, es normal. –

+1

conozco este producto, ¿cómo demonios hacen eso? – user63898

+0

Actualmente estamos en desarrollo y no hay paso de control de calidad ... commit-2-live a menudo demora 15 minutos. Si alcanzamos estable sin embargo, Excelsior definitivamente será una opción para nosotros. – Daniel

3

El código de bytes compilados seguirá dependiendo de la máquina virtual java. Un JIT no puede crear código que "tenga algún sentido" fuera del contenedor de JVM. Sí, el resultado es un montón de instrucciones válidas para la plataforma objetivo. Pero aún necesita la pila real, el montón y el recolector de basura (solo para nombrar algunos bloques de construcción requeridos).

1

En teoría, es posible tomar cualquier intérprete para un idioma y convertirlo en un compilador que produce código nativo en ese idioma. Esto está relacionado con una serie de ecuaciones llamadas Futamura projections. La idea de alto nivel es esencialmente "engañar" a la hora de definir un compilador. Supongamos que para un lenguaje L tengo un intérprete I (p) que, dado un programa p escrito en el lenguaje L, interpreta ese programa. Ahora, supongo que el intérprete I está representado directamente en el código máquina. Supongamos además que tengo un programa llamado mix que, dado un programa de código de máquina y una secuencia de entrada a ese programa, produce un nuevo programa de código de máquina que es el programa inicial con su entrada fija para ser la entrada especificada. Por ejemplo, si he realizado este programa en C++:

#include <iostream> 
using namespace std; 

int main() { 
    string message; 
    cin >> message; 
    cout << message << endl; 
} 

y luego se usa para mezclar mix el programa con la entrada "Hola", que tendría un programa que siempre se imprime el mensaje "Hola". En otras palabras, sería como si hubiera escrito este programa:

#include <iostream> 
using namespace std; 

int main() { 
    cout << "Hello" << endl; 
} 

Resulta que es posible construir este programa. Podría hacer esto, por ejemplo, mirando el código máquina, mirando cada lugar en el que intente leer la entrada desde la consola y luego reemplazándolo con un código que llame a una función para leer en cambio desde una cadena codificada.

Ahora, considere qué pasaría si ejecutara este programa mix tomando como entrada un intérprete I y algún programa p. Entonces, el resultado de esto sería un programa de código máquina que es equivalente al programa I que se ejecuta en la entrada p. En otras palabras, acaba de construir un programa de código máquina que simula lo que sucedería si ejecutara el intérprete en el programa, que es un programa de código máquina que ejecuta el programa p!

Por supuesto, esta construcción es completamente impráctica. Que yo sepa, nadie ha escrito mix, y si lo hicieran, cualquier programa que hagas convirtiendo un intérprete en un compilador sería tremendamente ineficiente porque no se optimizaría del todo.

En cuanto a su pregunta original sobre si podría tomar el JIT de la JVM y usarlo para producir código máquina sin formato para un programa Java, no estoy seguro ya que no he buscado el código fuente, pero dudo mucho eso. El código de máquina casi con certeza contiene ganchos que volverían a llamar a la JVM para tareas específicas (por ejemplo, recolección de basura, carga de clases, etc.), lo que haría que el código generado no funcionara en un entorno independiente. Sin embargo, es una buena idea tratar de hacer esto, y espero que esta respuesta arroje algo de luz sobre la teoría detrás de esto.

+0

Downvoter- ¿Puedes comentar sobre qué está mal con esta respuesta? – templatetypedef

0

Tenga en cuenta que esta pregunta es similar a "¿Puedo deshacerme de Windows y dejar que mi programa de Windows se ejecute sin un sistema operativo?"

Los programas de Java esperan que haya un amplio conjunto de clases disponibles, que es lo que proporciona el JRE, y que cualquier compilador o emulador deberá proporcionar también.

Lo que puede hacer sin embargo es mirar un lanzador que le permitirá llevar su propio JRE con su aplicación - esto sólo funcionará en la plataforma de la JRE, pero que ya está dispuesto a ser plataforma específica . Existen varios: te animo a que veas las muchas preguntas que ya están en Stack Overflow sobre cómo hacerlo.

+0

no me refiero a utilizar los gusts de contenedor jsmooth – user63898

+0

@ user63898, en ese caso, probablemente debería utilizar .NET en lugar de los tiempos de ejecución en Windows. –

+0

Excepto que es posible compilar Java con código nativo. Ver comentarios de Daniels sobre Excelsior Jet. – Dan

Cuestiones relacionadas