Per prima cosa:
Con JVM, sia interprete e compilatore (il compilatore JVM e non il codice sorgente del compilatore come javac) producono codice nativo (alias codice lingua Machine per la CPU fisica sottostante come x86) dal codice byte.
Qual è la differenza, allora:
La differenza sta nel modo in cui generare il codice nativo, come ottimizzato è bene quanto costoso l'ottimizzazione è. Informalmente, un interprete praticamente converte ogni istruzione di codice byte in corrispondente istruzione nativa cercando una istruzione JVM predefinita per mappare le istruzioni della macchina (vedi foto sotto). È interessante notare che è possibile ottenere un'ulteriore accelerazione nell'esecuzione, se prendiamo una sezione di byte-code e la convertiamo in codice macchina, perché considerando un'intera sezione logica spesso fornisce spazio per l'ottimizzazione anziché la conversione (nell'interpretazione di) ogni riga in isolamento (alle istruzioni della macchina). Questo stesso atto di convertire una sezione di byte-code in istruzioni (presumibilmente ottimizzate) della macchina si chiama compilazione (nel contesto corrente). Quando la compilazione viene eseguita in fase di esecuzione, il compilatore viene chiamato compilatore JIT.
Il co-relazione e coordinamento:
Dal Java progettista è andato per (hardware & OS) Architettura interprete portabilità, che avevano scelto (al contrario di c stile compilazione, assemblaggio e collegamento). Tuttavia, al fine di ottenere più velocità, un compilatore è anche facoltativamente aggiunto a una JVM. Tuttavia, mentre un programma continua ad essere interpretato (ed eseguito in CPU fisica), gli "hotspot" vengono rilevati da JVM e vengono generate le statistiche. Di conseguenza, utilizzando le statistiche dell'interprete, queste sezioni diventano candidate alla compilazione (codice nativo ottimizzato). Viene infatti eseguito al volo (quindi compilatore JIT) e le istruzioni della macchina compilate vengono utilizzate successivamente (anziché essere interpretate). In modo naturale, JVM memorizza anche questi pezzi di codice compilati.
Qualche parola di avvertimento:
Questi sono più o meno i concetti fondamentali. Se un vero implementatore di JVM, fa un modo leggermente diverso, non stupirti. Quindi potrebbe essere il caso di VM in altre lingue.
Qualche parola di avvertimento:
Affermazioni come "interprete esegue il codice byte nel processore virtuale", "interprete esegue il codice di byte direttamente", ecc, sono tutti corretti fino a quando si capisce che alla fine c'è un set delle istruzioni della macchina che devono essere eseguite in un hardware fisico.
Alcune buone referenze: [non hanno fatto un'ampia ricerca anche se]
- [carta] Istruzione pieghevole in un hardware-Traduzione basata su Java virtuale Machine di Hitoshi Oi
- [libro ] Organizzazione e progettazione informatica, 4a edizione, DA Patterson. (vedere Fig 2.23)
- [web-articolo] ottimizzazione delle prestazioni JVM, Parte 2: compilatori, da Eva Andreasson (JavaWorld)
PS: ho usato termini seguenti interchangebly - 'codice nativo ',' codice lingua macchina ',' istruzioni macchina ', ecc.