2011-02-15 14 views
8

Mi chiedo solo come posso sbarazzarmi della dipendenza java jre e produrre codice nativo e fornire il codice compilato come applicazione?In teoria, posso ottenere il JIT openJDK e compilare il mio codice Java in nativo?

Quindi è possibile?

P.S. So che il compilatore gcj è ciò che sta facendo?

+0

È necessario utilizzare la costruzione Class.forName()? –

+0

È possibile fornire un codice compilato e verrà eseguito su qualsiasi sistema con la versione corretta di Java installata. Indipendentemente da come lo si fa in qualsiasi lingua, si presume che alcuni SO/Software siano installati. –

+0

Un runtime Java può gestire Class.forName() nel codice nativo semplicemente cortocircuitando le classi precompilate, ma ovviamente deve anche includere un JIT o un interprete per le classi che non sono state precompilate (proxy dinamici, plugin di terze parti , ecc.) –

risposta

1

Excelsior ha un ottimo compilatore Java2Native. Mi piacerebbe usarlo, ma purtroppo il nostro progetto impiega 8 ore per compilare questo compilatore. La velocità risultante dell'app è un pensiero impressionante.

+3

È davvero un problema? Si sviluppa contro il JDK ma le compilazioni notturne automatiche escono dal compilatore. Il controllo qualità funziona contro i build automatizzati. Devo dire che la maggior parte dei sistemi su cui ho lavorato sono stati almeno così complessi, è normale. –

+1

Conosco questo prodotto, come diavolo lo fanno? – user63898

+0

Attualmente siamo in fase di sviluppo e non vi è alcun passaggio QA ... commit-2-live richiede spesso 15 minuti. Se raggiungiamo stabilmente tuttavia, Excelsior sarà sicuramente un'opzione per noi. – Daniel

3

Il codice byte compilato dipende ancora dalla macchina virtuale java. Un JIT non può creare codice che "abbia senso" al di fuori del contenitore JVM. Sì, il risultato è un insieme di istruzioni valide per la piattaforma di destinazione. Ma hai ancora bisogno del vero stack, heap e garbage collector (solo per citare alcuni blocchi predefiniti richiesti).

1

In teoria, è possibile assumere qualsiasi interprete per una lingua e trasformarlo in un compilatore che produce codice nativo in quella lingua. Questo è legato a una serie di equazioni chiamate Futamura projections. L'idea di alto livello è essenzialmente quella di "barare" su come si definisce un compilatore. Supponiamo che per qualche lingua L io abbia un interprete I (p) che, dato un programma p scritto nel linguaggio L, interpreti quel programma. Ora, presumo che l'interprete I sia rappresentato direttamente nel codice macchina. Supponiamo inoltre di avere un programma chiamato mix che, dato un programma di codice macchina e una sequenza di input per quel programma, produce un nuovo programma di codice macchina che è il programma iniziale con il suo input fisso per essere l'input specificato. Per esempio, se ho compilato questo programma C++:

#include <iostream> 
using namespace std; 

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

e poi utilizzato mix a mescolare il programma con l'ingresso "Ciao," mi piacerebbe avere un programma che stampa sempre il messaggio "Ciao". In altre parole, sarebbe come se io avessi scritto questo programma:

#include <iostream> 
using namespace std; 

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

Si scopre che è possibile costruire questo programma. Potrei farlo, ad esempio, osservando il codice della macchina, esaminando ogni punto in cui si tenta di leggere l'input dalla console e quindi sostituendolo con un codice che chiama una funzione per leggere invece da una stringa codificata.

Ora, pensate a cosa succederebbe se doveste eseguire questo programma mix prendendo come input un interprete I e qualche programma p. Quindi il risultato sarebbe un programma di codice macchina equivalente al programma I in esecuzione sull'ingresso p. In altre parole, hai appena creato un programma di codice macchina che simula cosa accadrebbe se dovessi eseguire l'interprete sul programma - che è un programma di codice macchina che esegue il programma p!

Naturalmente questa costruzione è completamente poco pratica. Per quanto ne sappia nessuno ha scritto mix, e se lo facessero, qualsiasi programma che hai fatto trasformando un interprete in un compilatore sarebbe stato terribilmente inefficiente perché non sarebbe stato affatto ottimizzato.

Per quanto riguarda la tua domanda iniziale sull'opportunità di prendere JIT JVM e usarlo per produrre codice macchina raw per un programma Java, non sono sicuro visto che non ho guardato il codice sorgente, ma dubito fortemente esso. Il codice macchina contiene quasi sicuramente degli hook che richiamano nella JVM per compiti specifici (ad esempio, garbage collection, caricamento della classe, ecc.), Che renderebbero il codice generato non funzionante in un ambiente standalone. Tuttavia, è un'idea davvero interessante provare a farlo, e spero che questa risposta metta in luce la teoria dietro di essa!

+0

Downvoter- Puoi commentare cosa c'è di sbagliato in questa risposta? – templatetypedef

0

Si prega di notare che questa domanda è simile a "Posso sbarazzarmi di Windows e lasciare che il mio programma Windows gira sul bare metal senza un sistema operativo"?

I programmi Java si aspettano che sia disponibile un ampio set di classi, che è quello che fornisce JRE e che anche qualsiasi compilatore o emulatore dovrà fornire.

Quello che possibile fare però è quello di guardare un lanciatore, che vi permetterà di portare il proprio JRE con l'applicazione - questo funziona solo alla piattaforma del JRE, ma si è già disposti ad essere piattaforma specifica . Diversi esistono: ti incoraggio a esaminare le numerose domande già contenute in Stack Overflow su come farlo.

+0

Non intendo usare i privilegi di wrapper jsmooth – user63898

+0

@ user63898, in tal caso dovresti probabilmente andare su .NET invece dove i runtime sono cotti in Windows. –

+0

Tranne che è possibile compilare Java nel codice nativo. Vedi il commento di Daniels su Excelsior Jet. – Dan

Problemi correlati