CHƯƠNG VI
KIM TRA KIU
Ni dung chính:
Hai cách kim tra kiu là kim tra tĩnh được thc hin trong thi gian biên dch
chương trình ngun và kim tra động được thc hin trong thi gian thc thi chương
trình đích. Trong chương này ta tp trung vào phn x lý ng nghĩa bng cách kim tra
tĩnh mà c thkim tra kiu. Phn đầu ca chương trình bày các khái nim v h
thng kiu, các biu thc kiu. Phn còn li mô t cách to ra mt b kim tra kiu đơn
gin.
Mc tiêu cn đạt:
Sau khi hc xong chương này, sinh viên phi nm được:
H thng kiu vi các biu thc kiu (kiu cơ s và kiu có cu trúc) thường
gp bt c mt ngôn ng lp trình nào.
Dch trc tiếp cú pháp cài đặt b kim tra kiu đơn gin t đó có th m rng
để cài đặt cho nhng ngôn ng phc tp hơn.
Kiến thc cơ bn:
Sinh viên phi biết mt s ngôn ng lp trình cp cao như Pascal, C++, Java, v.v hoc
đã được hc môn ngôn ng lp trình (phn đề cp đến các kiu cơ s và kiu có cu
trúc).
Tài liu tham kho:
[1] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey
D.Ullman - Addison - Wesley Publishing Company, 1986.
[2] Modern Compiler Implementation in C - Andrew W. Appel - Cambridge
University Press, 1997.
[3] Compiler Design – Reinhard Wilhelm, Dieter Maurer - Addison - Wesley
Publishing Company, 1996.
I. H THNG KIU
Trong các ngôn ng nói chung đều có kiu cơ s và kiu có cu trúc. Chng hn
trang Pascal, kiu cơ s là: boolean, char, integer, real, kiu min con và kiu lit kê.
Các kiu có cu trúc như mng, mu tin, tp hp, ...
1. Biu thc kiu
Biu thc kiu bao gm:
1. Kiu cơ s là mt biu thc kiu: boolean, char, integer, real. Ngoài ra còn có các
kiu cơ s đặc bit như: kiu type_error: ch ra mt li trong quá trình kim tra kiu;
kiu void, “không có giá tr”, cho phép kim tra kiu đối vi lnh.
135
2. Vì biu thc kiu có th được đặt tên, tên kiu là mt biu thc kiu.
3. Cu trúc kiu là mt biu thc kiu, các cu trúc bao gm:
a. Mng (array): Nếu T là mt biu thc kiu thì array(I, T) là mt biu thc kiu.
Mt mng có tp ch s I và các phn t có kiu T.
b. Tích (products): Nếu T1, T2 là biu thc kiu thì tích Decas T1* T2 là biu
thc kiu.
c. Mu tin (records): Là cu trúc bao gm mt b các tên trường, kiu trường.
d. Con tr (pointers): Nếu T là mt biu thc kiu thì pointer(T) là mt biu thc
kiu T.
e. Hàm (functions): Mt cách toán hc, hàm ánh x các phn t ca tp xác định
(domain) lên tp giá tr (range). Mt hàm là mt biu thc kiu D Æ R
2. H thng kiu
H thng kiu là mt b sưu tp các quy tc để gán các biu thc kiu vào các phn
ca mt chương trình. B kim tra kiu cài đặt mt h thng kiu.
3. Kim tra kiu tĩnh và động
Kim tra được thc hin bi chương trình dch được gi là kim kiu tĩnh. Kim tra
được thc hin trong khi chy chương trình đích gi là kim tra kiu động.
II. ÐC T MT B KIM TRA KIU ÐƠN GIN
Trong phn này chúng ta mô t mt b kim tra kiu cho mt ngôn ng đơn gin
trong đó kiu ca mi mt danh biu phi được khai báo trước khi s dng. B kim
tra kiu là mt lược đồ dch mà nó tng hp kiu ca mi biu thc t kiu ca các
biu thc con ca nó.
1. Mt ngôn ng đơn gin
Văn phm sau sinh ra mt chương trình, biu din bi mt ký hiu chưa kết thúc P
cha mt chui các khai báo D và mt biu thc đơn gin E.
P Æ D ; E
D Æ D ; D | id : T
T Æ char | integer | array[num] of T1 | T1
E Æ literal | num | id | E1 mod E2 | E1 [E2] | E1
Hình 6.1 - Văn phm ca mt ngôn ng đơn gin
Các kiu cơ s: char, integer và type-error
Mng bt đầu t 1. Chng hn array[256] of char là biu thc kiu (1...256,
char)
Kiu con tr T là mt biu thc kiu pointer(T).
Ta có lược đồ dch để lưu tr kiu ca mt danh biu
P Æ D ; E
136
D Æ D ; D
D Æ id : T {addtype(id.entry, T.type) }
T Æ char {T.type := char }
T Æ integer {T.type := integer }
T Æ T1 {T.type := pointer(T1.type) }
T Æ array[num] of T1 {T.type := array(1...num.val, T1.type) }
Hình 6.2- Lược đồ dch lưu tr kiu ca mt danh biu
2. Kim tra kiu ca biu thc
Lược đồ dch cho kim tra kiu ca biu thc như sau:
E Æ literal {E.type := char }
E Æ num {E.type := integer }
E Æ id {E.type := lookup(id.entry) }
E Æ E1 mod E2 {E.type := if E1.type = integer and E2.type = integer
then integer else type_error }
E Æ E1[E2] {E.type := if E2.type = integer and E1.type = array(s,t)
then t else type_error }
E Æ E1 { E.type := if E1.type = pointer(t) then t
else type_error }
Hình 6.3- Lược đồ dch kim tra kiu ca biu thc
đây ta dùng hàm lookup(e) để tìm kiu được lưu tr trong ô ca bng ký hiu mà
ô đó được tr bi e.
3. Kim tra kiu ca các lnh
Ta có lược đồ dch cho kim tra kiu ca lnh
S Æ id := E
{ S.type := if id.type = E.type then void else type_error }
S Æ if E then S1
{S.type := if E.type = boolean then S1.type else type_error }
S Æ while E do S1
{S.type := if E.type = boolean then S1.type else type_error }
S Æ S1 ; S2 {S.type := if S1.type = void and S2.type = void then void
else type_error }
Hình 6.4- Lược đồ dch kim tra kiu ca các lnh
137
4. Kim tra kiu ca các hàm
Áp dng hàm vào mt đối s có th được cho bi lut sinh E E (E). Lược đồ
dch cho kim tra kiu cho mt áp dng hàm là:
E Æ E1 (E2) {E.type := if E2.type = s and E1.type = s -> t then t
else type_error }
Hình 6.5- Lược đồ dch kim tra kiu ca hàm
Lut sinh trên biu din rng mt biu thc được hình thành áp dng E1 lên E2, kiu
ca E1 phi là mt hàm s -> t t kiu s ca E2 ti mt kiu gii hn t nào đó; kiu ca
E1 (E2) là t.
III. S TƯƠNG ÐƯƠNG CA CÁC BIU THC KIU
Thông thường kim tra kiu có dng: “nếu hai biu thc kiu bng nhau thì tr v
mt kiu ngược li tr v type_error”. Ðiu quan trng là cn xác định khi nào hai biu
thc kiu tương đương.
1. Tương đương cu trúc
Hai biu thc kiu được gi là tương đương cu trúc nếu cu trúc ca chúng ging
ht nhau.
Ví d 6.1:
- Biu thc kiu integer tương đương vi integer vì chúng là mt kiu cơ s.
- pointer(integer) tương đương vi pointer(integer) vì c hai được hình thành
bng cách áp dng cùng mt cu trúc con tr pointer lên các kiu tương đương.
Gi s, s và t là hai biu thc kiu, hàm sau kim tra xem chúng có tương đương
hay không?
Function sequiv(s, t) : boolean;
Begin
if s và t cùng là mt kiu cơ s then
return true
else if s = array(s1, s2) and t = array(t1, t2) then
return sequiv(s1, t1) and sequiv(s2, t2)
else if s = pointer(s1) and t = pointer(t1) then
return sequiv(s1, t1)
else if s = s1 -> s2 and t = t1 -> t2 then
return sequiv(s1, t1) and sequiv(s2, t2)
else return false;
end;
138
Hình 6.6- Ðon ngôn ng gi kim tra s tương đương cu trúc ca hai biu thc
kiu s và t
2. Tương đương tên
Trong mt s ngôn ng, kiu đưc cho bi tên. Ví d trong Pascal
type link = cell;
var next : link;
last : link;
p : cell;
q, r : cell;
Danh biu link được khai báo là tên ca kiu cell. Vn đề đặt ra là next, last, p, q,
r có kiu ging nhau hay không? Câu tr li ph thuc vào s cài đặt. Hai biu thc
kiu là tương đương tên nếu tên ca chúng ging nhau. Theo quan nim tương đương
tên thì last và next có cùng kiu; p, q và r có cùng mt kiu nhưng next và p có kiu
khác nhau.
IV. CHUYN ÐI KIU
Xét biu thc x + i trong đó x có kiu real và i có kiu integer. Vì biu din các s
nguyên, s thc khác nhau trong máy tính do đó các ch th máy khác nhau được dùng
cho s thc và s nguyên. Trình biên dch có th thc hin vic chuyn đổi kiu để hai
toán hng có cùng kiu khi phép toán cng xy ra.
B kim tra kiu trong trình biên dch có th được dùng để thêm các phép toán biến
đổi kiu vào trong biu din trung gian ca chương trình ngun. Chng hn ký hiu
hu t ca x + i có th là: x i inttoreal real+
Trong đó: inttoreal đổi s nguyên i thành s thc, real+ thc hin phép cng các
s thc.
S ép buc chuyn đổi kiu
S chuyn đổi t kiu này sang kiu khác được gi là n (implicit) nếu nó được
làm mt cách t động bi chương trình dch. Chuyn đổi kiu n còn gi là ép buc
chuyn đổi kiu (coercions).
Ví d 6.2: Ðnh nghĩa trc tiếp cú pháp cho kim tra kiu và ép buc chuyn đổi
kiu biến đổi kiu t integer thành real:
Lut sinh Lut ng nghĩa
E Æ num E.type := integer
E Æ num.num E.type := real
E Æ id E.type := lookup(id.entry)
E Æ E1 op E2 E.type := if E1.type = integer and E2.type = integer
then integer
else if E1.type = integer and E2.type = real
139