JIT è l'abbreviazione di compilatore just-in-time e name is misson: durante il runtime, determina ottimizzazioni del codice utili e le applica. Non sostituisce i normali compilatori ma fanno parte degli interpreti. Si noti che linguaggi come Java che utilizzano il codice intermedio hanno entrambi : un normale compilatore per la traduzione di codice da sorgente a intermedio e un JIT incluso nell'interprete per aumentare le prestazioni.
Le ottimizzazioni del codice possono certamente essere eseguite da compilatori "classici", ma nota la differenza principale: i compilatori JIT hanno accesso ai dati in fase di esecuzione. Questo è un enorme vantaggio; sfruttarlo correttamente può essere difficile, ovviamente.
Considera, ad esempio, un codice come questo:
m(a : String, b : String, k : Int) {
val c : Int;
switch (k) {
case 0 : { c = 7; break; }
...
case 17 : { c = complicatedMethod(k, a+b); break; }
}
return a.length + b.length - c + 2*k;
}
Un normale compilatore non può fare troppo al riguardo. Un compilatore JIT, tuttavia, può rilevare che m
viene sempre chiamato solo k==0
per qualche motivo (cose del genere possono accadere come modifiche del codice nel tempo); può quindi creare una versione più piccola del codice (e compilarlo in codice nativo, anche se considero questo un punto minore, concettualmente):
m(a : String, b : String) {
return a.length + b.length - 7;
}
A questo punto, probabilmente incorporerà anche la chiamata del metodo in quanto è banale ora.
Apparentemente, il Sun ha respinto la maggior parte delle ottimizzazioni che si javac
usavano in Java 6; Mi è stato detto che quelle ottimizzazioni hanno reso difficile per JIT fare molto, e alla fine il codice compilato ingenuamente ha funzionato più velocemente. Vai a capire.