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 сильно мешал, и в конце концов наивно скомпилированный код работал быстрее. Пойди разберись.