Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

1.Định nghĩa Chương trình dịch?

Các giai đoạn của Chương trình


dịch? Cho ví dụ?
*ĐN:
-Chương trình dịch (compiler) là một chương trình làm nhiệm vụ
đọc một chương trình được viết bằng một ngôn ngữ - ngôn ngữ
nguồn (source language) - rồi dịch nó thành một chương trình tương
đương ở một ngôn ngữ khác - ngôn ngữ đích (target languague).
-Chương trình dịch ta còn gọi là trình biên dịch.
-Một phần quan trọng trong quá trình dịch là ghi nhận lại các lỗi có
trong chương trình nguồn để thông báo lại cho người viết chương
trình.
*Các giai đoạn:
-Phân tích từ vựng (Lexical Analysis):
+Giai đoạn phân tích từ vựng sẽ đọc chương trình nguồn từ trái
sang phải (linear analysis/scanning) để tách ra thành các mã thông
báo (token).
+Trong quá trình phân tích từ vựng các khoảng trắng (blank) sẽ bị
bỏ qua.
+Ví dụ:
Quá trình phân tích từ vựng cho câu lệnh gán position = initial + rate
* 60 sẽ tách thành các token (từ tố) như sau:
1. Định danh (identifier) position
2. Ký hiệu phép gán =
3. Định danh initial
4. Ký hiệu phép cộng +
5. Định danh rate
6. Ký hiệu phép nhân *
7. Số 60
-Phân tích cú pháp (Syntax Analysis):
+Giai đoạn phân tích cú pháp thực hiện công việc nhóm các token
của chương trình nguồn thành các cụm từ văn phạm (grammatical
phrase)
+Thông thường các cụm từ văn phạm này được biểu diễn bằng cây
phân tích cú pháp (parse tree) với:
#Ngôn ngữ được định nghĩa bởi các luật sinh (production)
#Phân tích cú pháp dựa vào luật sinh để xây dựng cây phân tích cú
pháp.
+Ví dụ:
Nhiều ngôn ngữ lập trình định nghĩa các câu lệnh (statement) theo
cách như sau :
1) Nếu id1 là một định danh và expr2 là một biểu thức thì id1 :=
expr2 là một lệnh (stmt).
2) Nếu expr1 là một biểu thức và stmt2 là một lệnh thì
while (expr1) do stmt2
If (expr1) then stmt2
đều là các lệnh.
-Phân tích ngữ nghĩa (Semantic Analysis)
+Giai đoạn phân tích ngữ nghĩa sẽ thực hiện việc kiểm tra xem
chương trình nguồn có chứa lỗi về ngữ nghĩa hay không
+Tập hợp thông tin về các kiểu dữ liệu cho giai đoạn sinh mã về sau
+Sử dụng cấu trúc phân cấp của giai đoạn phân tích cú pháp để xác
định các toán tử, toán hạng của các biểu thức và câu lệnh
+Một phần quan trọng trong giai đoạn phân tích ngữ nghĩa là kiểm
tra kiểu (type checking) và ép chuyển đổi kiểu
+Ví dụ:
Trong câu lệnh position := initial + rate * 60
Giả sử các biến rate, initial và position được khai báo là real,
60 là số integer vì vậy trình biên dịch sẽ đổi số nguyên 60 thành số
thực 60.0 bằng hàm inttoreal
-Sinh mã trung gian (Intermediate Code Generator)
+Sau khi phân tích cấu trúc và ngữ nghĩa, một số trình biên dịch sẽ
tạo ra một dạng biểu diễn trung gian của chương trình nguồn
+Mã trung gian có 2 đặc tính quan trọng: Dễ tạo và dễ dàng chuyển
đổi thành chương trình đích.
+Mã trung gian có cách biểu diễn. Thông thường người ta sử dụng
dạng "mã máy 3 địa chỉ" (three-address code), tương tự như dạng
hợp ngữ cho một máy mà trong đó mỗi vị trí bộ nhớ có thể đóng vai
trò như một thanh ghi.
+Ví dụ:
Lệnh position := initial + rate * 60 khi chuyển sang dạng mã trung
gian three-address code có dạng:
temp1 := inttoreal (60)
temp2 := id3 * temp1
temp3 := id2 + temp2
id1 := temp3
Ta dùng id1, id2, id3 thay thế cho position, initial và rate để nhấn
mạnh rằng tên của một nhận dạng sẽ bị thay đổi khi ta biên dịch
chương trình
-Tối ưu mã (Code Optimizer):
+Giai đoạn tối ưu mã cố gắng tối ưu mã trung gian để thu được mã
máy thực hiện nhanh hơn.
+Ví dụ:
Mã trung gian nêu trên có thể tối ưu thành:
temp1 := id3 * 60.0
id1 := id2 + temp1
-Sinh mã (Code generation):
+Giai đoạn cuối cùng của biên dịch là sinh mã đích, thường là mã
máy hoặc mã hợp ngữ.
+Vị trí các vùng nhớ gán cho các biến được chương trình sử dụng.
+Sau đó, các lệnh trung gian được dịch lần lượt thành chuỗi các chỉ
thị mã máy. Vấn đề quyết định là việc gán các biến cho các thanh
ghi.
+Ví dụ:
Sử dụng các thanh ghi (chẳng hạn R1, R2) cho việc sinh mã đích
như sau:
MOVF id3, R2
MULF #60.0, R2
MOVF id2, R1
ADDF R2, R1
MOVF R1, id1
2.Các thế hệ ngôn ngữ lập trình? Vai trò của Chương trình dịch đối
với ngôn ngữ lập trình?
-Các thế hệ ngôn ngữ lập trình được phân loại dựa trên cách mã
nguồn được mã hóa và thực thi trên máy tính.
-Cụ thể, các thế hệ ngôn ngữ lập trình được phân loại như sau:
+Ngôn ngữ lập trình thế hệ đầu tiên (First-generation programming
language): Là ngôn ngữ máy, dùng các mã lệnh số để thực thi trên
máy tính.
+Ngôn ngữ lập trình thế hệ thứ hai (Second-generation programming
language): Là ngôn ngữ hợp ngữ (assembly language), được viết
bằng các từ khóa và biểu tượng thay vì các số hệ thống.
+Ngôn ngữ lập trình thế hệ thứ ba (Third-generation programming
language): Là các ngôn ngữ lập trình cao cấp như C, C++, Java,
Python, và nhiều ngôn ngữ khác, được viết bằng các từ và cú pháp
dễ đọc hiểu hơn cho con người.
+Ngôn ngữ lập trình thế hệ thứ tư (Fourth-generation programming
language): Là các ngôn ngữ lập trình cao cấp hơn cả thế hệ thứ ba,
được thiết kế để giải quyết các vấn đề cụ thể như xử lý dữ liệu, phân
tích, quản lý cơ sở dữ liệu, và phát triển ứng dụng di động.
+Ngôn ngữ lập trình thế hệ thứ năm (Fifth-generation programming
language): Là các ngôn ngữ lập trình được thiết kế để làm việc với
trí tuệ nhân tạo và các hệ thống thông minh.
-Về vai trò của chương trình dịch đối với ngôn ngữ lập trình, chương
trình dịch là một công cụ quan trọng để biên dịch mã nguồn từ ngôn
ngữ lập trình sang mã máy hoặc ngôn ngữ đích. Chương trình dịch
giúp cho các nhà phát triển có thể viết mã nguồn bằng các ngôn ngữ
lập trình cao cấp hơn và dễ đọc hơn, mà không cần phải hiểu về
ngôn ngữ máy. Chương trình dịch cũng giúp tối ưu hóa mã nguồn,
tăng tốc độ thực thi và sửa lỗi mã nguồn trước khi thực thi.
3.Định nghĩa văn phạm? Bài tập về văn phạm sinh ngôn ngữ? Biểu
thức chính quy đặc tả ngôn ngữ?
*Văn phạm:

