Trong lập trình máy tính, một triển khai của ngôn ngữ lập trình là một hệ thống để thực thi chương trình máy tính. Có hai cách tiếp cận chung để triển khai một ngôn ngữ lập trình:[1]
Một trình thông dịch gồm hai phần: một trình phân tích cú pháp và một trình đánh giá. Sau khi chương trình được đọc bởi trình thông dịch, nó được xử lý bởi trình phân tích cú pháp. Trình phân tích cú pháp chia chương trình thành các thành phần ngôn ngữ để tạo thành cây phân tích cú pháp. Trình đánh giá sau đó sử dụng cây phân tích cú pháp để thực thi chương trình.[3]
Một máy ảo là một loại trình thông dịch đặc biệt để thực thi bytecode.[2] Bytecode là một mã di động cấp thấp tương tự như mã máy, mặc dù nó thường được thực thi bởi máy ảo thay vì một máy vật lý.[4] Để cải thiện độ hiệu quả, nhiều ngôn ngữ lập trình như Java,[4] Python,[5] và C#[6] được biên dịch thành bytecode trước khi được thông dịch.
Một số máy ảo bao gồm trình biên dịch just-in-time (JIT) để cải thiện hiệu quả thực thi bytecode. Trong khi bytecode đang được thực thi bởi máy ảo, nếu trình biên dịch JIT xác định rằng một phần bytecode sẽ được sử dụng nhiều lần thì nó sẽ biên dịch phần cụ thể đó thành mã máy. Sau đó, trình biên dịch JIT lưu mã máy vào bộ nhớ để máy ảo có thể sử dụng. Trình biên dịch JIT cố gắng đạt được sự cân bằng giữa thời gian biên dịch dài hơn và thời gian thực thi nhanh hơn.[2]
Một trình biên dịch dịch một chương trình được viết bằng một ngôn ngữ sang ngôn ngữ khác. Hầu hết các trình biên dịch được tổ chức thành ba giai đoạn: phần front-end, trình tối ưu hóa và phần back-end. Phần front-end chịu trách nhiệm hiểu chương trình. Nó đảm bảo chương trình hợp lệ và biến nó thành một biểu diễn trung gian (intermediate representation), một cấu trúc dữ liệu được trình biên dịch sử dụng để biểu diễn chương trình. Trình tối ưu hóa cải thiện cách biểu diễn trung gian để tăng tốc độ hoặc giảm kích thước của tệp thực thi mà trình biên dịch tạo ra sau cùng. Phần back-end chuyển đổi biểu diễn trung gian đã được tối ưu hóa thành ngôn ngữ đầu ra của trình biên dịch.[7]
Nếu trình biên dịch của một ngôn ngữ bậc cao nhất định tạo ra một ngôn ngữ bậc cao khác thì nó được gọi là trình chuyển mã. Trình chuyển mã có thể được sử dụng để mở rộng các ngôn ngữ hiện có hoặc để đơn giản hóa việc phát triển trình biên dịch bằng cách khai thác các triển khai di động và được tối ưu hóa tốt của các ngôn ngữ khác (chẳng hạn như C).[2]
Có thể có nhiều sự kết hợp giữa thông dịch và biên dịch và nhiều cách triển khai ngôn ngữ lập trình hiện đại bao gồm các đặc điểm của cả hai. Ví dụ: ngôn ngữ lập trình Smalltalk được triển khai theo quy ước bằng cách biên dịch thành bytecode, sau đó được thông dịch hoặc biên dịch bởi một máy ảo. Vì bytecode Smalltalk được chạy trên máy ảo nên nó có thể được thực thi trên các nền tảng phần cứng khác nhau.[8]
Ngôn ngữ lập trình có thể có nhiều triển khai. Các triển khai khác nhau có thể được viết bằng những ngôn ngữ khác nhau và có thể sử dụng nhiều phương thức để biên dịch hoặc thông dịch mã. VÍ dụ, các triển khai của Python bao gồm:[9]