Trình biên dịch hoạt động trong các giai đoạn khác nhau, mỗi giai đoạn biến đổi chương trình nguồn từ hình thức này sang hình thức khác. Mỗi giai đoạn lấy đầu vào từ giai đoạn trước của nó và đưa đầu ra của nó sang giai đoạn tiếp theo của trình biên dịch.
Có 6 giai đoạn trong một trình biên dịch. Mỗi giai đoạn này giúp chuyển đổi ngôn ngữ cấp cao thành mã máy. Các giai đoạn của trình biên dịch là:
Tất cả các giai đoạn này chuyển đổi mã nguồn bằng cách chia thành các mã thông báo, tạo cây phân tích cú pháp và tối ưu hóa mã nguồn theo các giai đoạn khác nhau.
Phân tích từ vựng là giai đoạn đầu tiên khi trình biên dịch quét mã nguồn. Quá trình này có thể từ trái sang phải, theo từng ký tự và nhóm các ký tự này thành các mã thông báo.
Ở đây, dòng ký tự từ chương trình nguồn được nhóm thành các chuỗi có ý nghĩa bằng cách xác định các mã thông báo. Nó nhập các nhãn tương ứng vào bảng ký hiệu và chuyển mã thông báo đó sang giai đoạn tiếp theo.
Các chức năng chính của giai đoạn này là:
Ví dụ:
x = y + 10
Mã thông báo sẽ là:
X | Định danh |
= | Toán tử gán |
Y | Định danh |
+ | Toán tử cộng |
10 | Số |
Phân tích cú pháp là khám phá tất cả cấu trúc trong mã. Nó xác định xem một văn bản có tuân theo định dạng hay không. Mục đích chính của giai đoạn này là đảm bảo rằng mã nguồn được lập trình viên viết là chính xác hay không.
Phân tích cú pháp dựa trên các quy tắc dựa trên ngôn ngữ lập trình cụ thể bằng cách xây dựng cây phân tích với sự trợ giúp của các mã thông báo. Nó cũng xác định cấu trúc của ngôn ngữ nguồn và ngữ pháp hoặc cú pháp của ngôn ngữ.
Dưới đây là danh sách các nhiệm vụ được thực hiện trong giai đoạn này:
Ví dụ:
Bất kỳ định danh / số là một biểu thức
Nếu x là định danh và y + 10 là biểu thức thì x = y + 10 là câu lệnh.
Xem xét cây phân tích cho ví dụ sau:
(a + b) * c
Trong cây phân tích:
Phân tích ngữ nghĩa kiểm tra tính nhất quán ngữ nghĩa của mã. Nó sử dụng cây cú pháp của pha trước cùng với bảng ký hiệu để xác minh rằng mã nguồn đã cho là phù hợp về mặt ngữ nghĩa. Nó cũng kiểm tra xem mã có truyền đạt ý nghĩa thích hợp hay không.
Trình phân tích ngữ nghĩa sẽ kiểm tra các kiểu dữ liệu không khớp, toán hạng không tương thích, một hàm được gọi với các đối số không chính xác, một biến không được khai báo, v.v.
Chức năng của giai đoạn phân tích ngữ nghĩa là:
Ví dụ
float x = 20.2;
float y = x * 30;
Trong đoạn mã trên, bộ phân tích ngữ nghĩa sẽ ép kiểu số nguyên 30 thành kiểu float 30.0 trước khi thực hiện phép nhân.
Sau khi giai đoạn phân tích ngữ nghĩa hoàn tất, trình biên dịch tạo mã trung gian cho máy đích. Nó tạo ra một chương trình cho một số máy trừu tượng.
Mã trung gian nằm giữa ngôn ngữ cấp cao và ngôn ngữ máy. Mã trung gian này cần được tạo theo cách giúp dễ dàng dịch mã sang mã máy đích bất kỳ.
Hoạt động tạo mã trung gian:
Ví dụ:
total = count + rate * 5
Mã trung gian với sự trợ giúp của phương pháp mã địa chỉ là:
t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3
Giai đoạn tiếp theo là tối ưu mã hoặc mã trung gian. Giai đoạn này loại bỏ dòng mã không cần thiết và sắp xếp chuỗi các câu lệnh để tăng tốc độ thực hiện chương trình mà không lãng phí tài nguyên.
Mục tiêu chính của giai đoạn này là cải thiện mã trung gian để tạo mã chạy nhanh hơn và chiếm ít không gian hơn.
Các chức năng chính của giai đoạn này là:
Ví dụ:
Hãy xem đoạn mã sau đây:
a = intofloat(10)
b = c * a
d = e + b
f = d
Có thể trở thành:
b = c * 10.0
f = e + b
Tạo mã là giai đoạn cuối cùng và cuối cùng của trình biên dịch. Nó nhận đầu vào từ giai đoạn tối ưu hóa mã và tạo ra mã hợp ngữ hoặc mã đối tượng. Mục tiêu của giai đoạn này là phân bổ lưu trữ và tạo mã máy.
Nó cũng phân bổ các vị trí bộ nhớ cho biến. Các chỉ thị trong mã trung gian được chuyển đổi thành mã máy. Giai đoạn này chuyển đổi mã tối ưu hóa hoặc mã trung gian vào ngôn ngữ đích.
Ngôn ngữ đích là mã máy. Do đó, tất cả các vị trí bộ nhớ và thanh ghi cũng được chọn và phân bổ trong giai đoạn này. Mã được tạo bởi giai đoạn này được thực thi để lấy đầu vào và tạo đầu ra dự kiến.
Ví dụ:
a = b + 60.0
Có thể được dịch sang hợp ngữ.
MOVF a, R1
MULF #60.0, R2
ADDF R1, R2
Một bảng ký hiệu chứa một bản ghi cho mỗi mã định danh với các trường cho các thuộc tính của mã định danh.
Thành phần này giúp trình biên dịch dễ dàng tìm kiếm bản ghi định danh và truy xuất nó nhanh chóng.
Bảng ký hiệu cũng giúp bạn quản lý phạm vi. Bảng ký hiệu và trình xử lý lỗi tương tác với tất cả các giai đoạn và bảng ký hiệu cập nhật tương ứng.
Trong quá trình thiết kế trình biên dịch, lỗi có thể xảy ra trong tất cả các giai đoạn dưới đây:
Các lỗi phổ biến nhất là chuỗi ký tự không hợp lệ khi quét, chuỗi mã thông báo không hợp lệ về kiểu dữ liệu, lỗi phạm vi và phân tích cú pháp trong phân tích ngữ nghĩa.
Lỗi có thể gặp phải trong bất kỳ giai đoạn nào ở trên. Sau khi tìm thấy lỗi, giai đoạn cần xử lý các lỗi để tiếp tục quá trình biên dịch. Những lỗi này cần được báo cáo cho bộ xử lý lỗi xử lý lỗi để thực hiện quá trình biên dịch. Nói chung, các lỗi được báo cáo dưới dạng thông điệp.
Bạn có thể vui lòng tắt trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi duy trì hoạt động của trang web.
Trong hướng dẫn này, bạn sẽ tìm hiểu chi tiết về môi trường thực thi, nơi chương trình sau khi biên dịch sẽ được thực thi.
Trong hướng dẫn này, bạn sẽ tìm hiểu bảng ký hiệu là gì? Cách trình biên dịch sử dụng bảng ký hiệu trong thiết kế trình biên dịch.
Trong hướng dẫn này, bạn sẽ tìm hiểu chi tiết các phương pháp để tối ưu mã trong thiết kế trình biên dịch.
Trong hướng dẫn này, bạn sẽ tìm hiểu tạo mã và trình tạo mã trong thiết kế trình biên dịch.