Tôi nghĩ rằng có một sự khác biệt cần được thực hiện, tuy nhiên nó không nhất thiết phải là "Biên dịch" và "Được quản lý". Đây không phải là đối lập; một ngôn ngữ có thể được biên dịch và không được quản lý, hoặc giải thích (không được biên dịch) và được quản lý, hoặc cả hai, hoặc thậm chí là không.
Một ngôn ngữ "được biên dịch" chỉ đơn giản là một ngôn ngữ trong đó có một bước chuyển đổi mã nguồn được nhà phát triển viết thành một "mã byte" thông thường hơn, đó là thứ được thực thi bởi máy. "Máy" có thể là bộ xử lý thực tế hoặc "máy ảo" thực hiện các hoạt động bổ sung trên mã byte để dịch chúng sang hướng dẫn máy "gốc". Từ trái nghĩa của ngôn ngữ "đã biên dịch" là ngôn ngữ "được diễn giải", trong đó mã nguồn được chuyển đổi thành các lệnh bytecode trong thời gian chạy, từng dòng khi chúng được thực thi, không có bước biên dịch. Một kết hợp giữa chúng là "jits", từ "JIT" (Just In Time), thường được hiểu là một bước một lần của máy thực thi;
Ngôn ngữ "được quản lý" là ngôn ngữ được thiết kế để tạo ra các chương trình được sử dụng trong môi trường thời gian chạy cụ thể, hầu như luôn bao gồm trình thông dịch mã byte; một "máy ảo" lấy mã của chương trình và thực hiện một số chuyển đổi bổ sung cho từng máy hoặc môi trường cụ thể. Môi trường cũng có thể bao gồm quản lý bộ nhớ, chẳng hạn như "trình thu gom rác" và các tính năng "bảo mật" khác để giữ cho chương trình hoạt động trong "hộp cát" không gian và công cụ của nó, tuy nhiên các tính năng này không phải là miền duy nhất của thời gian chạy "được quản lý" . Hầu như tất cả các ngôn ngữ được thông dịch đều có thể được coi là được quản lý, bởi vì chúng yêu cầu trình thông dịch phải chạy bên dưới các dòng mã "người dùng" đang được thực thi. Ngoài ra, các ngôn ngữ JVM và .NET (Java, Scala, C #, VB, F #, IronWhthing) được biên dịch thành ngôn ngữ trung gian hoặc IL, tương tự bề ngoài về hình thức và chức năng với ngôn ngữ lắp ráp nhị phân, nhưng không tuân thủ 100% với bất kỳ tập lệnh "gốc" nào. Các hướng dẫn này được thực thi bởi JVM hoặc bởi CLR của .NET, giúp chuyển đổi chúng thành các hướng dẫn nhị phân riêng cụ thể cho kiến trúc CPU và / hoặc HĐH của máy.
Vì vậy, các ngôn ngữ thường có thể được mô tả là "biên dịch" hoặc "diễn giải" và "không được quản lý" (hoặc "bản địa") và "được quản lý". Có những ngôn ngữ có thể được mô tả như bất kỳ sự kết hợp nào của những ngôn ngữ này ngoại trừ "bản dịch được giải thích" có thể (điều này chỉ đúng với các mã thập lục phân viết tay, trong đó những gì được viết bởi nhà phát triển là những gì được thực thi); nếu bạn coi lớp diễn giải là "thời gian chạy" (dễ tranh luận và khó tranh luận), thì tất cả các ngôn ngữ được diễn giải đều được "quản lý".
Nếu bạn muốn có được kỹ thuật, hầu như tất cả các chương trình nhắm mục tiêu một hệ điều hành đa nhiệm hiện nay đều được "quản lý"; HĐH sẽ tạo ra một "máy ảo" cho mỗi chương trình đang chạy, trong đó chương trình nghĩ (hoặc ít nhất là không phải biết khác) rằng đó là thứ duy nhất đang chạy. Mã có thể thực hiện các cuộc gọi trong chính nó và tới các thư viện được tham chiếu khác như thể chương trình đó là thứ duy nhất được tải trong bộ nhớ; tương tự, các lệnh gọi để phân bổ RAM và bộ nhớ cao hơn khác để lưu trữ và thao tác dữ liệu và thiết bị điều khiển được mã hóa như thể toàn bộ kiến trúc bộ nhớ có sẵn. Sau đó, VM (và HĐH đằng sau nó) dịch các con trỏ bộ nhớ khác nhau sang vị trí thực tế của chương trình, dữ liệu của nó và móc vào trình điều khiển thiết bị, v.v. Điều này thường được thực hiện bằng cách áp dụng bù bộ nhớ (mỗi VM có một khối 2GB hoặc bất cứ điều gì của bộ nhớ, bắt đầu từ địa chỉ X mà chương trình có thể xử lý như thể X là địa chỉ 0) và như vậy rất rẻ để làm, nhưng có những thứ khác mà nhân hệ điều hành chịu trách nhiệm, chẳng hạn như lập lịch xử lý và giao tiếp giữa các quá trình, đó là phức tạp hơn để quản lý. Tuy nhiên, mẫu cơ bản này thường không được coi là "được quản lý", vì chương trình không phải biết rằng nó đang được điều hành bởi một máy ảo và thường vẫn có trách nhiệm giữ cho bộ nhớ được phân bổ của nó "sạch". Một chương trình được thiết kế để chạy trên dòng lệnh MS-DOS có thể chạy trên các HĐH Windows mới hơn, thậm chí không có môi trường MS-DOS bên dưới chúng nữa; thay vào đó, chương trình được cung cấp một môi trường "bảng điều khiển ảo" và với điều kiện là nó không cố rời khỏi "hộp cát" này