Bài giảng Chương trình dịch

Các giai đoạn làm việc của compiler có thể phân chia theo tính logic của

công việc hoặc theo thời gian làm việc.

Cấu trúc theo thời gian: lần lượt hay đồng thời.

Duyệt một lần: một số thành phần của chương trình được thực hiện đồng

thời. Bộ phân tích cú pháp đóng vai trò trung tâm, điều khiển cả chương trình.

Duyệt nhiều lần: các thành phần trong chương trình được thực hiện lần lượt

và độc lập với nhau. Qua mỗi một phần, kết quả sẽ được lưu vào thiết bị lưu trữ

ngoài để lại được đọc vào cho bước tiếp theo.

Cấu trúc logic: 2 giai đoạn: analysis (front end) và synthesis (back end),

chia làm nhiều pha làm việc.

pdf79 trang | Chuyên mục: Pascal | Chia sẻ: dkS00TYs | Lượt xem: 2615 | Lượt tải: 5download
Tóm tắt nội dung Bài giảng Chương trình dịch, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
d := v + u ADD R1, R0 
MOV R0, d 
R0 chứa d d trong R0 
d trong R0 và 
72 
trong bộ nhớ 
- Nội dung thảo luận: Sinh mã đích cho các biểu thức điều kiện và vòng lặp 
- Yêu cầu SV chuẩn bị 
Tìm hiểu về sinh mã đích cho các cấu trúc khác trong ngôn ngữ lập trình: 
khai báo, hàm… 
- Bài tập bắt buộc 
1. Chuyển các câu lệnh hoặc đoạn chương trình sau thành mã ba địa chỉ: 
1) a * - (b+c) 
2) đoạn chương trình C 
main () 
{ int i; int a[100]; 
 i=1; 
 while(i<=10) 
{ a[i]=0; 
 i=i+1;} 
} 
2. Dịch biểu thức : a * - ( b + c) thành các dạng : 
 a) Cây cú pháp. 
 b) Ký pháp hậu tố. 
 c) Mã lệnh máy 3 - địa chỉ. 
Trình bày cấu trúc lưu trữ biểu thức 
( a + b) * ( c + d ) + ( a + b + c) 
ở các dạng : a) Bộ tứ . b) Bộ tam. c) Bộ tam gián tiếp. 
3. Sinh mã trung gian (dạng mã máy 3 - địa chỉ) cho các biểu thức C đơn 
giản sau : 
 a) x = 1 b) x = y 
 c) x = x + 1 d) x = a + b * c 
 e) x = a / ( b + c) - d * ( e + f ) 
- Bài tập nâng cao 
4. Sinh mã trung gian (dạng mã máy 3 - địa chỉ) cho các biểu thức C sau: 
 a) x = a [i] + 11 b) a [i] = b [ c[j] ] 
 c) a [i][j] = b [i][k] * c [k][j] d) a[i] = a[i] + b[j] 
 e) a[i] + = b[j] 
5. Dịch lệnh gán sau thành mã máy 3 - địa chỉ : 
73 
 A [ i,j ] := B [ i,j ] + C [A[ k,l]] + D [ i + j ] 
- Tài liệu tham khảo 
1. Compilers : Principles, Technique and Tools. A.V. Aho, M. Lam, R. 
Sethi, J.D.Ullman. - Addison -Wesley 2nd Edition, 2007. Chương 7. 
2. Advanced Compiler Design and Implementation. S. Muchnick. 
Morgan-Kaufmann Publishers, 2007. Chương 6. 
3. Giáo trình chương trình dịch 2nd Edition. Phạm Hồng Nguyên. NXB 
ĐHQG Hà Nội, 2009. Chương 6. 
Câu hỏi ôn tập 
1. Các dạng mã máy đối tượng. 
2. Mã 3 địa chỉ là gì. Cho ví dụ minh họa. 
3. Anh\chị hãy trình bày giải thuật sinh mã đích. 
Bài giảng 09: Các vấn đề của trình biên dịch hiện đại 
Chương 9, mục: 
Tiết thứ: 43-45 Tuần thứ: 15 
- Mục đích yêu cầu 
Mục đích: Sau khi học xong bài này, sinh viên phải nắm được: Cách gọi 
và thực thi một chương trình; Cách tổ chức bộ nhớ và các chiến lược cấp phát – 
thu hồi bộ nhớ. 
Yêu cầu: Sinh viên phải nắm vững ít nhất một ngôn ngữ lập trình cấp cao 
như Pascal, C++, Java, v.v hoặc đã được học môn ngôn ngữ lập trình (phần đề 
cập đến các chương trình con). 
- Hình thức tổ chức dạy học: Lý thuyết, thảo luận, tự học, tự nghiên cứu 
- Thời gian: Giáo viên giảng: 2 tiết; Thảo luận và làm bài tập trên lớp: 1 tiết; 
Sinh viên tự học: 6 tiết. 
- Địa điểm: Giảng đường do P2 phân công. 
- Nội dung chính: 
8.1. Ngôn ngữ hướng đối tượng 
8.2. Run-Time Environment 
8.2.1. Chương trình con và cây hoạt động 
8.2.2. Ngăn xếp điều khiển 
8.2.3. Tầm vực của sự khai báo 
8.2.4. Liên kết tên 
74 
8.2.5. Một số vấn đề cần quan tâm khi viết chương trình dịch 
8.3. Bảng ký hiệu 
8.4. Quản lý bộ nhớ và địa chỉ 
8.5. Vấn đề tối ưu mã 
8.1. Ngôn ngữ hướng đối tượng 
8.2. Run-Time Environment 
8.2.1. Chương trình con và cây hoạt động 
Ðịnh nghĩa chương trình con là một sự khai báo nó. Dạng đơn giản nhất là 
sự kết hợp giữa tên chương trình con và thân của nó. 
Cây hoạt động: Trong quá trình thực hiện chương trình thì: 
 1. Dòng điều khiển là tuần tự: tức là việc thực hiện chương trình bao gồm 
