2010-03-11 10 views
27

Quali sono le differenze tra un compilatore Just-in-Time e un interprete e ci sono differenze tra il compilatore .NET e Java JIT?Quali sono le differenze tra un compilatore Just-in-Time e un interprete?

+2

Il titolo della domanda non corrisponde realmente al testo della domanda. Sia Java che .NET sono jitted, nessuno dei due è interpretato. – Aaronaught

+0

è servito come una seconda domanda – Rookian

+3

quindi dovresti chiedere come seconda domanda diversa. In questo modo stai solo confondendo le persone. – Oded

risposta

29

Just-in-time compilation è la conversione di codice non nativo, ad esempio bytecode, in codice nativo poco prima che venga eseguito.

Da Wikipedia:

JIT si basa su due idee precedenti in ambienti di runtime: bytecode compilazione e la compilazione dinamica. Converte il codice in runtime prima di eseguirlo in modo nativo, ad esempio bytecode in codice macchina nativo.

Un interpreter esegue un programma. Può o non può avere un jitter.

Ancora, da Wikipedia:

Un interprete può essere un programma che sia

  1. esegue il codice sorgente direttamente
  2. traduce codice sorgente in qualche efficiente rappresentazione intermedia (codice) ed esegue immediatamente questo
  3. esegue esplicitamente codice precompilato memorizzato creato da un compilatore che fa parte del sistema di interprete

Sia lo standard Java e .NET distribuzioni hanno compilazione JIT, ma non è richiesto dalle norme. Il compilatore JIT in .NET e C# sono ovviamente diversi perché il bytecode intermedio è diverso. Il principio è lo stesso però.

+0

Il compilatore JIT del CLR compila il codice WHOLE una volta o no? – Rookian

+3

No, compila solo il codice necessario. Questo ti dà un vantaggio di ottimizzare in un runtime. – Kimi

+0

Ma il processo di ottimizzazione per chiamata si verifica solo una volta, no (.NET JIT)? Perché redizzo .NET JIT compila una pace di codice solo una volta. – Rookian

9

Un interprete genera ed esegue le istruzioni in codice macchina al volo per ogni istruzione, indipendentemente dal fatto che è stato precedentemente eseguito.
Un JIT memorizza nella cache le istruzioni che sono stati precedentemente interpretati in codice macchina, e riutilizza le istruzioni in codice macchina nativo risparmiando così tempo & risorse per non dover re-interpretare le dichiarazioni che sono già state interpretate.

+0

La tua risposta è correlata al compilatore JIT Java, no? – Rookian

+0

Sì, ma credo che la tecnica JIT sia stata sviluppata per la prima volta su smalltalk. – crowne

+0

Quindi un JIT fa sì che un programma diventi più veloce a lungo che viene eseguito? – Aerovistae

1

Quando si compila un linguaggio Microsoft.NET, il compilatore genera codice scritto in Microsoft Intermediate Language (MSIL). MSIL è un insieme di istruzioni che possono essere rapidamente tradotte in codice nativo.

Un'applicazione Microsoft.NET può essere eseguita solo dopo che il codice MSIL è stato tradotto in codice macchina nativo. In .NET Framework, il linguaggio intermedio viene rispettato "just in time" (JIT) nel codice nativo quando viene eseguita l'applicazione o il componente anziché compilare l'applicazione in fase di sviluppo.

more info

2

JIT compilatore produce codici macchina binario di traslazione codice sorgente blocco. L'interprete traduce linea per linea.

6

La questione se un motore di esecuzione è un compilatore o un interprete può essere risolta molto semplicemente considerando quello che succede se una routine viene eseguita 1.000 volte.Se il codice all'interno del motore di esecuzione dovrà esaminare una particolare rappresentazione del codice 1.000 volte, il motore di esecuzione è un interprete di quella rappresentazione. Se il codice all'interno dell'esecuzione il motore di esecuzione dovrà solo esaminare quella particolare rappresentazione del codice un numero minore di volte (in genere, anche se non necessariamente, una volta), è un compilatore o traduttore di quella rappresentazione. Si noti che è molto comune per un motore di esecuzione prendere il codice di input e convertirlo in qualche altra forma che può essere esaminata più facilmente. Un tale motore di esecuzione combinerebbe un compilatore o un traduttore della precedente forma con un interprete di quest'ultima forma.

