JIT - це короткий термін для компілятора, який працює за часом, а ім'я - misson: під час виконання він визначає корисні оптимізації коду та застосовує їх. Він не замінює звичайні компілятори, але є частиною перекладачів. Зауважте, що такі мови, як Java, які використовують проміжний код, мають обидві звичайний компілятор для перекладу вихідного в проміжний код, так і JIT, включений в інтерпретатор для підвищення продуктивності.
Оптимізацію коду, безумовно, можуть виконувати "класичні" компілятори, але зауважте головну відмінність: компілятори JIT мають доступ до даних під час виконання. Це величезна перевага; Очевидно, що його правильно використовувати.
Розглянемо, наприклад, такий код:
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;
}
Звичайний компілятор не може з цим робити занадто багато. Компілятор JIT, однак, може виявити, що m
з k==0
будь-якої причини викликається лише колись (подібні речі можуть траплятися з часом зміни коду); Потім він може створити меншу версію коду (і скомпілювати його до рідного коду, хоча концептуально я вважаю це другорядним моментом):
m(a : String, b : String) {
return a.length + b.length - 7;
}
На цьому етапі, ймовірно, навіть вбудується виклик методу, як це тривіально зараз.
Мабуть, Sun відхилив більшість оптимізацій, які javac
раніше робили в Java 6; Мені сказали, що ці оптимізації ускладнювали JIT багато, і наївно складений код пробіг швидше. Піди розберися.