JIT jest skrótem od kompilatora just-in-time, a nazwa to misson: w czasie wykonywania określa wartościowe optymalizacje kodu i stosuje je. Nie zastępuje zwykłych kompilatorów, ale jest częścią tłumaczy. Zauważ, że języki takie jak Java, które używają kodu pośredniego, mają zarówno normalny kompilator do tłumaczenia kodu źródłowego na pośredni, jak i JIT zawarte w interpreterie w celu zwiększenia wydajności.
Optymalizacje kodu z pewnością mogą być wykonywane przez „klasyczne” kompilatory, ale zwróć uwagę na główną różnicę: kompilatory JIT mają dostęp do danych w czasie wykonywania. To ogromna zaleta; prawidłowe wykorzystanie może być oczywiście trudne.
Rozważmy na przykład taki kod:
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;
}
Normalny kompilator nie może z tym zrobić zbyt wiele. Jednak kompilator JIT może wykryć, że m
jest wywoływany tylko z k==0
jakiegoś powodu (takie rzeczy mogą się zdarzyć, gdy kod zmienia się w czasie); może następnie utworzyć mniejszą wersję kodu (i skompilować go do kodu natywnego, chociaż uważam, że to drobna kwestia, koncepcyjnie):
m(a : String, b : String) {
return a.length + b.length - 7;
}
W tym momencie prawdopodobnie nawet wstawi wywołanie metody, ponieważ jest to teraz trywialne.
Najwyraźniej Słońce odrzuciło większość optymalizacji wykonanych javac
w Javie 6; Powiedziano mi, że te optymalizacje utrudniały JIT wiele, a naiwnie skompilowany kod działał szybciej. Domyśl.