Trình biên dịch Trình biên dịch, còn gọi là phần mềm biên dịch, compiler, là một chương trình máy tính làm công việc dịch một chuỗi các câu lệnh được viết bằng một ngôn ngữ lập trình gọi
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
Giảng viên hướng dẫn : THS.ĐỖ CÔNG ĐỨC
Sinh viên thực hiện : NGUYỄN THỊ MỸ HÀ 18IT1
Trang 2ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
Giảng viên hướng dẫn : THS.ĐỖ CÔNG ĐỨC
Sinh viên thực hiện : NGUYỄN THỊ MỸ HÀ 18IT1
Đà Nẵng, tháng 05 năm 2020
Trang 3MỞ ĐẦU
Cùng với sự phát triển không ngừng của xã hội trong nền công nghiệp 4.0cũng như những nhu cầu cho việc phát triển cơ sở hạ tầng vững chắc để phát triểnnền công nghiệp, công nghệ thông tin trở thành một phần không thể thiếu trong cuộcsống hiện nay Tin học là một trong những công cụ tiếp cận công nghệ thông tinnhanh nhất Để có thể tính toán, ghi nhớ, điều khiển các thiết bị một cách chính xác
và hiệu quả nhất, chúng ta cần phải lập ra những chương trình để sử dụng chúng,việc này sẽ khiến tốc độ làm việc cũng như năng suất tăng lên rất nhiều Và dĩ nhiên,khi chúng ta muốn lập trình sẽ cần có ngôn ngữ lập trình, đó là sơ sở để hình thànhnên một chương trình, cũng như sự kết nối cần thiết cho chúng ta với các thiết bịđiện tử cũng như các thiết bị với nhau
Qua sự cân nhắc, tìm hiểu về các ngôn ngữ lập trình đang có hiện nay và kếthợp với kiến thức đã được học trên ghế nhà trường về môn Trình biên dịch Emquyết định thực hiện một chương trình trình biên dịch đơn giản nhằm cũng cố kiếnthức cũng như là phục vụ việc hoàn thành học phần Đồ án 5 - học kỳ II - năm học2020-2021
LỜI CẢM ƠN
Để hoàn thành tốt đồ án này, em xin gửi lời cảm ơn chân thành đến tất cả các Thầy Cô giáo đang giảng dạy tại Trường Đại học Công Nghệ Thông Tin và Truyền Thông Việt - Hàn đã giảng dạy em trong suốt thời gian qua Đặc biệt, em xin trân trọng cảm ơn và bày tỏ lòng biết ơn sâu sắc nhất tới thầy Đỗ Công Đức - người đã cung cấp cho em những kiến thức cơ bản liên quan tới đồ án cũng như trực tiếp hướng dẫn chúng em để có thể hoàn thành tốt đồ án này
Trang 4gian học tập và nghiên cứu, đóng góp những kinh nghiệm quý báu trong thời gian thực hiện đề tài này
Tuy nhiên, do kiến thức hiểu biết về đồ án này chưa thật sự đầy đủ nên dù đã nỗ lực hết sức mình, nhưng chắc rằng đồ án khó tránh khỏi thiếu sót Em rất mong nhận được sự thông cảm và góp ý của quý Thầy Cô và các bạn
Xin chân th8nh c9m ơn !
NHẬN XÉT
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 5MỤC LỤC
CHƯƠNG 1 GIỚI THIỆU 10
1.1 Tổng quan 10
1.1.1 Trình biên dịch 10
1.1.2 Các kiểu trình biên dịch 10
1.1.3 Vấn đề và hướng giải quyết 12
1.2 Phương pháp, kết quả 12
1.3 Cấu trúc đồ án 13
CHƯƠNG 2 NGHIÊN CỨU TỔNG QUAN 14
2.1 Ngôn ngữ lập trình hỗ trợ 14
2.1.1 BASIC (Beginners' All-purpose Symbolic Instruction Code) 14
2.1.2 Python 16
2.2 Công cụ hỗ trợ: Sublime Text 18
CHƯƠNG 3 PHÂN TÍCH THIẾT KẾ 20
3.1 Trình phân tích từ vựng - Lexing 20
3.1.1 Giới thiệu 20
3.1.2 Nhiệm vụ của Lexer 20
3.1.3 Viết một Lexer đơn giản 20
3.2 Trình phân tích cú pháp - Parsing 22
3.2.1 Giới thiệu 22
3.2.2 Nhiệm vụ của Parser 22
3.2.3 Viết một Parser đơn giản 23
CHƯƠNG 4 TRIỂN KHAI THỰC HIỆN 25
4.1 Xây dựng Lexer và Parse 25
4.1.1 Lexer 25
4.1.2 Parser 26
4.2 Node 26
4.3 Xây dựng các chức năng lệnh 27
Trang 64.6 Chạy thử chương trình 28
CHƯƠNG 5 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 29
5.1 Kết luận 29
5.2 Định hướng phát triển 29
TÀI LIỆU THAM KHẢO 30
DANH MỤC HÌNH ẢNH Hình 2.1 Python 16
Hình 2.2 Sublime Text 18
Hình 3.1 Phân tích từ vựng Lerxing 22
Hình 3.2 Phân tích cú pháp Parsing 24
Hình 4.1 Các từ khóa 25
Hình 4.2 Các biến so sánh 25
Hình 4.3 Các hàm so sánh 25
Hình 4.4 Các hàm expr() 26
Hình 4.5 Các hàm Node 26
Hình 4.6 Các chức năng lệnh 27
Hình 4.7 Gọi các lệnh chức năng 27
Hình 4.8 Các lớp báo lỗi 27
Hình 4.9 Hàm chạy chương trình 28
Hình 4.10 Gọi hàm chạy 28
Hình 4.11 File test.my 28
Hình 4.12 Kết quả chạy thử 28
DANH MỤC TỪ VIẾT TẮT
Trang 7CHƯƠNG 1 GIỚI THIỆU
1.1 Tổng quan
1.1.1 Trình biên dịch
Trình biên dịch, còn gọi là phần mềm biên dịch, compiler, là một chương trình máy tính làm công việc dịch một chuỗi các câu lệnh được viết bằng một ngôn ngữ lập trình (gọi là ngôn ngữ nguồn hay mã nguồn), thành một chương trình tương đương nhưng ở dưới dạng một ngôn ngữ máy tính mới (gọi là ngôn ngữ đích) và thường là ngôn ngữ ở cấp thấp hơn, như ngôn ngữ máy Chương trình mới được dịch này gọi mã đối tượng
Hầu hết các trình biên dịch sẽ chuyển dịch mã nguồn viết trong một ngôn ngữ cấpcao thành mã đối tượng hay ngôn ngữ máy mà có thể được thi hành trực tiếp bởi một máy tính hay bởi một máy ảo Dù vậy, việc chuyển dịch từ một ngôn ngữ cấp thấpsang một ngôn ngữ cấp cao hơn cũng có thể xảy ra; quá trình này thường được hiểu như là bộ biên dịch ngược nếu nó có thể tái tạo lại một chương trình trong ngôn ngữ cấp cao Cũng tồn tại các trình biên dịch chuyển đổi từ ngôn ngữ cao này sang ngôn ngữ cao khác, hay là chuyển đổi sang một ngôn ngữ mà nó cần để tiếp tục xử lý về sau; những trình biên dịch như vậy được biết như là bộ biên dịch phân tầng
Các loại trình biên dịch cho kết quả là mã đối tượng thì một cách cơ bản bao gồm mã máy tăng cường thêm các thông tin về tên vị trí của các ngõ vào và các gọi ngoài (đến các hàm mà không có sẵn bên trong của nó) Một tập hợp của các tập tin đối tượng, mà không hẳn được cung cấp từ cùng một trình biên dịch, thì vẫn có thể được liên kết với nhau để tạo nên các chương trình khả thi cuối cùng cho một người dùng Dĩ nhiên, để làm được như vậy thì các tập tin đối tượng đó phải được thiết kế chung nhau về dạng thức Ví dụ của kiểu tập đối tượng này là các tập có đuôi là.obj có thể dùng chung giữa ASM, C/C++, Fortran hay các tập tin.DLL trong các kiến trúc Windows dùng chung được cho nhiều ngôn ngữ
1.1.2 Các kiểu trình biên dịch
Trình biên dịch cùng b9n v8 trình biên dịch chéo b9n
Tất cả các trình biên dịch đều hoặc là biên dịch cùng bản hoặc là biên dịch chéo bản.Một trình biên dịch có thể sản xuất ra mã chủ định để chạy trên cùng một kiểu máy tính và một kiểu hệ điều hành như là chạy trên máy mà trình biên dịch tự nó tiến hành được gọi là một trình biên dịch cùng bản
Trang 8Một loại khác, trình biên dịch có thể sản xuất ra mã mà được thiết kế để chạy trêncác kiểu máy tính khác hay hệ điều hành khác Trường hợp này gọi là trình biên dịch chéo bản Các trình biên dịch chéo bản thì rất có ích khi gặp một hệ thống phần cứng mới trong lần đầu tiên Trình biên dịch chéo bản cũng rất cần khi việc phát triển phần mềm cho các hệ thống vi điều khiển, mà chúng chỉ có vừa đủ kho lưu trữ cho mã máy cuối, không đủ để tải trình biên dịch (như trường hợp dịch chương trình để chạy trên các palmtop và các điện thoại di động chẳng hạn).
Số bước chuyển dịch
Tất cả các trình biên dịch thì có thể là một bước hay nhiều bước
Trình biên dịch một bước: Với loại này, sự chuyển dịch hoàn tất trong một bước
và do đó rất nhanh (Ví dụ: các trình biên dịch trước đây cho Pascal hay Borland 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 là loại trình biên dịch nhận vào mã nguồn, là một ngôn ngữ cấp cao và chuyển dịch thành một ngôn ngữ cấp cao khác.V
í dụ : Một trình biên dịch tự động song song hoá sẽ thường xuyên lấy chương trình trong ngôn ngữ cấp cao ở ngõ vào và chuyển dạng mã nguồn và chú giải nó với các chú giải mã song song (như OpenMP hay các câu lệnh DOALL của Fortran,…)
−Trình biên dịch phân đoạn biên dịch sang ngôn ngữ ASM của một máy lý thuyết như là vài tiến hành của Prolog Loại máy Prolog này còn được gọi là máy trừu tượng Warren (hay WAM)
Ví dụ: Các trình biên dịch bytecode cho Java, Python và nhiều trình biên dịch khác nữa là một kiểu con của kiểu này
−Trình biên dịch động (JIT) sẽ chuyển dịch các ứng dụng sang bytecode, sau đó, bytecode sẽ được dịch sang mã của ngôn ngữ máy tương thích trước khi thi hành
Ví dụ: Trình biên dịch JIT được dùng bởi Smalltalk, Java, cũng như dùng bởi Ngôn ngữ trung gian thông dụng của Microsoft.NET
Các đặc tính khác
Đặc biệt, một trình biên dịch có thể có thêm các chức năng sau đây:
−Trình biên dịch mã liên kết là loại trình biên dịch cho phép thay thế các dòng ký tựtrong (mã) nguồn bằng các khối mã nhị phân sẵn có Các khối mã nhị phân này có thể có nhiều cấp độ khác nhau
8
Trang 9Ví dụ: các trình biên dịch trong hầu hết các kiến trúc của FORTH Trong thực tế, một vài trình biên dịch FORTH có thể dịch các chương trình mà không cần đến hệ điều hành.
−Trình biên dịch tăng tiến Trong trình biên dịch tăng tiến, các hàm riêng lẻ có thể được dịch trong thời gian thi hành (runtime) mà các hàm này cũng bao gồm các chức năng thông dịch
Ví dụ: Kiến trúc dịch tăng tiến xuất hiện từ 1962 và vẫn còn được sử dụng trong các
hệ thống Lisp
−Trình biên dịch đa năng là trình biên dịch có thể được điều chỉnh để tạo ra mã cho các kiến trúc CPU khác nhau một cách tương đối dễ dàng Mã đối tượng làm ra bởi các trình biên dịch này thường có chất lượng kém hơn là các mã được tạo ra từcác trình biên dịch chỉ chuyên dùng cho đúng loại CPU Trình biên dịch đa năng thường cũng là trình biên dịch chéo bản
Ví dụ: GCC là một loại trình biên dịch đa năng miễn phí rất phổ biến
Trình biên dịch song song hóa là loại trình biên dịch có khả năng chuyển đổi một chương trình vào được viết theo kiểu liên tục sang một dạng thuận tiện trên kiến trúc của máy tính song song
1.1.3 Vấn đề và hướng giải quyết
Hiện nay, trên thế giới chúng ta có rất nhiều ngôn ngữ lập trình đã và đang được
sữ dụng rộng rãi từ rất lâu Nỗi bật trong đó chúng ta có thể kể đến như là Java, C, C++, Python v.v
Ngôn ngữ lập trình là cơ sở cần thiết để chúng ta có thể kết nối với công nghệhiện nay một cách nhanh nhất Vì thế, em quyết định thực hiện đồ án này, để nhằm tìmhiểu và bước đầu có thể xây dựng được một chương trình đơn giản có thể phiên dịch ra
từ tiếng Việt chúng ta đang sử dụng hàng ngày sang Python và thực hiện các phép tínhcũng như các câu lệnh, chương trình đơn giản
Trang 10lý các câu lệnh ngắn gọn, thực hiện các phép toán, thuật toán đơn giản Và thông qua
đó, bản thân cũng có thể đạt được:
−Tìm hiểu được cách cách xây dựng một trình biên dịch là như thế nào.
−Hiểu hơn là học phần Trình biên dịch và áp dụng những kiến thức có được từ học
phần này vào đồ án 5 lần này
−Được củng cố kiến thức về các phương pháp để xây dựng được một trình biên
dịch
−Xây dựng một chương trình trình biên dịch xử lý được các câu lệnh đơn giản 1.3 Cấu trúc đồ án
Chương 2: Nghiên cứu tổng quan
Tìm hiểu, trình bày các công cụ hổ trợ, cũng như ngôn ngữ lập trình trung gian để xây dựng chương trình
Chương 3: Phân tích thiết kế
Trình bày một số lớp, hàm chức năng chính, cách thức triển khai của chương trình.Chương 4: Triển khai xây dựng
Mô tả phần triển khai demo cũng như kết quả của demo
Chương 5: Kết luận và hướng phát triển
Nêu ra những gì đã đạt được và chưa đạt được so với mục tiêu, kết quả đề ra ban đầu Những yêu cầu bổ sung cho chương trình các thêm hoàn thiện
CHƯƠNG 2 NGHIÊN CỨU TỔNG QUAN
2.1 Ngôn ngữ lập trình hỗ trợ
2.1.1 BASIC (Beginners' All-purpose Symbolic Instruction Code)
BASIC là một ngôn ngữ lập trình bậc cao, đơn giản, dễ sử dụng BASIC được phát minh vào năm 1963 bởi các giáo sư John George Kemeny và Thomas Eugene Kurtz thuộc viện Đại học Dartmouth (Dartmouth College) để cung cấp cho sinh viên cách viết các chương trình máy tính đơn giản Kể từ đó, ngôn ngữ này đã phát triển thành một ngôn ngữ mạnh mẽ hơn và có thể được sử dụng để tạo ra các chương trình nâng cao cho các hệ thống máy tính ngày nay
Trong BASIC, các câu lệnh đều được viết chữ in Khi đánh số nhãn lệnh, thông thường người ta đánh cách quãng (chẳng hạn, 10, 20, 30, ) để thuận tiện cho việc thêm các dòng lệnh (nếu cần) về sau này Chẳng hạn nếu muốn chèn dòng lệnh in ra
10
Trang 11thông báo trước khi in kết quả x + y thì dòng lệnh có nhãn 25 được chèn vào như sau:
INPUT "Cho gia tri cua y: "; y
INPUT "Cho gia tri cua z: ", z
Với dòng lệnh thứ nhất sẽ có một dấu chấm hỏi (?) hiện ra trên màn hình, chờ người dùng nhập một giá trị số vào Dòng lệnh thứ hai sẽ làm hiện lên hai dấu chấm hỏi (??), chờ nhập hai số Với dòng lệnh thứ ba, giữa thông báo và số nhập vào sẽ cách nhau một dấu trống Dòng lệnh thứ tư tương tự như vậy nhưng khoảng cách là một dấu TAB
Ngoài ra BASIC còn có các lệnh LINE INPUT để nhập chuỗi ký tự và INPUT WAIT có nhiệm vụ chờ người dùng nhập số liệu trong một khoảng thời gian nhất định.Đối với INPUT WAIT nếu không được nhập số liệu vào thì máy sẽ dùng một giá trị định sẵn
LINE INPUT "Nguyen Viet Thao: "; HOTEN$
Lệnh PRIN T : lệnh này được dùng để in giá trị của biến, của biểu thức (số và chuỗi ký
tự) ra tập tin, màn hình, máy in
Trang 12PRINT "Gia tri can tim la: "PRINT x / 2
Trang 13vì sự rõ ràng, dễ hiểu và cách gõ linh động làm cho nó nhanh chóng trở thành một ngôn ngữ lý tưởng để viết script và phát triển ứng dụng trong nhiều lĩnh vực, ở hầu hếtcác nền tảng
Python hoàn toàn tạo kiểu động và dùng cơ chế cấp phát bộ nhớ tự động; do vậy
nó tương tự như Perl Ruby Scheme Smalltalk, , , , và Tcl Python được phát triển trong một dự án mã mở, do tổ chức phi lợi nhuận Python Software Foundation quản lý.Ban đầu, Python được phát triển để chạy trên nền Unix Nhưng rồi theo thời gian,Python dần mở rộng sang mọi hệ điều hành từ MS-DOS đến Mac OS,
OS/2, Windows Linux, và các hệ điều hành khác thuộc họ Unix Mặc dù sự phát triển của Python có sự đóng góp của rất nhiều cá nhân, nhưng Guido van Rossum hiện nay vẫn là tác giả chủ yếu của Python Ông giữ vai trò chủ chốt trong việc quyết định hướng phát triển của Python
Sự phát triển Python đến nay có thể chia làm các giai đoạn:
Python 1: bao gồm các bản phát hành 1.x
−Giai đoạn này, kéo dài từ đầu đến cuối thập niên 1990 Từ năm 1990 đến 1995, Guido làm việc tại CWI (Centrum voor Wiskunde en Informatica - Trung tâm
Trang 14Toán - Tin học tại Amsterdam Hà Lan, ) Vì vậy, các phiên bản Python đầu tiên đều
do CWI phát hành Phiên bản cuối cùng phát hành tại CWI là 1.2
−Vào năm 1995, Guido chuyển sang CNRI (Corporation for National Research Initiatives) ở Reston Virginia Tại đây, ông phát hành một số phiên bản khác , Python 1.6 là phiên bản cuối cùng phát hành tại CNRI
−Sau bản phát hành 1.6, Guido rời bỏ CNRI để làm việc với các lập trình viên chuyên viết phần mềm thương mại Tại đây, ông có ý tưởng sử dụng Python với các phần mềm tuân theo chuẩn GPL Sau đó, CNRI và FSF (Free Software Foundation - Tổ chức phần mềm tự do) đã cùng nhau hợp tác để làm bản quyền Python phù hợp với GPL Cùng năm đó, Guido được nhận Giải thưởng FSF vì Sự phát triển Phần mềm tự do (Award for the Advancement of Free Software)
−Phiên bản 1.6.1 ra đời sau đó là phiên bản đầu tiên tuân theo bản quyền GPL Tuy nhiên, bản này hoàn toàn giống bản 1.6, trừ một số sửa lỗi cần thiết
Python 2: vào năm 2000, Guido và nhóm phát triển Python dời đến BeOpen.com và thành lập BeOpen PythonLabs team Phiên bản Python 2.0 được phát hành tại đây Saukhi phát hành Python 2.0, Guido và các thành viên PythonLabs gia nhập Digital Creations
−Python 2.1 ra đời kế thừa từ Python 1.6.1 và Python 2.0 Bản quyền của phiên bản này được đổi thành Python Software Foundation License Từ thời điểm này trở đi, Python thuộc sở hữu của Python Software Foundation (PSF), một tổ chức phi lợi nhuận được thành lập theo mẫu Apache Software Foundation
Python 3: còn gọi là Python 3000 hoặc Py3K: Dòng 3.x sẽ không hoàn toàn tương thích với dòng 2.x, tuy vậy có công cụ hỗ trợ chuyển đổi từ các phiên bản 2.x sang 3.x.Nguyên tắc chủ đạo để phát triển Python 3.x là "bỏ cách làm việc cũ nhằm hạn chế trùng lặp về mặt chức năng của Python" Trong PEP (Python Enhancement Proposal)
có mô tả chi tiết các thay đổi trong Python Các đặc điểm mới của Python 3.0 sẽ được trình bày phần cuối bài này
2.2 Công cụ hỗ trợ: Sublime Text
14