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

  • Số trang: 140 |
  • Loại file: PDF |
  • Lượt xem: 13 |
  • Lượt tải: 0
nhattuvisu

Đã đăng 26946 tài liệu

Mô tả:

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 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 – 0612051 NGUYỄN THÀNH TRUNG – 0612468 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 GIÁO VIÊN HƢỚNG DẪN TS. NGUYỄN THANH PHƢƠNG KHÓA 2006 – 2010 NHẬN XÉT CỦA GIÁO VIÊN HƢỚNG DẪN ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… TpHCM, ngày ….. tháng …… năm …… Giáo viên hướng dẫn i NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… ……………………………………………………………………………… Khóa luận đáp ứng yêu cầu của Khóa luận cử nhân CNTT. TpHCM, ngày ….. tháng …… năm …… Giáo viên phản biện ii 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 iii 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)  Các giai đoạn thực hiện : iv 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. Ngày……tháng……năm…… Xác nhận của GVHD SV Thực hiện v 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 ..................................................................................... 5 CHƢƠNG 1: 1.1. TỔNG QUAN ............................................................................. 6 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 1 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. MÔ HÌNH CHUYẾN TRƯỚC CỦA TRÌNH BIÊN DỊCH .................... 46 4.2. QUẢN LÝ MÃ TRUNG GIAN [9] ....................................................... 47 4.3. XÂY DỰNG BẢNG DANH BIỂU [1, 2, 3, 8, 9] ................................... 48 4.3.1. Cấu trúc cài đặt chung ............................................................................... 48 4.3.2. Các cấu trúc dữ liệu lưu trữ thông tin danh biểu......................................... 49 4.3.3. Ví dụ biễu diễn một số kiểu dữ liệu ............................................................. 56 4.3.4. Các thao tác quản lý bảng danh biểu. ......................................................... 57 4.3.5. Minh họa sơ đồ lưu trữ ............................................................................... 57 4.4. DỊCH CÁC CẤU TRÚC ........................................................................ 59 4.4.1. Biểu thức .................................................................................................... 59 4.4.2. Mảng và con trỏ ......................................................................................... 67 4.4.3. Dịch biểu thức logic - luồng điều khiển....................................................... 73 4.4.4. Khai báo..................................................................................................... 96 CHƢƠNG 5: TỔNG KẾT ............................................................................ 115 5.1. KẾT QUẢ............................................................................................ 115 5.2. HẠN CHẾ ........................................................................................... 115 5.3. HƯỚNG PHÁT TRIỂN ....................................................................... 115 PHỤ LỤC ........................................................................................................... 117 PHỤ LỤC 1: Bảng xác định độ ưu tiên của các toán tử.................................... 117 PHỤ LỤC 2: Dịch chương trình mẫu. .............................................................. 118 THAM KHẢO ................................................................................................... 133 2 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)................................................... 47 Hình 4.2. Mô hình cài đặt bảng danh biểu ............................................................. 48 Hình 4.3. Các cấu trúc lưu trữ thông tin danh biểu................................................ 50 Hình 4.4. Sơ đồ lưu trữ của bucket ........................................................................ 51 Hình 4.5. Structdef trong tổ chưc lưu trữ struct ..................................................... 52 Hình 4.6. Declarator trong khai báo con trỏ integer.............................................. 53 Hình 4.7. Symlink trong chuỗi thông tin danh biểu ................................................ 55 Hình 4.8. Symbol trong tổ chức lưu trữ khai báo biến............................................ 56 Hình 4.9. Biễu diễn một sô kiểu dữ liệu ................................................................. 56 Hình 4.10. Sơ đồ lưu trữ biến, struct và typedef ..................................................... 58 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ố.......... 60 3 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 ......... 66 Hình 4.13. Cây cú pháp và lan truyền thuộc tính cho ví dụ 4.13 ............................ 72 Hình 4.14. Phân bố mã cho các câu lệnh if............................................................ 75 Hình 4.15. Cây phân tích cú pháp sử dụng cho luật sinh 3 và 3’............................ 78 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 .................... 83 Hình 4.17. Cây phân tích cú pháp cho cấu trúc lệnh switch ................................... 90 Hình 4.18. Mô tả cấu trúc một case_val ................................................................ 91 Hình 4.19. Mô tả cấu trúc một switch table ........................................................... 91 Hình 4.20. Switch table khi đã lưu trữ đầy đủ thông tin để thực hiện hành vi ACT06 ...................................................................................................................... 94 Hình 4.21. Phân bố mã cho các câu lệnh while ..................................................... 95 Hình 4.22. Phân bố mã cho các câu lệnh do-while ................................................ 96 Hình 4.23. Cấu trúc khai báo của một chương trình .............................................. 97 Hình 4.24. Cây phân tích cú pháp của một chương trình đơn giản ........................ 97 Hình 4.25. Sự tương quan giửa khai báo và external_definition ............................ 98 Hình 4.26. Sự lan truyền thuộc tính “int” và “x” ................................................ 101 Hình 4.27. Sơ đồ tổ chức lưu trữ khai báo int x; ............................................ 102 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: . 105 Hình 4.29. Sơ đồ tổ chức lưu trữ hàm inc trong Ví dụ 4.20: ................................. 106 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 ........................................................................................................... 109 Hình 4.31. Sơ đồ tổ chức lưu trữ cho kiểu dữ liệu struct ...................................... 110 Hình 4.32. Cây phân tích cú pháp cho khai báo con trỏ....................................... 111 Hình 4.33 Sơ đồ lưu trữ cho khai báo int *x; ................................................. 112 Hình 4.34. Cây phân tích cú pháp cho khai báo typedef ...................................... 113 Hình 4.36. Tổ chức lưu trữ typedef ...................................................................... 114 4 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 ........... 59 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 .................. 64 Bảng 4.3. Luật sinh và luật ngữ nghĩa trường hợp mảng, con trỏ .......................... 71 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 ...... 84 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 ...................................................................................................................... 92 Bảng 4.6. Hệ thống luật sinh nhận kiểu ................................................................. 99 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 ................. 100 Bảng 4.8. Hệ thống luật phân tích tên hàm và tham số ........................................ 103 Bảng 4.9. Hệ thống luật nhận các khai báo trong hàm ........................................ 104 Bảng 4.10. Hệ thống luật phân tích khai báo struct ............................................. 107 Bảng 4.11. Hệ thống luật dành cho khai báo con trỏ ........................................... 110 5 Chương 1 – Tổng quan 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. Chương trình nguồn (mã nguồn) Trình biên dịch Báo lỗi Chương trình đích (mã nguồn) Hình 1.1. Trình biên dịch 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. 6 Chương 1 – Tổng quan 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. 7 Chương 1 – Tổng quan Chương trình nguồn (mã nguồn) Trình biên dịch Phân tích 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 Tổng hợp Chương trình đích (mã nguồn) Hình 1.2. Quá trình biên dịch 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. 8 Chương 1 – Tổng quan  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). 9 Chương 1 – Tổng quan Chương trình (mã nguồn) Phân tích từ vựng Token Phân tích cú pháp Quản lý bảng danh biểu Cây phân tích cú pháp Quản lý lỗi Phân tích ngữ nghĩa Cây phân tích cú pháp Bộ phát sinh mã trung gian Front-End Mã trung gian Bộ tối ưu mã trung gian Mã trung gian đã tối ưu Bộ phát sinh mã đích Mã đích Back-End Bộ tối ưu mã đích Mã đích đã tối ưu Hình 1.3. Các pha biên dịch mã nguồn 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 10 Chương 1 – Tổng quan 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 Chương trình nguồn (mã nguồn) Tiền xử lý Trình biên dịch Bộ dịch mã hợp ngữ Linker/Loader Thư viện Mã thực thi tuyệt đối trên chip Hình 1.4. Quá trình dịch mã cho chip 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 11 Chương 1 – Tổng quan 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 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. 12 Chương 1 – Tổng quan 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. LEVEL1 LEVEL2 main() { statments func1(); statments func2(); statments } LEVEL3 void func1() { Statments ... ... } void func2() { Statments ... func3(); ... } void func3() { Statments ... ... } Hình 1.5. Cấu trúc chương trình 1.2.2.2. Hằng số  Hằng số số học: 13
- Xem thêm -