Từ ứng dụng trò chơi giải trí đến, ví điện tử, các thiết vị giadụng thông minh,…Vậy mới thấy việc lập trình đóng góp to lớn như thế nào, từ đó các ngôn ngữ lập trình dần dần được ra đời
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN
THÔNG VIỆT -HÀN KHOA KHOA HỌC MÁY TÍNH
ĐỒ ÁN CƠ SỞ 5
ĐỀ TÀI: XÂY DỰNG NGÔN NGỮ LẬP TRÌNH ĐƠN GIẢN
Giảng viên hướng dẫn : TS VÕ NGỌC ĐẠT
Đà nẵng, tháng 05 năm 2021
Trang 2ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
VIỆT-HÀN
KHOA KHOA HỌC MÁY TÍNH
ĐỒ ÁN CƠ SỞ 5XÂY DỰNG NGÔN NGỮ LẬP TRÌNH ĐƠN GIẢN
Đà Nẵng, tháng 05 năm 2021
Trang 3MỞ ĐẦU
Trong thời đại hiện nay cuộc sống đang chuyển đổi theo xu hướng hiện đạihóa, công nghiệp hóa Trong đó ngành Công nghệ thông tin là một ngànhnghệ tất yếu, hỗ trợ đắc lực cho quá trình chuyển đổi số này Bằng những câulệnh ngững lập trình viên có thể tạo ra rất nhiều thư hỗ trợ và nâng tầm cuộcsống hiện đại Từ ứng dụng trò chơi giải trí đến, ví điện tử, các thiết vị giadụng thông minh,…Vậy mới thấy việc lập trình đóng góp to lớn như thế nào,
từ đó các ngôn ngữ lập trình dần dần được ra đời để hỗ trợ các lập trình viên
có thể dễ dàng tạo ra các sản phẩm công nghệ phục vụ cuộc sống
Trang 4LỜI CẢM ƠN
Báo cáo đồ án này là quá trình nghiên cứu và thực hiện của tôi dưới sự giúp đỡ,
hỗ trợ của rất nhiều người người
Lời đầu tiên tôi xin chân thành cảm ơn THS Võ Ngọc Đạt đã trực tiếp giúp
đỡ tôi tìm hiều và nghiên cứu thực hiện đề tài, cung cấp tài liệu, thông tin cần thiếtcho báo cáo này
Xin cảm ơn ban lãnh đạo trường Đại học Công nghệ thông tin và Truyền thôngViệt Hàn, khoa Khoa học máy tính đã tạo điều kiện cho tôi thực hiện đồ án củamình
Cuối cùng tôi xin chân thành cảm ơn gia đình, người thân và bạn bè đã luôn bêncạnh ủng hộ, động viên trong suốt quá trình tôi thực hiện đồ án 5
Tôi xin chân thành cảm ơn!
Trang 5NHẬN XÉT (Của giảng viên hướng dẫn)
………
………
………
………
………
………
………
………
………
………
Trang 6
MỤC LỤC Trang Chương 1 Giới thiệu 10
1.1 Tổng quan 10
1.2 Phương pháp 10
1.3 Cấu trúc đồ án 10
Chương 2 Tổng quan về lý thuyết 11
2.1 Ngôn ngữ lập trình là gì? 11
2.2 Các loại ngôn ngữ lập trình 11
2.2.1 Ngôn ngữ máy 11
2.2.2 Hợp ngữ 11
2.2.3 Ngôn ngữ lập trình bậc cao 12
2.3 Các thành phần của một ngôn ngữ lập trình 12
2.3.1 Bảng chữ cái 12
2.3.2 Cú pháp 12
2.3.3 Ngữ nghĩa 12
2.3.4 Một số khái niệm khác 12
2.4 Các bước xây dựng một ngôn ngữ lập trình 13
2.4.1 Thiết kế ngôn ngữ 13
2.4.2 Xây dựng trình dịch ngôn ngữ 14
2.5 Ngôn ngữ lập trình Python 17
Chương 3 Phân tích thiết kế hệ thống 18
3.1 Thiết kế ngôn ngữ 18
3.1.1 Ngữ pháp 18
3.1.2 Cú pháp 19
3.2 Lựa chọn trình dịch và công cụ 20
Chương 4 Triển khai xây dựng 21
4.1 Bộ phân tích từ vựng (Lexer) 21
4.2 Bộ phân tích cú pháp (Parser) 22
4.3 Bộ thông dịch (interpreter) 23
Kết luận và hướng phát triển 25
Trang 7DANH MỤC CÁC BẢNG
TrangBảng 1: Bảng so sánh trình biên dịch và trình thông dịch 19
Trang 8DANH MỤC HÌNH
Trang
Hình 1: Ngôn ngữ lập trình là gì? 13
Hình 2: Xây dựng ngữ pháp 15
Hình 3: Trình biên dịch 17
Hình 4: Các giai đoạn biên dịch 18
Hình 5: Ngôn ngữ lập trình python 19
Hình 6: Ngữ pháp 20
Hình 7: Expr, term, factor 21
Hình 8: Lexer 23
Hình 9: Mô tả parser 24
Hình 10: Parser 25
Hình 11: Interpreter 26
Trang 9DANH MỤC CỤM TỪ VIẾT TẮT
Trang 10Chương 1 Giới thiệu
1.1 Tổng quan
Hiện nay ngành công nghệ thông tin đang trở thành trợ thủ đắc lực cho quátrình chuyển đổi số, nâng cao chất lượng cuộc sống cho con người Chỉ bằng cácdòng lệnh các lập trình viên có thể tạo ra nhiều công cụ thông minh trợ giúp conngười trong cuộc sống hàng ngày, từ những trò chơi giải trí, đến các thiết bị giadụng thông minh
Từ đó các ngôn ngữ lập trình cũng ngày càng phát triển để hỗ trợ các lậptrình viên có thể dễ dàng hơn trong quá trình lập trình Với mong muốn có thểphát triển được một ngôn ngữ lập trình “made in Viet Nam”, tôi thực hiện đồ ánnày nhằm mục đích nghiên cứu cách tạo ra một ngôn ngữ lập trình, tạo tiền đề đểphát triển một ngôn ngữ lập trình hoàn chỉnh trong tương lai
1.2 Phương pháp
Để có thể tạo ra một ngôn ngữ lập trình những công việc chính mà chúng tacần làm đó là thiết kế được ngôn ngữ, sau đó là xây dựng trình biên dịch hoặcthông dịch Trong đồ án này tôi chọn xây xựng trình thông dịch và sử dụng ngônngữ python để thực hiện Ngôn ngữ python là một ngôn ngữ rất thân thiện vì gầngiống với ngôn ngữ nói, nên sẽ thuận tiện hơn trong việc viết code
1.3 Cấu trúc đồ án
Đồ án gồm có 3 chương chính như sau:
- Chương 2: Trình bày về các kiến thức liên quan đến đề tài như khái niệmngôn ngữ lập trình, phân loại, các thành phần, cũng như cách xây dựngmột ngôn ngữ lập trình
- Chương 3: Trình bay phần phân tích thiết kế hệ thống, thiết kế ngôn ngữ,thiết kế ngữ pháp, cú pháp
- Chương 4: Trình bày các bước, xây dựng hệ thống
Trang 11Chương 2 Tổng quan về lý thuyết
2.1 Ngôn ngữ lập trình là gì?
Hình 1: Ngôn ngữ lập trình là gì?
Ngôn ngữ lập trình (programming language) là dạng ngôn ngữ được chuẩnhóa theo một quy tắc nhất định mà mỗi ngôn ngữ lập trình khác nhau sẽ có quytắc khác nhau Nhằm một mục đích là giúp con người có thể giao tiếp với máymóc, hay chính xác hơn là điều khiển máy móc làm theo ý mình
Hiện nay có rất nhiều ngôn ngữ lập trình đang được sử dụng Mặc dù cácngôn ngữ cũng có điểm chung tương đồng nhưng mỗi ngôn ngữ lại có các cúpháp sử dụng riêng Công việc của các lập trình viên là họ phải học các quy tắc,
cú pháp và cấu trúc ngôn ngữ rồi thực hiện viết mã nguồn trong một trình soạnthảo hoặc IDE và biên dịch code thành ngôn ngữ máy để máy tính có thể hiểuđược Các ngôn ngữ script không yêu cầu trình biên dịch mà sử dụng các trìnhthông dịch để thực thi script
2.2 Các loại ngôn ngữ lập trình
2.2.1 Ngôn ngữ máy
Ngôn ngữ máy – mã máy (machine language): là ngôn ngữ nền tảng của
bộ vi xử lý Các chương trình được viết trong tất cả các loại ngôn ngữ khác cuốicùng đều được chuyển thành ngôn ngữ máy trước khi chương trình đó được thihành Các chỉ thị trong ngôn ngữ máy được biểu diễn dưới dạng mã nhị phân.Đây là ngôn ngữ duy nhất mà bộ vi xử lí có thể nhận biết và thực hiện một cáchtrực tiếp
2.2.2 Hợp ngữ
Hợp ngữ (assembly language) là một ngôn ngữ lập trình bậc thấp, nó dùngcác từ viết tắt trong tiếng Anh để viết chương trình Ví dụ: Input = nhập; add =phép cộng; sub = phép trừ,.v.v
Hợp ngữ đã từng được dùng rộng rãi trong tất cả các khía cạnh lập trình ,nhưng ngày nay nó có xu hướng chỉ được dùng trong một số lĩnh vực hẹp, chủyếu để giao tiếp trực tiếp với phần cứng hoặc xử lý các vấn đề liên quan đến tốc
Trang 12độ cao Điển hình như các trình điều khiển thiết bị, các hệ thống nhúng cấp thấp
và các ứng dụng thời gian thực
Các nhược điểm: Chương trình còn cồng kềnh, phức tạp, khó nhớ, còn phụthuộc vào loại thiết bị (vi xử lý) Để thiết bị điện tử hiểu và thực thi được chươngtrình, cần phải có công cụ hợp dịch để dịch từ hợp ngữ ra ngôn ngữ máy
2.2.3 Ngôn ngữ lập trình bậc cao
Ngôn ngữ lập trình bậc cao (High-level programming language) là ngônngữ lập trình có hình thức gần với ngôn ngữ tự nhiên, có tính độc lập cao, ít phụthuộc vào loại thiết bị (loại vi xử lý) cũng như các trình dịch
Một số ngôn ngữ lập trình bậc cao phổ biến hiện nay như: ngôn ngữ lậptrình C, C++, Java, Pascal, PHP, Visual Basic
Ngữ nghĩa là xác định ý nghĩa thao tác cần phải thực hiên, ứng với tổ hợp kí
tự dựa vào ngữ cảnh của nó
Lỗi ngữ nghĩa chỉ được phát hiện khi thực hiện chương trình trên dữliệu cụ thể.
2.3.4 Một số khái niệm khác
a Khái niệm về tên
Mọi đối tượng trong chương trình đều phải được đặt tên theo quy tắc củamỗi ngôn ngữ lập trình và từng chương trình dịch cụ thể
Trang 13Tên dành riêng là những tên được ngôn ngữ lập trình quy định với ý nghĩaxác định Mà người lập trình không thể dùng với ý nghĩa khác Tên dànhriêng còn được gọi là từ khóa.
o Ví dụ một số từ khóa:
o Trong ngôn ngữ Pascal: program, var, uses, Begin, End…
o Trong ngôn ngữ C++: main, include, while, void…
Tên chuẩn là những tên được ngôn ngữ lập trình dùng với ý nghĩa nào đótrong các thư viện của NNLT, tuy nhiên người lập trình có thể sử dụng với
ý nghĩa khác Tên dành riêng còn được gọi là từ khóa
o Ví dụ một số tên chuẩn:
o Trong ngôn ngữ Pascal: Real, lnteger, Sin, Cos, Char…
o Trong ngôn ngữ C++: cin, cout, getchar…
Tên do người lập trình tự đặt được xác định bằng cách khai báo trước khi
sử dụng và không được trùng với tên dành riêng Các tên trong chươngtrình không được trùng nhau
Hằng logic: là các giá trị đúng hoặc sai.
c Khái niệm về biến
Biến là đại lượng được đặt tên, giá trị có thể thay đổi được trong chươngtrình
Các NNLT có nhiều loại biến khác nhau
Biến phải khai báo trước khi sử dụng
d Khái niệm về chú thích
Chú thích giúp cho người đọc chương trình nhận biết ý nghĩa của chươngtrình đó dễ dàng hơn, chú thích không ảnh hưởng đến nội dung chương trìnhnguồn và được chương trình đích bỏ qua
2.4 Các bước xây dựng một ngôn ngữ lập trình
Về cơ bản để xây dựng một ngôn ngữ lập trình có hai bước chính như sau:
Trang 14lệnh ví dụ như quy tắc khai báo biến khư thế nào, quy tắc viết vong lặp nhưthế nào, quy tắc viết câu lệnh rẽ nhành như thế nào Mỗi ngôn ngữ sẽ có một
bộ quy tắc riêng
Ví dụ như: Để viêt câu lệnh in ra màn hình đoạn văn bản “Hello World!’’,
- trong python ta sẽ viết như sau: print(“Hello World”)
- còn trong java ta sẽ viết như sau: System.out.println(“Hello World!”)
2.4.2 Xây dựng trình dịch ngôn ngữ
Trình dịch ngôn ngữ là một phần mềm dịch các chương trình từ một ngônngữ nguồn ở dạng có thể đọc được bởi con người thành một chương trình tươngđương bằng ngôn ngữ đối tượng Ngôn ngữ nguồn nói chung là ngôn ngữ lập trìnhcấp cao và ngôn đối tượng thường là ngôn ngữ máy Có hai loại trình dịch đó làTrình biên dịch (Compilers) và trình thông dịch (Interpreters):
a Trình thông dịch
Trình thông dịch là một thay thế để thực thi một ngôn ngữ lập trình và thựchiện công việc tương tự như một trình biên dịch Trình thông dịch thực hiệnkiểm tra từ vựng, phân tích cú pháp và kiểm tra các kiểu tương tự như trìnhbiên dịch Nhưng trình thông dịch xử lý cây cú pháp trực tiếp để truy cập cácbiểu thức và thực thi câu lệnh thay vì tạo mã trung gian
Một trình thông dịch có thể yêu cầu xử lý cùng một cây cú pháp nhiều lần,
đó là lý do tại sao tốc độ sẽ đối chậm hơn so với thực hiện chương trình đượcbiên dịch
Việc biên dịch và thông dịch kết hợp để có thể thực thi ngôn ngữ lập trình.Trong đó một trình biên dịch tạo mã ở cấp trung gian, sau đó mã được diễngiải thay vì được biên dịch thành mã máy
Sử dụng một trình thông dịch thì sẽ thuận lợi trong quá trình phát triểnchương trình, trong đó phần quan trọng nhất là có thể kiểm tra việc sửa đổichương trình một cách nhanh chóng thay vì chạy chương trình một cách hiệuquả
b Trình biên dịch
Trình biên dịch là một trình dịch đọc một chương trình được viết bằngngôn ngữ bậc cao và chuyển đổi nó thành ngôn ngữ máy hoặc ngôn ngữ cấpthấp hơn và báo cáo các lỗi có trong chương trình Nó chuyển đổi toàn bộ mãnguồn trong một lần hoặc có thể mất nhiều lượt như vậy, nhưng cuối cùngngười dùng sẽ nhận được mã đã được biên dịch sẵn sàng để thực thi
Trang 15Hình 3: Trình biên dịch
Trình biên dịch hoạt động thoe từng giai đoạn, các giao đoạn khác nhau cóthể được nhóm thành hai thành phần đó là:
- Giai đoạn phân tích, cũng được gọi là phần đầu: trong đó chương
trình được chia thành các phần cấu thành cơ bản và kiểm tra ngữ pháp,ngữ nghĩa và cú pháp của mã sau khi mã trung gian được tạo Giaođoạn phân tích bao gồm phân tích từ vựng, phân tích ngữ nghĩa vàphân tích cú pháp
- Giai đoạn tổng hợp, còn được gọi là phần cuối: trong đó mã trung
gian được tối ưu hóa và mã đích được tạo Giai đoạn tổng hợp baogồm trình tối ưu mã hóa và trình tạo mã
Các giai đoạn biên dịch
- Trình phân tích từ vựng: Nó quét mã dưới nhóm ký tự, nhóm chuỗi
ký tự thành từ vựng và ra chuỗi mã thông báo có tham chiếu đến ngônngữ lập trình
- Trình phân tích cú pháp: Trong giai đoạn này, các mã thông báo
được tạo trong giai đạn trước được kiểm tra theo ngữ pháp của ngônngữ lập trình, cho dù các biểu thức có đúng về mặt cú pháp hay không
- Trình phân tích ngữ nghĩa: Nó xác minh xem các biểu thức và câu
lệnh được tạo trong giai đoạn trước có tuân theo quy tắc của ngôn ngữlập trình hay không và nó tạo ra các cây phân tích chú thích
- Trình tạo mã trung gian: Nó tạo ra một mã trung gian tương đương
với mã nguồn Có nhiều cách trình bày mã trung gian, nhưng TAC (mãđịa chỉ ba) được sử dụng rộng rãi nhất
TAC (mã địa chỉ ba) là một biểu thức được biên dịch sử dụng như mộtcông cụ để hiệu chỉnh lại mã nguồn Mỗi mã địa chỉ ba được cấu thành
từ bốn phần tử: toán tử, toán hạng 1, toán hạng 2, và kết quả
Mỗi câu lệnh có một dạng chung như sau: x:= y (op) z (Với x, y, z làcác biến, các hằng hoặc biến trung gian được tạo bởi trình biên dịch;
op là toán tử đại số, hoặc các toán tử logic như AND, OR)
Trang 16Một biểu thức có nhiều đơn một phép toán cơ bản sẽ được chia nhỏ đểđưa về dạng mã địa chỉ ba Ví dụ phép toán p:= x + y * z sẽ đượcchuyển thành:
t1:= y * z
p:= x + t1
- Trình tối ưu hóa mã: Nó cải thiện yêu cầu về thời gian và không gian
cuaur chương trình Để làm như vậy, nó loại bỏ mã dự phòng có trongchương trình
- Trình tạo mã: Đây là giai đoạn cuối cùng của trình biên dịch, trong
đó mã đích cho một máy cụ thể được tạo Nó thực hiện các hoạt độngnhư quản lý bộ nhớ, gán đăng ký và tối ưu hóa cụ thể cho máy
Hình 4: Các giai đoạn biên dịch
Symbol Table: Nó là một cấu trúc dữ liệu quản lý các mã định danh
cùng với loại dữ liệu có liên quan mà nó đang lưu trữ Trình xử lý lỗi pháthiện, báo cáo, sửa các lỗi gặp phải giữa các giai đoạn khác nhau của trìnhbiên dịch
Trang 17c So sánh
Đây là bảng so sánh giữa trình biên dịch và trình thông dịch
Tiêu chí Trình biên dịch Trình thông dịch
Đầu vào Toàn bộ chương trình Chỉ một dòng codeĐầu ra Mã đối tượng trung gian Không tạo ra bất kỳ mã
đối tượng trung gian nào
Cơ chế hoạt
động Việc biên dịch sẽ phải hoànthành trước khi thực thi Việc biên dịch và thực thisẽ là đồng thờiTốc độ Nhanh hoăn Chậm hơn
Bộ nhớ Yêu cầu bộ nhớ nhiều hơn
do việc tạo mã đối tượng
Nó đòi hỏi ít bộ nhớ hơn
vì nó không tạo mã trung
gianErors Hiển thị tất cả các lỗi sau khi
biên dịch
Hiển thị lỗi của từng dòng
mộtPhát hiện error Rất khó khăn Tương đối dễCác ngôn ngữ
lập trình C, C++, C#, Scala,TypeScript PHP, Perl, Python, Ruby
Bảng 1: Bảng so sánh trình biên dịch và trình thông dịch
d Xây dựng
Để xây dựng được trình dịch ta cần xác định được ngôn ngữ lập trình của mình sẽ dùng loại trình dịch nào, là trình thông dịch hay trình biên dịch ngôn ngữ dùng để xây dựng, có thể sử dụng bất kỳ ngôn ngữ lập trình nào
2.5 Ngôn ngữ lập trình Python
Hình 5: Ngôn ngữ lập trình python
Python là một ngôn ngữ lập trình bậc cao cho các mục đích lập trình đa năng,
do Guido van Rossum tạo ra và lần đầu ra mắt vào năm 1991 Python được thiết
kế với ưu điểm mạnh là dễ đọc, dễ học và dễ nhớ Python là ngôn ngữ có hìnhthức rất sáng sủa, cấu trúc rõ ràng, thuận tiện cho người mới học lập trình Cấutrúc của Python còn cho phép người sử dụng viết mã lệnh với số lần gõ phím tốithiểu
Trang 18Chương 3 Phân tích thiết kế hệ thống 3.1 Thiết kế ngôn ngữ
3.1.1 Ngữ pháp
Hình 6: Ngữ pháp
Trang 19- Statements: là các câu lệnh, các câu lệnh thì có thể chứa các câu lệnh khác và ký tự xuống dòng
- Statement: là dòng lệnh đơn, có thể là các lệnh như break, return hoặc các biểu thức
- Expr (expression): là biểu thức, có thể là khai báo biến, hoặc là biểuthức so sánh
- Comp-expr (compare expression): là biểu thức so sánh, có thể chứa thêm biểu thức số học
- Arith-expr (arithmetic expression): là biểu thức số học cộng, trừ
- Term: là nhân chia giữa các factor
- Factor: là các biểu thức cộng trừ với các factor khác, hoặc là power
- Power: là gọi chức năng tính số mũ
- Call: gọi hàm
- Atom: các loại hàm có sẵn, hoặc tên hàm
- List-expr: định nghĩa kiểu dữ liệu list
- If-expre: định nghĩa lệnh rẽ nhánh
- If-expr-b: định nghĩa lệnh elif
- If-expr-c: định nghĩa lệnh else
- For-expr: định nghĩa vòng lặp for
- While-expr: định nghĩa vòng lặp while
- Func-def: định nghĩa cách tạo hàm
Hình 7: Expr, term, factor
3.1.2 Cú pháp
- Khai báo biến: VAR <tên biến> giá trị
Tên biến chỉ bao gồm chữ cái, chữ số và dấu gạch dưới, dấu gạch dưới và chữ
số không thể đứng đầu
- Câu lệnh rẽ nhánh If
+ IF <điều kiện> THEN <công việc>
+ IF <điều kiện> THEN
ELIF <điều kiện> THEN
<công việc>