Interpretazione : significa che prendi un piccolo pezzo di codice, capisci cosa fa e poi fallo. Il piccolo pezzo di codice può essere codice sorgente "plain text", ma può anche essere una sorta di codice pre-tokenizzato, o una sorta di codice byte, o istruzioni native per una diversa CPU. La differenza importante qui è che per interpretare il suo codice non mai convertito in codice nativo per la CPU su cui è in esecuzione.
Compilazione : ciò significa che converti il codice sorgente in codice nativo. Quando la maggior parte delle persone pensa ai "compilatori", pensano a uno strumento che converte codice sorgente in codice nativo in codice nativo (noto come "compilazione anticipata" perché è compilato prima dell'esecuzione - spesso anche prima che l'utente finale lo riceva), ma questo non è l'unico modo per compilare. Il vantaggio principale della compilazione in anticipo è che il compilatore può dedicare molto tempo all'ottimizzazione del codice molto bene senza che l'utente finale si preoccupi di quanto tempo ci vuole.
Compilazione JIT : questo è uno dei diversi casi di compilazione (nota: JIT è "Just In Time", e diverse persone chiameranno invece questa traduzione dinamica). In questo caso attendi che sia necessario eseguire una piccola parte di codice, quindi compila quel piccolo pezzo in codice nativo ed eseguilo; poi vai alla ricerca del prossimo pezzo di codice. Memorizzando nella cache i piccoli pezzi precedentemente compilati si finisce per compilare la maggior parte del programma mentre il programma è in esecuzione. Per il codice che viene eseguito spesso questo è molto più veloce dell'interpretazione; ma per il codice eseguito solo quando è più lento dell'interpretazione.
Per Java, prima il codice sorgente del testo in chiaro è compilato in byte-code usando un compilatore in anticipo. Questo è dove si verifica un sacco di ottimizzazione. Successivamente, il codice byte viene eseguito da una Java Virtual Machine (JVM).
Vecchie implementazioni di JVM usate per interpretare il codice byte (che era più lento). Le moderne JVM interpretano il codice di byte che non viene eseguito molto spesso (per evitare il sovraccarico di compilazione quando non è giustificato) e inoltre esegue la compilazione JIT per il codice che viene eseguito spesso (per avvicinarsi alla velocità nativa per quelle parti più importanti).
Fondamentalmente (per implementazioni moderne), non è l'uno o l'altro - è "in anticipo" seguito da una combinazione di compilazione interpretata e JIT.