Các giai đoạn của trình biên dịch kèm ví dụ, quy trình và các bước thực hiện.

⚡ Tóm tắt thông minh

Các giai đoạn của trình biên dịch mô tả cách trình biên dịch chuyển đổi mã nguồn thành mã máy thông qua sáu giai đoạn: phân tích từ vựng, phân tích cú pháp, phân tích ngữ nghĩa, tạo mã trung gian, tối ưu hóa mã và tạo mã, được hỗ trợ bởi quản lý bảng ký hiệu và xử lý lỗi xuyên suốt.

  • 🔤 Phân tích từ vựng: Giai đoạn đầu tiên quét mã nguồn và nhóm các ký tự thành các token, điền vào bảng ký hiệu.
  • 🌳 Phân tích cú pháp: Các token được kiểm tra dựa trên các quy tắc ngữ pháp và được sắp xếp thành cây phân tích cú pháp.
  • Phân tích ngữ nghĩa: Trình biên dịch kiểm tra tính tương thích kiểu dữ liệu và ý nghĩa bằng cách sử dụng cây cú pháp và bảng ký hiệu.
  • 🔁 Trung cấp Code: Một dạng biểu diễn độc lập với máy tính, chẳng hạn như mã ba địa chỉ, được tạo ra để dễ dàng dịch thuật.
  • Tối ưu hóa: Các đoạn mã dư thừa và không thể truy cập được sẽ bị loại bỏ để giúp chương trình chạy nhanh hơn và có kích thước nhỏ hơn.
  • 🖥️ Code Thế hệ: Giai đoạn cuối cùng chuyển đổi mã đã được tối ưu hóa thành mã máy đích, phân bổ các thanh ghi và bộ nhớ.

Các giai đoạn của thiết kế trình biên dịch là gì?

Trình biên dịch hoạt động theo nhiều giai đoạn khác nhau, mỗi giai đoạn biến đổi chương trình nguồn từ cách biểu diễn này sang cách biểu diễn khác. Mỗi giai đoạn lấy đầu vào từ giai đoạn trước và cung cấp đầu ra của nó cho 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 một trình biên dịch là:

  1. Phân tích từ vựng
  2. Phân tích cú pháp
  3. Phân tích ngữ nghĩa
  4. Trình tạo mã trung gian
  5. Code tối ưu hóa
  6. Code máy phát điện
Các giai đoạn của trình biên dịch
Các giai đoạn của trình biên dịch

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.

Giai đoạn 1: Phân tích từ vựng

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, 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ó thực hiện việc nhập các vé 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à:

  • Xác định các đơn vị từ vựng trong mã nguồn
  • Phân loại các đơn vị từ vựng thành các lớp như hằng số, từ dành riêng và nhập chúng vào các bảng khác nhau. Nó sẽ bỏ qua các bình luận trong chương trình nguồn
  • Xác định mã thông báo không phải là một phần của ngôn ngữ

Ví dụ:
x = y + 10

Tokens

X định danh
= Toán tử chuyển nhượng
Y định danh
+ Toán tử bổ sung
10 Con số

Giai đoạn 2: Phân tích cú pháp

Phân tích cú pháp là về việc khám phá cấu trúc trong mã. Nó xác định xem văn bản có tuân theo định dạng mong đợi 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 có 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 cú pháp với sự trợ giúp của 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:

  • Nhận mã thông báo từ máy phân tích từ vựng
  • Kiểm tra xem biểu thức có đúng về mặt cú pháp hay không
  • Báo cáo tất cả các lỗi cú pháp
  • Xây dựng một cấu trúc phân cấp được gọi là cây phân tích cú pháp

Ví dụ

Bất kỳ mã định danh/số nào đều là một biểu thức
Nếu x là một mã định danh và y+10 là một biểu thức thì x= y+10 là một câu lệnh.
Hãy xem xét cây phân tích cú pháp cho ví dụ sau

(a+b)*c

Ví dụ về phân tích cú pháp

Trong cây phân tích

  • Nút bên trong: bản ghi có một toán tử được lưu trữ và hai tệp dành cho trẻ em
  • Lá: bản ghi có 2 trường trở lên; một cho mã thông báo và thông tin khác về mã thông báo
  • Đảm bảo rằng các thành phần của chương trình khớp với nhau một cách có ý nghĩa
  • Thu thập thông tin về loại và kiểm tra tính tương thích của loại
  • Toán hạng kiểm tra được cho phép bởi ngôn ngữ nguồn

Giai đoạn 3: Phân tích ngữ nghĩa

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 giai đoạn trước cùng với bảng ký hiệu để xác minh rằng mã nguồn đã cho có nhất quán về mặt ngữ nghĩa hay không. Nó cũng kiểm tra xem mã có truyền tải ý nghĩa phù hợp hay không.
Trình phân tích ngữ nghĩa sẽ kiểm tra các loại không khớp, toán hạng không tương thích, hàm được gọi với đối số không đúng, 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à:

  • Giúp bạn lưu trữ thông tin loại đã thu thập và lưu nó vào bảng ký hiệu hoặc cây cú pháp
  • Cho phép bạn thực hiện kiểm tra loại
  • Trong trường hợp loại không khớp, khi không có quy tắc sửa loại chính xác thỏa mãn thao tác mong muốn, một lỗi ngữ nghĩa sẽ được hiển thị
  • Thu thập thông tin về loại và kiểm tra tính tương thích của loại
  • Kiểm tra xem ngôn ngữ nguồn có cho phép toán hạng hay không

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ẽ đánh máy số nguyên 30 thành float 30.0 trước khi nhân

