Tải bản đầy đủ (.pdf) (138 trang)

LUẬN VĂN:KHẢO SÁT VÀ XÂY DỰNG THỬ NGHIỆM CHUYẾN TRƯỚC CỦA TRÌNH BIÊN DỊCH DÀNH CHO NGÔN NGỮ ANSI C GIẢN LƯỢC doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.16 MB, 138 trang )



TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN KHOA HỌC MÁY TÍNH






NGUYỄN VIỆT CƯỜNG – NGUYỄN THÀNH TRUNG








KHẢO SÁT VÀ XÂY DỰNG THỬ NGHIỆM
CHUYẾN TRƯỚC CỦA TRÌNH BIÊN DỊCH
DÀNH CHO NGÔN NGỮ ANSI C GIẢN LƯỢC









KHÓA LUẬN TỐT NGHIỆP CỬ NHÂN CNTT









TP. HCM, 2010



i


LỜI CÁM ƠN
Đầu tiên, chúng em xin cảm ơn khoa Công nghệ Thông tin, trường Đại học
Khoa học Tự nhiên Thành phố Hồ Chí Minh đã tạo điều kiện cho chúng em thực
hiện đề tài này.
Chúng em xin chân thành cám ơn các thầy cô khoa Công nghệ Thông tin đã
truyền đạt những kiến thức hữu ích tạo nền tảng vững chắc cho chúng em định
hướng trong học tập và phát huy khả năng của mình khi bước vào đời.
Đặc biệt, chúng em xin gởi lời cảm ơn chân thành và lời chúc sức khỏe đến
thầy Nguyễn Thanh Phương đã hướng dẫn và dạy bảo tận tình để nhóm em hoàn
thành tốt luận văn tốt nghiệp của mình.
Chúng em xin cảm ơn anh Đặng Đăng Khoa và anh Phan Lê Sang đã giúp đỡ
tận tụy và luôn sát cánh bên chúng em như những người anh trong gia đình trong
suốt quá trình thực hiện khóa luận.

Chúng em cũng xin cảm ơn sự động viên tích cực của các anh chị nhân viên
phòng SELab trường Khoa hoc Tự nhiên và bạn bè trong quá trình chúng em thực
hiện đề tài.
Và cuối cùng chúng con xin cảm ơn các đấng sinh thành đã nuôi dạy, dìu dắt
và luôn là nguồn khích lệ để chúng con phấn đấu trong học tập.
Mặc dù cố gắng và nổ lực hết mình, chúng em vẫn còn mắc nhiều thiếu sót
trong luận văn của mình, chúng em hy vọng sẽ nhận được sự ủng hộ và đóng góp ý
kiến để hoàn thiện đề tài này một cách tốt hơn.
TP. Hồ Chí Minh, tháng 06, 2010.
Nhóm sinh viên thực hiện
Nguyễn Việt Cường – Nguyễn Thành Trung


ii



KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN: KHOA HỌC MÁY TÍNH
ĐỀ CƯƠNG CHI TIẾT
Tên đề tài: Khảo sát và xây dựng thử nghiệm chuyến trước của trình biên dịch dành
cho ngôn ngữ ANSI C giản lược.
Giáo viên hướng dẫn: TS. Nguyễn Thanh Phương
Thời gian thực hiện: Từ ngày 01/09/2009 đến ngày 10/07/2010
Sinh viên thực hiện:
1. Nguyễn Việt Cường - 0612051
2. Nguyễn Thành Trung - 0612468
Loại đề tài: Tìm hiểu công nghệ và xây dựng ứng dụng.
Nội Dung Đề Tài:
Nội dung:

– Tìm hiểu kỹ thuật xây dựng trình biên dịch.
– Khảo sát các công cụ hỗ trợ phát sinh một phần trình biên dịch.
– Vận dụng vào việc xây dựng chuyến trước cho ngôn ngữ ANSI C giản lược.
– Giải quyết các bài toán nảy sinh trong thực tế, vốn không xuất hiện trong lý
thuyết nền tảng.
Yêu cầu:
– Nắm vững và vận dụng có sáng tạo các kiến thức tiếp thu được từ lý thuyết
cũng như thực tế.
– Xây dựng thành công chuyến trước của trình biên dịch (có thể vận hành).
Kết quả:
Phát sinh ra mã trung gian, hướng đến họ chip VN-08
Kế Hoạch Thực Hiện: (mô tả chi tiết thời gian của các giai đoạn thực hiện và phân
công công việc của từng thành viên trong nhóm)

