2010-03-11 71 views
27

Sự khác nhau giữa Trình biên dịch Chỉ trong thời gian và Phiên dịch là gì, và có sự khác nhau nào giữa .NET và trình biên dịch Java JIT không?Sự khác biệt giữa Trình biên dịch Chỉ trong thời gian và Phiên dịch là gì?

+2

Tiêu đề câu hỏi của bạn không thực sự khớp với văn bản câu hỏi. Cả Java và .NET đều được trích xuất, không được diễn giải. – Aaronaught

+0

nó phục vụ như một câu hỏi thứ hai – Rookian

+3

sau đó bạn nên hỏi nó như là một câu hỏi thứ hai, khác nhau. Bằng cách này bạn chỉ là người khó hiểu. – Oded

Trả lời

29

Just-in-time compilation là chuyển đổi mã không phải gốc, ví dụ bytecode, thành mã gốc ngay trước khi được thực thi.

Từ Wikipedia:

JIT xây dựng dựa trên hai ý tưởng trước đó trong môi trường thời gian chạy: bytecode biên soạn và biên soạn năng động. Nó chuyển đổi mã tại thời gian chạy trước khi thực thi nó một cách tự nhiên, ví dụ bytecode thành mã máy gốc.

An interpreter thực hiện chương trình. Nó có thể hoặc có thể không có một jitter.

Một lần nữa, từ Wikipedia:

Một thông dịch viên có thể là một chương trình mà hoặc

  1. thực thi mã nguồn trực tiếp
  2. dịch mã nguồn thành một số đại diện trung gian hiệu quả (code) và ngay lập tức thực hiện điều này
  3. thực thi một cách rõ ràng mã được biên dịch sẵn được biên dịch bởi một trình biên dịch mà là một phần của thông dịch viên hệ thống

Cả hai tiêu chuẩn Java và .NET phân phối có JIT biên soạn, nhưng nó không phải là yêu cầu của các tiêu chuẩn. Trình biên dịch JIT trong .NET và C# tất nhiên là khác nhau bởi vì bytecode trung gian là khác nhau. Nguyên tắc là như nhau mặc dù.

+0

Trình biên dịch JIT của CLR có biên dịch mã WHOLE một lần hay không? – Rookian

+3

Không, nó chỉ biên dịch mã cần thiết. Điều này mang lại cho bạn một lợi thế để tối ưu hóa trong một thời gian chạy. – Kimi

+0

Nhưng quá trình tối ưu hóa cho mỗi cuộc gọi chỉ xảy ra một lần, phải không (.NET JIT)? Bởi vì tôi là màu đỏ. NET JIT biên dịch một sự hòa bình của mã chỉ một lần. – Rookian

9

Một thông dịch viên tạo và thực thi các hướng dẫn mã máy khi đang bay cho mỗi lệnh, bất kể lệnh đó đã được thực thi trước đó chưa.
Một JIT lưu trữ các hướng dẫn đã được giải thích trước đó về mã máy, và sử dụng lại các hướng dẫn mã máy gốc đó, do đó tiết kiệm thời gian & tài nguyên bằng cách không phải diễn giải lại các câu lệnh đã được diễn giải.

+0

Câu trả lời của bạn có liên quan đến Java JIT Compiler phải không? – Rookian

+0

Yup, nhưng tôi tin rằng kỹ thuật JIT lần đầu tiên được phát triển trên smalltalk. – crowne

+0

Vì vậy, một JIT gây ra một chương trình để có được nhanh hơn dài nó chạy? – Aerovistae

1

Khi bạn biên dịch một ngôn ngữ Microsoft.NET, trình biên dịch tạo mã được viết bằng Ngôn ngữ trung gian Microsoft (MSIL). MSIL là một tập hợp các hướng dẫn có thể nhanh chóng được dịch sang mã gốc.

Ứng dụng Microsoft.NET chỉ có thể chạy sau khi mã MSIL được dịch sang mã máy gốc. Trong .NET Framework, ngôn ngữ trung gian được tuân theo "chỉ trong thời gian" (JIT) thành mã gốc khi ứng dụng hoặc thành phần được chạy thay vì biên dịch ứng dụng vào thời gian phát triển.

more info

2

trình biên dịch JIT sản xuất mã máy nhị phân dịch mã nguồn khối. Phiên dịch dịch từng dòng.

6

Câu hỏi liệu động cơ thực thi là trình biên dịch hay thông dịch viên có thể được trả lời rất đơn giản bằng cách xem xét điều gì xảy ra nếu một quy trình được thực hiện 1.000 lần.Nếu mã trong công cụ thực thi sẽ phải kiểm tra một số biểu diễn cụ thể của mã 1.000 lần, thì công cụ thực thi là một trình thông dịch của biểu diễn đó. Nếu mã trong thực thi, công cụ thực thi sẽ chỉ phải kiểm tra biểu diễn cụ thể của mã một số lần nhỏ hơn (thông thường, mặc dù không nhất thiết, một lần), nó là trình biên dịch hoặc trình dịch của đại diện đó. Lưu ý rằng nó là rất phổ biến cho một công cụ thực thi để lấy mã đầu vào và chuyển đổi nó sang một số hình thức khác mà có thể được kiểm tra dễ dàng hơn. Một công cụ thực thi như vậy sẽ kết hợp một trình biên dịch hoặc dịch giả của biểu mẫu cũ với một thông dịch viên của biểu mẫu thứ hai.