một chuỗi các bước. Tại mỗi bước đều có một sự điều khiển xác định. 
 2. Việc thực hiện chương trình con bắt đầu tại điểm bắt đầu của thân 
chương trình con và trả điều khiển về cho chương trình gọi tại điểm nằm sau lời 
gọi khi việc thực hiện chương trình con kết thúc. 
• Thời gian tồn tại của một chương trình con p là một chuỗi các bước giữa 
bước đầu tiên và bước cuối cùng trong sự thực hiện thân chương trình con bao 
gồm cả thời gian thực hiện các chương trình con được gọi bởi p. 
• Nếu a và b là hai sự hoạt động của hai chương trình con tương ứng thì 
thời gian tồn tại của chúng tách biệt nhau hoặc lồng nhau. 
• Một chương trình con là đệ quy nếu một hoạt động mới có thể bắt đầu 
trước khi một hoạt động trước đó của chương trình con đó kết thúc. 
• Ðể đặc tả cách thức điều khiển vào ra mỗi hoạt động của chương trình 
con ta dùng cấu trúc cây gọi là cây hoạt động. 
1. Mỗi nút biểu diễn cho một hoạt động của một chương trình con. 
2. Nút gốc biểu diễn cho hoạt động của chương trình chính. 
3. Nút a là cha của b nếu và chỉ nếu dòng điều khiển sự hoạt động đó từ a 
sang b 
4. Nút a ở bên trái của nút b nếu thời gian tồn tại của a xuất hiện trước thời 
gian tồn tại của b. 
75 
8.2.2. Ngăn xếp điều khiển 
Dòng điều khiển một chương trình tương ứng với phép duyệt theo chiều 
sâu của cây hoạt động. Bắt đầu từ nút gốc, thăm một nút trước các con của nó và 
thăm các con một cách đệ quy tại mỗi nút từ trái sang phải. 
Hình sau trình bày nội dung của Stack đang lưu trữ đường đi từ nút q(2, 3) 
đến nút gốc. Các cạnh nét đứt thể hiện một nút đã pop ra khỏi Stack. 
8.2.3. Tầm vực của sự khai báo 
Ðoạn chương trình chịu ảnh hưởng của một sự khai báo gọi là tầm vực của 
khai báo đó. 
Trong một chương trình có thể có nhiều sự khai báo trùng tên ví dụ biến i 
trong chương trình sort. Các khai báo này độc lập với nhau và chịu sự chi phối 
bởi quy tắc tầm của ngôn ngữ. 
Sự xuất hiện của một tên trong một chương trình con được gọi là cục bộ 
(local) trong chương trình con ấy nếu tầm vực của sự khai báo nằm trong 
chương trình con, ngược lại được gọi là không cục bộ (nonlocal). 
8.2.4. Liên kết tên 
Trong ngôn ngữ của ngôn ngữ lập trình, thuật ngữ môi trường (enviroment) 
để chỉ một ánh xạ từ một tên đến một vị trí ô nhớ và thuật ngữ trạng thái (state) 
để chỉ một ánh xạ từ vị trí ô nhớ tới giá trị lưu trữ trong đó. 
76 
8.2.5. Một số vấn đề cần quan tâm khi viết chương trình dịch 
Các vấn đề cần đặt ra khi tổ chức lưu trữ và liên kết tên: 
1. Chương trình con có thể đệ quy không? 
2. Ðiều gì xảy ra cho giá trị của các tên cục bộ khi trả điều khiển từ hoạt 
động của một chương trình con. 
3. Một chương trình con có thể tham khảo tới một tên cục bộ không? 
4. Các tham số được truyền như thế nào khi gọi chương trình con. 
5. Một chương trình con có thể được truyền như một tham số? 
6. Một chương trình con có thể được trả về như một kết quả? 
7. Bộ nhớ có được cấp phát động không? 
8. Bộ nhớ có phải giải phóng một cách tường minh? 
8.3. Bảng ký hiệu 
Mục đích, nhiệm vụ: Thu thập các thông 
tin về tên; Sử dụng các thông tin về tên 
 Phân tích ngữ nghĩa: kiểm tra việc 
dùng các tên phải khớp với khai 
báo 
 Sinh mã: lấy kích thước, loại bộ 
nhớ phải cấp phát cho một tên 
 Các khối khác: để phát hiện và 