iii


Các giai đoạn thực hiện :
o Bắt đầu : 01/09/2009
o Hoàn thành giai đoạn tìm tài liệu và project liên quan : 28/09/2009
o Hoàn thành đọc tài liệu và thiết kế mô hình C-Compiler : 28/12/2009
o Hoàn thành giai đoạn Coding và Testing : 15/05/2010
o Hoàn thành báo cáo cuối cùng : 10/07/2010
 Phân công công việc :
o Xây dựng cấu trúc, quản lý bảng danh biểu : Nguyễn Thành Trung.
o Tìm hiểu các công cụ phát sinh trình biên dịch : Nguyễn Việt Cường.
o Phát sinh mã cho các cấu trúc khai báo, định nghĩa kiểu dữ liệu :
Nguyễn Thành Trung.
o Phát sinh mã cho các cấu trúc điều khiển, biểu thức : Nguyễn Việt
Cường.

Xác nhận của GVHD Ngày……tháng……năm……
SV Thực hiện












iv



1

MỤC LỤC
MỤC LỤC 1
DANH MỤC CÁC HÌNH VẼ 3
DANH MỤC CÁC BẢNG 4
CHƯƠNG 1: TỔNG QUAN 6
1.1. GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH 6
1.1.1. Trình biên dịch là gì? 6
1.1.2. Phân loại trình biên dịch 6
1.1.3. Quá trình biên dịch 7
1.1.4. Quá trình phân tích 8

1.1.5. Quá trình tổng hợp 9
1.1.6. Các pha trong quá trình biên dịch 9
1.1.7. Các module phụ của trình biên dịch 11
1.2. CÁC GIỚI HẠN CỦA LUẬN VĂN 13
1.2.1. Các giới hạn chung 13
1.2.2. Ngôn ngữ ANSI C giản lược 13
1.3. NỘI DUNG LUẬN VĂN 17
CHƯƠNG 2: GIỚI THIỆU VỀ CHUYẾN TRƯỚC 18
2.1. VAI TRÒ, CHỨC NĂNG CỦA CHUYẾN TRƯỚC. 18
2.2. BẢNG DANH BIỂU. 18
2.2.1. Bảng danh biểu là gì? Vai trò và chức năng? 18
2.2.2. Tầng dữ liệu 20
2.2.3. Tổ chức lưu trữ dạng bảng băm 21
2.2.4. Tầng quản lý 23
2.3. PHÂN TÍCH TỪ VỰNG. 24
2.4. PHÂN TÍCH CÚ PHÁP. 26
2.4.1. Phương pháp phân tích cú pháp từ dưới lên (Bottom-Up Parsing) 27
2.4.2. Kỹ thuật phân tích cú pháp LR 30
2.5. PHÂN TÍCH NGỮ NGHĨA 34
2.6. PHÁT SINH MÃ TRUNG GIAN. 35

2

CHƯƠNG 3: CÁC CÔNG CỤ HỖ TRỢ XÂY DỰNG MỘT PHẦN TRÌNH
BIÊN DỊCH. 38
3.1. GIỚI THIỆU. 38
3.2. Bộ phát sinh trình phân tích từ vựng FLEX 38
3.2.1. Cấu trúc. 38
3.2.2. Quy trình vận hành. 39
3.2.3. Một số hàm hỗ trợ. 40

3.3. Bộ phát sinh trình phân tích cú pháp BISON 41
3.3.1. Cấu trúc. 41
3.3.2. Quy trình vận hành. 44
CHƯƠNG 4: XÂY DỰNG CHUYẾN TRƯỚC CỦA TRÌNH BIÊN DỊCH 46
4.1. QUẢN LÝ MÃ TRUNG GIAN 46
4.2. XÂY DỰNG BẢNG DANH BIỂU 47
4.2.1. Cấu trúc cài đặt chung 47
4.2.2. Các cấu trúc dữ liệu lưu trữ thông tin danh biểu 48
4.2.3. Ví dụ biễu diễn một số kiểu dữ liệu 55
4.2.4. Các thao tác quản lý bảng danh biểu. 56
4.2.5. Minh họa sơ đồ lưu trữ 56
4.3. DỊCH CÁC CẤU TRÚC 58
4.3.1. Biểu thức 58
4.3.2. Mảng và con trỏ 66
4.3.3. Dịch biểu thức logic - luồng điều khiển. 72
4.3.4. Khai báo 95
CHƯƠNG 5: TỔNG KẾT 114
5.1. KẾT QUẢ 114
5.2. HẠN CHẾ 114
5.3. HƯỚNG PHÁT TRIỂN 114
PHỤ LỤC 116
PHỤ LỤC 1: Bảng xác định độ ưu tiên của các toán tử. 116
PHỤ LỤC 2: Dịch chương trình mẫu. 117
THAM KHẢO 132