Giai đoạn 4: Trung cấp Code Thế hệ

Sau khi giai đoạn phân tích ngữ nghĩa hoàn tất, trình biên dịch sẽ tạo ra mã trung gian cho máy đích. Mã này thể hiện một chương trình cho một số tác vụ cụ thể.tracmáy t.
Mã trung gian nằm giữa ngôn ngữ cấp cao và ngôn ngữ cấp máy. Mã trung gian này cần được tạo theo cách sao cho dễ dàng chuyển nó sang mã máy đích.
Các hàm trên mức trung gian Code thế hệ:

  • Nó phải được tạo ra từ biểu diễn ngữ nghĩa của chương trình nguồn
  • Giữ các giá trị được tính toán trong quá trình dịch thuật
  • Giúp bạn dịch mã trung gian sang ngôn ngữ đích
  • Cho phép bạn duy trì thứ tự ưu tiên của ngôn ngữ nguồn
  • Nó giữ đúng số toán hạng của lệnh

Ví dụ

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 5: Code Tối ưu hóa

Giai đoạn tiếp theo là tối ưu hóa mã hoặc mã trung gian. Giai đoạn này loại bỏ những dòng mã không cần thiết và sắp xếp chuỗi câu lệnh để tăng tốc độ thực thi 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à:

  • Nó giúp bạn thiết lập sự cân bằng giữa tốc độ thực thi và biên dịch
  • Cải thiện thời gian chạy của chương trình mục tiêu
  • Tạo mã hợp lý vẫn ở dạng biểu diễn trung gian
  • Xóa mã không thể truy cập và loại bỏ các biến không sử dụng
  • Xóa các câu lệnh không bị thay đổi khỏi vòng lặp

Ví dụ:
Hãy xem xét đoạn mã sau

a = intofloat(10)
b = c * a
d = e + b
f = d

Có thể trở thành

b =c * 10.0
f = e+b

Giai đoạn 6: Code Thế hệ

Code Giai đoạn tạo mã là giai đoạn cuối cùng của trình biên dịch. Nó nhận đầu vào từ các giai đoạn tối ưu hóa mã và tạo ra mã trang hoặc mã đối tượng. Mục tiêu của giai đoạn này là phân bổ bộ nhớ và tạo ra mã máy có thể di chuyển được.
Nó cũng phân bổ vị trí bộ nhớ cho biến. Các lệnh trong mã trung gian được chuyển thành lệnh máy. Giai đoạn này chuyển mã tối ưu hóa hoặc mã trung gian sang ngôn ngữ đích.
Ngôn ngữ đích là mã máy. Do đó, tất cả các vị trí bộ nhớ và các 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 ra đầu ra dự kiến.

Ví dụ

a = b + 60.0
Có thể sẽ được dịch sang sổ đăng ký.

MOVF a, R1
MULF #60.0, R2
ADDF R1, R2

Quản lý bảng biểu tượng

Bảng ký hiệu chứa bản ghi cho mỗi mã định danh cùng với các trường dành cho 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ó một cách 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à cập nhật bảng ký hiệu tương ứng.

Quy trình xử lý lỗi

Trong quá trình thiết kế trình biên dịch, lỗi có thể xảy ra ở tất cả các giai đoạn được đưa ra dưới đây:

  • Trình phân tích từ vựng: Mã thông báo viết sai chính tả
  • Trình phân tích cú pháp: Thiếu dấu ngoặc đơn
  • Trình tạo mã trung gian: Các toán hạng không khớp cho một toán tử
  • Code Trình tối ưu hóa: Khi câu lệnh không thể thực thi được
  • Code Generator: Khi bộ nhớ đầy hoặc các thanh ghi thích hợp không được phân bổ
  • Bảng ký hiệu: Lỗi khai báo nhiều định danh

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ề loại, 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 ở bất kỳ giai đoạn nào ở trên. Sau khi tìm ra 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 để 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 tin nhắn.

Câu Hỏi Thường Gặp

Giai đoạn phân tích (phần đầu) chia nhỏ mã nguồn thông qua phân tích từ vựng, cú pháp và ngữ nghĩa. Giai đoạn tổng hợp (phần cuối) xây dựng chương trình đích thông qua việc tạo mã trung gian, tối ưu hóa và tạo mã.

Trình biên dịch dịch toàn bộ chương trình nguồn thành mã máy trước khi chạy. Trình thông dịch dịch và thực thi mã từng dòng một, điều này giúp việc gỡ lỗi dễ dàng hơn nhưng thường chậm hơn khi chạy.

Mã ba địa chỉ là một dạng biểu diễn trung gian trong đó mỗi lệnh có tối đa ba toán hạng, ví dụ như t1 = a + b. Nó đơn giản để tối ưu hóa và dễ dàng chuyển đổi sang mã máy đích.

Trí tuệ nhân tạo (AI) và máy học giúp các trình biên dịch hiện đại đưa ra các quyết định tối ưu hóa thông minh hơn, chẳng hạn như lựa chọn biến đổi vòng lặp, nội tuyến hóa và phân bổ thanh ghi. Chúng dự đoán những tối ưu hóa nào sẽ cải thiện hiệu suất cho một chương trình và mục tiêu cụ thể.

Đúng vậy. Trí tuệ nhân tạo có thể giải thích từng giai đoạn bằng các ví dụ. tracGiải thích cách một câu lệnh mẫu chuyển đổi từ token sang mã máy và trả lời các câu hỏi tiếp theo. Điều này giúp sinh viên dễ dàng học thiết kế trình biên dịch hơn.

Tóm tắt bài viết này với: