Professional Documents
Culture Documents
IT4079 Five
IT4079 Five
2. Sinh mã đích
3. Tối ưu mã
2/20/24 2
1. Sinh mã trung gian
Giới thiệu
• Bộ sinh mã trung gian chuyển chương trình
nguồn sang chương trình tương đương trong
ngôn ngữ trung gian
– Chương trình trung gian là một chương trình
cho một máy trừu tượng
• Ngôn ngữ trung gian được người thiết kế
trình biên dịch quyết định, có thể là:
– Cây cú pháp
– Ký pháp Ba Lan sau (hậu tố)
– Mã 3 địa chỉ …
2/20/24 3
1. Sinh mã trung gian
Nội dung
• Chương trình dịch định hướng cú pháp
• Cây cú pháp
• Ký pháp Ba lan sau
• Mã 3 địa chỉ
– Các dạng mã
– Dịch trực tiếp cú pháp thành mã 3 địa chỉ
– Sinh mã cho khai báo
– Sinh mã cho lệnh gán
– Sinh mã cho các biểu thức logic
– Sinh mã cho các cấu trúc lập trình
2/20/24 4
1. Sinh mã trung gian
2/20/24 5
1. Sinh mã trung gian
Ví dụ
Sản xuất Quy tắc ngữ nghĩa
L ® E return Print (E.val)
E ® E1+T E.val = E1.val + T.val
E®T E.val = T.val
T ® T1 * F T.val = T1.val * F.val
T®F T.val = F.val
F ® (E) F.val = E.val
F ® digit F.val = digit.lexval
•Các ký hiệu E, T, F có thuộc tính tổng hợp val
•Từ tố digit có thuộc tính tổng hợp lexval ( Được bộ
phân tích từ vựng đưa ra )
2/20/24 6
1. Sinh mã trung gian
2/20/24 7
1. Sinh mã trung gian
Nội dung
• Chương trình dịch định hướng cú pháp
• Cây cú pháp
• Ký pháp Ba lan sau
• Mã 3 địa chỉ
– Các dạng mã
– Dịch trực tiếp cú pháp thành mã 3 địa chỉ
– Sinh mã cho khai báo
– Sinh mã cho lệnh gán
– Sinh mã cho các biểu thức logic
– Sinh mã cho các cấu trúc lập trình
2/20/24 8
1. Sinh mã trung gian
2/20/24 10
1. Sinh mã trung gian
2/20/24 11
1. Sinh mã trung gian
E + T
T F
+
T * F 4
F 2
*
4
5
F.Link =mkLeaf(4)
2
5
T.Link
F.Link
F.Link
=mkNode(*,T1.Link,F.Link)
=mkLeaf(5)
=mkNode(+,E1.Link,T.Link)
F.Link =mkLeaf(2)
2/20/24 14
1. Sinh mã trung gian
Nội dung
• Chương trình dịch định hướng cú pháp
• Cây cú pháp
• Ký pháp Ba lan sau
• Mã 3 địa chỉ
– Các dạng mã
– Dịch trực tiếp cú pháp thành mã 3 địa chỉ
– Sinh mã cho khai báo
– Sinh mã cho lệnh gán
– Sinh mã cho các biểu thức logic
– Sinh mã cho các cấu trúc lập trình
2/20/24 15
1. Sinh mã trung gian
2/20/24 17
1. Sinh mã trung gian
Nội dung
• Chương trình dịch định hướng cú pháp
• Cây cú pháp
• Ký pháp Ba lan sau
• Mã 3 địa chỉ
– Các dạng mã
– Dịch trực tiếp cú pháp thành mã 3 địa chỉ
– Sinh mã cho khai báo
– Sinh mã cho lệnh gán
– Sinh mã cho các biểu thức logic
– Sinh mã cho các cấu trúc lập trình
2/20/24 20
1. Sinh mã trung gian
Mã 3 địa chỉ
• Là loại mã trung gian thường dùng, tương tự mã
assembly
• Chương trình trung gian là một dãy các lệnh thuộc
kiểu mã 3 địa chỉ
– Mỗi lệnh gồm tối đa 3 toán hạng
– Tồn tại nhiều nhất một toán tử ở vế phải cộng thêm một
toán tử gán
• x,y,z là các địa chỉ, tức là tên, hằng hay các tên
trung gian do trình biên dịch sinh ra
– Tên trung gian phải được sinh để thực hiện các phép
toán trung gian
– Các địa chỉ được thực hiện như con trỏ tới phần tử
tương ứng của nó trong bảng ký hiệu
2/20/24 21
1. Sinh mã trung gian
Mã 3 địa chỉ ® Ví dụ
• Câu lệnh
– A=x+y*z
• Chuyển thành mã 3 địa chỉ
T=y*z
A=x+T
T là tên trung gian
– Được bộ sinh mã trung gian sinh ra cho các
toán tử trung gian
2/20/24 22
1. Sinh mã trung gian
2/20/24 23
1. Sinh mã trung gian
param xn
Call p, n
2/20/24 25
1. Sinh mã trung gian
Ví dụ:
While a + b Do a := a * b
S.Code =
S.Begin = L1: t1 := a + b
newLabel() = If t1 = 0 goto L2
L1
t2 = a * b
S.After =
newLabel() = a := t2
L2 goto L1
L2:
2/20/24 30
1. Sinh mã trung gian
2/20/24 31
1. Sinh mã trung gian
A: Interger;
C Interger 4
B: Interger; B Interger 2 20
C:Interger; A Interger 0 10
SymbolTable
B :=10 Data Segment
C:=20 [2] := 10
A:=B*C [4]:= 20
A := A * B + C ?
Thêm biến tạm T vào bảng
ký hiệu, T có offset là : 6 Code Segment
2/20/24 36
1. Sinh mã trung gian
2/20/24 38
1. Sinh mã trung gian
2/20/24 40
1. Sinh mã trung gian
Ví dụ
X:int; - Xây dựng cây phân tích có chú
giải cho chương trình bên.
M:Array[10] of int;
- Xây dựng bảng ký hiệu, có chỉ
Proc A; rõ vị trí các biến
X:int; - Nếu SB là lệnh M[4] + N * X;
N : int; Cho biết địa chỉ của các đối
Proc B; tượng trong lệnh trên
X:int; - Nếu SB là câu lệnh CALL A;
- Lệnh thực hiện được không? Hãy
SB
giải thích
SA - Cần sửa lại như thế nào để lệnh
S thực hiện được như bình thường.
2/20/24 45
1. Sinh mã trung gian
2/20/24 47
1. Sinh mã trung gian
2/20/24 54
1. Sinh mã trung gian
Dịch trực tiếp cú pháp cho các cấu trúc lập trình
Sản xuất Quy tắc ngữ nghĩa
S® if E then S1 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 E.True = newLabel(); E.False = newLabel();
else S2 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.False = S.next; S1.next = S.Begin
S.Code = gen(S.begin ‘:’) ||E.code ||gen(E.true ’:’)
||S1.code || gen(‘goto ‘ S.Begin);
2/20/24 55
1. Sinh mã trung gian
Sinh mã cho biểu thức logic trong cấu trúc lập trình
• Nếu E có dạng: a < b E.Code sinh ra
– Mã lệnh sinh ra có dạng như thế nào?
If a<b then goto E.true
goto E.false
• Nếu E có dạng: E1 or E2 thì
– Nếu E1 là true thì E cũng là true
– Nếu E1 là false thì phải đánh giá E2; E sẽ là true
hay false phụ thuộc E2
• Tương tự với E1 and E2
• Nếu E có dạng not E1
– Nếu E1 là true, E là false và ngược lại
2/20/24 56
1. Sinh mã trung gian
Sinh mã cho biểu thức logic trong cấu trúc lập trình
Sản xuất Quy tắc ngữ nghĩa
E®E1 or E2 E1.true := E.true
E1.false := newLabel()
E2.true := E.true
E2.false := E.false
E.Code = E1.code || gen (E1.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 (E1.true ‘: ‘) || E2.code
Chú ý: E.True và E.false là các thuộc tính kế thừa
2/20/24 57
1. Sinh mã trung gian
Sinh mã cho biểu thức logic trong cấu trúc lập trình
Sản xuất Quy tắc ngữ nghĩa
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®Id1 relop Id2 E.Code := gen(‘if’ id1.place relop id2.place ‘goto’ E.true)
gen( ‘goto’ E.false);
E®True E.Code := gen(‘goto’ E.true)
E®False E.Code := gen(‘goto’ E.false)
2/20/24 58
1. Sinh mã trung gian
• E®a < b
E.code = if a < b goto E.true goto E.false
• E®E1 or E2
– E1.true := E.true Þ E1.true = Ltrue
• Ltrue là nhãn đi tới nếu biểu thức là true
• Lfalse là nhãn đi tới nếu biểu thức là false
– E1.false := L1; //E1.False = newLabel()
– E2.true := E.true= Ltrue; E2.false := E.false = Lfalse
– E.Code = E1.code || gen (E1.false ‘: ‘) || E2.code
if a < b goto E1.true goto E1.false || E1.false || E2.code
2/20/24
if a < b goto Ltrue goto L1 L1: || E2.code (1) 60
1. Sinh mã trung gian
While a ¹ b do
If a > b Then
a := a – b // (S1)
Else
b := b – a // (S2)
S ÞId := E ÞId :=E1 – E2 ÞId :=Id – Id
S1.Code S2.Code
t1 := a – b t2 := b – a
(A) (B)
a := t1 a := t2
2/20/24 62
1. Sinh mã trung gian
Id ¹ Id If E2 Then S1 Else S2
a b Id := E Id := E
Id > Id
E1.Code := a Id - Id b Id - Id
a b
gen(‘if’ id1.place relop id2.place ‘goto’ E.true) a b b a
2/20/24 gen( ‘goto’ E.false); 63
1. Sinh mã trung gian
S ® While E do S1
S.Begin = L1 // S.Begin=newLabel();
E.True = L2 // E.True = newLabel();
E.False = Next // E.False = S.next();
S1.next = L1 // S1.next = S.Begin
S.Code = L1: || E.code || L2 || S1.code || goto L1 (1)
E®a¹b
E.Code := if a ¹ b goto L2 goto Next (2)
E.Code:=gen(‘if’ id1.place relop id2.place ‘goto’ E.true)
gen( ‘goto’ E.false);
2/20/24 64
1. Sinh mã trung gian
S ® if E then S1 else S2
E.True = L3 // E.True = newLabel();
E.False = L4 // E.False = newLabel();
S1.next = L1 // S1.next = S.next;
S2.next = L1 // S2.next = S.next (3)
S.Code = E.code || L3 : || S1.code || goto L1 L4 : || S2.code
E®a>b
E.Code := if a > b goto L3 goto L4 (4)
E.Code:=gen(‘if’ id1.place relop id2.place ‘goto’ E.true)
gen( ‘goto’ E.false);
2/20/24 65
1. Sinh mã trung gian
2. Sinh mã đích
3. Tối ưu mã
2/20/24 68
2. Sinh mã đích
Nội dung
1. Giới thiệu
2. Môi trường thực hiện: Máy ngăn xếp
– Bộ thông dịch cho máy ngăn xếp
3. Sinh mã đích từ mã trung gian
• Mã trung gian là cây cú pháp
• Mã trung gian là ký pháp Ba lan sau
• Mã trung gian là mã 3 địa chỉ
4. Sinh mã đích từ mã nguồn
– Xây dựng bảng ký hiệu
– Sinh mã cho câu lệnh
2/20/24 69
2. Sinh mã đích
1. Giới thiệu
• Chương trình đich viết trên một ngôn ngữ
trung gian
• Là dạng Assembly của máy giả định
– Máy ảo (Máy ảo làm việc với bộ nhớ stack)
• Việc thực hiện chương trình thông qua một
bộ thông dich interpreter
– Interpreter mô phỏng hành động của máy ảo
– Thực hiện tập lệnh assembly của nó
• Chương trình đích được dịch từ
– Mã trung gian
– Mã nguồn
2/20/24 70
2. Sinh mã đích
• PC (program counter):
– Con trỏ lệnh trỏ tới lệnh hiện tại đang thực thi
trên bộ đệm chương trình
• B (base):
– Con trỏ trỏ tới địa chỉ cơ sở của vùng nhớ cục
bộ. Các biến cục bộ được truy xuất gián tiếp
qua con trỏ này
• T (top);
– Con trỏ, trỏ tới đỉnh của ngăn xếp
2/20/24 73
2. Sinh mã đích
2/20/24 77
2. Sinh mã đích
op p q
LA Load Address t:=t+1; s[t]:=base(p)+q;
2/20/24 78
2. Sinh mã đích
op p q
J Jump pc:=q;
FJ False Jump if s[t]=0 then pc:=q; t:=t-1;
HLT Halt Halt
ST Store s[s[t-1]]:=s[t]; t:=t-2;
s[t+2]:=b; s[t+3]:=pc;
CALL Call
s[t+4]:=base(p); b:=t+1; pc:=q;
Exit
EP Procedure t:=b-1; pc:=s[b+2]; b:=s[b+1];
EF Exit Function t:=b; pc:=s[b+2]; b:=s[b+1];
2/20/24 79
2. Sinh mã đích
op p q
Read read one character into s[s[t]];
RC
Character t:=t-1;
Read
RI read integer to s[s[t]]; t:=t-1;
Integer
Write write one character from s[t];
WRC
Character t:=t-1;
Write
WRI write integer from s[t]; t:=t-1;
Integer
WLN New Line CR & LF
2/20/24 80
2. Sinh mã đích
op p q
op p q
t:=t-1; if s[t] = s[t+1] then
EQ Equal
s[t]:=1 else s[t]:=0;
t:=t-1; if s[t] != s[t+1] then
NE Not Equal
s[t]:=1 else s[t]:=0;
Greater t:=t-1; if s[t] > s[t+1] then
GT
Than s[t]:=1 else s[t]:=0;
t:=t-1; if s[t] < s[t+1] then
LT Less Than
s[t]:=1 else s[t]:=0;
Greater or t:=t-1; if s[t] >= s[t+1] then
GE
Equal s[t]:=1 else s[t]:=0;
Less or t:=t-1; if s[t] <= s[t+1] then
LE
2/20/24 Equal s[t]:=1 else s[t]:=0; 82
2. Sinh mã đích
2/20/24 84
2. Sinh mã đích
2/20/24 88
2. Sinh mã đích
a := b + c a := b * c
LA a.Addr LA a.Addr
LV b.Addr //LC b LV b.Addr //LC b
LV c.Addr //LC c LV c.Addr //LC c
ADD MUL
ST ST
2/20/24 92
2. Sinh mã đích
2/20/24 94
2. Sinh mã đích
F ® Id[E] ?
LA Id.Addr; LC Id.widthType; genE();MUL; ADD; LI;
2/20/24 95
2. Sinh mã đích
void term(){
factor();
while(Token == TIMES || Token == SLASH){
Op = Token;
Token = getToken();
factor();
if (Op == TIMES) genCode(OP_ML);
else genCode(OP_DV);
}
}
2/20/24 96
2. Sinh mã đích
2/20/24 97
2. Sinh mã đích
Foo SubProc
Sub Proc. SymTable
Sub SubProc
B Interger 4
.... ...... .... M Interger 0
Main SymTable FooProc. SymTable
2/20/24 103
2. Sinh mã đích
2/20/24 104
2. Sinh mã đích
• Lời gọi
– Thủ tục gặp trong sinh mã lệnh CallSt
• Trước khi sinh lời gọi thủ tục cần phải nạp
giá trị cho các tham số hình thức bằng cách
– Tăng giá trị T lên 4 (bỏ qua RV,DL,RA,SL)
– Sinh mã cho k tham số thực tế
• Tham trị: compileExpression()
• Tham biến: compileLValue()
– Giảm giá trị T đi 4 + k
– Sinh lệnh CALL
2/20/24 105
2. Sinh mã đích
2/20/24 108
Chương 5: Sinh mã
2. Sinh mã đích
3. Tối ưu mã
2/20/24 109
Giới thiệu
Yêu cầu
– Chương trình sau khi tối ưu phải tương đương
– Tốc độ thực hiện trung bình tăng
– Hiệu quả đạt được tương xứng với công sức
Có thể tối ưu mã vào lúc nào
– Mã nguồn
• Do người lập trình (giải thuật)
– Mã trung gian
– Mã đích
2/20/24 110
3. Tối ưu mã
Tối ưu mã cục bộ
• Nguyên tắc
– Xem xét một dãy lệnh trong mã đích và thay
thế chúng bằng những đoạn mã ngắn hơn và
hiệu quả hơn
• Xu hướng chính
– Loại bỏ lệnh dư thừa
– Thông tin dòng điều khiển
– Loại bỏ biểu thức con chung
– Tính toán giá trị hằng
– Giảm chi phí tính toán
2/20/24
– Lan truyền biến gán….. 111
3. Tối ưu mã
goto L1
…
L1: goto L2 ß Không cần
chuyển thành
goto L2
2/20/24 113
3. Tối ưu mã
t1 = i+1
t2 = b[t1]
t3
a[t1]
= i =+ t2
1 Không cần
a[t3] = t2
2/20/24 114
3. Tối ưu mã
i=4 i=4
t1 = i+1 t1 = 5
t2 = b[t1] t2 = b[t1]
a[t1] = t2 a[t1] = t2
i=4
i=4 t1 = 5
t2 = b[5] t2 = b[5]
a[5] = t2 a[5] = t2
2/20/24 115
3. Tối ưu mã
tmp2 = tmp1 ;
tmp3 = tmp2 * tmp1; tmp3 = tmp1 * tmp1;
tmp4 = tmp3 ; tmp5 = tmp3 * tmp1 ;
tmp5 = tmp3 * tmp2 ; c = tmp3 + tmp5 ;
c = tmp5 + tmp4 ;
2/20/24 117
3. Tối ưu mã
• Khái niệm
– Chuỗi các lệnh kế tiếp nhau trong đó ḍ òng
điều khiển đi vào lệnh đầu tiên của khối và ra
ở lệnh cuối cùng của khối mà không bị dừng
hoặc rẽ nhánh.
• Ví dụ
t1 := a * a
t2 := a * b
t3 := 2 * t2
t4 := t1 + t2
t5 := b * b
t6 := t4 + t5
2/20/24 118
3. Tối ưu mã
1 i=m-1 16 t7 = 4 * I
2 j=n 17 t8 = 4 * j
3 t1 =4 * n 18 t9 = a[t8]
4 v = a[t1] 19 a[t7] = t9
5 i=i +1 20 t10 = 4 * j
6 t2 = 4 * i Xác 21 a[t10] = x
7 t3 = a[t2] 22 goto (5)
định
8 if t3 < v goto (5) 23 t11 = 4 * I
9 j=j–1
khối cơ 24 x = a[t11]
10 t4 = 4 * j bản 25 t12 = 4 * i
11 t5 = a[t4] 26 t13 = 4 * n
12 if t5 > v goto (9) 27 t14 = a[t13]
13 if i >= j goto (23) 28 a[t12] = t14
14 t6 = 4 * i 29 t15 = 4 * n
15 x = a[t6] 30 a[t15] = x
2/20/24 121
3. Tối ưu mã
B4
if i >= j goto B6
2/20/24 122
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Loại biểu thức con chung
t1 =4 * n
v = a[t1]
B5 B6
t6 = 4 * i
B2 t11 = 4 * i
x = a[t6] x = a[t11]
i=i +1
t2 = 4 * i t7 = 4 * i t12 = 4 * i
t3 = a[t2] t8 = 4 * j t13 = 4 * n
if t3 < v goto B2 t9 = a[t8] t14 = a[t13]
B3 a[t7] = t9 a[t12] = t14
j=j–1 t10 = 4 * j t15 = 4 * n
t4 = 4 * j
a[t10] = x a[t15] = x
t5 = a[t4]
goto B2
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 123
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Loại biểu thức con chung
t1 =4 * n
v = a[t1]
B5 B6
t6 = 4 * i
B2 t11 = 4 * i
x = a[t6] x = a[t11]
i=i +1
t2 = 4 * i t8 = 4 * j t12 = 4 * i
t3 = a[t2] t9 = a[t8] t13 = 4 * n
if t3 < v goto B2 a[t6] = t9 t14 = a[t13]
B3 t10 = 4 * j a[t12] = t14
j=j–1 a[t10] = x t15 = 4 * n
t4 = 4 * j
goto B2 a[t15] = x
t5 = a[t4]
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 124
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Loại biểu thức con chung
t1 =4 * n
v = a[t1]
B5 B6
t6 = 4 * i
B2 t11 = 4 * i
x = a[t6] x = a[t11]
i=i +1
t2 = 4 * i t8 = 4 * j t12 = 4 * i
t3 = a[t2] t9 = a[t8] t13 = 4 * n
if t3 < v goto B2 a[t6] = t9 t14 = a[t13]
B3 a[t8] = x a[t12] = t14
j=j–1 goto B2 t15 = 4 * n
t4 = 4 * j
a[t15] = x
t5 = a[t4]
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 125
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Loại biểu thức con chung
t1 =4 * n
v = a[t1]
B5 B6
t6 = 4 * i
B2 t11 = 4 * i
x = a[t6] x = a[t11]
i=i +1
t2 = 4 * i t8 = 4 * j t13 = 4 * n
t3 = a[t2] t9 = a[t8] t14 = a[t13]
if t3 < v goto B2 a[t6] = t9 a[t11] = t14
B3 a[t8] = x a[t13] = x
j=j–1 goto B2
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 126
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Loại biểu thức con chung
t1 =4 * n
v = a[t1]
B5 B6
x = a[t2]
B2 t11 = 4 * i
t8 = 4 * j x = a[t11]
i=i +1
t2 = 4 * i t9 = a[t8] t13 = 4 * n
t3 = a[t2] a[t2] = t9 t14 = a[t13]
if t3 < v goto B2 a[t8] = x a[t11] = t14
B3 goto B2 a[t13] = x
j=j–1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 127
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Loại biểu thức con chung
t1 =4 * n
v = a[t1]
B5 B6
x = t3
B2 t11 = 4 * i
t8 = 4 * j x = a[t11]
i=i +1
t2 = 4 * i t9 = a[t8] t13 = 4 * n
t3 = a[t2] a[t2] = t9 t14 = a[t13]
if t3 < v goto B2 a[t8] = x a[t11] = t14
B3 goto B2 a[t13] = x
j=j–1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 128
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Loại biểu thức con chung
t1 =4 * n
v = a[t1]
B5 B6
x = t3
B2 t11 = 4 * i
t9 = a[t4] x = a[t11]
i=i +1
t2 = 4 * i a[t2] = t9 t13 = 4 * n
t3 = a[t2] a[t4] = x t14 = a[t13]
if t3 < v goto B2 goto B2 a[t11] = t14
B3 a[t13] = x
j=j–1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 129
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Loại biểu thức con chung
t1 =4 * n
v = a[t1]
B5 B6
x = t3
B2 t11 = 4 * i
a[t2] = t5 x = a[t11]
i=i +1
t2 = 4 * i a[t4] = x t13 = 4 * n
t3 = a[t2] goto B2 t14 = a[t13]
if t3 < v goto B2
a[t11] = t14
B3 a[t13] = x
j=j–1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
Tương tự với B6
B4
if i >= j goto B6
2/20/24 130
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Lan truyền biến gán
t1 =4 * n
v = a[t1]
B5 B6
x = t3
B2 x = t3
a[t2] = t5 t14 = a[t1]
i=i +1
t2 = 4 * i a[t4] = x a[t11] = t14
t3 = a[t2] goto B2 a[t13] = x
if t3 < v goto B2
B3
j=j–1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 131
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Giảm chi phí
t1 =4 * n
v = a[t1]
B5 B6
a[t2] = t5
B2 t14 = a[t1]
a[t4] = t3 a[t11] = t14
i=i +1
t2 = 4 * i goto B2 a[t13] = t3
t3 = a[t2]
if t3 < v goto B2
B3
j=j–1
t4 = 4 * j
t5 = a[t4]
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 132
3. Tối ưu mã
Tối ưu mã ® Ví dụ
B1 i=m-1
j=n Giảm chi phí
t1 =4 * n
v = a[t1]
B5 B6
t2= 4* i
a[t2] = t5 t14 = a[t1]
t4 = 4*j
a[t4] = t3 a[t11] = t14
B2 goto B2 a[t13] = t3
t2 = t2+4
t3 = a[t2]
if t3 < v goto B2
B3
t4 = t4-4
t5 = a[t4]
if t5 > v goto B3
B4
if i >= j goto B6
2/20/24 133
3. Tối ưu mã
Tối ưu mã đích
2/20/24 134
3. Tối ưu mã
• Load c • Load c
• Store #3 • Stroe #3
• Load b • Load b • Load c
• Store #1 • Store #1 • Stroe #3 • Load b
• Load a • Load # 1 • Load b • Add a
• Add #1 • Add a • Add a • Mul 10
• Store #2 • Strore #2 • Mul 10 • Add c
• Load 10 • Load #2 • Add # 3 • Store V
• Mul #2 • Mul 10 • Store V
• Add # 3 • Add # 3
• Store V • Store V
2/20/24 136