Si noti che gli interpreti producono molto raramente qualsiasi forma di codice macchina. Quasi l'unica volta in cui un interprete produrrà un codice macchina è quando una dichiarazione dovrebbe svolgere alcune operazioni che in realtà non possono essere fatte in altro modo. Ad esempio, se un interprete BASIC in esecuzione su 8080 incontra l'istruzione "OUT 100,5", normalmente eseguirà tale operazione memorizzando D3 64 C9 (OUT 64h/RET) in tre byte consecutivi ad un indirizzo fisso, caricando A con 5 e CHIAMANDO quell'indirizzo. L'interprete potrebbe tecnicamente generare codice macchina, ma se si dovesse eseguire la stessa istruzione OUT 500 volte, l'interprete dovrebbe rigenerare il codice macchina ogni volta.

1

Quando la prima volta viene fatto riferimento a una classe, il motore di esecuzione JIT ricompila i file .class (file binari primari) generati dal compilatore Java contenente il set di istruzioni JVM su binari che contiene il set di istruzioni del sistema HOST. JIT memorizza e riutilizza quei binari ricompilati dalla memoria andando avanti, riducendo i tempi di interpretazione e i benefici derivanti dall'esecuzione del codice nativo.

D'altra parte una pianura vecchio Java interprete interpreta un'istruzione JVM da file di classe alla volta e chiede una procedura contro di esso.

trovare un confronto dettagli qui http://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html

22

Ho sempre trovato che una spiegazione più astratto a volte aiuta. Diciamo che stai cercando di chiedere a tutti in Messico "Ciao, come stai?" (la tua lingua sorgente )) Ovviamente, dovrai prima tradurlo in spagnolo (la lingua madre del Paese). Quella traduzione sarebbe "Hola. Como estas?"

Se conosci lo spagnolo, non è necessario tradurre (codice nativo/assemblatore). Basta chiedere "Hola, Como Estas?"

Se non conosci lo spagnolo, ci sono 3 modi per affrontarlo.

Il primo è quello di ottenere un dizionario Spagnolo (un compilatore ) e cercare ciò che le parole spagnoli sono prima di andare. Forse ti rendi conto che "Hola. Que tal?" è una sillaba più breve (ottimizzazione del compilatore) e lo usa invece. Questa è la compilazione della lingua ; stai convertendo in anticipo le informazioni nella lingua nativa.

La seconda è dove si guarda le parole nel dizionario spagnolo mentre si sta in piedi di fronte alla prima persona e poi memorizzare il risultato (alzando le parole just-in-time). Il vantaggio qui è che potresti ottenere un dizionario mandarino e poi fare lo stesso esperimento in Cina senza dover tenere dieci bigliettini (binari per diverse piattaforme) di frasi tradotte.

Il terzo è dove guardi le parole mentre ti trovi di fronte a ciascuna persona.In sostanza, interpreti le parole separatamente per ogni persona (ti comporti come interprete ). Il vantaggio qui è che qualsiasi modifica viene immediatamente riflessa con la persona successiva (è possibile passare a chiedere "Ciao. Di che colore è il tuo cane?" Senza dover volare a casa e ricominciare - non è necessario per ricompilare le frasi) .

  • Traducendo in anticipo significa che si può chiedere alle persone più veloci (pre-compiliation); non hai nemmeno bisogno di portare il dizionario con te.
  • Tradurre quando si vede la prima persona in ogni paese è quasi veloce come tradurre in anticipo, ma consente comunque di viaggiare in più paesi senza dover andare a casa per ottenere un dizionario ma significa che è necessario portare con sé diversi dizionari (un runtime indipendente dalla piattaforma).
  • La traduzione su richiesta è molto più lenta ma consente di modificare le parole senza dover viaggiare a casa (lingua distribuita di origine).
+1

Fantastico, adoro questa risposta. Tutti gli altri sono troppo tecnici e confondono i non programmatori. –

0

tl; dr

Interprete: richiede una sola istruzione alla volta per l'esecuzione

just in time: prende un blocco di codice in una volta e compila prima esecuzione . quindi ha molto spazio per l'ottimizzazione

Problemi correlati