Tì
hbiê
dị
h
T
r
ì
n
h
biê
n
dị
c
h
Bà
i
1
T
ổ
Bà
i
1
–
T
ổ
ng quan
Các chủ đề chính
•
Thế nào là
trì
nh biên
dị
ch
•
Thế
nào
là
trì
nh
biên
dị
ch
•Sự cần thiết của trình biên dịch
•Những yêu cầu đối với một trình biên dịch
T ihiêứ tì hbiê dị h
•
T
ạ
i
sao ng
hiê
n c
ứ
u
t
r
ì
n
h
biê
n
dị
c
h
•Cấu trúc chung của trình biên dịch
– Trình biên dịch 2 chuyến
– Trình biên dịch 3 chuyến
–Các kỹ thuật dịch
•Các
p
ha của trình biên d
ị
ch
p ị
– Phân tích từ vựng
– Phân tích cú pháp
–
Phân
tí
ch ng
ữ nghĩ
a
Phân
tí
ch
ng
ữ
nghĩ
a
– Phát sinh mã trung gian
–Tối ưu mã
–
Phá
tsinh
mã
2
Phá
t
sinh
mã
• Các công cụ xây dựng trình biên dịch
•Các chương trình hỗ trợ
Thế nào là trình biên dịch
• Trình biên dịch là một phần mềm có nhiệm vụ chuyển một
chương trình, được viết bởi ngôn ngữ nguồn, sang chương
trình tương đương, biểu diễn bởi ngôn ngữ đích.
– Ngôn ngữ nguồn thường là các ngôn ngữ cấp cao.
– Ngôn ngữ đích: thường là ngôn ngữ cấp thấp (mã máy hay
mã hợp ngữ).
Thô
bá
á
l
ỗ
i
ủ
h
tì
h
ồ
đ
há
thi
ệ
•
Thô
ng
bá
o c
á
c
l
ỗ
i
c
ủ
a c
h
ương
t
r
ì
n
h
ngu
ồ
n,
đ
ược p
há
t
hi
ệ
n
trong quá trình dịch.
3
Ví dụ: Thế giới của con người và máy tính
ồ ế ằ ấ
1. Mã ngu
ồ
n được vi
ế
t b
ằ
ng ngôn ngữ c
ấ
p cao.
2. Thông thường được dịch sang mã hợp ngữ của hệ thống.
3
Trình biên dịch hợpngữ (củahệ thống) tiếptụcdịch sang
Mã nguồnviết
Mã hợpngữ
Mã máy
3
.
Trình
biên
dịch
hợp
ngữ
(của
hệ
thống)
tiếp
tục
dịch
sang
mã máy.
7F45 4C46 0102 0100 0000 0000 0000 0000 0002 0002 0000 0001 0001 04A0
0000 0034 0000 1474 0000 0000 0034 0020 0005 0028 001B 0019 0000 0006
0000 0034 0001 0034 0000 0000 0000 00A0 0000 00A0 0000 0005 0000 0000
0000 0003 0000 00D4 0000 0000 0000 0000 0000 0011 0000 0000 0000 0004
int main(void) {
int
a
b
s
;
Mã
nguồn
viết
bằng ngôn ngữ C
Mã
hợp
ngữ
(Hệ thống SPARC)
Mã
máy
0000 0000 0000 0001 0000 0000 0001 0000 0000 0000 0000 0782 0000 0782
0000 0005 0001 0000 0000 0001 0000 0784 0002 0784 0000 0000 0000 0188
0000 01A4 0000 0007 0001 0000 0000 0002 0000 0838 0002 0838 0000 0000
0000 00B8 0000 0000 0000 0007 0000 0000 2F75 7372 2F6C 6962 2F6C 642E
736F 2E31 0000 0000 0000 0017 0000 0016 0000 0000 0000 0001 0000 0002
0000 0000 0000 0003 0000 0004 0000 0006 0000 0007 0000 0009 0000 0000
0000 000A 0000 000C 0000 000D 0000 000E 0000 0000 0000 0000 0000 000F
0000 0010 0000 0000 0000 0011 0000 0012 0000 0013 0000 0015 0000 0000
0000 0000 0000 0000 0000 0000 0000 0005 0000 0000 0000 0000 0000 0008
int
a
,
b
,
s
;
printf("Enter two integers: ");
scanf("%d %d", &a, &b);
s = a*a + b*b;
printf("%d^2 + %d^2
=
%
d
\
n"
,
a,
b,
s)
;
0000 0000 0000 0000 0000 000B 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0014 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 0002 0924 0000 0004
1100 0014 0000 000A 0001 0782 0000 0000 1100 000C 0000 0011 0002 07A4
0000 0000 1100 000E 0000 002B 0002 07D4 0000 0000 1200 0000 0000 0032
0002 081C 0000 0000 1200 0000 0000 0038 0000 0000 0000 0000 2000 0000
0000 004E 0002 0928 0000 0000 1100 0014 0000 0053 0002 0838 0000 0000
1100 000F 0000 005C 0002 0924 0000 0004 2100 0014 0000 0064 0002 0810
0000 0000 1200 0000 0000 006B 0002 0784 0000 0000 1100 000D 0000 0081
0002
0828
0000
0000
1200
0000
0000
008
0002
0
E
0
0000
0000
1200
0000
%
d
\
,
a,
b,
s)
;
}
4
0002
0828
0000
0000
1200
0000
0000
008
7
0002
0
7
E
0
0000
0000
1200
0000
0000 008C 0002 090C 0000 0000 1100 0013 0000 0093 0002 07EC 0000 0000
1200 0000 0000 0099 0001 0714 0000 001C 1200 000A 0000 009F 0001 0730
0000 0014 1200 000B 0000 00A5 0001 04A0 0000 0074 1200 0009 0000 00AC
0000 0000 0000 0000 2000 0000 0000 00C4 0001 0748 0000 0004 1100 000C
0000 00D1 0001 0634 0000 007C 1200 0009 005F 656E 7669 726F 6E00 5F65
7465 7874 005F 5052 4F43 4544 5552 455F 4C49 4E4B 4147 455F 5441 424C
…
Sự cần thiết của trình biên dịch
•Những khó khăn khi sử dụng ngôn ngữ cấp thấp (hợp ngữ
hay ngôn ngữ máy)
–Viết mã nhiều, kém thân thiện.
–Hỗ trợ tìm lỗi kém.
ả
ả
ấ
–
Kh
ả
năng b
ả
o trì th
ấ
p.
–Trở ngại trong việc đọc và hiểu chương trình.
S
ra đ
ờ
i
củ
a ngôn ng
ữ
l
ậ
p
trì
nh c
ấ
pcao
àtrì
nh biên
dị
ch
•
S
ự
ra
đ
ờ
i
củ
a
ngôn
ng
ữ
l
ậ
p
trì
nh
c
ấ
p
cao
v
à
trì
nh
biên
dị
ch
đã giải phóng những tiềm năng to lớn trong việc viết
chương
trì
nh.
chương
trì
nh.
•Hợp ngữ vẫn được sử dụng trong một số ít trường hợp:
–
Tr
uy
x
u
ấ
t
đế
n
cá
c
tà
i n
guyê
n
c
ấ
p
t
h
ấ
p
.
5
uy u
ấ
t
đế
cá
c
tà
guyê c
ấ
pt
ấ
p
–Các đoạn mã tương đối nhỏ, thời gian thực thi nhanh.
Những yêu cầu đối với một trình biên dịch
• Trình biên dịch bản thân phải là một phần mềm không
chứa lỗi.
•Mã đích được phát sinh phải hoàn toàn tương đương
với mã nguồnkhithựcthi
với
mã
nguồn
khi
thực
thi
.
• Trình biên dịch cần phải khả chuyển (hỗ trợ biên dịch
riêng)
riêng)
.
•Thời gian biên dịch nhanh.
Thờii th thi ã đ biê dị hh h
•
Thời
g
i
an
th
ực
thi
m
ã
đ
ược
biê
n
dị
c
h
n
h
an
h
.
•Kết xuất thông báo lỗi chính xác và có thông điệp rõ
6
ràng.
Tại sao nghiên cứu trình biên dịch
•Thế giới riêng trong ngành Khoa học máy tính
• Để xây dựng một trình biên dịch, cần hội tụ nhiều kiến thức:
–Trí tuệ nhân tạo: các giải thuật máy học, heuristic, …
–Cấu trúc dữ liệu và giải thuật: kỹ thuật băm, các giải thuật đồ
thị qui hoạch động
thị
,
qui
hoạch
động
, …
– Các mô hình tính toán, lý thuyết ngôn ngữ hình thức, toán rời
rạc, l
ý
thu
y
ết
g
iàn tron
g
p
hân tích, …
ýyggp
–Kiến trúc máy tính: quản lý đa luồng, quản lý tập chỉ thị lệnh,
phân cấp bộ nhớ, …
ầ ề
–
Công nghệ ph
ầ
n m
ề
m
–Xử lý song song
Lý thuyếtvề ngôn ngữ lập trình (truyền tham số phạmvicủa
7
–
Lý
thuyết
về
ngôn
ngữ
lập
trình
(truyền
tham
số
,
phạm
vi
của
biến, quản lý bộ nhớ, con trỏ, …)
Cấu trúc chung của trình biên dịch
Trình biên
dịch
Chương trình
nguồn
Chương trình
đích
Kết
quả
Lỗi Dữ liệu nhập
8
Trình biên dịch 2 chuyến (2-pass)
Ch
ế
t
ướ
Mã
Ch
ế
Mã
IR
Bảng danh biểu
Ch
uy
ế
n
tr
ướ
c
(front-end)
Mã
nguồn
Ch
uy
ế
n
sau
(back-end)
Mã
đích
IR
•
IR
(
Intermediate Representation
):
Mã
trung gian
Lỗi
IR
(
Intermediate
Representation
):
Mã
trung
gian
.
• Chuyến trước: còn được gọi là phần Phân tích
–
Chuy
ể
n
mã
ngu
ồ
n
(
h
ợ
pl
ệ
)
sang
mã
trung gian
Chuy
ể
n
mã
ngu
ồ
n
(
h
ợ
p
l
ệ
)
sang
mã
trung
gian
.
–Tập hợp các thông tin và lưu vào bảng danh biểu.
•
Chuy
ế
nsau
:
cò
n đ
ượ
c
gọ
i
là
ph
ầ
n
T
ổ
ng h
ợ
p
9
Chuy
ế
n
sau
:
cò
n
đ
ượ
c
gọ
i
là
ph
ầ
n
T
ổ
ng
h
ợ
p
– Chuyển mã trung gian sang mã đích.
Sự ngụybiện!?!
Fortran
Front
Fortran
Front
Fortran
code
C++
Front
end
Front
Back
end
SPARC
system
Fortran
code
C++
Front
end
Front
Back
end
SPARC
system
IRs
code
Basic
code
end
Front
end
Back
end
Pentium
system
IR
code
Basic
code
end
Front
end
Back
end
Back
Pentium
system
PowerPC
ADA
code
Front
end
Back
end
PowerPC
system
ADA
code
Front
end
Back
end
PowerPC
system
•Xây dựng (m n) trình biên dịch từ (m + n) thành phần?
• Câu trả lời: Phải tìm được mã trung gian (IR) thỏa:
Mã hóa được toàn bộ tri thứccủa
từng
chuyếntrước
–
Mã
hóa
được
toàn
bộ
tri
thức
của
từng
chuyến
trước
.
–Biểu diễn được mọi đặc tính trong một bộ mã trung gian.
–Xử lý được mọi đặc trưng trong từng chuyến sau.
10
•Chỉ đạt thành công hạn chế với mã trung gian mức thấp.
– Ứng dụng ở mức (1 + n) với ngôn ngữ như Java
Trình biên dịch 3 chuyến (3-pass)
Bảng danh biểu
Chuyến trước
(front-end)
Mã
nguồn
Chuyến sau
(back-end)
Mã
đích
IR
Chuyến giữa
(middle-end)
IR
Lỗi
T
ố
i ưu
1
T
ố
i ưu
2
T
ố
i ưu
n
IR IR IRIR
T
ố
i ưu
1
T
ố
i ưu
2
…
T
ố
i ưu
n
L
ỗ
i
11
L
ỗ
i
Các kỹ thuật dịch
Biên dịch
Thông dịch
Kỹ thuậtlai
Biên
dịch
(Compiler)
Thông
dịch
(Interpreter)
Kỹ
thuật
lai
(Hybrid)
Cổ điển Just-In-Time
Mã nguồn
Tì hbiê dị h
Mã nguồn
Dữ liệu
Mã nguồn
Trình
Mã nguồn
Trình biên dịch
ế
T
r
ì
n
h
biê
n
dị
c
h
(Chuyến trước)
Trình thông dịch
(máy ảo)
Trình
biên dịch
(Chuy
ế
n trước)
Mã trung gian
Mã
trung gian
Dữ liệu
Kết quả
Mã
máy
Dữ liệu
Trình biên dịch
(Chuyến sau i)
Trình thông dịch
(máy ảo i)
Máy tính
ế
Má tí h
i
Mã máy i
12
Kết quả
K
ế
t quả
Kết quả
Má
y
tí
n
h
i
Các pha của
trình biên dịch
Phân
tí
ch t
ừ
v
ự
ng
Chương trình nguồn
Phân
tí
ch t
ừ
v
ự
ng
Phân tích cú pháp
Luồng token
Phân tích ngữ nghĩa
Cây phân tích cú pháp
Cây
cú phá
p tr
ừ
u t
ượ
ng
Bả
dh bi
ể
Phát sinh mã trung gian
Cây
cú phá
p tr
ừ
u t
ượ
ng
Mã trung gian
Bả
ng
d
an
h bi
ể
u
Bộ xử lý lỗi
Cây cú pháp
úí
Tối ưu mã trung gian
há
h
ã
đ
í
h
Mã trung gian
ch
ú
th
í
ch
P
há
t sin
h
m
ã
đ
í
c
h
Mã đích
Tối ưu mã đích
13
Mã đích
Phân tích từ vựng
(
Lexical analysis/Scanning
)
(
Lexical
analysis/Scanning
)
•
Đ
ọ
clu
ồ
ng
ký
t
ự củ
achương
trì
nh ngu
ồ
n
Đ
ọ
c
lu
ồ
ng
ký
t
ự
củ
a
chương
trì
nh
ngu
ồ
n
.
• Nhóm các ký tự thành các lexeme (có nghĩa).
V
ớ
i
ỗ
i
l
b
ộ
hâ
tí
ht
ừ
•
V
ớ
i
m
ỗ
i
l
exeme,
b
ộ
p
hâ
n
tí
c
h
t
ừ
vựng:
–Tạo token tương ứng và gửi cho bộ phân tích cú pháp.
–Lưu thông tin vào bảng danh biểu.
•Loại trừ các khoảng trắng (tab, blank, comment, …).
•Kiểm tra lỗi từ vựng.
14
position = initial + rate * 60
Bộ phân tích từ vựng
id,
1
=
id,
2
+
id,
3
*
60
id,
1
id,
2
+
id,
3
60
1 position …
2 initial …
3
t
3
ra
t
e …
Bản
g
danh biểu
15
g
Phân tích cú pháp
(
St li/P i
)
(
S
yn
t
ax ana
l
ys
i
s
/P
ars
i
ng
)
•
S
ử dụ
ng
token
để
xây d
ự
ng cây phân
tí
ch
cú phá
p(
parse
S
ử
dụ
ng
token
để
xây
d
ự
ng
cây
phân
tí
ch
cú
phá
p
(
parse
tree).
Cây phân
tí
ch
cú phá
pmô
tả
c
ấ
u
trú
cvăn
phạ
m
củ
alu
ồ
ng
–
Cây
phân
tí
ch
cú
phá
p
mô
tả
c
ấ
u
trú
c
văn
phạ
m
củ
a
lu
ồ
ng
token.
Văn
phạ
m phi ng
ữ cả
nh (
contex
free grammar
CFG
)
đ
ượ
c
–
Văn
phạ
m
phi
ng
ữ
cả
nh
(
contex
-
free
grammar
–
CFG
)
đ
ượ
c
sử dụng để mô tả cấu trúc văn phạm của các ngôn ngữ lập
trì
nh.
trì
nh.
•Kiểm tra lỗi cú pháp.
16
Văn phạm phi ngữ cảnh
•Gọi văn phạm phi ngữ cảnh G = (S, N, T, P), với:
–
S: K
ý
hi
ệ
u bắt đầu của văn
p
h
ạ
m.
ý
ệ
p ạ
–N: Tập các ký hiệu không kết thúc.
–T: tập các ký hiệu kết thúc.
–P: tập các luật sinh có dạng A B với A N và B N T.
•Ví d
ụ
:
ụ
1. <assign> id = <expr>
2. <expr> <expr> + <term> | <term>
3. <term> <term> * <fact> | <fact>
4. <fact> id | num
17
id, 1=id, 2+id, 3*60
Bộ phân tích cú pháp
<assign> =
<id, 1> = <expr>
<expr>
+
<term>
<id, 1> +
<id, 2> *
<expr>
+
<term>
<term>
<term> * <fact>
<id, 3> 60
<fact>
<id
2
>
<fact>
<id
3
>
60
18
<id
,
2
>
<id
,
3
>
Cây phân tích cú pháp
Cây cú pháp trừu tượng
Phân tích ngữ nghĩa
(
Semantic analysis
)
(
Semantic
analysis
)
•Sử dụng cây cú pháp trừu tượng và bảng danh biểu để
ki
ể
t“
ữ hĩ
”
ki
ể
m
t
ra
“
ng
ữ
ng
hĩ
a
”
.
–Biến sử dụng đã được khai báo?
T
ậ
h
thô ti
l t
ữ
lê â
úhá
à
/
h
ặ
bả
•
T
ậ
p
h
ợp
thô
ng
ti
n,
l
ưu
tr
ữ
lê
n c
â
y c
ú
p
há
p v
à
/
h
o
ặ
c
bả
ng
danh biểu.
•
Ti
ế
n
hà
nh ki
ể
mtraki
ể
u(
type checking
):
•
Ti
ế
n
hà
nh
ki
ể
m
tra
ki
ể
u
(
type
checking
):
– Toán tử có phù hợp với toán hạng.
–
Chỉ
s
ố mả
ng
có phả
i
là
ki
ể
us
ố
nguyên?
Chỉ
s
ố
mả
ng
có
phả
i
là
ki
ể
u
s
ố
nguyên?
–Kiểu của toán hạng bên trái và phải phép gán có phù hợp?
–
…
19
•Thực hiện chuyển kiểu (coercion)
=
<id
1
>
+
<id
,
1
>
+
<id, 2> *
<id, 3> 60
=
Bộ phân tích ngữ nghĩa
<id, 1> +
<id, 2> *
<id
3
>
int
2
float
Chuyển kiểu
20
<id
,
3
>
int
2
float
60
Phát sinh mã trung gian
(
Intermediate Code Generation
)
(
Intermediate
Code
Generation
)
•
Trì
nh biên
dị
ch
có
th
ể
phát sinh m
ộ
tho
ặ
cnhi
ề
ubi
ể
udi
ễ
n
Trì
nh
biên
dị
ch
có
th
ể
phát
sinh
m
ộ
t
ho
ặ
c
nhi
ề
u
bi
ể
u
di
ễ
n
trung gian.
–
Câ
y
cú
p
há
p
t
r
ừu tượn
g
(
hi
g
h
-
level IR
)
.
y
p
p
g(
g
)
– Mã 3 địa chỉ, mã máy ngăn xếp (low-level IR).
•IR cấ
p
thấ
p
g
iốn
g
như chươn
g
trình được viết bằn
g
n
g
ôn
p
pg
g g
gg
ngữ của một máy ảo, có ưu điểm:
–Dễ dàng sản sinh.
–Dễ dàng dịch sang mã đích.
–Hoặc có thể chạy trực tiếp trên máy ảo.
21
Mã 3 địa chỉ
(
Three
Address Code
)
(
Three
-
Address
Code
)
•
Tương t
ự
như
cá
ccâul
ệ
nh h
ợ
png
ữ
Tương
t
ự
như
cá
c
câu
l
ệ
nh
h
ợ
p
ng
ữ
.
•Chứa tối đa 3 toán hạng trên một chỉ thị.
M
ỗ
i
tá
h
đ
ó
i
tò
h
ộ
tth h hi
•
M
ỗ
i
t
o
á
n
h
ạng
đ
ó
ng va
i
t
r
ò
n
h
ư m
ộ
t
th
an
h
g
hi
.
•Chứa tối đa một toán tử bên vế phải của chỉ thị.
Thứ tự các chỉ thị sẽ cố định thứ tự các toán tử được thực
thi.
•Khi cần thiết, các tên tạm (temporary name) có thể được
sinh ra để chứa giá trị trung gian khi tính toán.
22
Ví dụ: Biểu diễn trung gian cho biểu thức x – 2 y
23
=
<id, 1> +
id
2
*
<
id
,
2
>
*
<id, 3> int2float
60
B
ộ phá
t sinh
mã
trung gian
B
ộ phá
t sinh
mã
trung gian
t1 = int2float(60)
t2 = id3 * t1
t3 = id2 + t2
id1 = t3
24
Tối ưu mã
(
Code Optimization
)
(
Code
Optimization
)
•Cải tiến mã trung gian để cho ra mã đích “tốt hơn”.
•“Tốt hơn”: tùy trường hợp cụ thể
– Nhanh hơn.
– Mã ngắn hơn.
–Mã đích tiêu hao ít năng lượng hơn.
• Các trình biên dịch có pha “tối ưu mã” gọi là “optimizing
compiler” mất nhiều thời gian hơn.
• Có 2 loại tối ưu, liên quan đến phần cứng
–Phụ thuộc phần cứng: tối ưu trên mã đích.
25
– Độc lập phần cứng: tối ưu trên mã trung gian.
Tối ưu mã …
•Bộ tối ưu mã phải thỏa các tiêu chí sau:
Mã đượctối ưuphải đúng nghĩa là duy trì ngữ nghĩacủa
–
Mã
được
tối
ưu
phải
đúng
,
nghĩa
là
duy
trì
ngữ
nghĩa
của
chương trình được biên dịch.
Sự tối ưuphảicảitiến đượcsự thựcthicủamãbanđầu
–
Sự
tối
ưu
phải
cải
tiến
được
sự
thực
thi
của
mã
ban
đầu
.
Với hệ thống nhúng: Tối thiểu hóa kích thước mã phát sinh.
Vớithiếtbị di động: Tốithiểu hóa năng lượng sử dụng
Với
thiết
bị
di
động:
Tối
thiểu
hóa
năng
lượng
sử
dụng
.
Tăng tốc độ thực thi.
Thời gian cho quá trình tối ưumãlàhợplý
–
Thời
gian
cho
quá
trình
tối
ưu
mã
là
hợp
lý
.
– Duy trì chi phí phát triển cũng như bảo trì toàn hệ thống biên
dịch ở mứchợplý
26
dịch
ở
mức
hợp
lý
.
Bộ phát sinh mã
(
Code Generation
)
(
Code
Generation
)
•Bộ phát sinh mã:
–Nhập: IR của chương trình nguồn.
–Xuất: mã của ngôn ngữ đích.
• Ngôn ngữ đích:
–Mã máy:
Mỗi chỉ thị của mã trung gian được dịch thành dãy các mã máy.
Thanh ghi/bộ nhớ thay thế các biến trong chương trình.
T
ậ
d
khả
ă
ử d
th h hi
T
ậ
n
d
ụng
khả
n
ă
ng s
ử
d
ụng
th
an
h
g
hi
.
–Mã dạng hợp ngữ:
Ti
ế
p
tụ
cs
ử dụ
ng
trì
nh biên
dị
ch h
ợ
png
ữ để dị
ch sang
mã má
y
27
Ti
ế
p
tụ
c
s
ử
dụ
ng
trì
nh
biên
dị
ch
h
ợ
p
ng
ữ
để
dị
ch
sang
mã
má
y
.
t1 = int2float(60)
t2 = id3 * t1
t3 = id2 + t2
id1 = t3
Bộ tối ưu mã
t1 = id3 * 60.0
id1 = id2 + t1
Bộ phát sinh mã
LDF R2, id3
MULF R2, R2, #60.0
LDF R1, id2
28
ADDF R1, R1, R2
STF id1, R1
Bảng danh biểu
(
Symbol Tables
)
(
Symbol
Tables
)
•Bản chất của trình biên dịch là
Ghi h
ậ
á
dhbi
ể
đ
ử d
th
tì
h
–
Ghi
n
h
ậ
n c
á
c
d
an
h
bi
ể
u
đ
ược s
ử
d
ụng
t
rong c
h
ương
t
r
ì
n
h
.
–Tập hợp các thông tin về những thuộc tính của danh biểu:
Vù
ng nh
ớ
đ
ượ
cc
ấ
p
phá
t
Vù
ng
nh
ớ
đ
ượ
c
c
ấ
p
phá
t
.
Kiểu dữ liệu.
Ph
ạ
m vi.
ạ
Số lượng tham số truyền, kiểu tham số, kiểu truyền, kiểu trả về,
… (nếu danh biểu là tên chương trình con).
•Bảng danh biểu là cấu trúc dữ liệu gồm nhiều bản ghi
chứa:
ể
29
–
Tên danh bi
ể
u.
–Các trường (fields) tương ứng với các thuộc tính.
Xử lý lỗi
(
Error Handling
)
(
Error
Handling
)
•
Cá
cl
ỗ
i
chủ
y
ế
u đ
ượ
c
tì
m
và
x
ử lý
trong
chuyếntrước
Cá
c
l
ỗ
i
chủ
y
ế
u
đ
ượ
c
tì
m
và
x
ử
lý
trong
chuyến
trước
.
• Phân tích từ vựng:
Cá
ký
t
óhì
h
thà
hê
tk
?
–
Cá
c
ký
t
ự c
ó
hì
n
h
thà
n
h
n
ê
n
t
o
k
en
?
• Phân tích cú pháp:
–Luồng token có vi phạm luật cú pháp của ngôn ngữ?
• Phân tích ngữ nghĩa:
–Xảy ra: <tên mảng> + <tên thủ tục>?
–Chỉ mục mảng có phải là số nguyên?
30
Các công cụ xây dựng trình biên dịch
•Lợi ích của việc sử dụng các công cụ:
–
Tránh nhữn
g
chi tiết
p
hức t
ạ
p
của
g
iải thu
ậ
t.
g
p
ạ
p
g
ậ
–Dễ dàng tích hợp kết quả thành phần vào trình biên dịch.
•
M
ộ
ts
ố
công
cụ
thông
dụ
ng:
•
M
ộ
t
s
ố
công
cụ
thông
dụ
ng:
– Scanner generator: phát sinh bộ phân tích từ vựng từ những
mô
tả
token
b
ằ
ng bi
ể
uth
ứ
c
chí
nh qui
mô
tả
token
b
ằ
ng
bi
ể
u
th
ứ
c
chí
nh
qui
.
– Parser generator: phát sinh bộ phân tích cú pháp từ những
mô
tả
văn
phạ
m
củ
angônng
ữ
ngu
ồ
n
mô
tả
văn
phạ
m
củ
a
ngôn
ng
ữ
ngu
ồ
n
.
– Code-generator generator: tạo bộ phát sinh mã, dựa trên tập
lu
ậ
t
dị
ch
chỉ thị củ
a
mã
trung gian sang ngôn ng
ữ
đ
í
ch
31
lu
ậ
t
dị
ch
chỉ
thị
củ
a
mã
trung
gian
sang
ngôn
ng
ữ
đ
í
ch
.
–…
Các chương trình hỗ trợ
Chương trình nguồn
Chương
trình
nguồn
Bộ tiền xử lý
Chương trình nguồn
(đã hiệu chỉnh)
Trình biên dịch
Mã hợpngữ
Trình biên dịch hợp ngữ
Mã
hợp
ngữ
ố
Bộ liên kết/Bộ nạp
Mã máy khả tái định vị
•Tập tin mã đ
ố
i tượng
khả tái định vị
•Hàm thư viện
32
Bộ
liên
kết/Bộ
nạp
Mã máy đích
Các chương trình hỗ trợ
•Bộ tiền xử lý (Preprocessor)
– “Bung” các macro.
–Kết nối các file nguồn được lưu trữ riêng.
• Trình biên dịch hợ
p
n
g
ữ
(
A
ssembler
)
pg(
)
– Phát sinh mã máy đích từ mã hợp ngữ.
•B
ộ
liên kết
(
Linker
)
ộ (
)
– Liên kết các file mã khả tái định vị được biên dịch riêng.
–
Kết nối đ
ị
a chỉ c
ụ
thể của các hàm thư vi
ệ
n ho
ặ
c hàm h
ệ
ị ụ ệ
ặ
ệ
thống với những lời gọi hàm trong chương trình.
•Bộ nạ
p
(
Loader
)
: tải các file mã đối tượn
g
vào bộ nhớ,
33
p(
) g
chuẩn bị thực thi chương trình.