Quá nhiều ngữ nghĩa và báo cáo dựa trên ý kiến.
Trước hết: C# không phải là ngôn ngữ diễn giải; CLR và JVM được coi là "runtimes" hoặc "middleware", nhưng cùng tên được áp dụng cho những thứ như Perl. Điều này tạo ra rất nhiều sự nhầm lẫn giữa những người có liên quan với tên.
Thuật ngữ "Phiên dịch" tham chiếu thời gian chạy thường có nghĩa là mã hiện tại diễn giải một số mã không phải là mã gốc. Có hai mô hình lớn: Phân tích cú pháp đọc mã nguồn thô và thực hiện các hành động logic; bytecode thực hiện đầu tiên biên dịch mã để một đại diện nhị phân không phải bản địa, đòi hỏi ít hơn nhiều chu kỳ CPU để giải thích.
Java ban đầu được biên dịch sang bytecode, sau đó đi qua một thông dịch viên; bây giờ, JVM đọc bytecode và chỉ trong thời gian biên dịch nó thành mã gốc. CIL cũng làm như vậy: CLR chỉ sử dụng trình biên dịch trong thời gian tới mã gốc.
Hãy xem xét tất cả các kết hợp của mã nguồn đang chạy, chạy bytecode, biên dịch thành bản gốc, chỉ trong thời gian biên dịch, chạy mã nguồn thông qua trình biên dịch đến đúng thời gian, v.v. Các ngữ nghĩa về việc liệu một ngôn ngữ được biên dịch hay giải thích trở thành vô nghĩa.
Ví dụ: nhiều ngôn ngữ thông dịch sử dụng tính năng biên dịch bytecode chỉ trong thời gian. C# biên dịch thành CIL, mà JIT biên dịch thành native; Ngược lại, Perl lập tức biên dịch một tập lệnh thành mã byte, sau đó chạy bytecode này thông qua một trình thông dịch. Bạn chỉ có thể chạy một assembly C# trong định dạng bytecode CIL; bạn chỉ có thể chạy tập lệnh Perl ở định dạng mã nguồn thô.
Trình biên dịch đơn giản cũng chạy rất nhiều thiết bị bên ngoài và bên trong. Thời gian chạy theo dõi việc thực hiện các chức năng khác nhau và sau đó điều chỉnh bố cục mã để tối ưu hóa các chi nhánh và tổ chức mã cho luồng thực thi cụ thể của nó. Điều đó có nghĩa là mã JIT có thể chạy nhanh hơn mã được biên dịch tự nhiên (như C++ thông thường, hoặc giống như C# chạy qua IL2CPP), vì JIT điều chỉnh chiến lược tối ưu hóa của nó thành trường hợp thực thi của mã khi nó chạy.
Chào mừng bạn đến với thế giới lập trình máy tính. Chúng tôi quyết định làm cho nó cực kỳ phức tạp, sau đó đính kèm các tên không mang tính mô tả vào mọi thứ. Mục đích là để tạo ra flamewars trên định nghĩa của các từ mà không có ý nghĩa thiết thực.
thể trùng lặp của [Liệu C# Interpreted hoặc biên soạn?] (Http://stackoverflow.com/questions/2777242/is-c-sharp-interpreted-or-compiled) –