Trình biên dịch là một chương trình dịch mã nguồn cho một chương trình khác từ ngôn ngữ lập trình thành mã thực thi.
Mã nguồn thường là ngôn ngữ lập trình cấp cao (ví dụ: Pascal, C, C ++, Java, Perl, C #, v.v.). Mã thực thi có thể là một chuỗi các lệnh máy có thể được CPU thực thi trực tiếp hoặc nó có thể là một biểu diễn trung gian được diễn giải bởi một máy ảo (ví dụ mã byte Java).
Nói tóm lại, trình biên dịch chuyển đổi một chương trình từ định dạng có thể đọc được thành định dạng có thể đọc được bằng máy.
Về cách trình biên dịch hoạt động, điều đó thực sự phức tạp. Có sách và các khóa học đại học về chủ đề này. Tôi sẽ cố gắng phác thảo ngắn gọn các giai đoạn chính của quy trình, nhưng đây sẽ là một tổng quan rất khó hiểu.
- Lexing - chia văn bản của chương trình thành "mã thông báo". Các mã thông báo là "từ" của ngôn ngữ lập trình, chẳng hạn như mã định danh (từ khóa, tên biến, tên hàm, v.v.) hoặc toán tử (=, *, &, v.v.).
- Phân tích cú pháp - chuyển đổi chuỗi mã thông báo thành cây phân tích, là cấu trúc dữ liệu đại diện cho các cấu trúc ngôn ngữ khác nhau: khai báo kiểu, khai báo biến, định nghĩa hàm, vòng lặp, điều kiện, biểu thức, v.v.
- Tối ưu hóa - đánh giá các biểu thức không đổi, tối ưu hóa các biến không sử dụng hoặc mã không thể truy cập, các vòng lặp không kiểm soát nếu có thể, v.v.
- Dịch cây phân tích thành các lệnh máy (hoặc mã byte JVM).
Một lần nữa, tôi nhấn mạnh rằng đây là một mô tả rất ngắn gọn. Trình biên dịch hiện đại rất thông minh, và do đó, rất phức tạp.