2010-02-27 11 views
15

Realizzo lo benefits di codice bytecode e nativo (portabilità).Perché il software Java non è compilato in modo nativo?

Ma dire che si sa sempre che il codice verrà eseguito su un'architettura x86, perché non compilarlo per x86 e ottenere il vantaggio delle prestazioni?

Si noti che sto assumendo che ci sia un guadagno di prestazioni nella compilazione del codice nativo. Alcune persone hanno risposto che ci potrebbe in effetti essere nessun guadagno, che è una novità per me ..

+0

Penso che sia possibile, aspetterò le risposte con voi)) – Roman

+0

Su quale Solarix x64 o SPARC? ;) –

+0

A proposito, la portabilità non è l'unico vantaggio. Proprio il più ovvio –

risposta

15

Perché il guadagno di prestazioni (se presente) non vale la pena.

Inoltre, garbage collection è molto importante per le prestazioni. Le probabilità sono che il GC della JVM sia migliore di quello incorporato nell'eseguibile compilato, ad esempio con GCJ.

E la compilazione just in time può anche portare a prestazioni migliori perché la JIT dispone di maggiori informazioni disponibili per ottimizzare la compilazione rispetto al compilatore in fase di compilazione. Vedi la pagina di Wikipedia su JIT.

+2

Il secondo punto è importante. Il JIT può produrre una compilazione migliore perché le informazioni di runtime non sono disponibili durante la compilazione statica. –

+1

Può, o lo fa? Implementare un compilatore dinamico altamente ottimizzante è molto più difficile di uno statico, soprattutto se si stanno prendendo di mira dispositivi con bassa potenza di calcolo (mobile, embedded, ecc.) Non tutte le app vengono eseguite per mesi su server di fascia alta con abbondanza di CPU e RAM. –

+0

Un altro punto è che i compilatori statici possono ricevere informazioni sul profilo come input. Il nostro lo fa per ottimizzare i tempi di avvio. –

7

Il bytecode viene eseguito in una Java Virtual Machine che è compilato per (ad esempio) di Solaris. Sarà ottimizzato come diamine per quel sistema operativo.

In casi reali, si vede spesso vedere prestazioni uguali o migliori dal codice Java in fase di esecuzione, in virtù del fatto di basarsi sul codice della macchina virtuale per cose come la gestione della memoria - il codice si è evoluto e sta maturando da anni.

La JVM offre più vantaggi rispetto alla semplice portabilità: ad esempio, ogni volta che viene rilasciata una nuova JVM, il codice bytecode compilato ottiene ottimizzazioni, miglioramenti algoritmici ecc. Che provengono dai migliori del settore. D'altra parte, una volta compilato il codice C, è tutto.

+0

Giusto, ma Solaris JVM compila le istruzioni bytecode Java alle istruzioni native di Solaris. Il che richiede tempo. –

+0

Pensi davvero che il tempo di compilazione sia un collo di bottiglia? –

+0

Puoi davvero dimostrare un guadagno in termini di prestazioni con il codice nativo che vorresti scrivere da solo? – Brabster

5

Perché con la compilazione Just-In-Time, c'è un vantaggio di prestazioni insignificante.

In realtà, molte cose JIT possono effettivamente fare più velocemente.

+1

Perché così tante app desktop scritte in java sembrano essere più lente? –

+0

Perché il leyer dell'interfaccia utente in Java è un po 'lento, non perché il codice viene eseguito lentamente .. – nos

+5

Lo sviluppo dell'interfaccia utente (Swing) è difficile da eseguire correttamente e la maggior parte dei programmatori non sa cosa diavolo stanno facendo. Le app di Swing possono essere rese estremamente reattive, ma la maggior parte dei programmatori non capisce il sistema di thread ed eventi di Swing, causando un codice orribilmente inefficiente. –

4

È già compilato da JIT nel codice nativo di Solaris, dopo l'esecuzione. Non puoi ricevere altri vantaggi se lo compili prima di caricarlo sul sito di destinazione.

11

"Solaris" è un sistema operativo, non un'architettura CPU. La JVM installata sulla macchina effettiva verrà compilata secondo le istruzioni native della CPU. Solaris potrebbe essere l'architettura SPARC, x86 o x86-64.

Inoltre, il compilatore JIT può rendere ottimizzazioni specifiche del processore a seconda della famiglia di CPU attuale. Ad esempio, sequenze di istruzioni diverse sono più veloci su CPU Intel rispetto alle CPU AMD e un compilatore JIT per la tua esatta piattaforma può trarre vantaggio da queste informazioni per produrre codice altamente ottimizzato.

+0

Grazie, ho aggiornato il post re: architettura della CPU. –

+1

@Marcus Si noti inoltre che il compilatore JIT ottimizza il codice durante l'esecuzione; percorsi di codice frequentemente seguiti possono (e saranno) quindi ottimizzati. E poiché il JIT ha informazioni di livello superiore/superiore, può ottimizzare meglio che una CPU possa ottimizzare l'assemblaggio. – extraneon

4

Si può, o non si può ottenere un beneficio di prestazioni. Ma più probabilmente si otterrebbe una penalizzazione delle prestazioni: l'ottimizzazione JIT non è possibile con la compilazione statica, quindi le prestazioni sarebbero buone solo se il compilatore può renderle "bendate" (senza effettivamente profilare il programma e ottimizzarlo di conseguenza, che è ciò che Compilatori JIT come fa HotSpot).

È sorprendentemente intuitivo quanto sia economica la compilazione (in termini di risorse) e quanto possa essere ottimizzato automaticamente semplicemente osservando il programma in esecuzione. Magia nera, ma buona per noi :-)

1

Tutto questo parlare di JITs è di circa sette anni non aggiornato. BTW. La tecnologia in questione ora si chiama HotSpot e non è solo una JIT.

0

Immagino perché la compilazione JIT (just in time) è molto avanzata.

1

"perché non quindi compilare per x86"

Perché allora non si può sfruttare le caratteristiche specifiche di particolare cpu sarà eseguito su. In particolare, se vogliamo leggere "compile per x86" come "produrre codice nativo che può essere eseguito su un 386 e i suoi discendenti", il codice risultante non può contare su qualcosa di vecchio come le istruzioni mmx.

In questo modo, il risultato finale è che è necessario compilare per ogni architettura esatta su cui verrà eseguito (per quanto riguarda quelli che non esistono ancora) e richiedere all'installatore di selezionare quale file eseguibile mettere in atto. Oppure, sento che il compilatore intel C++ produrrà diverse versioni della stessa funzione, che differiscono solo dalle funzioni della cpu usate, e scelgono quella giusta in fase di esecuzione in base a ciò che la CPU riporta come disponibile.

D'altra parte, è possibile visualizzare il codice byte come sorgente "semi-compilata", simile a un formato intermedio che un compilatore nativo (a meno che non venga richiesto) non scriverà effettivamente sul disco. L'ambiente runtime può quindi eseguire la compilazione finale, sapendo esattamente quale architettura verrà utilizzata. Questo è il motivo per cui un codice C# /. Net potrebbe leggermente sovraperformare il codice C++ su alcune attività cpu-intensive in alcuni benchmark qualche tempo fa.

La "compilazione finale" di bytecode può anche fare ipotesi di ottimizzazione aggiuntive che sono (da una prospettiva di compilazione statica) distintamente non sicure * e ricompilare solo se tali ipotesi sono state trovate errate in seguito.

Problemi correlati