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.
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