3

DANH MỤC CÁC HÌNH VẼ
Hình 1.1. Trình biên dịch 6

Hình 1.2. Quá trình biên dịch 8
Hình 1.3. Các pha biên dịch mã nguồn 10
Hình 1.4. Quá trình dịch mã cho chip 11
Hình 1.5. Cấu trúc chương trình 13
Hình 2.1. Sự phân chia tầng trong cài đặt bảng danh biểu 19
Hình 2.2. Cấu trúc lưu trữ (dạng đơn giản) cho danh biểu 20
Hình 2.3. Bảng băm với kích thước khóa 256 21
Hình 2.4. Bảng danh biểu với liên kết chỉ định phạm vi 23
Hình 2.5 .Giao thức liên hệ của bộ phân tích từ vựng. 25
Hình 2.6. Vị trí của trình phân tích cú pháp trong chuyến trước của trình biên dịch
27
Hình 2.7. Cấu trúc của một bộ phân tích cú pháp LR 31
Hình 2.8. Automat của văn phạm dành cho biểu thức đơn giản[1] 32
Hình 3.1. Quá trình phân tích từ vựng 39
Hình 3.2. Quá trình phân tích cú pháp của BISON 44
Hình 4.1. Cấu trúc của một toán hạng (operand) 46
Hình 4.2. Mô hình cài đặt bảng danh biểu 47
Hình 4.3. Các cấu trúc lưu trữ thông tin danh biểu 49
Hình 4.4. Sơ đồ lưu trữ của bucket 50
Hình 4.5. Structdef trong tổ chưc lưu trữ struct 51
Hình 4.6. Declarator trong khai báo con trỏ integer 52
Hình 4.7. Symlink trong chuỗi thông tin danh biểu 54
Hình 4.8. Symbol trong tổ chức lưu trữ khai báo biến 55
Hình 4.9. Biễu diễn một sô kiểu dữ liệu 55
Hình 4.10. Sơ đồ lưu trữ biến, struct và typedef 57
Hình 4.11. Quá trình lan truyền thuộc tính danh biểu và thuộc tính hằng số 59
Hình 4.12. Cây cú pháp và lan truyền thuộc tính cho biểu thức ++a + b * c 65

4


Hình 4.13. Cây cú pháp và lan truyền thuộc tính cho ví dụ 4.13 71
Hình 4.14. Phân bố mã cho các câu lệnh if 74
Hình 4.15. Cây phân tích cú pháp sử dụng cho luật sinh 3 và 3’ 77
Hình 4.16. Cây phân tích cú pháp của cấu trúc điều khiển ví dụ 4.16 82
Hình 4.17. Cây phân tích cú pháp cho cấu trúc lệnh switch 89
Hình 4.18. Mô tả cấu trúc một case_val 90
Hình 4.19. Mô tả cấu trúc một switch table 90
Hình 4.20. Switch table khi đã lưu trữ đầy đủ thông tin để thực hiện hành vi ACT06
93
Hình 4.21. Phân bố mã cho các câu lệnh while 94
Hình 4.22. Phân bố mã cho các câu lệnh do-while 95
Hình 4.23. Cấu trúc khai báo của một chương trình 96
Hình 4.24. Cây phân tích cú pháp của một chương trình đơn giản 96
Hình 4.25. Sự tương quan giửa khai báo và external_definition 97
Hình 4.26. Sự lan truyền thuộc tính “int” và “x” 100
Hình 4.27. Sơ đồ tổ chức lưu trữ khai báo int x; 101
Hình 4.28. Cây phân tích cú pháp và lan truyền thuộc tính cho ví dụ ví dụ 4.20: . 104
Hình 4.29. Sơ đồ tổ chức lưu trữ hàm inc trong Ví dụ 4.20: 105
Hình 4.30. Cây phân tích cú pháp và quá trình lan truyền thuộc tính cho khai báo
struct 108
Hình 4.31. Sơ đồ tổ chức lưu trữ cho kiểu dữ liệu struct 109
Hình 4.32. Cây phân tích cú pháp cho khai báo con trỏ 110
Hình 4.33 Sơ đồ lưu trữ cho khai báo int *x; 111
Hình 4.34. Cây phân tích cú pháp cho khai báo typedef 112
Hình 4.36. Tổ chức lưu trữ typedef 113



