2009-08-25 27 views
103

In passato ho usato C++ come linguaggio di programmazione. So che il codice scritto in C++ passa attraverso un processo di compilazione finché non diventa codice oggetto "codice macchina".Java è un linguaggio di programmazione compilato o interpretato?

Vorrei sapere come funziona Java in questo senso. In che modo l'utente ha scritto codice Java eseguito dal computer?

+12

C++ potrebbe essere interpretato. Ci sono alcuni interpreti C là fuori. –

risposta

38

Java viene compilato in bytecode, che va poi nel Java VM, che lo interpreta.

+0

risposta semplice e piacevole –

+24

... ma non rigorosamente preciso. –

+1

JVM potrebbe scegliere di non "interpretare" bytecode. Può JIT compilarlo ed eseguirlo direttamente. –

10

Java è un linguaggio di programmazione compilato, ma piuttosto che compilare direttamente in codice macchina eseguibile, compila ad una forma binaria intermedia chiamata JVM byte code. Il codice byte viene quindi compilato e/o interpretato per eseguire il programma.

0

Java è un linguaggio compilato in byte destinato a una piattaforma denominata Java Virtual Machine che è basata sullo stack e presenta alcune implementazioni molto veloci su molte piattaforme.

+0

Che cosa significa "byte-compilato"? – Jesper

+2

@Jesper: "Byte-compiled" in genere significa "compilato in bytecode". "Bytecode" è un termine generale che copre qualsiasi tipo di codice intermedio non testuale (generalmente non eseguibile dalla macchina). –

12

Tipo di entrambi. In primo luogo java compilato (alcuni preferirebbero dire "tradotto") in bytecode, che poi può essere compilato o interpretato a seconda dell'umore di JIT.

+22

Questo è un software avanzato, per creare stati d'animo :) – Thorarin

+4

Il JIT è davvero un software molto sofisticato, che può fare ottimizzazioni basate su informazioni di runtime (come un profiler), che un compilatore in anticipo può ' t fare (perché non ha informazioni sul comportamento di runtime di un programma prima del tempo). Ma probabilmente non ha davvero degli stati d'animo ... :-) – Jesper

141

Le implementazioni Java utilizzano in genere un processo di compilazione in due fasi. Il codice sorgente Java è compilato al bytecode dal compilatore Java. Il bytecode viene eseguito da una Java Virtual Machine (JVM). Le moderne JVM usano una tecnica chiamata Just-in-Time (JIT) compilation per compilare il bytecode con istruzioni native comprese dalla CPU hardware al volo in fase di esecuzione.

