JIT là viết tắt của trình biên dịch chỉ trong thời gian và tên là misson: trong thời gian chạy, nó xác định tối ưu hóa mã đáng giá và áp dụng chúng. Nó không thay thế trình biên dịch thông thường mà là một phần của trình thông dịch. Lưu ý rằng các ngôn ngữ như Java sử dụng mã trung gian có cả hai : trình biên dịch thông thường để dịch mã nguồn sang trung gian và JIT có trong trình thông dịch để tăng hiệu suất.
Tối ưu hóa mã chắc chắn có thể được thực hiện bởi trình biên dịch "cổ điển", nhưng lưu ý sự khác biệt chính: Trình biên dịch JIT có quyền truy cập vào dữ liệu khi chạy. Đây là một lợi thế rất lớn ; Khai thác nó đúng cách có thể khó, rõ ràng.
Hãy xem xét, ví dụ, mã như thế này:
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;
}
Một trình biên dịch bình thường không thể làm quá nhiều về điều này. Tuy nhiên, một trình biên dịch JIT có thể phát hiện ra rằng m
nó chỉ được gọi với k==0
một số lý do (những thứ như thế có thể xảy ra khi mã thay đổi theo thời gian); sau đó nó có thể tạo một phiên bản mã nhỏ hơn (và biên dịch nó thành mã gốc, mặc dù tôi coi đây là một điểm nhỏ, về mặt khái niệm):
m(a : String, b : String) {
return a.length + b.length - 7;
}
Tại thời điểm này, nó có thể thậm chí sẽ thực hiện cuộc gọi phương thức vì nó là tầm thường bây giờ.
Rõ ràng, Mặt trời đã loại bỏ hầu hết các tối ưu hóa javac
được sử dụng trong Java 6; Tôi đã được thông báo rằng những tối ưu hóa đó khiến JIT khó có thể làm được gì nhiều, và mã được biên dịch ngây thơ chạy nhanh hơn cuối cùng. Đi hình.