5


DANH MỤC CÁC BẢNG
Bảng 1.1. Các kiểu dữ liệu 14
Bảng 1.2. Các toán tử 2 ngôi 15
Bảng 2.1. Mô tả một số token của ngôn ngữ C 24
Bảng 2.2. Mô tả từng bước hoạt động của phương pháp phân tích cú pháp dưới lên
29
Bảng 2.3. Bảng phân tích cú pháp của văn phạm dành cho biểu thức đơn giản 33
Bảng 2.4. Các bước thực hiện của bộ phân tích cú pháp LR với câu nhập 2 * 3 34
Bảng 4.1. Cách hình thành một toán hạng từ danh biểu hoặc một constant 58
Bảng 4.2. Luật sinh và luật ngữ nghĩa trường hợp tính toán biểu thức 63
Bảng 4.3. Luật sinh và luật ngữ nghĩa trường hợp mảng, con trỏ 70
Bảng 4.4. Mô tả các hành vi ngữ nghĩa và phát sinh mã ba địa chỉ của lệnh if 83
Bảng 4.5. Mô tả các hành vi ngữ nghĩa và phát sinh mã ba địa chỉ của lệnh switch
91
Bảng 4.6. Hệ thống luật sinh nhận kiểu 98
Bảng 4.7. Hệ thống luật nhận tên biến và số lượng phần tử của mảng 99
Bảng 4.8. Hệ thống luật phân tích tên hàm và tham số 102
Bảng 4.9. Hệ thống luật nhận các khai báo trong hàm 103
Bảng 4.10. Hệ thống luật phân tích khai báo struct 106
Bảng 4.11. Hệ thống luật dành cho khai báo con trỏ 109






Chương 1 – Tổng quan
6

CHƯƠNG 1: TỔNG QUAN

1.1. GIỚI THIỆU VỀ TRÌNH BIÊN DỊCH
1.1.1. Trình biên dịch là gì?
Trình biên dịch (TBD) là một chương trình xử lý ngôn ngữ, làm công việc
dịch chương trình hay một chuỗi các câu lệnh được viết bằng ngôn ngữ lập trình
(gọi là ngôn ngữ nguồn hay mã nguồn) thành chương trình tương đương dưới
dạng ngôn ngữ đích. Một phần quan trọng trong quá trình dịch là ghi nhận và
thông báo lỗi.


Trong đa số các trường hợp, ngôn ngữ nguồn là ngôn ngữ cấp cao như
Fortran, C/C++, Java, … Và ngôn ngữ đích là mã hợp ngữ hoặc mã máy của
một hoặc một họ hệ thống phần cứng.
1.1.2. Phân loại trình biên dịch
Theo số bước biên dịch, ta chia làm hai loại chính: một bước và nhiều
bước.
1.1.2.1. Trình biên dịch một bước
Việc biên dịch mã nguồn viết bằng ngôn ngữ cấp cao sang ngôn ngữ
máy (hay mã máy) gọi là trình biên dịch 1 bước. Các trình biên dịch trước
đây cho Pascal hay Borland C là trình biên dịch một bước.
Trình biên dịch
Chương trình nguồn
(mã nguồn)

Chương trình đích
(mã nguồn)

Báo lỗi
Hình 1.1. Trình biên dịch
Chương 1 – Tổng quan
7


1.1.2.2. Trình biên dịch nhiều bước.
Các trình biên dịch cần nhiều hơn một bước để hoàn tất gọi là trình
biên dịch nhiều bước.
Các kiểu trình biên dịch nhiều bước bao gồm:
 Trình biên dịch nguồn sang nguồn: dịch từ một ngôn ngữ cấp cao
này sang một ngôn ngữ cấp cao khác. Chẳng hạn biên dịch một
chương trình viết bằng ngôn ngữ C++ sang một chương trình viết
bằng ngôn ngữ C.
 Trình biên dịch phân đoạn: biên dịch sang một loại mã thực thi gần
