Tóm tắt tôi đưa ra dưới đây dựa trên "Trình biên dịch, Nguyên tắc, Kỹ thuật & Công cụ", Aho, Lam, Sethi, Ullman, (Pearson International Edition, 2007), trang 1, 2, với việc bổ sung một số ý tưởng của riêng tôi.
Hai cơ chế cơ bản để xử lý một chương trình là biên dịch và giải thích .
Quá trình biên dịch lấy đầu vào là chương trình nguồn theo ngôn ngữ đã cho và xuất chương trình đích bằng ngôn ngữ đích.
source program --> | compiler | --> target program
Nếu ngôn ngữ đích là mã máy, nó có thể được thực thi trực tiếp trên một số bộ xử lý:
input --> | target program | --> output
Quá trình biên dịch bao gồm quét và dịch toàn bộ chương trình đầu vào (hoặc mô-đun) và không liên quan đến việc thực hiện nó.
Giải thích lấy làm đầu vào của chương trình nguồn và đầu vào của nó, và tạo ra đầu ra của chương trình nguồn
source program, input --> | interpreter | --> output
Giải thích thường liên quan đến việc xử lý (phân tích và thực hiện) một câu lệnh chương trình tại một thời điểm.
Trong thực tế, nhiều bộ xử lý ngôn ngữ sử dụng kết hợp cả hai cách tiếp cận. Ví dụ, các chương trình Java được dịch lần đầu tiên (được biên dịch) thành một chương trình trung gian (mã byte):
source program --> | translator | --> intermediate program
đầu ra của bước này sau đó được thực thi (diễn giải) bởi một máy ảo:
intermediate program + input --> | virtual machine | --> output
Để làm phức tạp mọi thứ hơn nữa, JVM có thể thực hiện biên dịch đúng lúc trong thời gian chạy để chuyển đổi mã byte sang định dạng khác, sau đó được thực thi.
Ngoài ra, ngay cả khi bạn biên dịch sang ngôn ngữ máy, vẫn có một trình thông dịch chạy tệp nhị phân của bạn được bộ xử lý bên dưới triển khai. Do đó, ngay cả trong trường hợp này, bạn đang sử dụng kết hợp biên dịch + giải thích.
Vì vậy, các hệ thống thực sử dụng kết hợp cả hai nên rất khó để nói liệu bộ xử lý ngôn ngữ nhất định là trình biên dịch hay trình thông dịch, bởi vì nó có thể sẽ sử dụng cả hai cơ chế ở các giai đoạn xử lý khác nhau. Trong trường hợp này có lẽ sẽ thích hợp hơn để sử dụng một thuật ngữ khác, trung tính hơn.
Tuy nhiên, biên dịch và giải thích là hai loại xử lý riêng biệt, như được mô tả trong các sơ đồ trên,
Để trả lời các câu hỏi ban đầu.
Một trình biên dịch sẽ tạo ra ngôn ngữ máy chạy trực tiếp trên phần cứng vật lý?
Không nhất thiết, trình biên dịch dịch một chương trình được viết cho máy M1 thành chương trình tương đương được viết cho máy M2. Máy đích có thể được thực hiện trong phần cứng hoặc là máy ảo. Về mặt khái niệm không có sự khác biệt. Điểm quan trọng là trình biên dịch nhìn vào một đoạn mã và dịch nó sang ngôn ngữ khác mà không thực hiện nó.
Vì vậy, một trình thông dịch không tạo ra ngôn ngữ máy nhưng trình biên dịch sẽ làm điều đó cho đầu vào của nó?
Nếu bằng cách tạo ra bạn đang đề cập đến đầu ra, thì trình biên dịch sẽ tạo ra một chương trình đích có thể bằng ngôn ngữ máy, một trình thông dịch thì không.