CHƯƠNG VIII
SINH MÃ TRUNG GIAN
Ni dung chính:
Thay vì mt chương trình ngun được dch trc tiếp sang mã đích, nó nên được dch sang
dng mã trung gian bi k trước trước khi được tiếp tc dch sang mã đích bi k sau vì mt
s tin ích: Thun tin khi mun thay đổi cách biu din chương trình đích; Gim thi gian
thc thi chương trình đích vì mã trung gian có th được ti ưu. Chương này gii thiu các
dng biu din trung gian đặc bit là dng mã ba địa ch. Phn ln ni dung ca chương tp
trung vào trình bày cách to ra mt b sinh mã trung gian đơn gin dng mã 3 đại ch. B
sinh mã này dùng phương thc trc tiếp cú pháp để dch các khai báo, câu lnh gán, các lnh
điu khin sang mã ba địa ch.
Mc tiêu cn đạt:
Sau khi hc xong chương này, sinh viên phi nm được cách to ra mt b sinh mã trung gian
cho mt ngôn ng lp trình đơn gin (ch cha mt s loi khai báo, lnh điu khin và câu
lnh gán) t đó có th m rng để cài đặt b sinh mã cho nhng ngôn ng phc tp hơn.
Tài liu tham kho:
[1] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey D.Ullman -
Addison - Wesley Publishing Company, 1986.
I. NGÔN NG TRUNG GIAN
Cây cú pháp, ký pháp hu t và mã 3 địa ch là các loi biu din trung gian.
1. Biu din đồ th
Cây pháp t cu trúc phân cp t nhiên ca chương trình ngun. DAG cho ta cùng
lượng thông tin nhưng bng cách biu din ngn gn hơn trong đó các biu thc con không
được biu din lp li.
Ví d 8.1: Vi lnh gán a := b * - c + b * - c, ta có cây cú pháp và DAG:
Cây cú pháp DAG
:=
a +
* *
b
c
- b -
c
:=
a +
*
b -
c
Hình 8.1- Biu din đồ th ca a :=b * - c + b * - c
168
pháp hu t là mt biu din tuyến tính ca cây cú pháp. Nó là mt danh sách các nút
ca cây, trong đó mt nút xut hin ngay sau con ca nó.
a b c - * b c - * + := là biu din hu t ca cây cú pháp hình trên.
Cây cú pháp có th được cài đặt bng mt trong 2 phương pháp:
- Mi nút được biu din bi mt mu tin, vi mt trường cho toán t và các trường
khác tr đến con ca nó.
- Mt mng các mu tin, trong đó ch s ca phn t mng đóng vai trò như là con tr
ca mt nút.
Tt c các nút trên cây cú pháp có th tuân theo con tr, bt đầu t nút gc ti 10
Hình 8.2 - Hai biu din ca cây cú pháp trong hình 8.1
:=
i
d
a
+
*
i
d
b
-
i
d
c
:=
i
d
b
-
0 i
d
b
2 - 1
1 i
d
c
3 * 0 2
4 i
d
b
5 i
d
c
6 - 5
7 * 4 6
8 + 3 7
9 i
d
a
10 := 9 8
11 .... .... .....
d
ci
2. Mã 3 địa ch
lnh 3 địa ch là mt chui các lnh có dng tng quát là x :=y op z. Trong đó x,y,z là
tên, hng hoc d liu tm sinh ra trong khi dch, op là mt toán t s hc hoc logic.
Chú ý rng không được có quá mt toán t vế phi ca mi lnh. Do đó biu thc x + y
* z phi được dch thành chui :
t1 := y * z
t2 := x + t1
Trong đó t1, t2 là nhng tên tm sinh ra trong khi dch.
Mã lnh 3 địa ch là mt biu din tuyến tính ca cây cú pháp hoc DAG, trong đó các tên
tường minh biu din cho các nút trong trên đồ th.
t1 := - c t1 := -c
t2 := b * t1 t2 := b * t1
t3 := - c t3 := t2 + t2
t4 := b * t3 a := t3
169
t5 := t2 + t4
a := t5
Mã lnh 3 địa ch ca cây cú pháp Mã lnh 3 địa ch ca DAG
Hình 8.3 - Mã lnh 3 địa ch tương ng vi cây cú pháp và DAG trong hình 8.1
3. Các mã lnh 3 địa ch ph biến
1. Lnh gán dng x := y op z, trong đó op là toán t 2 ngôi s hc hoc logic.
2. Lnh gán dng x := op y, trong đó op là toán t mt ngôi. Chng hn, phép ly s đối,
toán t NOT, các toán t SHIFT, các toán t chuyn đổi.
3. Lnh COPY dng x :=y, trong đó giá tr ca y được gán cho x.
4. Lnh nhy không điu kin goto L. Lnh 3 địa ch có nhãn L là lnh tiếp theo thc
hin.
5. Các lnh nhy có điu kin như if x relop y goto L. Lnh này áp dng toán t quan h
relop (<, =, >=, .. .. ) vào x và y. Nếu x và y tha quan h relop thì lnh nhy vi nhãn
L s được thc hin, ngược li lnh đứng sau IF x relop y goto L s được thc hin.
6. param x và call p, n cho li gi chương trình con và return y. Trong đó, y biu din
giá tr tr v có th la chn. Cách s dng ph biến là mt chui lnh 3 địa ch.
param x1
param x2
.. .. ..
param xn
call p, n
được sinh ra như là mt phn ca li gi chương trình con p (x1,x2,.. .., xn).
7. Lnh gán dng x := y[i] và x[i] := y. Lnh đầu ly giá tr ca v trí nh ca y được xác
định bi giá tr ô nh i gán cho x. Lnh th 2 ly giá tr ca y gán cho ô nh x được
xác định bi i.
8. Lnh gán địa ch và con tr dng x :=&y , x := *y và *x := y. Trong đó, x := &y đặt
giá tr ca x bi v trí ca y. Câu lnh x := *y vi y là mt con tr mà r_value ca nó
là mt v trí, r_value ca x đặt bng ni dung ca v trí này. Cui cùng *x := y đặt
r_value ca đối tượng được tr bi x bng r_value ca y.
4. Dch trc tiếp cú pháp thành mã lnh 3 địa ch
Ví d 8.2: Ðnh nghĩa S _ thuc tính sinh mã lnh địa ch cho lnh gán:
Lut sinh Lut ng nghĩa
S id := E
E E1 + E2
E E1 * E2
S.code := E.code || gen (id.place ':=' E.place)
E.place := newtemp;
E.code := E1.code || E2.code ||
gen (E.place ':=' E1.place '+' E2.place)
E.place := newtemp;
E.code := E1.code || E2.code ||
170
E - E1
E (E1)
E id
gen (E.place ':=' E1.place '*' E2.place)
E.place := newtemp;
E.code := E1.code|| gen (E.place ':=' 'uminus' E1.place )
E.place := newtemp;
E.code := E1.code
E.place := id.place;
E.code := ''
Hình 8.4 - Ðnh nghĩa trc tiếp cú pháp sinh mã lnh ba địa ch cho lnh gán
Vi chui nhp a = b * - c + b * - c, nó sinh ra mã lnh 3 địa ch
t1 := -c
t2 := b * t1
t3 := - c
t4 := b * t3
t5 := t2 + t4
thuc tính tng hp S.code biu din mã 3 địa ch cho lnh gán
S. Ký hiu chưa kết thúc E có 2 thuc tính E.place là giá tr ca
E và E.code là chui lnh 3 địa ch để đánh giá E
a := t5
Khi lnh 3 địa ch đuc sinh, tên tm được to ra cho mi nút trong trên cây cú
pháp.
Giá tr ca ký hiu chưa kết thúc E trong lut sinh E E1 + E2 đưc tính vào trong tên
tm t. Nói chung mã lnh 3 địa ch cho lnh gán id := E bao gm mã lnh cho vic đánh giá E
vào trong biến tm t, sau đó là mt lnh gán id.place := t.
Hàm newtemp tr v mt chui các tên t1, t2, .. .. , tn tương ng các li gi liên tiếp. Gen
(x ':=' y '+' z) để biu din lnh 3 địa ch x :=y+z
E.code
if E.place = 0 goto S.after
S1.code
goto S.begin
S.begin:
S.after:
Lut sinh Lut ng nghĩa
S while E do S1S.begin := newlabel;
S.after := newlabel;
S.code := gen(S.begin ':') || E.code ||
gen('if' E.place '=' 0 'goto' S.after) ||
S1.code || gen('goto' S.begin) || gen(S.after ':')
171
Hình 8.5 - Ðnh nghĩa trc tiếp cú pháp sinh mã lnh ba địa ch cho câu lnh while
Lnh S while E do S1 được sinh ra bng cách dùng các thuc tính S.begin và S.after để
đánh du lnh đầu tiên trong đon mã lnh ca E và lnh sau đon mã lnh ca S.
Hàm newlabel tr v mt nhãn mi ti mi ln được gi
5. Cài đặt lnh 3 địa ch
Lnh 3 địa ch là mt dng tru tượng ca mã lnh trung gian. Trong chương trình dch, các
mã lnh này có th cài đặt bng mt mu tin vi các trường cho toán t và toán hng. Có 3
cách biu din là b t, b tam và b tam gián tiếp.
B t
B t (quadruples) là mt cu trúc mu tin có 4 trường ta gi là op, arg1, arg2 và result.
Trường op cha toán t. Lnh 3 địa ch x := y op z được biu din bng cách thay thế y
bi arg1, z bi arg2 và x bi result. Các lnh vi toán t mt ngôi như x := -y hay x := y
thì không s dng arg2. Các toán t như param không s dng c arg2 ln result. Các
lnh nhy có điu kin và không điu kin đặt nhãn đích trong result.
Ni dung các trường arg1, arg2 và result tr ti ô trong bng ký hiu đối vi các tên biu
din bi các trường này. Nếu vy thì các tên tm phi được đưa vào bng ký hiu khi
chúng được to ra.
Ví d 8.3: B t cho lnh a := b * -c + b * -c
op arg1 arg2 result
(0)
(1)
(2)
(3)
(4)
(5)
uminus
*
uminus
*
+
:=
c
b
c
b
t2
t5
t1
t3
t4
t1
t2
t3
t4
t5
a
Hình 8.6 - Biu din b t cho các lnh ba địa ch
B tam
Ð tránh phi lưu tên tm trong bng ký hiu; chúng ta có th tham kho ti giá tr tm
bng v trí ca lnh tính ra nó. Ð làm điu đó ta s dng b tam (triples) là mt mu tin
có 3 trường op, arg1 và arg2. Trong đó, arg1 và arg2 tr ti bng ký hiu (đối vi tên hoc
hng do người lp trình định nghĩa) hoc tr ti mt phn t trong b tam (đối vi giá tr
tm)
op arg1 arg2
(0)
(1)
(2)
(3)
(4)
(5)
uminus
*
uminus
*
+
:=
c
b
c
b
(1)
a
(0)
(2)
(3)
(4)
Các lnh như x[i]:=y và x:=y[i] s dng 2 ô trong cu trúc b tam.
Hình 8.7 - Biu din b tam cho các
lnh ba địa ch
172