JIT es la abreviatura de compilador justo a tiempo, y el nombre es misson: durante el tiempo de ejecución, determina optimizaciones de código que valen la pena y las aplica. No reemplaza a los compiladores habituales, pero son parte de los intérpretes. Tenga en cuenta que los lenguajes como Java que usan código intermedio tienen ambos : un compilador normal para la traducción de código fuente a intermedio, y un JIT incluido en el intérprete para aumentar el rendimiento.
Ciertamente, los compiladores "clásicos" pueden realizar optimizaciones de código, pero tenga en cuenta la diferencia principal: los compiladores JIT tienen acceso a los datos en tiempo de ejecución. Esta es una gran ventaja; explotarlo adecuadamente puede ser difícil, obviamente.
Considere, por ejemplo, un 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;
}
Un compilador normal no puede hacer mucho al respecto. Sin embargo, un compilador JIT puede detectar que m
solo se llama k==0
por alguna razón (cosas como esa pueden suceder a medida que el código cambia con el tiempo); luego puede crear una versión más pequeña del código (y compilarlo en código nativo, aunque considero que esto es un punto menor, conceptualmente):
m(a : String, b : String) {
return a.length + b.length - 7;
}
En este punto, probablemente incluso alineará la llamada al método, ya que es trivial ahora.
Aparentemente, el Sol descartó la mayoría de las optimizaciones que javac
solía hacer en Java 6; Me han dicho que esas optimizaciones dificultaron que JIT hiciera mucho, y al final el código compilado ingenuamente fue más rápido. Imagínate.