430 likes | 1.36k Views
MÔN HỌC TRÌNH BIÊN DỊCH. Số tiết: 45t Trường: Đại học Công Nghiệp GV: Nguyễn Trần Cao Tấn Khoa. NỘI DUNG MÔN HỌC. Môn học Trình biên dịch hay còn gọi là Chương trình dịch sẽ giới thiệu những nguyên tắc và kỹ thuật cơ bản để cài đặt một trình biên dịch.
E N D
MÔN HỌC TRÌNH BIÊN DỊCH Số tiết: 45t Trường: Đại học Công Nghiệp GV: Nguyễn Trần Cao Tấn Khoa
NỘI DUNG MÔN HỌC • Môn học Trình biên dịch hay còn gọi là Chương trình dịch sẽ giới thiệu những nguyên tắc và kỹ thuật cơ bản để cài đặt một trình biên dịch. • Những kiến thức này sẽ giúp hiểu được cơ cấu và cách vận hành trong các trình biên dịch của các ngôn ngữ lập trình thông dụng như Pascal, C, C++ và Java, nhờ đó hiểu thấu đáo hơn về các ngôn ngữ này, giúp nâng cao kỹ năng lập trình và gỡ lỗi chương trình.
NỘI DUNG CỤ THỂ • Mô hình biên dịch phân tích-tổng hợp • Các kỹ thuật phân tích từ vựng • Lý thuyết phân tích cú pháp LL, LR • Phân tích ngữ nghĩa • Tổ chức bộ nhớ lúc chương trình hoạt động (môi trường lúc thực thi)
TÀI LIỆU THAM KHẢO 1. Aho, Sethi, and Ullman [1986]. Compilers: Principles, Techniques, and Tools, Addison-Wesley, Reading Mass., 1986. (Bản dịch tiếng Việt gồm hai tập với tựa đề: Trình biên dịch: Nguyên lý, Kỹ thuật và Công cụ, nhà xuất bản Thống kê, 2000-2001). 2. Trần Đức Quang. Trình biên dịch thiết kế và cài đặt, nhà xuất bản đại học quốc gia tp HCM. 3. Phan Thị Tươi. Trình biên dịch, nhà xuất bản giáo dục.
KIỂM TRA VÀ TÍNH ĐIỂM 1. Một bài thi lý thuyết giữa kỳ. 2. Một bài thi lý thuyết ngay sau khi kết thúc môn học. 3. Một bài đồ án lập trình: Thiết kế và cài đặt một trình biên dịch cho một ngôn ngữ lập trình đơn giản. (thời hạn nộp sẽ thông báo sau). Nguyên tắc tính điểm: 1. Điểm thi lý thuyết giữa kỳ: 2 điểm (tối đa). 1. Điểm thi lý thuyết cuối khóa: 5 điểm (tối đa). 2. Bài tập lập trình: 3 điểm (tối đa). Các bài nộp chỉ được phép trễ trong vòng 24 giờ (một ngày) và bị trừ 25% trên điểm số nhận được.
CHƯƠNG 1GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH • Ngôn ngữ lập trình: 1.1 Giới thiệu: • Con người muốn máy tính thực hiện công việc, phải viết các yêu cầu đưa cho máy bằng ngôn ngữ máy hiểu được. • Việc viết các yêu cầu ta gọi là lập trình • Ngôn ngữ dùng để lập trình được gọi là ngôn ngữ lập trình
GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 1.2 Phân loại: • Ngôn ngữ máy. • Hợp ngữ. • Ngôn ngữ cấp trung. • Ngôn ngữ cấp cao. 1.3 Chương trình: • Tập hợp các yêu cầu được sắp đặt hợp lý để máy thực hiện. • Các yêu cầu có thể được diễn tả bằng nhiều ngôn ngữ khác nhau, thế nhưng máy tính chỉ hiểu được một ngôn ngữ duy nhất: ngôn ngữ máy (machine language).
GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 1.4 Phiên dịch (translation): • Quá trình biến đổi một chương trình được viết bằng một ngôn ngữ (ngôn ngữ nguồn) thành một chương trình tương đương nhưng được diễn tả bằng một ngôn ngữ khác (ngôn ngữ đích). • Ngôn ngữ đích thường là ngôn ngữ máy. • Có hai dạng phiên dịch:
GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 1.4.1 Biên dịch (compilation): • Chương trình nguồn được ghi trong các tập tin rồi được dịch thành chương trình đích và được ghi lại trong các tập tin. • Sau đó chúng ta có thể cho chương trình chạy bằng cách "mở" tập tin chứa chương trình đích ra. • Công việc này tương tự như công việc của một chuyên gia dịch thuật khi thực hiện dịch một văn bản (tác phẩm văn học, tài liệu kỹ thuật).
GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 1.4.2 Thông dịch (interpretation): • Chương trình nguồn được dịch rồi cho thực hiện ngay mà không ghi lại bản dịch. • Công việc này tương tự như công việc của một thông dịch viên.
GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH • Chương trình chịu trách nhiệm dịch từ một ngôn ngữ này sang một ngôn ngữ khác được gọi chung là chương trình dịch (translator) và có thể được chia thành hai loại: • Trình biên dịch (compiler) • Trình thông dịch (interpreter).
TRÌNH BIÊN DỊCH 1. Các thành phần của trình biên dịch: 1.1 Phân tích từ vựng: Nhận dạng token. Token: danh biểu, hằng, từ khóa, các toán tử phép toán, các ký hiệu phân cách, khoảng trắng, các ký hiệu đặc biệt Ví dụ: COST := ( PRICE + TAX )*65 Đầu ra của bộ phân tích từ vựng: (<id,1>) := ( (<id,2>) + (<id,3>) ) * (<num>,4) Viết gọn: id1 := (id2 + id3) * num4
TRÌNH BIÊN DỊCH 1.2 Bảng danh biểu Ví dụ: COST := (PRICE + TAX) * 65 Bảng danh biểu
TRÌNH BIÊN DỊCH 1.3 Phát hiện và thông báo lỗi: 1.4 Phân tích cú pháp Vídụ: COST := (PRICE + TAX) * 65 Kết quả phân tích từ vựng: id1 := ( id2 + id3 )* num4
TRÌNH BIÊN DỊCH • Kết quả phân tích cú pháp: Cây cú pháp của phát biểu
TRÌNH BIÊN DỊCH 1.5 Phân tích ngữ nghĩa: Cây cú pháp có xử lý ngữ nghĩa
TRÌNH BIÊN DỊCH 1.6 Sinh mã trung gian: temp1:= intoreal(65) temp2:= id2+ id3 temp3:= temp2* temp1 id1:= temp3 1.7 Tối ưu mã trung gian: temp1:= id2+ id3 id1:= temp1 * 65
TRÌNH BIÊN DỊCH 1.8 Sinh mã đối tượng: movF id2, R1 movF id3, R2 addF R2, R1 multF# 65.0, R1 movF R1, id1
CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH 1. Bộ tiền xử lý: • Xử lý macro (macro processing) • Chêm tập tin (file inclusion) • Bộ xử lý hoà hợp (rational processor) • Mở rộng ngôn ngữ (language extension)
CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH 2. Trình biên dịch hợp ngữ: Phát biểu gán b := a + 2 được dịch ra mã hợp ngữ MOV a, R1 ADD #2 , R1 MOV R1, b
CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH 3. Trình biên dịch hợp ngữ hai chuyến: Chuyến thứ nhất: đọc mã hợp ngữ và tạo bảng danh biểu Danh biểu Điạ chỉ tương đối a 0 b 4 Chuyến thứ hai: đọc mã hợp ngữ và dịch sang mã máy khả định vị địa chỉ: MOV a, R1 0001 010000000000* ADD #2, R1 0010 0110 00000010 (1.6) MOV R1, b 0100 010000000100*
CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH 4. Bộ cất liên kết soạn thảo: Loader là chương trình thực hiện hai nhiệm vụ: cất và soạn thảo liên kết. Quá trình cất bao gồm lấy mã máy khả định vị tính lại thành địa chỉ tuyệt đối. Như ở ví dụ phần 3: Giả sử mã máy được cất trong bộ nhớ trong tại địa chỉ L = 00001111; địa chỉ tuyệt đối của a, b là 00001111 và 00010011. Ba chỉ thị (1.6) được viết lại dưới dạng mã máy tuyệt đối: 0001010000001111 0011011000000010 (1.7) 0010010000010011 Link-editor cho phép tạo một chương trình duy nhất từ nhiều tập tin ở dạng mã máy khả định vị của những lần biên dịch riêng biệt và từ các tập tin thư viện do hệ thống cung cấp.
CÁC MỐI LIÊN QUAN VỚI TRÌNH BIÊN DỊCH 5. Nhóm các giai đoạn của trình biên dịch • Giai đoạn trước và giai đoạn sau(front end and back end) • Cácchuyến • Thu giảmsốlượngcácchuyến Thídụ: goto L : goto L : L : a = b + c
MỘT SỐ CHƯƠNG TRÌNH PHỤ TRỢ • Thông thường, trình biên dịch chỉ lo dịch một chương trình nguồn được diễn tả bằng một ngôn ngữ cấp cao thành chương trình được diễn tả ở dạng mã hợp ngữ. Do vậy chúng ta cần có một số chương trình phụ trợ để hoàn tất quá trình biên dịch. 1. Trình tiền xử lý (preprocessor). Để chuẩn bị một bản nguồn hoàn chỉnh cho trình biên dịch, một ngôn ngữ có thể dùng một trình tiền xử lý để thực hiện một lượt xử lý dựa vào các chỉ dẫn (directives) do lập trình viên ghi trong bản nguồn. Trình tiền xử lý của C là một thí dụ minh họa.
MỘT SỐ CHƯƠNG TRÌNH PHỤ TRỢ 2. Trình dịch hợp ngữ (assembler). Thành phẩm của trình biên dịch thường không phải là mã đích mà là mã hợp ngữ (assembly code), và trách nhiệm dịch từ mã hợp ngữ thành mã đích được trao lại cho trình dịch hợp ngữ. Cách làm này tuy tốn thêm một lượt biên dịch nhưng tạo thuận lợi cho việc viết trình biên dịch và việc sửa lỗi chương trình.
MỘT SỐ CHƯƠNG TRÌNH PHỤ TRỢ 3. Trình liên kết (linker) và trình tải (loader). Hai chương trình này có liên quan mật thiết với hạ tầng (platform) hệ điều hành và họ máy tính và có khi chúng được tích hợp thành một chương trình. • Trình liên kết chịu trách nhiệm kết nối các mô đun đã được biên dịch lại với nhau để tạo ra một chương trình hoàn chỉnh có thể chạy được. • Trình tải thường là bộ phận của hệ điều hành chịu trách nhiệm đưa bản dịch hoàn chỉnh vào bộ nhớ tại một vị trí thích hợp để cho thực hiện. Muốn vậy trình tải phải sửa lại các tham chiếu đến đúng địa chỉ bộ nhớ cho mỗi lần thực thi cụ thể của chương trình.