Ni dung chnh:
Thay v mt chng trnh ngun c dch trc tip sang m ch, n nn c dch sang
dng m trung gian bi k trc trc khi c tip tc dch sang m ch bi k sau v mt
s tin ch: Thun tin khi mun thay i cch biu din chng trnh ch; Gim thi gian
thc thi chng trnh ch v m trung gian c th c ti u. Chng ny gii thiu cc
dng biu din trung gian c bit l dng m ba a ch. Phn ln ni dung ca chng tp
trung vo trnh by cch to ra mt b sinh m trung gian n gin dng m 3 i ch. B
sinh m ny dng phng thc trc tip c php dch cc khai bo, cu lnh gn, cc lnh
iu khin sang m ba a ch.
Mc tiu cn t:
Sau khi hc xong chng ny, sinh vin phi nm c cch to ra mt b sinh m trung gian
cho mt ngn ng lp trnh n gin (ch cha mt s loi khai bo, lnh iu khin v cu
lnh gn) t c th m rng ci t b sinh m cho nhng ngn ng phc tp hn.
Ti liu tham kho:
[1] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey D.Ullman Addison - Wesley Publishing Company, 1986.
a
*
b
a
*
c
Cy c php
*
-
c
DAG
168
:=
id
id
id
id
id
id
id
10
:=
11
id
.... ....
d ca
c cy c php trong hnh 8.1
Hnh 8.2 - Hai biu idin
8
.....
2. M 3 a ch
M lnh 3 a ch l mt chui cc lnh c dng tng qut l x :=y op z. Trong x,y,z l
tn, hng hoc d liu tm sinh ra trong khi dch, op l mt ton t s hc hoc logic.
Ch rng khng c c qu mt ton t v phi ca mi lnh. Do biu thc x + y
* z phi c dch thnh chui :
t1 := y * z
t2 := x + t1
Trong t1, t2 l nhng tn tm sinh ra trong khi dch.
M lnh 3 a ch l mt biu din tuyn tnh ca cy c php hoc DAG, trong cc tn
tng minh biu din cho cc nt trong trn 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 cy c php
M lnh 3 a ch ca DAG
3. Cc m lnh 3 a ch ph bin
1. Lnh gn dng x := y op z, trong op l ton t 2 ngi s hc hoc logic.
2. Lnh gn dng x := op y, trong op l ton t mt ngi. Chng hn, php ly s i,
ton t NOT, cc ton t SHIFT, cc ton t chuyn i.
3. Lnh COPY dng x :=y, trong gi tr ca y c gn cho x.
4. Lnh nhy khng iu kin goto L. Lnh 3 a ch c nhn L l lnh tip theo thc
hin.
5. Cc lnh nhy c iu kin nh if x relop y goto L. Lnh ny p dng ton t quan h
relop (<, =, >=, .. .. ) vo x v y. Nu x v y tha quan h relop th lnh nhy vi nhn
L s c thc hin, ngc li lnh ng sau IF x relop y goto L s c thc hin.
6. param x v call p, n cho li gi chng trnh con v return y. Trong , y biu din
gi tr tr v c th la chn. Cch s dng ph bin l mt chui lnh 3 a ch.
param
x1
param
x2
.. .. ..
param
call
xn
p, n
Lut ng ngha
S id := E
E E1 + E2
E.place := newtemp;
E.code := E1.code || E2.code ||
gen (E.place ':=' E1.place '+' E2.place)
E E1 * E2
E.place := newtemp;
E.code := E1.code || E2.code ||
170
E.place := newtemp;
E.code := E1.code
E (E1)
E.place := id.place;
E.code := ''
E id
Hnh 8.4 - nh ngha trc tip c php sinh m lnh ba a ch cho lnh gn
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
a := t5
E.code
if E.place = 0 goto S.after
S1.code
S.after:
goto S.begin
Lut sinh
S while E do S1
Lut ng ngha
S.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
Hnh 8.5 - nh ngha trc tip c php sinh m lnh ba a ch cho cu lnh while
Lnh S while E do S1 c sinh ra bng cch dng cc thuc tnh S.begin v S.after
nh du lnh u tin trong on m lnh ca E v lnh sau on m lnh ca S.
Hm newlabel tr v mt nhn mi ti mi ln c gi
5. Ci t lnh 3 a ch
Lnh 3 a ch l mt dng tru tng ca m lnh trung gian. Trong chng trnh dch, cc
m lnh ny c th ci t bng mt mu tin vi cc trng cho ton t v ton hng. C 3
cch biu din l b t, b tam v b tam gin tip.
B t
B t (quadruples) l mt cu trc mu tin c 4 trng ta gi l op, arg1, arg2 v result.
Trng op cha ton t. Lnh 3 a ch x := y op z c biu din bng cch thay th y
bi arg1, z bi arg2 v x bi result. Cc lnh vi ton t mt ngi nh x := -y hay x := y
th khng s dng arg2. Cc ton t nh param khng s dng c arg2 ln result. Cc
lnh nhy c iu kin v khng iu kin t nhn ch trong result.
Ni dung cc trng arg1, arg2 v result tr ti trong bng k hiu i vi cc tn biu
din bi cc trng ny. Nu vy th cc tn tm phi c a vo bng k hiu khi
chng c to ra.
V d 8.3: B t cho lnh a := b * -c + b * -c
op
arg1
arg2
result
(0)
uminus
(1)
(2)
uminus
(3)
t3
t4
(4)
t2
t4
t5
(5)
:=
t5
t1
t1
t2
t3
B tam
trnh phi lu tn tm trong bng k hiu; chng ta c th tham kho ti gi tr tm
bng v tr ca lnh tnh ra n. lm iu ta s dng b tam (triples) l mt mu tin
c 3 trng op, arg1 v arg2. Trong , arg1 v arg2 tr ti bng k hiu (i vi tn hoc
hng do ngi lp trnh nh ngha) hoc tr ti mt phn t trong b tam (i vi gi tr
tm)
(0)
(1)
(2)
(3)
(4)
(5)
op
uminus
*
uminus
*
+
:=
arg1
c
b
c
b
(1)
a
arg2
(0)
(2)
(3)
(4)
172
(0)
(2)
op
[]
:=
arg1
x
(0)
arg2
i
y
(0)
(2)
op
[]
:=
arg1
y
x
arg2
i
(0)
(0)
(1)
(2)
(3)
(4)
(5)
statements
(14)
(15)
(16)
(17)
(18)
(19)
(14)
(15)
(16)
(17)
(18)
(19)
op
uminus
*
uminus
*
+
:=
arg1
c
b
c
b
(15)
a
arg2
(14)
(16)
(17)
(18)
II. KHAI BO
1. Khai bo trong chng trnh con
Cc tn cc b trong chng trnh con c truy xut n thng qua a ch tng i ca
n. Gi l offset.
V d 8.4: Xt lc dch cho vic khai bo bin
P
{offset:= 0 } D
DD;D
D id : T
T integer
T real
173
PMD
M {offset := 0 }
Tt c cc hnh vi u nm cui v phi.
2. Lu tr thng tin v tm
Trong mt ngn ng m chng trnh con c php khai bo lng nhau. Khi mt chng
trnh con c tm thy th qu trnh khai bo ca chng trnh con bao b tm dng.
Vn phm cho s khai bo l;
PD
D D ; D | id: T | proc id ; D; S
n gin chng ta to ra mt bng k hiu ring cho mi chng trnh con.
Khi mt khai bo chng trnh con D proc id D1 ; S c to ra v cc khai bo trong
D1 c lu tr trong bng k hiu mi.
V d 8.5: Chng trnh Sort c bn chng trnh con lng nhau readarray, exchange,
quicksort v partition. Ta c nm bng k hiu tng ng.
sort
quicksort
nil
header
a
readarray
header
readarray
partition
exchange
header
partition
quicksort
id
exchange
header
header
i
j
Hnh 8.11 - Nhng bng k hiu ca cc chng trnh con lng nhau
Lut ng ngha c xc nh bi cc thao tc sau
174
{ addwidth(top(tblptr), top(offset));
pop(tblptr); pop(offset) }
D D1 ; D2
D proc id ; N D1 ; S
D id : T
Hnh 8.12 - X l cc khai bo trong nhng chng trnh con lng nhau
Ta dng Stack tblptr gi cc con tr bng k hiu.
Chng hn, khi cc khai bo ca partition c kho st th trong tblptr cha cc con tr
ca cc bng ca sort, quicksoft v partition. Con tr ca bng hin hnh nm trn nh Stack.
offset l mt Stack khc lu tr offset. Ch rng vi lc A BC {action A} th
tt c cc hnh vi ca cc cy con B v C c thc hin trc A.
Do hnh vi kt hp vi M c thc hin trc. N khng to ra bng k hiu cho
tng ngoi cng (chng trnh sort) bng cch dng mktable(nil), con tr ti bng ny c
a vo trong Stack tblptr ng thi c a vo Stack offset.
K hiu cha kt thc N ng vai tr tng t nh M khi mt khai bo chng trnh con
xut hin. N dng mktable(top(tblptr)) to ra mt bng mi. Tham s top(tblptr) cho
gi tr con tr ti bng li c push vo nh Stack tblptr v 0 c push vo Stack offset.
Vi mi khai bo bin id:T; mt mi c to ra trong bng k hiu hin hnh. Gi tr
trong top(offset) c tng ln bi T.width.
Khi hnh vi v phi P proc id ; N D1 ; S din ra, kch thc ca tt c cc i tng d
liu khai bo trong D1 s nm trn nh Stack offsert. N c lu tr bng cch dng
addwidth, cc Stack tblptr v offset b pop v chng ta tr v thao tc trn cc khai bo ca
chng trnh con
3. X l i vi mu tin
Khai bo mt mu tin c cho bi lut sinh
T record D end
Lut dch tng ng
T record L D end
{ T.type := record(top(tblptr));
175
III. LNH GN
1. Tn trong bng k hiu
Xt lc dch sinh ra m lnh 3 a ch cho lnh gn:
S id := E
{p:=lookup( id.name);
if p <> nil then emit( p ':=' E.place) else error }
E E1 + E2
{ E.place := newtemp;
emit(E.place ':=' E1.place '+ E2.place) }
E E1 * E2
{ E.place := newtemp;
emit(E.place ':=' E1.place '* E2.place) }
E - E1
{ E.place := newtemp;
emit(E.place ':=' 'unimus' E1.place) }
E ( E1 )
E id
{ E.place:=E1.place) }
{ p:=lookup( id.name);
if p <> nil then E.place := p else error }
2. a ch ha cc phn t ca mng
Cc phn t ca mng c th truy xut nhanh nu chng c lin trong mt khi cc
nh kt tip nhau. Trong mng mt chiu nu kch thc ca mt phn t l w th a ch
tng i phn t th i ca mng A c tnh theo cng thc
a ch tng i ca A[i] = base + (i-low) * w
Trong
low: l cn di tp ch s
base: l a ch tng i ca nh cp pht cho mng tc l a ch tng i ca
A[low]
176
Bin i mt cht ta c
a ch tng i ca A[i]= i * w + (base -low * w)
Trong : c=base - low * w c th tnh c ti thi gian dch v lu trong bng k
hiu. Do a ch tng i A[i] = i * w +c.
Mng hai chiu co th xem nh l mt mng theo mt trong hai dng: theo dng
(row_major) hoc theo ct (colum_major)
a[1,1] a[1,2] a[1,3]
a[1,1]
a[1,2]
a[1,3]
a[2,1]
a[2,2]
a[2,3]
a[1,1]
Dng 1
a[1,2]
a[1,3]
Ct 1
Ct 2
a[2,1]
Dng 2
a[2,2]
a[1,1]
a[2,1]
a[1,2]
a[2,2]
Ct 3
a[2,3]
Theo dng
a[1,3]
a[2,3]
Theo ct
177
178
S dng 1 biu din true v 0 biu din false. Biu thc c nh gi t tri
sang phi theo cch tng t biu thc s hc.
V d 8.6: Vi biu thc a or b and not c, ta c dy lnh 3 a ch:
t1 := not c
t2 := b and t1
t3 := a or t2
Biu thc quan h a<b tng ng lnh iu kin if a<b then 1 else 0. dy lnh 3 a ch
tng ng l
100 : if a<b goto 103
101 : t := 0
102 : goto 104
103 : t :=1
104 :
Ta c, lc dch sinh ra m lnh 3 a ch i vi biu thc logic:
E E1 or E2
E E1 and E2
E not E1
E false
Hnh 8.17 - Lc dch s dng biu din s sinh m lnh ba a ch cho cc biu thc
logic
V d 8.7: Vi biu thc a < b or c< d and e < f, n s sinh ra lnh a ch nh sau:
100 : if a<b goto 103
101 : t1 := 0
102 : goto 104
103 : t1 := 1
104 : if c<d goto 107
105 : t2 := 0
106 : goto 108
107 : t2 := 1
179
1. M nhy
nh gi biu thc logic m khng sinh ra m lnh cho cc ton t or, and v not. Chng
ta ch biu din gi tr mt biu thc bi v tr trong chui m. V d, trong chui m lnh
trn, gi tr t1 s ph thuc vo vic chng ta chn lnh 101 hay lnh 103. Do gi tr ca t1
l tha.
2. Cc lnh iu khin
S
if E then S1
| if E then S1 else S2
| while E do S1
to E.true
to E.false
S1.code
...
(a) if -then
E.code
E.true:
E.false:
S.next:
to E.true
to E.false
S.begin:
E.code
E.true:
S1.code
S1.code
goto S.next
S2.code
E.false:
to E.true
to E.false
goto S.begin
...
180
Lut ng ngha
E.true := newlabel;
E.false := S.next;
S1.next := S.next;
S.code := E.code || gen(E.true ':') || S1.code
S if E then S1 else S2
E.true := newlabel;
E.false := newlabel;
S1.next := S.next;
S2.next := S.next;
S.code := E.code || gen(E.true ':') || S1.code ||
gen('goto' S.next) ||
gen(E.false ':') || S2.code
S while E do S1
S.begin := newlabel;
E.true := newlabel;
E.fasle := S.next;
S1.next := S.begin;
S.code:= gen(S.begin':') || E.code || gen(E.true ':') ||
S1.code || gen('goto' S.begin)
Ta c nh ngha trc tip c php cho vic dch cc biu thc logic thnh m lnh 3
a ch. Ch true v false l cc thuc tnh k tha.
Lut sinh
E E1 or E2
Lut ng ngha
E1.true := E.true;
E1.false := newlabel;
E2.true := E.true;
181
E2.false := E.false;
E.code := E1.code || gen(E.false ':') || E2.code
E E1 and E2
E1.true := newlabel;
E1.false := E.false;
E2.true := E.true;
E2.false := E.false;
E.code := E1.code || gen(E.true ':') || E2.code
E not E1
E1.true := E.false;
E1.false := E.true;
E.code := E1.code
E (E1)
E1.true := E.true;
E1.false := E.false;
E.code := E1.code
E true
E false
Hnh 8.21 - nh ngha trc tip c php sinh m lnh ba a ch cho biu thc logic
182
E.place := newtemp;
E2.true := newlabel;
E2.false := newlabel;
E.code := E1.code || E2.code || gen(E2.true ':' E.place ':= ' E1.place +1) ||
gen('goto' nextstat +1) || gen(E2.false ':' E.place ':= ' E1.place)
else if ...
Hnh 8.22 - Lut ng ngha cho lut sinh E E1 +E2
Trong trng hp nu c biu thc logic no c biu thc s hc, chng ta sinh m lnh
cho E1, E2 bi cc lnh
E2.true : E.place := E1.place +1
goto nextstat +1
E2.false : E.place := E1.place
V. LNH CASE
Lnh CASE hoc SWITCH thng c s dng trong cc ngn ng lp trnh.
Sn
end
Hnh 8.23 - C php ca cu lnh switch
m lnh ca S1
goto next
L2:
m lnh ca S2
183
goto next
...............
Ln-1 :
m lnh ca Sn-1
..
goto next
Ln :
m lnh ca Sn
goto next
test :
if t=V1 goto L1
if t=V2 goto L2
.. .. .. ..
if t=Vn-1 goto Ln-1
else goto Ln
next:
Hnh 8.24 - Dch cu lnh case
Mt phng php khc ci t lnh SWITCH l
m lnh nh gi biu thc E vo t
if t <> V1 goto L1
m lnh ca S1
goto next
L1 :
if t <> V2 goto L2
m lnh ca S2
goto next
L2: .............
Ln-2 :
if t <> Vn-1 goto Ln-1
..
m lnh ca Sn-1
goto next
Ln-1 :
m lnh ca Sn
next:
Hnh 8.24 - Mt cch dch khc ca cu lnh case
184
BI TP CHNG VIII
8.1. Dch biu thc : a * - ( b + c) thnh cc dng:
a) Cy c php.
b) K php hu t.
c) M lnh my 3 - a ch.
8.2. Trnh by cu trc lu tr biu thc - ( a + b) * ( c + d ) + ( a + b + c) cc
dng:
a) B t .
b) B tam.
c) B tam gin tip.
8.3. Sinh m trung gian ( dng m my 3 - a ch) cho cc biu thc C n gin sau:
a) x = 1
b) x = y
c) x = x + 1
d) x = a + b * c
e) x = a / ( b + c) - d * ( e + f )
8.4. Sinh m trung gian ( dng m my 3 - a ch) cho cc biu thc C sau:
a) x = a [i] + 11
b) a [i] = b [ c[j] ]
c) a [i][j] = b [i][k] * c [k][j]
d) a[i] = a[i] + b[j]
e) a[i] + = b[j]
8.5. Dch lnh gn sau thnh m my 3 - a ch:
A [ i,j ] := B [ i,j ] + C [A[ k,l]] + D [ i + j ]
185