2010-02-04 19 views
13

Ho sentito molte volte che la compilazione JIT (just-in-time) di Java e i suoi bytecode portatili su piattaforme vengono "interpretati" da JVM. Tuttavia, non so veramente cosa siano i bytecode e cosa significhi realmente la JVM nell'architettura del linguaggio Java; Mi piacerebbe sapere di più su di loro.Cosa sono i bytecode e come li gestisce JVM

+3

speranza http://en.wikipedia.org/wiki/Bytecode potrebbe aiutare. – Jichao

risposta

36

La JVM (Java Virtual Machine) ha un set di istruzioni proprio come una macchina reale. Il nome assegnato a questo set di istruzioni è Bytecode Java. È descritto nello Java Virtual Machine Specification. Altre lingue sono tradotte in un bytecode prima dell'esecuzione, ad esempio rubino e pitone. Il bytecode di Java è a un livello piuttosto basso mentre quello di Python è molto più alto.

L'interpretazione e la compilazione JIT sono due diverse strategie per l'esecuzione di bytecode. I processi di interpretazione bytecode uno alla volta apportano le modifiche allo stato della macchina virtuale codificati in ciascuna istruzione. La compilazione JIT traduce il bytecode in istruzioni native della piattaforma host che eseguono operazioni equivalenti.

L'interpretazione è in genere rapida all'avvio, ma lenta durante l'esecuzione, mentre JIT ha un sovraccarico maggiore all'avvio, ma viene eseguita più rapidamente in seguito. Le moderne JVM utilizzano una combinazione di tecniche di interpretazione e JIT per ottenere il beneficio di entrambi. Il bytecode viene prima interpretato mentre il JIT lo sta traducendo in background. Una volta completata la compilazione JIT, la JVM passa a utilizzare quel codice anziché l'interprete. A volte la compilazione JIT può produrre risultati migliori rispetto alla compilazione in anticipo utilizzata per C e C++ perché è più dinamica.La JVM può tenere traccia di quanto spesso viene chiamato il codice e quali sono i percorsi tipici attraverso il codice e utilizzare queste informazioni per generare codice più efficiente mentre il programma è in esecuzione. La JVM può passare a questo nuovo codice proprio come quando inizialmente passa dall'interprete al codice JIT.

Proprio come ci sono altri linguaggi che compilano codice nativo, come C, C++, Fortran; ci sono compilatori per altre lingue che generano bytecode JVM. Un esempio è il linguaggio scala. Credo che groovy e jruby possano anche convertire in codice byte java.

+1

+1 spiegato molto bene – stacker

+1

_Il bytecode viene prima interpretato mentre il JIT lo sta traducendo in background_. Si tratta di un concetto con sottotitoli o un processo sequenziale? – jmishra

+2

@ ladiesMan217 che è, naturalmente, fino alla particolare implementazione; ma mi aspetto che le JVM moderne eseguano il compilatore JIT in un thread parallelo –

13

Bytecode è un passaggio tra il codice sorgente e il codice macchina effettivo. La JVM è ciò che prende il bytecode e lo traduce in codice macchina.

JIT si riferisce al fatto che la JVM fa questa traduzione al volo quando il programma viene eseguito, anziché in un unico passaggio (come in un tradizionale linguaggio compilato/collegato come C o C++)

Il punto di bytecode è che si ottengono prestazioni migliori rispetto a un linguaggio strettamente interpretato (come ad esempio PHP) perché il bytecode è già parzialmente compilato e ottimizzato. Inoltre, poiché il bytecode non ha bisogno di essere interpretato direttamente dalla CPU, non ha bisogno di essere legato a una specifica architettura della CPU che lo rende più portabile.

Lo svantaggio, naturalmente, è che in genere sarà un po 'più lento di un'applicazione nativamente compilata poiché la JVM deve ancora lavorare per tradurre il bytecode in codice macchina.

+0

"La JVM è ciò che prende il bytecode e lo traduce in codice macchina." Non sempre, non è vero? –

0

Quando si compila qualcosa in Java, il compilatore genera bytecode. Questo è il codice nativo per Java Virtual Machine. La JVM quindi traduce il bytecode in codice nativo per il tuo processore/architettura, questo è dove si verifica il JIT. Senza JIT, la JVM tradurrebbe il programma una istruzione alla volta, che è molto lenta.

0

jcyang già fornito un link a Wikipedia, ma questo è una migliore corrispondenza alla tua domanda:

Java Bytecode

Java Compiler compila il codice sorgente Java per i file di classe. I metodi della classe sono tradotti in codice Byte e la Java virtual machine (JVM) interpreta questo codice byte. Un compilatore Just In Time (JIT) può essere utilizzato per tradurre il codice byte in codice macchina per velocizzare l'esecuzione dei metodi di classe.

0

Bytecode è l'equivalente JVM delle istruzioni del linguaggio macchina.

0

JVM è una macchina virtuale che viene utilizzata per eseguire il codice Java. Possiamo confrontare JVM con un compilatore poiché senza di esso non possiamo compilare codice Java e creare applicazioni. JVM non è altro che un pezzo di codice che testimonierà il tuo codice Java. Il compito principale di JVM è convertire il codice Java in bytecode Java e compilarlo. Ciò semplifica lo sviluppo di Java. Dai un'occhiata a this article se vuoi sapere di più su come funziona Java Virtual Machine?

0

Oracle jdk

codice di programmazione che, una volta compilato, viene fatto passare attraverso una macchina virtuale invece del processore computer. Utilizzando questo approccio, il codice sorgente può essere eseguito su qualsiasi piattaforma una volta compilato ed eseguito attraverso la macchina virtuale.

Bytecode è il formato compilato per i programmi Java. Una volta che un programma Java è stato convertito in bytecode, può essere trasferito attraverso una rete ed eseguito da Java Virtual Machine (JVM). I file Bytecode hanno generalmente un'estensione .class.

Problemi correlati