JIT é a abreviação de compilador just-in-time, e o nome é misson: durante o tempo de execução, determina otimizações de código que valem a pena e as aplica. Ele não substitui os compiladores comuns, mas faz parte dos intérpretes. Observe que idiomas como Java, que usam código intermediário, têm ambos : um compilador normal para tradução de código intermediário e intermediário e um JIT incluído no interpretador para aumentar o desempenho.
As otimizações de código certamente podem ser executadas por compiladores "clássicos", mas observe a principal diferença: os compiladores JIT têm acesso aos dados em tempo de execução. Esta é uma enorme vantagem; explorá-lo corretamente pode ser difícil, obviamente.
Considere, por exemplo, código como este:
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;
}
Um compilador normal não pode fazer muito sobre isso. Um compilador JIT, no entanto, pode detectar que isso m
só é chamado k==0
por algum motivo (coisas assim podem acontecer à medida que o código muda com o tempo); ele pode criar uma versão menor do código (e compilá-lo no código nativo, embora eu considere isso um ponto secundário, conceitualmente):
m(a : String, b : String) {
return a.length + b.length - 7;
}
Nesse ponto, provavelmente alinhará a chamada do método, já que é trivial agora.
Aparentemente, o Sun descartou a maioria das otimizações javac
usadas no Java 6; Disseram-me que essas otimizações dificultavam muito o JIT e o código compilado ingenuamente era mais rápido no final. Vai saber.