khắc phục lỗi 
Các yêu cầu với bảng kí hiệu: 
 phát hiện một tên cho trước có ở 
trong bảng hay không 
 thêm một tên mới vào bảng 
 lấy thông tin tương ứng với tên cho 
trước 
 thêm các thông tin mới vào một tên 
cho trước 
 xoá một tên hoặc nhóm tên trong bảng 
Thông tin đưa vào bảng ký hiệu: 
 Xâu ký tự tạo nên tên 
 Thuộc tính của tên 
 Các tham số, như số chiều của mảng 
 (Có thể) con trỏ đến tên cấp phát 
Phán têch tæì væûng
Phán têch ngæî
nghéa
Sinh maî trung gian
Sinh maî
Phán têch cuï phaïp
Quaín lyï baíng
kyï hiãûu
Chæång trçnh nguäön
Chæång trçnh âêch
Täúi æu maî
77 
8.4. Quản lý bộ nhớ và địa chỉ 
Bộ nhớ có thể chia ra để lưu trữ các phần: 
1. Mã đích. 
2. Ðối tượng dữ liệu. 
3. Bản sao của Stack điều khiển để lưu trữ hoạt động của chương trình con. 
Ðối với các vùng nhớ khác nhau trong tổ chức bộ nhớ, ta có các chiến lược 
cấp phát khác nhau: 
1. Cấp phát tĩnh cho tất cả các đối tượng dữ liệu tại thời gian dịch. 
2. Cấp phát sử dụng Stack cho bộ nhớ trong thời gian thực hiện. 
3. Ðối với vùng dữ liệu Heap sử dụng cấp phát và thu hồi dạng Heap. 
Gọi thực hiện chương trình con: 
Quy tắc tầm vực 
 Quy tắc tầm vực của ngôn ngữ sẽ xác định việc xử lý khi tham khảo 
đến các tên không cục bộ. 
 Quy tắc tầm vực bao gồm hai loại: Quy tắc tầm tĩnh và quy tắc tầm 
động. 
 Quy tắc tầm tĩnh (static - scope rule): Xác định sự khai báo áp dụng 
cho một tên bằng cách kiểm tra văn bản chương trình nguồn. Các 
ngôn ngữ Pascal, C và Ada sử dụng quy tắc tầm tĩnh với một quy 
định bổ sung: “tầm gần nhất”. 
 Quy tắc tầm động (dynamic- scope rule): Xác định sự khai báo có 
thể áp dụng cho một tên tại thời gian thực hiện bằng cách xem xét 
hoạt động hiện hành. Các ngôn ngữ Lisp, APL và Snobol sử dụng 
quy tắc tầm động. 
- Nội dung thảo luận: vấn đề cấp phát bộ nhớ và địa chỉ 
78 
- Nội dung tự học: Tìm hiểu về các kỹ năng tối ưu mã chương trình, kỹ năng tối 
ưu mã nguồn. 
- Bài tập bắt buộc 
1. Hãy dùng quy tắc tầm vực của ngôn ngữ Pascal để xác định tầm vực ý 
nghĩa của các khai báo cho mỗi lần xuất hiện tên a, b trong chương trình sau. 
Output của chương trình là các số nguyên từ 1 đến 4. 
Program a ( input, output); 
Procedure b ( u, v, x, y : integer); 
Var a : record a, b : integer end; 
b : record a, b : integer end; 
begin 
With a do begin a := u ; b := v end; 
With b do begin a := x ; b := y end; 
Writeln ( a.a, a.b, b.a, b.b ); 
end; 
Begin 
B ( 1, 2, 3, 4) 
End. 
2. Cho đoạn chương trình sau: 
var a, b : integer; 
Procedure AB 
Var a, c : real; k, l : integer; 
procedure AC 
Var x, y : real; 
b : array [ 1 .. 10] of integer; 
begin 
.... 
end; 
begin 
.... 
end; 
begin 
.... 
end. 
Hãy xây dựng bảng ký hiệu thao các phương pháp sau: 
a) Danh sách tuyến tính 
79 
b) Băm (hash), nếu giả sử ta có kết quả của hàm biến đổi băm như sau: 
a = 3; b = 4; c = 4; k = 2; l = 3; x = 4; y = 5; AB = 2; AC = 6; 
- Bài tập nâng cao 
3. Hãy vẽ bảng ký hiệu cho từng chương trình con có con trỏ trỏ đến bảng 
ký hiệu của chương trình bị gọi và có con trỏ trỏ ngược lại bảng ký hiệu của 
chương trình gọi nó. 
- Tài liệu tham khảo 
1. Modern Compiler Implementation in C. A.W. Appel - Cambridge 
University Press, 1997. Chương 8. 
2. Giáo trình chương trình dịch 2nd Edition. Phạm Hồng Nguyên. NXB 
ĐHQG Hà Nội, 2009. Chương 7. 
- Câu hỏi ôn tập 
1. Các cách tổ chức bộ nhớ. 
2. Các chiến lược cấp phát – thu hồi bộ nhớ 

File đính kèm:

  • pdfBài giảng Chương trình dịch.pdf