Lưu ý rằng người phiên dịch hiếm khi sản xuất bất kỳ dạng mã máy nào. Chỉ khoảng thời gian duy nhất một thông dịch viên sẽ tạo ra mã máy là khi một tuyên bố được cho là để thực hiện một số hoạt động mà thực sự không thể được thực hiện theo bất kỳ cách nào khác. Ví dụ, nếu một trình thông dịch BASIC chạy trên 8080 gặp lệnh "OUT 100,5", nó thường thực hiện thao tác đó bằng cách lưu trữ D3 64 C9 (OUT 64h/RET) thành ba byte liên tiếp tại một số địa chỉ cố định, nạp A bằng 5, và GỌI địa chỉ đó. Thông dịch viên có thể tạo ra mã máy, nhưng nếu một người thực hiện cùng lệnh OUT 500 lần, người thông dịch sẽ phải tạo lại mã máy mỗi lần.

1

Khi lần đầu tiên một lớp được tham chiếu Công cụ thực thi JIT biên dịch lại các tệp .class (nhị phân chính) được tạo bởi Java Compiler chứa bộ hướng dẫn JVM thành các tệp nhị phân chứa bộ chỉ dẫn của hệ thống HOST. JIT lưu trữ và sử dụng lại những tệp nhị phân được biên dịch lại từ Bộ nhớ trong tương lai, bằng cách giảm thời gian diễn giải và lợi ích từ việc thực thi mã gốc.

Mặt khác, một trình thông dịch java cũ đơn giản diễn giải một lệnh JVM từ tệp lớp tại một thời điểm và gọi thủ tục chống lại nó.

Tìm một so sánh chi tiết ở đây http://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html

22

Tôi luôn thấy rằng một lời giải thích trừu tượng hơn đôi khi giúp. Giả sử bạn đang cố hỏi mọi người ở Mexico "Xin chào. Bạn thế nào?" (ngôn ngữ nguồn của bạn) Tất nhiên, trước tiên bạn cần dịch sang tiếng Tây Ban Nha (ngôn ngữ mẹ đẻ của quốc gia). Bản dịch đó sẽ là "Hola. Como estas?"

Nếu bạn biết tiếng Tây Ban Nha, bạn sẽ không cần dịch (mã/bộ mã gốc). Bạn chỉ cần hỏi "Hola. Como estas?"

Nếu bạn không biết tiếng Tây Ban Nha, có 3 cách để giải quyết.

Đầu tiên là lấy từ điển tiếng Tây Ban Nha (trình biên dịch) và tìm kiếm những từ tiếng Tây Ban Nha trước khi bạn đi. Có lẽ bạn nhận ra rằng "Hola. Que tal?" là một âm tiết ngắn hơn (tối ưu hóa trình biên dịch) và sử dụng thay thế đó. Đây là biên soạn ngôn ngữ ; bạn đang chuyển đổi thông tin sang ngôn ngữ gốc trước đó.

Thứ hai là nơi bạn tìm kiếm các từ trong Từ điển tiếng Tây Ban Nha trong khi bạn đang đứng trước người đầu tiên và sau đó lưu trữ kết quả (tra cứu các từ just-in-time). Lợi thế ở đây là bạn có thể nhận được một từ điển tiếng Quan Thoại và sau đó làm thử nghiệm tương tự ở Trung Quốc mà không cần phải giữ mười ghi chú (nhị phân cho các nền tảng khác nhau) của cụm từ đã dịch.

Thứ ba là nơi bạn tra cứu các từ trong khi đang đứng trước mỗi người.Về bản chất, bạn diễn giải các từ cho từng người một cách riêng biệt (bạn hoạt động như một thông dịch viên ). Lợi thế ở đây là mọi thay đổi được phản ánh ngay lập tức với người tiếp theo (bạn có thể thay đổi để hỏi "Xin chào. Con chó của bạn là màu gì?" Mà không cần phải bay về nhà và khởi động lại - bạn không cần phải biên dịch lại cụm từ) .

  • Dịch trước có nghĩa là bạn có thể yêu cầu mọi người nhanh nhất (trước khi hợp nhất); bạn không cần phải mang theo từ điển cùng bạn.
  • Dịch khi bạn nhìn thấy người đầu tiên ở mỗi quốc gia gần như dịch nhanh nhưng vẫn cho phép bạn đi đến nhiều quốc gia mà không cần phải về nhà để nhận từ điển, nhưng có nghĩa là bạn cần mang theo một số từ điển. thời gian chạy độc lập nền tảng).
  • Dịch theo yêu cầu chậm hơn nhiều nhưng cho phép bạn thay đổi các từ mà không cần đi về nhà (ngôn ngữ được phân phối nguồn).
+1

Tuyệt vời, tôi thích câu trả lời này. Tất cả những người khác là quá kỹ thuật và sẽ gây nhầm lẫn không lập trình viên. –

0

tl; dr

Interpreter: chỉ mất một hướng dẫn tại một thời điểm để thực hiện

Just-in-time: mất một khối mã cùng một lúc và biên dịch nó trước khi thực hiện . do đó có nhiều chỗ để tối ưu hóa

Các vấn đề liên quan