Các giai đoạn của trình biên dịch với ví dụ

Mục lục:

Anonim

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 trong các giai đoạn khác nhau, mỗi giai đoạn chuyển đổi chương trình nguồn từ một biểu diễn này sang biểu diễn khác. Mỗi giai đoạn lấy đầu vào từ giai đoạn trước của nó 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 đều giúp chuyển đổi ngôn ngữ cấp cao của 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. Trình tối ưu hóa mã
  6. Trình tạo mã
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ác 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.

Trong hướng dẫn này, bạn sẽ học:

  • Các giai đoạn của thiết kế trình biên dịch là gì?
  • Giai đoạn 1: Phân tích từ vựng
  • Giai đoạn 2: Phân tích cú pháp
  • Giai đoạn 3: Phân tích ngữ nghĩa
  • Giai đoạn 4: Tạo mã trung gian
  • Giai đoạn 5: Tối ưu hóa mã
  • Giai đoạn 6: Tạo mã
  • Quản lý bảng biểu tượng
  • Quy trình xử lý lỗi:

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

Lexical Analysis 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

Mã thông báo

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à tất cả về việc khám phá cấu trúc trong mã. Nó xác định xem một 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 viết bởi lập trình viên 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 tác 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ó chính xác 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 cấu trúc phân cấp được gọi là cây phân tích cú pháp

Thí dụ

Bất kỳ định danh / số nào cũng là một biểu thức

Nếu x là một đị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

Trong cây phân tích cú pháp

  • Nút bên trong: bản ghi với một toán tử được lưu trữ và hai tệp cho trẻ em
  • Lá: bản ghi có 2 / nhiều trường; 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 phù hợp với nhau một cách có ý nghĩa
  • Gathers loại thông tin và kiểm tra tính tương thích của loại
  • Toán hạng séc được ngôn ngữ nguồn cho phép

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 là nhất quán 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 loại 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 phù hợp, 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à:

  • Giúp bạn lưu trữ thông tin loại được thu thập và lưu nó trong 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 kiểu không khớp, khi không có quy tắc sửa kiểu chính xác đáp ứng thao tác mong muốn, lỗi ngữ nghĩa được hiển thị
  • Thu thập thông tin 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 các toán hạng hay không

Thí dụ

float x = 20.2;float y = x*30;

Trong đoạn mã trên, trình phân tích ngữ nghĩa sẽ nhập số nguyên 30 thành float 30.0 trước khi nhân

Giai đoạn 4: Tạo mã trung gian

Khi giai đoạn phân tích ngữ nghĩa kết thúc trình biên dịch, tạo mã trung gian cho máy đích. Nó đại diện cho 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à cấp máy. Mã trung gian này cần được tạo theo cách giúp dễ dàng dịch nó thành mã máy đích.

Chức năng tạo mã trung gian:

  • 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
  • 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ó chứa đúng số toán hạng của lệnh

Thí 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 * t1t3 := count + t2total := t3

Giai đoạn 5: Tối ưu hóa mã

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ỏ các 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 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 dung lượng 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ã được sắp xếp hợp lý vẫn ở dạng đại 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
  • Loại bỏ các câu lệnh không bị thay đổi khỏi vòng lặp

Thí dụ:

Hãy xem xét đoạn mã sau

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

Có thể trở thành

b =c * 10.0f = e+b

Giai đoạn 6: Tạo mã

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ừ các giai đoạn tối ưu hóa mã và kết quả là 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 mã máy có thể di dời.

Nó cũng cấp phát các vị trí bộ nhớ cho biến. Các hướng dẫn trong mã trung gian được chuyển đổi thành các 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à thanh ghi cũng được chọn và phân bổ trong giai đoạn này. Đoạn 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 mong đợi.

Thí dụ:

a = b + 60,0

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

MOVF a, R1MULF #60.0, R2ADDF R1, R2

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

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ó 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 trong tất cả các giai đoạn dưới đây:

  • Lexical analyzer: 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ử
  • Trình tối ưu hóa mã: Khi không thể truy cập được tuyên bố
  • Trình tạo mã: Các câu lệnh không thể truy cập
  • Bảng ký hiệu: Lỗi của nhiều mã định danh đã khai báo

Hầu hết các lỗi phổ biến là chuỗi ký tự không hợp lệ trong quá trình 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 trong bất kỳ giai đoạn nào ở trên. Sau khi tìm ra lỗi, phase cần xử lý các lỗi đó để tiếp tục quá trình biên dịch. Các 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 tin nhắn.

Tóm lược

  • Trình biên dịch hoạt động trong các giai đoạn khác nhau, mỗi giai đoạn chuyển đổi chương trình nguồn từ biểu diễn này sang biểu diễn khác
  • Sáu giai đoạn của thiết kế 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) Trình tối ưu hóa mã 6) Trình tạo mã
  • Lexical Analysis là giai đoạn đầu tiên khi trình biên dịch quét mã nguồn
  • Phân tích cú pháp là tất cả về việc khám phá cấu trúc trong văn bản
  • Phân tích ngữ nghĩa kiểm tra tính nhất quán ngữ nghĩa của mã
  • Khi giai đoạn phân tích ngữ nghĩa kết thúc trình biên dịch, hãy tạo mã trung gian cho máy đích
  • Giai đoạn tối ưu hóa mã 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
  • Giai đoạn tạo mã nhận đầu vào từ giai đoạn tối ưu hóa mã và kết quả là tạo ra mã trang hoặc mã đối tượng
  • Một bảng ký hiệu chứa một bản ghi cho mỗi số nhận dạng với các trường cho các thuộc tính của số nhận dạng
  • Xử lý lỗi theo quy trình xử lý lỗi và báo cáo trong nhiều giai đoạn