với máy, thông thường là mã hợp ngữ. Ví dụ biên dịch một chương
trình viết bằng ngôn ngữ C sang một chương trình viết bằng mã hợp
ngữ cho một con chip bất kỳ (x86, VN-08, SG-08), từ mã hợp ngữ
này, ta lại cần một trình biên dịch hợp ngữ để dịch mã hợp ngữ sang
mã máy thực thi trên chip.
Trên thực tế, có trình biên dịch thực hiện biên dịch ngược, dịch từ
ngôn ngữ cấp thấp sang lại ngôn ngữ cấp cao và trình biên dịch như thế được
gọi là trình biên dịch ngược.
1.1.3. Quá trình biên dịch
Quá trình biên dịch mã nguồn được thực hiện theo mô hình biên dịch
phân tích - tổng hợp bao gồm 2 bước:
 Phân tích.
 Tổng hợp.
Chương 1 – Tổng quan
8



1.1.4. Quá trình phân tích
Quá trình này nhằm thu thập và tích lũy các thông tin từ chương trình

nguồn, tạo ra một dạng biễu diễn trung gian tương đương. Từ đó, trình biên dịch
sẽ sử dụng biểu diễn trung gian này để phục vụ cho quá trình tổng hợp.
Quá trình phân tích bao gồm 3 bước:
 Phân tích từ vựng (Lexical analysis). Thực hiện phân loại chuỗi
văn bản trong mã nguồn thành các nhóm, loại từ vựng có nghĩa,
gọi là token để cung cấp cho bước sau.
 Phân tích cú pháp (Syntax analysis). Từ các token nhận được, thực
hiện kiểm tra xem mã nguồn có được viết theo đúng cú pháp của
ngôn ngữ hay không.
 Phân tích ngữ nghĩa (Semantic analysis). Kiểm tra ngữ nghĩa và
thực thi các hành vi ngữ nghĩa tương ứng.
Phân tích
Chương trình nguồn
(mã nguồn)

Chương trình đích
(mã nguồn)

Tổng hợp
Biểu diễn trung gian
M

t t

p h

p các thông tin
mà trình biên dịch thu thập
được từ chương trình nguồn
Trình biên dịch

Hình 1.2.

Quá trình biên d

ch

Chương 1 – Tổng quan
9

 Phát sinh mã trung gian. Tạo ra mã trung gian – một dạng biểu
diễn của chương trình nguồn. Mã trung gian thường độc lập với
các đặc trưng kỹ thuật của máy đích.
1.1.5. Quá trình tổng hợp
Là quá trình xây dựng nên chương trình đích từ các thông tin trong biểu
biểu diễn trung gian đã thu thập được.
Quá trình tổng hợp thực hiện các bước sau để phát sinh mã đích:
 Tối ưu mã trung gian. Tối ưu mã trung gian để tạo ra dạng biểu
diễn tốt hơn. Giúp mã đích khi được phát sinh có thể thực thi nhanh
hơn hoặc tiết kiệm không gian hay năng lượng.
 Phát sinh mã đích. Tạo ra mã đích từ biễu diễn trung gian đã tối ưu.
 Tối ưu mã đích. Thực hiện tối ưu để tạo ra một tập mã đích có thể
thực thi nhanh hơn.
Hai quá trình tối ưu là tùy chọn.
1.1.6. Các pha trong quá trình biên dịch
Từ các bước trong quá trình phân tích và tổng hợp, quá trình biên dịch sẽ
được chia thành từng pha tương ứng, mỗi pha biên dịch sẽ chuyển dần mã nguồn
của chương trình sang mã đích. Theo đó, mỗi một pha sẽ nhận một dạng thông
tin có cấu trúc được quy định sẵn từ pha trước, tiến hành xử lý và tạo ra một
dạng thông tin mới để phục vụ cho pha sau liền kề.
Tùy thuộc vào loại ngôn ngữ của mã nguồn và loại mã đích muốn phát

sinh, các pha sẽ được phân nhóm để việc tổ chức, xây dựng được thuận tiện hơn.
Thông thường sự phân nhóm này sẽ tương ứng với mô hình phân tích - tổng
hợp. Trong đó, phân tích được gọi là chuyến trước (Front-End), tổng hợp sẽ là
chuyến sau (Back-End) (Hình 1.3).
Chương 1 – Tổng quan
10