Alcune implementazioni di JVM possono scegliere di interpretare il bytecode, invece di JIT compilarlo in codice macchina, ed eseguirlo direttamente. Anche se questo è ancora considerato un "interprete", è molto diverso dagli interpreti che leggono ed eseguono il codice sorgente di alto livello (in questo caso, il codice sorgente Java non viene interpretato direttamente, è il bytecode, l'output del compilatore Java.)

È tecnicamente possibile compilare Java in anticipo sul codice nativo ed eseguire il file binario risultante. È anche possibile interpretare direttamente il codice Java.

In sintesi, a seconda dell'ambiente di esecuzione, bytecode può essere:

  • compilato in anticipo ed eseguito come codice nativo (simile alla maggior parte dei compilatori C++)
  • compilato just in time ed eseguito
  • interpretato
  • direttamente eseguito da un processore supportato (bytecode è l'insieme di istruzioni nativo di alcune CPU)
+12

In realtà, alcune JVM HotSpot iniziano interpretando bytecode, e le compila solo nel codice nativo dopo aver capito cosa vale la pena compilare, e raccolto alcune statistiche su come il codice è in esecuzione; per esempio. per capire il percorso più comune preso in ogni ramo condizionale. –

+0

Quindi il termine "Hotspot" :) Lo fa a ciò che viene eseguito spesso, per ottenere un'ottimizzazione. –

+4

È possibile disattivare l'interprete in HotSpot con -Xcomp. Vale la pena provare un'applicazione per vedere che cattiva idea è. –

43

I termini "linguaggio interpretato" o "linguaggio compilato" non hanno senso, perché qualsiasi linguaggio di programmazione può essere interpretato e/o compilato.

Per quanto riguarda le implementazioni esistenti di Java, la maggior parte comportano una fase di compilazione in bytecode, in modo da coinvolgere la compilazione. Il runtime può anche caricare bytecode in modo dinamico, quindi è sempre necessaria una qualche forma di interprete bytecode. L'interprete può a sua volta utilizzare la compilazione su codice nativo internamente.

In questi giorni parziale just-in-time è usato di compilazione per molte lingue, che una volta erano considerati "interpretati", per esempio Javascript.

+0

Grazie per la * sola * risposta corretta e corretta sull'intera pagina. Stavo seriamente iniziando a mettere in discussione l'intelligenza della comunità SO. Solo alcune aggiunte rapide: non tutte le implementazioni Java vengono compilate in bytecode JVM. GNU GCJ può compilare direttamente nel codice nativo. Inoltre, non tutte le JVM interpretano bytecode. La VM di Maxine Research di Sun non contiene un interprete, ma contiene due compilatori: uno molto veloce che genera codice lento che viene utilizzato quando altre JVM utilizzano il loro interprete e uno lento che genera codice veloce utilizzato per le ottimizzazioni degli hotspot . –

+2

Inoltre, il motore di esecuzione JavaScript V8 di Google non esegue solo la compilazione just-in-time parziale. Esso * sempre * compila il codice nativo, infatti, V8 non ha * nemmeno * un interprete. Ha * solo * il compilatore (simile a Maxine, ma a differenza di Maxine V8 ha un solo compilatore). Tutti e tre questi esempi (GCJ, Maxine e V8) dimostrano il tuo punto ancora più fortemente: non esiste una lingua interpretata o compilata. Una lingua non è interpretata o compilata. Una lingua solo * è * (Questa è in realtà una citazione di Shriram Krishnamurthi). –

+2

Perché stai parlando di javascript in una domanda java? –

-1

Citazione da: https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

Gli sviluppatori di applicazioni in grado di sviluppare il codice dell'applicazione su uno qualsiasi dei vari OS che sono disponibili oggi sul mercato. Il linguaggio Java è agnostico in questa fase al sistema operativo. Il brillante codice sorgente scritto dallo sviluppatore di applicazioni Java ora viene compilato in codice Java Byte che nella terminologia Java viene indicato come compilazione lato client. Questa compilazione in codice Java Byte è ciò che consente agli sviluppatori Java di 'scrivere una volta'. Il codice Java può essere eseguito su qualsiasi sistema operativo e server compatibile, rendendo quindi il codice sorgente agnostico di OS/Server. Creazione del codice Post Java Byte, l'interazione tra l'applicazione Java e il sistema operativo/server sottostante è più intima. Il viaggio continua - Il framework di applicazioni enterprise esegue questi codici Java Byte in un ambiente run time che è noto come Java Virtual Machine (JVM) o Java Runtime Environment (JRE). La JVM ha stretti legami con il SO e l'hardware sottostanti perché sfrutta le risorse offerte dal sistema operativo e dal server. Il codice byte Java è ora compilato su un codice eseguibile in linguaggio macchina che è specifico per piattaforma. Si parla di compilazione lato server.

Quindi direi che Java è sicuramente un linguaggio compilato.

31

[1] immagine qui sotto spiega tutto ...

enter image description here

codice scritto in Java è:

  • Prima compilato in bytecode da un programma chiamato javac come mostrato nella sezione sinistra dell'immagine ab ove;
  • Poi, come mostrato nella parte destra della immagine qui sopra, [2] un altro programma chiamato java avvia l'ambiente di runtime Java e potrebbe di compilazione e/o interpretare il bytecode utilizzando la Java Interpreter/JIT Compiler.

Quando si fa java interpretare il bytecode, e quando lo fa compilare esso?[3] Il codice dell'applicazione viene inizialmente interpretato, ma la JVM controlla frequentemente le sequenze di bytecode e le traduce in codice macchina per l'esecuzione diretta sull'hardware. Per bytecode che viene eseguito solo poche volte, questo salva il tempo di compilazione e riduce la latenza iniziale; per il codice byte frequentemente eseguito, la compilazione JIT viene utilizzata per l'esecuzione ad alta velocità, dopo una fase iniziale di interpretazione lenta. Inoltre, poiché un programma impiega più tempo ad eseguire una minoranza del suo codice, il tempo di compilazione ridotto è significativo. Infine, durante l'interpretazione del codice iniziale, le statistiche di esecuzione possono essere raccolte prima della compilazione, il che aiuta a ottenere una migliore ottimizzazione.


Clicca sui numeri in apice nella risposta per i riferimenti.

+0

È dovuto al bytecode memorizzato nella cache che Java utilizza molta memoria? –

+2

@sedulam: un 'sacco di memoria' è un'affermazione sfocata. La gestione della memoria di Java è piuttosto semplice: le tre generazioni sono ciò che la JVM utilizza per la creazione e la manutenzione dei suoi oggetti. Questa [un'altra risposta SO] (https://stackoverflow.com/q/3496442) potrebbe essere utile per te. – displayName

+0

Con la spiegazione sopra, in teoria, il codice compilato C++ deve essere sempre più veloce di un codice java logicamente simile poiché ci sarà sempre una parte del file .class che JIT decide di non trasformare in codice macchina. In altre parole, java non può mai sfruttare la velocità di esecuzione bare metal dimostrata da C++. È questa la presunzione corretta? – DevdattaK

Problemi correlati