2010-05-25 21 views
32

Stavo solo guardando i video IO di Google e hanno parlato del compilatore JIT che includevano nell'androide. Hanno mostrato una demo di miglioramenti delle prestazioni grazie al compilatore JIT. Mi chiedevo cosa facesse esattamente un compilatore JIT e volevo sentire da persone diverse.Cosa fa un compilatore JIT?

Quindi, qual è il dovere di un compilatore JIT?

+3

possibile duplicato di [Cosa fa un just-in-time (JIT) compilatore?] (http://stackoverflow.com/questions/95635/what-does-a-just-in-time-jit-compiler-do) – msanford

risposta

31

Il codice Java è normalmente distribuito come bytecode, ovvero pseudocodice indipendente dalla macchina. (La stessa idea era stata precedentemente utilizzata nel sistema UCSD-p sviluppato negli anni 70.) Il vantaggio di questo è che la stessa applicazione può essere eseguita in diversi processori e sistemi operativi. Inoltre, il bytecode è spesso più piccolo dell'applicazione compilata.

Lo svantaggio è che l'interpretazione del codice è lento rispetto all'esecuzione del codice compilato. Per risolvere questo problema, è stato sviluppato il compilatore JIT . Il compilatore JIT compila il codice in codice macchina appena prima dell'esecuzione del codice. Ciò accelera l'esecuzione rispetto all'interprete, ma il tempo aggiuntivo viene impiegato per la compilazione ogni volta che viene eseguito il programma. Inoltre, poiché il compilatore JIT deve compilare rapidamente, non può utilizzare tecniche di ottimizzazione complesse utilizzate nei compilatori statici.

Un altro approccio è Compilazione HotSpot. Inizialmente funziona come interprete, ma poi rileva quali routine vengono utilizzate più spesso e ne compila solo quelle. Il vantaggio è che non vi è alcun ritardo iniziale dovuto alla compilazione. Inoltre, il compilatore HotSpot può eseguire il profiling durante l'esecuzione e quindi emettere una maggiore ottimizzazione per le routine più importanti. Può persino raccogliere informazioni in modo che quando si esegue la stessa applicazione più e più volte, verrà eseguito sempre più veloce. Ulteriori informazioni sulla compilazione di HotSpot possono essere trovate da this article (tnx Pangea per il collegamento).

Ovviamente, anziché utilizzare il compilatore JIT, è possibile utilizzare semplicemente un compilatore statico per compilare il bytecode per la macchina. Ciò consente l'ottimizzazione completa e quindi non è necessario compilare nuovamente ogni volta che si esegue l'applicazione. Tuttavia, nei telefoni e nelle pagine Web, è sufficiente eseguire il codice (o l'applet) una sola volta, quindi il compilatore JIT potrebbe essere una scelta migliore.

Aggiornamento

file bytecode Python hanno estensione .py. Quando si esegue il file bytecode, il compilatore JIT di Python produce il file compilato .pyc. La prossima volta che eseguirai lo stesso programma, se il file .py non è cambiato, non c'è bisogno di compilarlo di nuovo, ma Python esegue il file .pyc precedentemente compilato. Questo accelera l'inizio del programma.

+3

+1 Per avermi mostrato la bella idea di compilare HotSpot – AlcubierreDrive

+0

@PauliL: se JIT trasforma il codice byte in un formato comprensibile dalla macchina, quindi in che modo la piattaforma del codice byte è indipendente? –

+0

@ShardaPrasadJaiswal: Bytecode è indipendente dalla piattaforma. Il compilatore JOT lo compila nel codice nativo del tuo computer quando esegui il programma. – PauliL

7

È un compilatore just-in-time, a metà strada tra un interprete e un compilatore (cioè, compila, ma solo poco prima che il codice venga eseguito).

Ciò consente di ottimizzare la compilazione utilizzando le informazioni dinamiche conosciute solo in fase di esecuzione (poiché i compilatori di solito funzionano in modo statico e quindi hanno solo accesso alle informazioni in fase di compilazione). Sono molto più difficili da scrivere, ma possono dare grandi miglioramenti nelle prestazioni.

Per ulteriori informazioni, come sempre, see Wikipedia:

In informatica, compilatore just-in-time (JIT), noto anche come traduzione dinamica, è una tecnica per migliorare le prestazioni di esecuzione di un programma per computer . Tradizionalmente, i programmi per computer avevano due modalità di funzionamento runtime, compilazione interpretata o statica (in anticipo). Il codice interpretato è stato tradotto da un linguaggio di alto livello in un codice macchina continuamente durante ogni esecuzione, mentre la compilazione statica ha tradotto il codice in codice macchina prima dell'esecuzione e ha richiesto solo questa traduzione una sola volta.

I compilatori JIT rappresentavano un approccio ibrido, con la traduzione che si verificava continuamente, come con gli interpreti, ma con il caching del codice tradotto per ridurre al minimo il degrado delle prestazioni. Offre inoltre altri vantaggi rispetto al codice compilato staticamente in fase di sviluppo, come la gestione dei tipi di dati con scadenza tardiva e la possibilità di applicare garanzie di sicurezza.

13

JIT è l'abbreviazione di "just in time". Un compilatore JIT compila il codice, che è spesso in un linguaggio intermedio come Java bytecode o Microsoft IL, in codice eseguibile nativo, e lo fa nel momento in cui viene chiamato il codice. Quindi, finché il codice non viene chiamato, esiste solo in un bytecode o in un IL specifico portatile, e quindi quando viene chiamato, viene generato un codice nativo (che viene poi riutilizzato nelle chiamate successive).

3

JIT = Just in Time. È un processo in cui un programma che altrimenti verrebbe interpretato (ad es. Bytecode Java o codice JavaScript) viene convertito in codice macchina nativa al volo mentre viene eseguito per migliorare le prestazioni.

Alcuni dei vantaggi del compilatore JIT sono la visualizzazione degli hotspot e l'applicazione di ottimizzazioni più aggressive, inoltre è possibile sfruttare le estensioni che il processore corrente ha come SSE2.

Questa domanda può avere più informazioni: How a JIT compiler helps performance of applications?

2

Quindi, qual è il dovere di un JIT compiler ?

Come è già stato detto, è "Just In Time", che in questo senso significa "Just in time for execution".

Quando si compilano programmi su codice macchina, questi vengono spesso indirizzati a una determinata piattaforma.

Pertanto JIT è stato "inventato", si vogliono compilare gli ultimi pezzi del codice per la piattaforma di esecuzione, in modo da vedere questo come un "prima con elaborazione" -compiler/ottimizzatore.

JIT rende le nostre vite più semplici e rende (si spera) le nostre applicazioni più veloci.

Ci sono ovviamente altri purposes of JIT-compilation, il precedente è solo uno di questi.

1

Un compilatore JIT è in genere l'ultima parte della pipeline di una VM e genera codice macchina dal linguaggio intermedio della VM.

Migliora la velocità ottimizzando il codice generato per l'ambiente su cui viene eseguito (istruzioni specifiche della CPU, dimensioni della cache, ...).

I compilatori tradizionali ottimizzano anche il codice macchina generato ma devono farlo senza essere consapevoli delle risorse specifiche che saranno disponibili in fase di esecuzione.

1

Il compilatore JIT (Just-In-Time) è un componente di Java ™ Runtime Environment che migliora le prestazioni delle applicazioni Java in fase di esecuzione.

Fare riferimento alla documentazione IBM here.

L'interprete fa fondamentalmente questo:

  1. Leggi la prossima bytecode da eseguire
  2. Guardate quello che il bytecode è e trovare l'istruzione macchina nativo (s) che corrispondono ad esso
  3. Eseguire il istruzione macchina nativo (s)
  4. Andare al punto 1

che è semplice, funziona bene, e sarà esegui il tuo programma Java. Ma è anche inefficiente, perché la ricerca delle istruzioni native per ogni singolo bytecode da eseguire comporta un tempo di elaborazione dei costi. Così la JVM contiene un secondo meccanismo, il compilatore Just-In-Time, che fa fondamentalmente questo:

  1. Leggi tutte le bytecode per il metodo che deve essere eseguito
  2. convertire tutti quei bytecode di istruzioni macchina native
  3. eseguire le istruzioni macchina native generate

Dopo aver convertito i bytecode per un metodo di istruzioni macchina native, la JVM si ricorda che il codice nativo, in modo che la prossima volta che il metodo deve essere eseguito, si può semplicemente esegui la instructio nativa ns - non ha bisogno di convertire i bytecode ogni volta che viene eseguito il metodo. Ciò rende il programma eseguito molto più veloce.

Inoltre, il JIT esegue molte ottimizzazioni per generare codice nativo che viene eseguito il più velocemente possibile.

+0

Questa domanda aveva già una serie di risposte decenti; non sono sicuro del motivo per cui aveva bisogno di una copia e incolla di contenuti esistenti. –

+0

@AndrewBarber Sono atterrato su questa domanda e non ho trovato nessuna chiara menzione del fatto che il JIT sia una specie di alternativa all'interprete. Solo dopo aver fatto qualche altra ricerca, ho avuto una chiara visione di ciò. Ho pubblicato solo in modo che potesse aiutare gli altri. Specialmente la documentazione IBM è molto utile. –

+0

Due delle prime tre risposte erano abbastanza chiare sul confronto con gli interpreti. –

2

Abbastanza bella spiegazione:.

"In pratica, i metodi non sono compilati la prima volta che essi sono chiamati Per ogni metodo, la JVM mantiene un conteggio di chiamata, che viene incrementato ogni volta che il metodo viene chiamato Il. JVM interpreta un metodo fino a quando il conteggio delle chiamate supera una soglia di compilazione JIT. Pertanto, i metodi utilizzati più spesso vengono compilati subito dopo l'avvio della JVM e i metodi meno utilizzati vengono compilati molto più tardi o non del tutto. la JVM si avvia rapidamente e continua a migliorare le prestazioni: la soglia è stata attentamente selezionata per ottenere un equilibrio ottimale tra i tempi di avvio e le prestazioni a lungo termine

Dopo che un metodo è stato compilato, il conteggio delle chiamate viene azzerato e le chiamate successive al metodo continuano ad incrementare il conteggio. Quando il conteggio chiamate di un metodo raggiunge una soglia di ricompilazione JIT, il compilatore JIT lo compila una seconda volta, applicando una selezione più ampia di ottimizzazioni rispetto alla compilazione precedente. Questo processo viene ripetuto fino al raggiungimento del livello massimo di ottimizzazione. I metodi più impegnativi di un programma Java sono sempre ottimizzati in modo più aggressivo, massimizzando i vantaggi in termini di prestazioni dell'utilizzo del compilatore JIT. Il compilatore JIT può anche misurare i dati operativi in ​​fase di esecuzione e utilizzare tali dati per migliorare la qualità di ulteriori ricompilazioni.

Il compilatore JIT può essere disabilitato, nel qual caso verrà interpretato l'intero programma Java.La disattivazione del compilatore JIT non è raccomandato tranne che per diagnosticare o risolvere problemi di compilazione JIT "

Fonte:. https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.71.doc/diag/understanding/jit_overview.html

0

Dubbio Sir se javac è un compilatore Java il suo ruolo è quello di convertire il codice sorgente in byte code significa. Class e quindi. Class (byte code) viene interpretato da Java interprete (Java) significa da JVM e JIT è la parte di JVM quindi qual è il suo lavoro effettivo

+3

Questa frase mi ha ferito il cervello ... Puoi riformulare? – Poorkenny