Chuyến trước phụ thuộc rất nhiều vào loại ngôn ngữ nguồn, trong khi
chuyến sau chỉ phụ thuộc chủ yếu vào bộ mã trung gian mà chuyến trước cung
cấp, và các đặc điểm phần cứng mà mã đích thực thi trên đó. Khi chuyến sau đã
được xây dựng tốt trên một bộ mã trung gian chuẩn, thì việc xây dựng nên một
Hình 1.3.
Các pha biên d

ch mã ngu

n

Front-End
Back-End
Quản lý bảng
danh biểu
Quản lý
lỗi
Phân tích từ vựng
Chương trình
(mã nguồn)
Phân tích cú pháp

Token
Phân tích ngữ nghĩa
Cây phân tích cú pháp
Cây phân tích cú pháp
Bộ phát sinh mã trung
gian

Bộ tối ưu mã trung gian
Mã trung gian
Bộ phát sinh mã đích
Mã trung gian đã tối ưu
Mã đích đã tối ưu
Bộ tối ưu mã đích
Mã đích
Chương 1 – Tổng quan
11

trình biên dịch ngôn ngữ mới để dịch mã cho cùng một loại phần cứng chỉ là
việc xây dựng lại chuyến trước cho phù hợp với ngôn ngữ mới.
Quản lý bảng danh biểu và quản lý lỗi là hai pha luôn được thực hiện
xuyên suốt trong quá trình biên dịch.
 Bảng danh biểu. Những thông tin về một danh biểu (tên, kiểu, phạm
vi,…) sẽ được trình biên dịch thu thập và lưu trữ vào bảng danh biểu.
Chuyến sau sẽ sử dụng những dữ liệu này để phát sinh mã.
 Kiểm và thông báo lỗi. Mỗi bước xử lý trong sơ đồ trên đều có thể
xuất hiện lỗi về khai báo, cú pháp, ngữ nghĩa, Trình biên dịch cần
kiểm tra được các lỗi và thông báo lỗi cho người sử dụng.
1.1.7. Các module phụ của trình biên dịch



1.1.7.1. Tiền xử lý - Preprocessor
Trong thực tế, mã nguồn của một chương trình thường được tách ra
thành nhiều tập tin để thuận tiện cho việc quản lý. Do đó để biên dịch được
chương trình, ta cần thu thập được tất cả các thông tin từ các tập tin mã nguồn
Ti

n x




Chương trình nguồn
(mã ngu

n)

Trình biên dịch
Mã thực thi tuyệt đối
trên chip

Bộ dịch mã hợp ngữ
Linker/Loader
Thư viện
Hình 1.4. Quá trình dịch mã cho chip
Chương 1 – Tổng quan
12

riêng lẻ, công việc đó sẽ được thực hiện ở quá trình tiền xử lý, đồng thời dịch
các macro, các chỉ thị thành các câu lệnh tương ứng trong chương trình.
Tiền xử lý thực hiện dịch các khai báo hỗ trợ lập trình được viết trong

chương trình, chuyển các khai báo đó thành mã nguồn mà trình biên dịch có
thể xử lý được.
Tiền xử lý thực hiện dịch các loại macro sau:
o Các macro mà người lập trình khai báo.
o Macro chèn tập tin.
Ví dụ: #include <global.h>
o Built-in macro: là các macro được xây dựng sẵn để hỗ trợ lập
trình.
Ví dụ như macro khai báo chèn một đoạn lệnh hợp ngữ:
__asm
__endasm;
1.1.7.2. Bộ dịch mã hợp ngữ - Assembler
Đa số trình biên dịch chỉ dịch ra mã hợp ngữ, do phụ thuộc vào đặc
tính của thiết bị phần cứng nên mã hợp ngữ chưa thể thực thi được, ví dụ như
mã hợp ngữ cần thực thi trên một loại vi xử lý PIC[6] có bộ nhớ RAM, ROM
ở mức hạn chế. Lúc đó ta cần chuyển đổi từ mã hợp ngữ sang mã thực thi
(opcode) cụ thể để phù hợp với vi xử lý PIC thì mới có thể thực thi được.
1.1.7.3. Trình liên kết/Tải – Linker/Loader
Do cấu trúc chương trình đôi khi có sử dụng đến các hàm thư viện đã
được biên dịch sẵn (nhằm tránh biên dịch nhiều lần), đồng thời không gian bộ
nhớ dùng để thực thi lệnh trên chip (thường gọi là ROM) có tính chất đặc thù
riêng, nên ta cần một chương trình được gọi là linker để thực hiện liên kết các
đoạn mã lại với nhau thành 1 khối thống nhất trước khi nạp xuống bộ nhớ
ROM.
Chương 1 – Tổng quan
13

