Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 28 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
28
Dung lượng
199 KB
Nội dung
CHƯƠNG Giới thiệu chương trình dịch Mục tiêu: Giới thiệu khái niệm bản, giai đoạn biên dịch chương trình Khái niệm chương trình dịch • Chương trình dịch (compiler) chương trình làm nhiệm vụ đọc chương trình viết ngôn ngữ - ngôn ngữ nguồn (source language) - dịch thành chương trình tương đương ngơn ngữ khác - ngơn ngữ đích (target languague) • Chương trình dịch ta cịn gọi trình biên dịch • Một phần quan trọng q trình dịch ghi nhận lại lỗi có chương trình nguồn để thơng báo lại cho người viết chương trình Chương trình nguồn Trình biên dịch Chương trình đích (Source program) (Compiler) (Target program) Thông báo lỗi (Error messages ) Ngữ cảnh trình biên dịch • Để tạo tra chương trình đích có khả thực thi (excutable) ngồi trình biên dịch ta phải có thêm số chương trình khác • Sơ đồ sau mơ tả ngữ cảnh trình biên dịch hệ thống xử lí ngơn ngữ (language-processing system) Chương trình nguồn khung (Skeletal source program) Bộ tiền xử lí (Preprocessor) Chương trình nguồn (Source program) Trình biên dịch (Compiler) Chương trình hợp ngữ đích (Target assembly program) Trình dịch hợp ngữ (Assembler) Mã máy tái khả định (Relocatable machine code) Trình tải/liên kết (Loader/link-editor) Mã máy tuyệt đối (Absolute machine code) Thư viện/tập tin đối tượng (Library/object files) Các giai đoạn biên dịch chương trình • Q trình biên dịch chia thành nhiều giai đoạn • Qua giai đoạn chương trình nguồn chuyển đổi từ dạng biểu sang dạng biểu diễn khác • Trong thục tế xây dựng trình biên dịch, đơi giai đoạn nhóm lại với • Các giai doạn biên dịch minh hoạ hình vẽ Chương trình nguồn (Source program) Phân tích từ vựng (Lexical analyzer) Phân tích cú pháp (Syntax analyzer) Phân tích ngữ nghĩa (Semantic analyzer) Quản lí bảng kí tự (Symbol-table manager) Sinh mã trung gian (Intermediate code generator) Tối ưu mã (Code optimizer) Sinh mã (Code generator) Chương trình đích (Target program) Quản lí lỗi (Error handler) Phân tích từ vựng (Lexical Analysis) • Giai đoạn phân tích từ vựng đọc chương trình nguồn từ trái sang phải (linear analysis/scanning) để tách thành mã thông báo (token) • Trong q trình phân tích từ vựng khoảng trắng (blank) bị bỏ qua • Ví dụ : Q trình phân tích từ vựng cho câu lệnh gán position := initial + rate * 60 tách thành token sau: Định danh (identifier) position Ký hiệu phép gán := Định danh initial Ký hiệu phép cộng + Định danh rate Ký hiệu phép nhân * Số 60 Phân tích cú pháp (Syntax Analysis) • Giai đoạn phân tích cú pháp thực cơng việc nhóm token chương trình nguồn thành cụm từ văn phạm (grammatical phrase) • Thơng thường cụm từ văn phạm biểu diễn phân tích cú pháp (parse tree) với : - Ngơn ngữ định nghĩa luật sinh (production) - Phân tích cú pháp dựa vào luật sinh để xây dựng phân tích cú pháp Ví dụ: Nhiều ngơn ngữ lập trình định nghĩa câu lệnh (statement) theo cách sau : 1) Nếu id1 định danh expr2 biểu thức id1 := expr2 lệnh (stmt) 2) Nếu expr1 biểu thức stmt2 lệnh while (expr1) do stmt2 If (expr1) then stmt2 lệnh Phân tích ngữ nghĩa (Semantic Analysis) • Giai đoạn phân tích ngữ nghĩa thực việc kiểm tra xem chương trình nguồn có chứa lỗi ngữ nghĩa hay khơng • Tập hợp thơng tin kiểu liệu cho giai đoạn sinh mã sau • Sử dụng cấu trúc phân cấp giai đoạn phân tích cú pháp để xác định toán tử, toán hạng biểu thức câu lệnh • Một phần quan trọng giai đoạn phân tích ngữ nghĩa kiểm tra kiểu (type checking) ép chuyển đổi kiểu Ví dụ: Trong câu lệnh position := initial + rate * 60 Giả sử biến rate, initial position khai báo real, 60 số integer trình := biên:=dịch đổi số nguyên 60 thành số thực 60.0 hàm inttoreal + position + position initial initial * rate 60 * rate inttoreal 60 Sinh mã trung gian (Intermediate Code Generator) • Sau phân tích cấu trúc ngữ nghĩa, số trình biên dịch tạo dạng biểu diễn trung gian chương trình nguồn • Mã trung gian có đặc tính quan trọng: Dễ tạo dễ dàng chuyển đổi thành chương trình đích • Mã trung gian có cách biểu diễn Thơng thường người ta sử dụng dạng "mã máy địa chỉ" (threeaddress code), tương tự dạng hợp ngữ cho máy mà vị trí nhớ đóng vai trị ghi Ví dụ: Lệnh position := initial + rate * 60 chuyển sang dạng mã trung gian three-address code có dạng: temp1 := inttoreal (60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 Ta dùng id1, id2, id3 thay cho position, initial rate để nhấn mạnh tên nhận dạng bị thay đổi ta biên dịch chương trình Tối ưu mã (Code Optimizer) • Giai đoạn tối ưu mã cố gắng tối ưu mã trung gian để thu mã máy thực nhanh Ví dụ: Mã trung gian nêu tối ưu thành: temp1 := id3 * 60.0 id1 := id2 + temp1 Sinh mã (Code generation) • Giai đoạn cuối biên dịch sinh mã đích, thường mã máy mã hợp ngữ • Vị trí vùng nhớ gán cho biến chương trình sử dụng • Sau đó, lệnh trung gian dịch thành chuỗi thị mã máy Vấn đề định việc gán biến cho ghi Ví dụ: Sử dụng ghi (chẳng hạn R1, R2) cho việc sinh mã đích sau: MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 Quản lí bảng kí tự • Một nhiệm vụ quan trọng trình biên dịch ghi lại định danh sử dụng chương trình nguồn thu thập thơng tin thuộc tính khác định danh • Các thuộc tính cung cấp thơng tin vị trí nhớ cấp phát cho định danh, kiểu phạm vi định danh • Nếu định danh tên thủ tục thuộc tính thơng tin số lượng kiểu đối số, phương pháp truyền đối số kiểu trả thủ tục (nếu có) • Bảng ký hiệu (symbol table) cấu trúc liệu mà phần tử ghi dùng để lưu trữ định danh, trường thuộc tính định danh • Trong q trình phân tích từ vựng, tên định danh tìm thấy đưa vào bảng ký hiệu thường thuộc tính chưa xác định giai đoạn • Các thuộc tính khác định danh bổ sung giai đoạn biên dịch Ví dụ: Trong Pascal câu lệnh khai báo biến Var position, initial, rate: real; Sau phân tích từ vựng bảng quản lí kí tự có dạng sau: SYMBOL TABLE position initial rate Xử lí lỗi • Mỗi giai đoạn biên dịch gặp nhiều lỗi, ví dụ: Giai đoạn phân tích từ vựng gặp lỗi ký tự ghép thành token Giai đoạn phân tích cú pháp gặp lỗi token kết hợp với theo cấu trúc ngơn ngữ Giai đoạn phân tích ngữ nghĩa gặp lỗi tốn hạng có kiểu khơng u cầu phép tốn • Sau phát lỗi, tùy thuộc vào trình biên dịch mà có cách xử lý lỗi khác nhau: Q trình biên dịch dừng lại tiếp tục Ví dụ: Biên dịch câu lệnh gán position := initial + rate * 60 Phân tích từ vựng id1 := id2 + id3 * 60 Phân tích cú pháp := + id1 id2 * id3 60 Phân tích ngữ nghĩa := + id1 id2 * id3 Inttoreal | 60 Sinh mã trung gian temp1 := inttoreal (60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 Tối ưu mã temp1 := id3 * 60.0 id1 := id2 + temp1 Sinh mã MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 ... languague) • Chương trình dịch ta cịn gọi trình biên dịch • Một phần quan trọng trình dịch ghi nhận lại lỗi có chương trình nguồn để thơng báo lại cho người viết chương trình Chương trình nguồn Trình. ..Khái niệm chương trình dịch • Chương trình dịch (compiler) chương trình làm nhiệm vụ đọc chương trình viết ngơn ngữ - ngơn ngữ nguồn (source language) - dịch thành chương trình tương đương... biên dịch Chương trình đích (Source program) (Compiler) (Target program) Thơng báo lỗi (Error messages ) Ngữ cảnh trình biên dịch • Để tạo tra chương trình đích có khả thực thi (excutable) ngồi trình