-Văn phạm (Grammar) là một bộ quy tắc định nghĩa cách một ngôn
ngữ được cấu thành từ các thành phần cơ bản của nó. Văn phạm
thường được sử dụng trong ngành khoa học máy tính để định nghĩa
ngữ pháp và cú pháp của một ngôn ngữ lập trình.
-Quy ước:
+Ký hiệu kết thúc được viết bằng chữ thường hoặc các số.
+Ký hiệu chưa kết thúc được viết bằng chữ in.
+Ký hiệu chưa kết thúc nằm bên trái của sản xuất đầu tiên là ký hiệu
bắt đầu.
-Để thuận tiện về mặt kí hiệu, ta dùng định nghĩa chính qui (ĐNCQ)
để đặt tên cho các BTCQ
*Biểu thức chính quy
-Biểu thức chính quy (Regular Expression) là một công cụ được sử
dụng để đặc tả các chuỗi ký tự theo một mẫu nhất định. Biểu thức
chính quy thường được sử dụng để tìm kiếm và so khớp các chuỗi
ký tự trong các ứng dụng văn bản như tìm kiếm và thay thế, phân
tích cú pháp, và kiểm tra tính hợp lệ của định dạng email hoặc số
điện thoại. Biểu thức chính quy cũng được sử dụng để đặc tả ngôn
ngữ thông qua các quy tắc ký tự và cú pháp.
-Một ĐNCQ là một dãy các định nghĩa có dạng
d1 → r1
d2 → r2
.........
d n → rn
-Trong đó di là các tên, ri là các BTCQ trên tập các kí hiệu Σ∪{d1,
d2, ....di-1}