1.2. CÁC GIỚI HẠN CỦA LUẬN VĂN
1.2.1. Các giới hạn chung
Nhằm mục đích tìm hiểu và học hỏi, việc xây dựng trình biên dịch trong

khuôn khổ luận văn này sẽ bao gồm các giới hạn sau:
 Xây dựng cho ngôn ngữ ANSI C giản lược.
 Chỉ thực hiện xây dựng chuyến trước. Mã phát sinh được tính đến
thời điểm hiện tại là mã trung gian.
1.2.2. Ngôn ngữ ANSI C giản lược
1.2.2.1. Cấu trúc chương trình
 Khai báo biến (cục bộ, toàn cục).
 Khai báo hàm
 Gọi hàm, truyền biến, gọi hàm đa cấp.



1.2.2.2. Hằng số
 Hằng số số học:
main()
{
statments
func1();
statments
func2();
statments
}
void func1()
{
Statments


}
void func2()
{

Statments

func3();

}
void func3()
{
Statments


}
LEVEL1 LEVEL2 LEVEL3
Hình 1.5. Cấu trúc chương trình
Chương 1 – Tổng quan
14

o Thập phân: -3, 10,…
o Thập lục phân (hexadecimal): 0x30, …
o Nhị phân: 0b00011101
 Ký tự hằng: ‘A’, ‘b’…
 Chuỗi hằng: “ABCD”
1.2.2.3. Biến và các kiểu biến

Tên kiểu Kích thước

Giá trị tối thiểu Giá trị tối đa
unsigned char
1 byte 0 255
char
1 byte -128 +127

unsigned int
(unsigned short)
2 bytes 0 65535
int (short)
2 bytes -32768 +32767
unsigned long
4 bytes 0 4294967295
long
4 bytes -2147483648 +2147483647
Bảng 1.1. Các kiểu dữ liệu
 Phạm vi biến:
o Biến toàn cục: phạm vi hoạt động từ sau khai báo biến.
o Cục bộ: Chỉ có hiệu lực cục bộ trong hàm, hoặc trong block
chứa nó.
 Phạm vi khai báo: ở đầu hàm, hoặc khai báo toàn cục.
 Có thể dùng toán tử & để truy xuất địa chỉ của biến.
 Hỗ trợ biến tĩnh static và extern
1.2.2.4. Con trỏ
 Hỗ trợ con trỏ một cấp của tất cả cá kiểu dữ liệu.
 Hỗ trợ các thao tác số học trên con trõ.
 Kích thước con trỏ: 2 bytes.
 Không hỗ trợ con trỏ hàm.
Chương 1 – Tổng quan
15

1.2.2.5. Mảng
 Hỗ trợ mảng 1 chiều, mảng nhiều chiều.
 Hỗ trợ truy xuất mảng thông qua con trỏ.
1.2.2.6. Cấu trúc
 Hỗ trợ khai báo cấu trúc

 Cấu trúc lồng cấu trúc.
1.2.2.7. Toán tử
 Toán tử 1 ngôi: !, ~, ++,
 Toán tử 2 ngôi:
Toán tử Ý nghĩa
+
Cộng
-
Trừ
<<
Dịch trái
>>
Dịch phải
*
Nhân
/
Chia
%
Modulo
&
AND
|
OR
^
XOR
&&
Logical AND
||
Logical OR
Bảng 1.2. Các toán tử 2 ngôi

 Toán tử quan hệ: >, >=, <, <=, ==, !=
1.2.2.8. Khai báo khởi tạo giá trị.
Không hỗ trợ khai báo khởi tạo.
Ví dụ:
Chương 1 – Tổng quan
16

 int i = 80;
 char ch = ‘a’;
 int ia[3] = {1, 2, 3};
1.2.2.9. Hàm
 Khai báo hàm
 Gọi hàm
 Truyền tham số chỉ hỗ trợ truyền trị.
