Trình biên dịch JIT đặc biệt làm gì trái ngược với trình biên dịch không JIT? Ai đó có thể đưa ra một mô tả ngắn gọn và dễ hiểu?
Trình biên dịch JIT đặc biệt làm gì trái ngược với trình biên dịch không JIT? Ai đó có thể đưa ra một mô tả ngắn gọn và dễ hiểu?
Câu trả lời:
Trình biên dịch JIT chạy sau khi chương trình đã khởi động và biên dịch mã (thường là mã byte hoặc một số hướng dẫn VM) một cách nhanh chóng (hoặc chỉ trong thời gian, như cách gọi của nó) thành một dạng thường nhanh hơn, điển hình là nguồn gốc của CPU chủ tập lệnh. Một JIT có quyền truy cập vào thông tin thời gian chạy động trong khi trình biên dịch chuẩn không có và có thể tối ưu hóa tốt hơn như các hàm nội tuyến được sử dụng thường xuyên.
Điều này trái ngược với trình biên dịch truyền thống biên dịch tất cả mã thành ngôn ngữ máy trước đó chương trình được chạy lần đầu tiên.
Để diễn giải, các trình biên dịch thông thường xây dựng toàn bộ chương trình dưới dạng tệp EXE TRƯỚC lần đầu tiên bạn chạy nó. Đối với các chương trình kiểu mới hơn, một hội đồng được tạo bằng mã giả (mã p). Chỉ sau khi bạn thực thi chương trình trên HĐH (ví dụ: bằng cách nhấp đúp vào biểu tượng của nó), trình biên dịch (JIT) sẽ khởi động và tạo mã máy (mã m) mà bộ xử lý dựa trên Intel hoặc bất cứ điều gì sẽ hiểu.
Ban đầu, một trình biên dịch chịu trách nhiệm biến ngôn ngữ cấp cao (được định nghĩa là cấp cao hơn trình biên dịch) thành mã đối tượng (hướng dẫn máy), sau đó sẽ được liên kết (bởi một trình liên kết) thành một tệp thực thi.
Tại một thời điểm trong quá trình phát triển của các ngôn ngữ, trình biên dịch sẽ biên dịch một ngôn ngữ cấp cao thành mã giả, sau đó sẽ được phiên dịch (bởi một thông dịch viên) để chạy chương trình của bạn. Điều này đã loại bỏ mã đối tượng và các tệp thực thi và cho phép các ngôn ngữ này có thể được chuyển sang nhiều hệ điều hành và nền tảng phần cứng. Pascal (được biên dịch thành P-Code) là một trong những cái đầu tiên; Java và C # là những ví dụ gần đây hơn. Cuối cùng, thuật ngữ P-Code đã được thay thế bằng mã byte, vì hầu hết các hoạt động giả đều dài một byte.
Trình biên dịch Just-In-Time (JIT) là một tính năng của trình thông dịch thời gian chạy, thay vì diễn giải mã byte mỗi khi một phương thức được gọi, sẽ biên dịch mã byte vào các lệnh mã máy của máy đang chạy, sau đó gọi nó mã đối tượng thay thế. Lý tưởng nhất là hiệu quả của việc chạy mã đối tượng sẽ khắc phục sự kém hiệu quả của việc biên dịch lại chương trình mỗi khi nó chạy.
JIT-Chỉ trong thời gian từ mà chính nó nói khi cần thiết (theo yêu cầu)
Mã nguồn được chuyển đổi hoàn toàn thành mã máy
Mã nguồn sẽ được chuyển đổi thành ngôn ngữ lắp ráp như cấu trúc [cho ex IL (ngôn ngữ trung gian) cho C #, ByteCode cho java].
Mã trung gian được chuyển đổi thành ngôn ngữ máy chỉ khi ứng dụng cần mã yêu cầu chỉ được chuyển đổi thành mã máy.
Trong JIT, không phải tất cả mã được chuyển đổi thành mã máy trước tiên, một phần mã cần thiết sẽ được chuyển đổi thành mã máy sau đó nếu một phương thức hoặc chức năng được gọi không có trong máy thì nó sẽ được chuyển thành mã máy ... nó sẽ giảm gánh nặng cho CPU.
Vì mã máy sẽ được tạo trong thời gian chạy .... trình biên dịch JIT sẽ tạo mã máy được tối ưu hóa để chạy kiến trúc CPU của máy.
Như những người khác đã đề cập
JIT là viết tắt của Just-in-Time, có nghĩa là mã được biên dịch khi cần, không phải trước khi chạy.
Chỉ cần thêm một điểm để thảo luận ở trên, JVM duy trì số đếm theo thời gian một hàm được thực thi. Nếu số này vượt quá giới hạn được xác định trước, JIT sẽ biên dịch mã thành ngôn ngữ máy có thể được bộ xử lý thực thi trực tiếp (không giống như trường hợp thông thường trong đó javac biên dịch mã thành mã byte và sau đó java - trình thông dịch sẽ dịch dòng mã byte này theo dòng mã máy và thực thi).
Ngoài ra, lần tới, hàm này được tính cùng mã được biên dịch được thực thi lại không giống như diễn giải thông thường trong đó mã được diễn giải lại theo từng dòng. Điều này làm cho việc thực hiện nhanh hơn.
Trình biên dịch JIT chỉ biên dịch mã byte thành mã gốc tương đương ở lần thực hiện đầu tiên. Sau mỗi lần thực hiện liên tiếp, JVM chỉ sử dụng mã gốc đã được biên dịch để tối ưu hóa hiệu năng.
Không có trình biên dịch JIT, trình thông dịch JVM sẽ dịch từng dòng mã byte để làm cho nó xuất hiện như thể một ứng dụng gốc đang được thực thi.
JIT là viết tắt của Just-in-Time, có nghĩa là mã được biên dịch khi cần, không phải trước khi chạy.
Điều này có lợi vì trình biên dịch có thể tạo mã được tối ưu hóa cho máy cụ thể của bạn. Trình biên dịch tĩnh, giống như trình biên dịch C trung bình của bạn, sẽ biên dịch tất cả mã trên thành mã thực thi trên máy của nhà phát triển. Do đó trình biên dịch sẽ thực hiện tối ưu hóa dựa trên một số giả định. Nó có thể biên dịch chậm hơn và thực hiện nhiều tối ưu hơn vì nó không làm chậm quá trình thực thi chương trình cho người dùng.
Sau khi mã byte (là kiến trúc trung tính) đã được trình biên dịch Java tạo ra, việc thực thi sẽ được xử lý bởi JVM (trong Java). Mã byte sẽ được nạp vào JVM bởi trình tải và sau đó mỗi lệnh byte được diễn giải.
Khi chúng ta cần gọi một phương thức nhiều lần, chúng ta cần diễn giải cùng một mã nhiều lần và điều này có thể mất nhiều thời gian hơn mức cần thiết. Vì vậy, chúng tôi có trình biên dịch JIT (chỉ trong thời gian). Khi byte đã được tải vào JVM (thời gian chạy của nó), toàn bộ mã sẽ được biên dịch thay vì diễn giải, do đó tiết kiệm thời gian.
Trình biên dịch JIT chỉ hoạt động trong thời gian chạy, vì vậy chúng tôi không có bất kỳ đầu ra nhị phân nào.
Just In Time Compiler (JIT):
Nó biên dịch mã byte java thành các lệnh máy của CPU cụ thể đó.
Ví dụ: nếu chúng ta có một câu lệnh lặp trong mã java:
while(i<10){
// ...
a=a+i;
// ...
}
Mã vòng lặp trên chạy trong 10 lần nếu giá trị của i bằng 0.
Không cần thiết phải biên dịch mã byte trong 10 lần nữa vì lệnh tương tự sẽ được thực thi trong 10 lần. Trong trường hợp đó, chỉ cần biên dịch mã đó một lần và giá trị có thể được thay đổi cho số lần yêu cầu. Vì vậy, Trình biên dịch Just In Time (JIT) theo dõi các câu lệnh và phương thức như vậy (như đã nói ở trên) và biên dịch các đoạn mã byte đó thành mã máy để có hiệu suất tốt hơn.
Một ví dụ tương tự khác, đó là tìm kiếm một mẫu bằng cách sử dụng "Biểu thức chính quy" trong danh sách các chuỗi / câu.
Trình biên dịch JIT không biên dịch tất cả mã thành mã máy. Nó biên dịch mã có một mẫu tương tự trong thời gian chạy.
Xem tài liệu này của Oracle về Hiểu JIT để đọc thêm.
Bạn có mã được bổ sung vào một số IL (ngôn ngữ trung gian). Khi bạn chạy chương trình của mình, máy tính không hiểu mã này. Nó chỉ hiểu mã bản địa. Vì vậy, trình biên dịch JIT biên dịch IL của bạn thành mã gốc khi đang di chuyển. Nó làm điều này ở cấp độ phương pháp.
Tôi biết đây là một chủ đề cũ, nhưng tối ưu hóa thời gian chạy là một phần quan trọng khác của quá trình biên dịch JIT dường như không được thảo luận ở đây. Về cơ bản, trình biên dịch JIT có thể giám sát chương trình khi nó chạy để xác định các cách để cải thiện việc thực thi. Sau đó, nó có thể thực hiện những thay đổi đó một cách nhanh chóng - trong thời gian chạy. Tối ưu hóa Google JIT (javaworld có một bài viết khá hay về nó. )
Trình biên dịch đúng lúc (JIT) là một phần mềm nhận được đầu vào không thực thi và trả về mã máy thích hợp sẽ được thực thi. Ví dụ:
Intermediate representation JIT Native machine code for the current CPU architecture
Java bytecode ---> machine code
Javascript (run with V8) ---> machine code
Hậu quả của điều này là đối với một kiến trúc CPU nhất định, trình biên dịch JIT thích hợp phải được cài đặt.
Mặc dù có thể có ngoại lệ nói chung khi chúng ta muốn chuyển đổi mã nguồn thành mã máy, chúng ta có thể sử dụng:
Jit là viết tắt của trình biên dịch chỉ trong thời gian jit là một chương trình biến mã byte java thành lệnh có thể được gửi trực tiếp đến bộ xử lý.
Sử dụng java chỉ trong trình biên dịch thời gian (thực sự là trình biên dịch thứ hai) ở nền tảng hệ thống cụ thể tuân theo mã byte thành mã hệ thống cụ thể, một khi mã được biên dịch lại bởi trình biên dịch jit, nó thường sẽ chạy nhanh hơn trong máy tính.
Trình biên dịch đúng lúc đi kèm với máy ảo và được sử dụng tùy chọn. Nó biên dịch mã byte thành mã thực thi dành riêng cho nền tảng được thực thi ngay lập tức.
just-in-time (JIT) biên soạn, (còn động dịch hoặc thời gian chạy biên dịch), là một cách để thực thi mã máy tính đó liên quan đến việc biên soạn trong khi thực hiện một chương trình - vào thời gian chạy - chứ không phải trước khi thực hiện .
Biên dịch CNTT là sự kết hợp của hai cách tiếp cận truyền thống để dịch sang mã máy - biên dịch trước thời hạn (AOT) và giải thích - và kết hợp một số ưu điểm và nhược điểm của cả hai. Biên dịch JIT kết hợp tốc độ của mã được biên dịch với tính linh hoạt của giải thích .
Hãy xem xét JIT được sử dụng trong JVM,
Ví dụ, trình biên dịch JVM HotSpot tạo ra tối ưu hóa động. Nói cách khác, họ đưa ra quyết định tối ưu hóa trong khi ứng dụng Java đang chạy và tạo ra các hướng dẫn máy gốc hiệu năng cao được nhắm mục tiêu cho kiến trúc hệ thống cơ bản.
Khi một phương thức được chọn để biên dịch, JVM cung cấp mã byte của nó cho trình biên dịch Just-In-Time (JIT). JIT cần hiểu ngữ nghĩa và cú pháp của mã byte trước khi có thể biên dịch phương thức chính xác. Để giúp trình biên dịch JIT phân tích phương thức, mã byte của nó trước tiên được định dạng lại trong một biểu diễn bên trong được gọi là cây theo dõi, giống với mã máy gần hơn mã byte. Phân tích và tối ưu hóa sau đó được thực hiện trên cây của phương pháp. Cuối cùng, các cây được dịch sang mã gốc.
Cây theo dõi là một cấu trúc dữ liệu được sử dụng trong quá trình biên dịch mã lập trình thời gian chạy. Cây dấu vết được sử dụng trong một loại 'chỉ trong trình biên dịch thời gian' theo dõi việc thực thi mã trong các điểm nóng và biên dịch nó. Tham khảo điều này .
Tham khảo :
Trình biên dịch không phải JIT lấy mã nguồn và biến đổi nó thành mã byte cụ thể của máy tại thời gian biên dịch. Trình biên dịch JIT lấy mã byte bất khả tri của máy được tạo ra trong thời gian biên dịch và biến nó thành mã byte cụ thể của máy trong thời gian chạy. Trình biên dịch JIT mà Java sử dụng là những gì cho phép một nhị phân duy nhất chạy trên nhiều nền tảng mà không cần sửa đổi.
20% mã byte được sử dụng 80% thời gian. Trình biên dịch JIT có được các số liệu thống kê này và tối ưu hóa 20% mã byte này để chạy nhanh hơn bằng cách thêm các phương thức nội tuyến, loại bỏ các khóa không sử dụng, v.v. và cũng tạo mã byte cụ thể cho máy đó. Tôi đang trích dẫn từ bài viết này, tôi thấy nó rất tiện dụng. http://java.dzone.com/articles/just-time-compiler-jit-hotspot
JIT đề cập đến công cụ thực thi trong một vài triển khai JVM, một công cụ nhanh hơn nhưng đòi hỏi nhiều bộ nhớ hơn, là một trình biên dịch đúng lúc. Trong sơ đồ này, mã byte của một phương thức được biên dịch thành mã máy gốc khi lần đầu tiên phương thức được gọi. Mã máy gốc cho phương thức sau đó được lưu vào bộ đệm, vì vậy nó có thể được sử dụng lại vào lần tiếp theo khi phương thức tương tự được gọi.
JVM thực sự thực hiện các bước biên dịch trong thời gian chạy vì lý do hiệu năng. Điều này có nghĩa là Java không có sự phân tách thực thi biên dịch sạch. Đầu tiên, nó được gọi là biên dịch tĩnh từ mã nguồn Java sang mã byte. Sau đó, mã byte này được truyền cho JVM để thực thi. Nhưng việc thực thi mã byte là chậm nên JVM đo tần suất chạy mã byte và khi phát hiện "điểm nóng" mã chạy rất thường xuyên, nó thực hiện biên dịch động từ mã byte sang mã máy của mã "hotspot" (hotspot profiler). Vì vậy, ngày nay các chương trình Java được chạy bằng thực thi machinecode.
Trình biên dịch Just In Time còn được gọi là trình biên dịch JIT được sử dụng để cải thiện hiệu năng trong Java. Nó được kích hoạt theo mặc định. Nó được biên dịch được thực hiện tại thời điểm thực hiện sớm hơn. Java đã phổ biến việc sử dụng trình biên dịch JIT bằng cách đưa nó vào JVM.