4.Định nghĩa otomat? Các thành phần của otomat? Bài tập về otomat
đoán nhận ngôn ngữ và biểu thức chính quy? Vẽ đồ thị chuyển?
-Automaton (Otomat) là một mô hình toán học đơn giản được sử
dụng để mô hình hóa hệ thống tự động. Otomat được sử dụng trong
nhiều lĩnh vực, ví dụ như trong lý thuyết tính toán, xử lý ngôn ngữ tự
nhiên, xử lý tín hiệu, v.v...
-Các thành phần của Otomat bao gồm:
+Trạng thái (State): Trạng thái là những điểm đánh dấu về trạng thái
của hệ thống tại một thời điểm nào đó.
+Bộ ký tự vào (Input Alphabet): Bộ ký tự vào là tập hợp các ký tự
đầu vào được chấp nhận bởi Otomat.
+Hàm chuyển trạng thái (Transition function): Hàm chuyển trạng
thái biểu diễn các quy tắc chuyển đi từ một trạng thái đến trạng thái
khác dựa trên các ký tự đầu vào.
+Trạng thái ban đầu (Initial state): Trạng thái ban đầu là trạng thái
khởi đầu của Otomat.
+Trạng thái kết thúc (Accepting state): Trạng thái kết thúc là trạng
thái mà Otomat chấp nhận nhận dạng chuỗi đầu vào.
5.Biểu thức chính quy?
-Biểu thức chính quy là một chuỗi ký tự được sử dụng để mô tả một
ngôn ngữ hình thức. Biểu thức chính quy được sử dụng trong lý
thuyết ngôn ngữ hình thức và trong các ứng dụng liên quan đến xử
lý ngôn ngữ như trích xuất thông tin từ văn bản, kiểm tra cú pháp,
tìm kiếm và thay thế. Biểu thức chính quy được sử dụng để miêu tả
các quy tắc cú pháp của một chuỗi ký tự và bao gồm các ký tự, toán
tử và ký hiệu đặc biệt.
-Các ký tự trong biểu thức chính quy thường đại diện cho các ký tự
hoặc chuỗi ký tự cụ thể, ví dụ như "a" để biểu diễn ký tự "a", hoặc
"abc" để biểu diễn chuỗi ký tự "abc". Các toán tử trong biểu thức
chính quy được sử dụng để kết hợp các ký tự hoặc chuỗi ký tự thành
các mẫu phức tạp hơn. Ví dụ, toán tử "|" được sử dụng để chỉ định
một trong các tùy chọn khả dĩ, như trong biểu thức "a|b" để biểu diễn
ký tự "a" hoặc "b". Các ký hiệu đặc biệt trong biểu thức chính quy
được sử dụng để chỉ định các vị trí đặc biệt trong chuỗi, chẳng hạn
như "^" để chỉ định vị trí đầu tiên của chuỗi hoặc "$" để chỉ định vị
trí cuối cùng của chuỗi.
-Ví dụ về một biểu thức chính quy đơn giản là "a(b|c)*", biểu thị một
chuỗi bắt đầu với ký tự "a", theo sau bởi bất kỳ số lượng lặp lại của
một chuỗi bao gồm ký tự "b" hoặc "c". Biểu thức chính quy này có
thể được sử dụng để mô tả một loạt các chuỗi như "ab", "ac", "abb",
"abc", "accccccb" và nhiều hơn nữa.
Bài1:Cho các văn phạm:

a)Văn phạm G sinh ra các chuỗi gồm các ký tự a và b có dạng:


ABC → iADj → iDj → iDiCj → iBiCj → iBj → ij ABC →
iADj → iDj → iDCiCj → iBCiCj → iBj → ij
Vì vậy, ngôn ngữ được sinh ra bởi văn phạm G là {ij | i,j ∈ {a,b}}.
Biểu thức chính quy đặc tả ngôn ngữ này là: (a|b)*.
b)Văn phạm G sinh ra các chuỗi có dạng sau:
S → SS → aSbS → aaSbbS → aabSbbS → aabbSbS → aabbab
S → SS → aSbS → aSbbSb → aaSbbbSb → aabSbbbsb → aabbSbb
→ aabbba
S → SS → bSaS → bSaab → bsaaSab → bsaaabab
Vì vậy, ngôn ngữ được sinh ra bởi văn phạm G là tập các chuỗi chứa
các ký tự a và b sao cho số lượng ký tự a bằng số lượng ký tự b.
Biểu thức chính quy đặc tả ngôn ngữ này là: (ab | ba)*.
c)Văn phạm G sinh ra các chuỗi có dạng sau:
S → aS → aaS → aaaS → ...
S → a → a1 | a2 | ... | an
Vì vậy, ngôn ngữ được sinh ra bởi văn phạm G là tập các chuỗi chứa
các ký tự a, trong đó số lượng ký tự a bất kỳ. Biểu thức chính quy
đặc tả ngôn ngữ này là: a*.
Bài2: Hãy xác định biểu thức chính quy biểu diễn ngôn ngữ được
đoán nhận bởi otomat hữu hạn có đồ thị chuyển như sau:

Bài 3: Hãy xây dựng các biểu thức chính quy và các otomat hữu hạn
đơn định biểu diễn các ngôn ngữ sau:

You might also like