1.2.2.10. Các câu lệnh
 Biến được khai báo ở đầu block
{
variable declaration;
statement1;
statement2;
statement3;

statementn;
}
 Biểu thức:
o Số học.
o Luận lý
o Quan hệ
 Các lệnh điều khiển:
o Goto

o If
o Switch
o While
o For
o Do
o Continue
o Break
o Return
Chương 1 – Tổng quan
17

1.3. NỘI DUNG LUẬN VĂN
Việc xây dựng thành công một trình biên dịch hoàn chỉnh là rất phức tạp, tốn
nhiều thời gian và cần nhiều kiến thức. Do đó, trong khuôn khổ của luận văn này, ta
chỉ tập trung vào các phần chính yếu sau:
– Tìm hiểu kỹ thuật xây dựng trình biên dịch.
– Khảo sát các công cụ hỗ trợ phát sinh một phần trình biên dịch.
– Vận dụng vào việc xây dựng một trình biên dịch cho ngôn ngữ ANSI C
giản lược.
– Giải quyết các bài toán nảy sinh trong thực tế, vốn không được đề cập
trong tài liệu.














Chương 2 – Giới thiệu về chuyến trước
18

CHƯƠNG 2: GIỚI THIỆU VỀ CHUYẾN TRƯỚC
2.1. VAI TRÒ, CHỨC NĂNG CỦA CHUYẾN TRƯỚC.
Với nhiệm vụ chính là phân tích mã nguồn, chuyến trước có vai trò rất quan
trọng trong việc xử lý ngôn ngữ. Trong khi chuyến sau phụ thuộc gần như hoàn
toàn vào hệ thống phần cứng và không liên quan đến ngôn ngữ nguồn thì ngược lại,
chuyến trước sẽ tập trung xử lý ngôn ngữ nguồn mà không quan tâm đến phần cứng
cụ thể. Sợi dây liên kết 2 giai đoạn này chính là tập mã trung gian.
Như đã đề cập trong chương 1, chuyến trước bao gồm các phần sau:
 Phân tích từ vựng.
 Phân tích cú pháp.
 Phân tích ngữ nghĩa.
 Phát sinh mã trung gian.
 Quản lý bảng danh biểu, quản lý lỗi.
2.2. BẢNG DANH BIỂU.
2.2.1. Bảng danh biểu là gì? Vai trò và chức năng?
Như đã biết, một chương trình cơ bản sẽ gồm 3 phần chính: khai báo
(declaration), biểu thức (expression) và lệnh (statement). Bảng
danh biểu (symbol table) được dùng để lưu giữ thông tin về các khai báo trong
chương trình. Ví dụ như biến, chương trình con, struct, typedef,
v.v…Mỗi khai báo như thế được gọi là một danh biểu. Trong đa số các trường
hợp, thông tin sẽ được tích lũy ở giai đoạn phân tích và được sử dụng bởi giai
đoạn tổng hợp để sinh mã đích.
Ví dụ 2.1: Với khai báo biến toàn cục

int x;
Chương 2 – Giới thiệu về chuyến trước
19

Sau giai đoạn phân tích, một danh biểu “x” sẽ được tạo ra để lưu trữ các
thông tin của biến x, sau đó, tiến hành thêm vào bảng danh biểu để sử
dụng cho quá trình phát sinh mã.
Với vai trò là cơ sở dữ liệu cho toàn bộ hệ thống biên dịch, bảng danh
biểu cần được thiết kế hợp lý nhằm thỏa mãn các yêu cầu chính sau:
 Tốc độ truy xuất, cập nhật thông tin nhanh chóng.
 Do có nhiều loại khai báo (biến, hàm, typedef, struct, v.v )
nên bảng danh biểu cần có tính linh động để có thể lưu trữ nhiều
loại danh biểu khác nhau.
Để việc cài đặt bảng danh biểu được dễ dàng, người ta chia bảng danh
biểu thành 2 tầng: tầng dữ liệu và tầng quản lý:
 Tầng dữ liệu là tầng tổ chức cấu trúc dữ liệu lưu trữ bảng danh
biểu.
 Tầng quản lý là tầng thực hiện cài đặt các thao tác quản lý bảng
danh biểu.



Bảng danh biểu

Tầng dữ liệu

Tầng quản lý
Hình 2.1. Sự phân chia tầng trong cài đặt bảng danh biểu


×