Presentation is loading. Please wait.

Presentation is loading. Please wait.

PhD. Hieu Chi Nguyen Fall 2008

Similar presentations


Presentation on theme: "PhD. Hieu Chi Nguyen Fall 2008"— Presentation transcript:

1 PhD. Hieu Chi Nguyen Fall 2008
CS 3016 Compilers PhD. Hieu Chi Nguyen Fall 2008

2 Levels of language in computing

3 High-Level Programming Languages
What is a Compiler? Compiler High-Level Programming Languages Machine Code Error Messages Then What? Machine Code Program Inputs Program Outputs

4 What is an Interpreter? Source Code Interpreter Program Outputs
Program Inputs

5 What is a Just-in-Time Compiler?
IR Generator Source Code Program Outputs Program Inputs Virtual Machine Intermediate Program

6 Why Study Compilers? Fundamental tool in computer science since 1952
Remains a vibrant research topic Machines keep changing Languages keep changing Applications keep changing When to compile keeps changing Challenging! Must correctly handle an infinite set of legal programs Is itself a large program → “Where theory meets practice”

7 Goals of a Compiler A compiler’s job is to Lower the abstraction level
Eliminate overhead from language abstractions Map source program onto hardware efficiently Hide hardware weaknesses, utilize hardware strengths Equal the efficiency of a good assembly programmer Optimizing compilers should improve the code Performance* Code size Security Reliability Power consumption

8 An Interface to High-Level Languages
Compiler High-Level Programming Languages Machine Code Programmers write in high-level languages Increases productivity Easier to maintain/debug More portable HLLs also protect the programmer from low-level details Registers and caches – the register keyword Instruction selection Instruction-level parallelism The catch: HLLs are less efficient

9 High-Level Languages and Features
C (80’s) … C++ (Early 90’s) … Java (Late 90’s) Each language had features that spawned new research C/Fortran/COBOL User-defined aggregate data types (arrays, structures) Control-flow and procedures Prompted data-flow optimizations C++/Simula/Modula II/Smalltalk Object orientation (more, smaller procedures) Prompted inlining Java Type safety, bounds checking, garbage collection Prompted bounds removal, dynamic optimization

10 An Interface to Computer Architectures
Compiler High-Level Programming Languages Machine Code Parallelism Instruction level multiple operations at once want to minimize dependences Processor level multiple threads at once want to minimize synchronization Memory Hierarchies Register allocation (only portion explicitly managed in SW) Code and data layout (helps the hardware cache manager) Designs driven by how well compilers can leverage new features!

11 How Can We Translate Effectively?
High-Level Source Code ? Low-Level Machine Code

12 Idea: Translate in Steps
Series of program representations Intermediate representations optimized for various manipulations (checking, optimization) More machine specific, less language specific as translation proceeds

13 Simplified Compiler Structure
Source code (character stream) if (b==0) a = b; Lexical Analysis Token stream Front End Parsing Machine independent Abstract syntax tree Intermediate Code Generation Intermediate code Optimization Back End LIR Machine dependent Assembly code (character stream) CMP CX, 0 CMOVZ CX, DX Register Allocation

14 Why Separate the Front and Back Ends?
hello.c Hello x86 hello.cc Compiler X FEs Hello alpha Y BEs hello.f Hello sparc hello.ada Recall: An interface between HLLs and architectures Option: X*Y compilers or X-front ends + Y-back ends Front End Hello alpha Hello x86 Hello sparc hello.c hello.f hello.cc hello.ada Back End IR

15 Structure of a Compiler
Front End Lexical Analysis Syntax Analysis Semantic Analysis Intermediate Code Generation Back End Code Optimization Code Generation

16 Lexical Analysis Someone breaks the ice S o m e o n e b r e a k s
final := initial + rate * 60 id1 := id2 + id3 * 60

17 Syntax Analysis Someone breaks the ice id1 := id2 + id3 * 60 := id1 +
sentence subject verb object Someone breaks the ice

18 Semantic Analysis := id1 + id2 * id3 60 i2r Someone plays the piano
(meaningful) The piano plays someone (meaningless)

19 Intermediate Code Generation
Most common intermediate representation 􀂄 Syntax trees 􀂄 Directed acyclic graphs (DAG) 􀂄 Postfix notation 􀂄 Three-address code := id1 + id2 * id3 60 i2r temp1 := i2r ( 60 ) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 Someone breaks the ice A?

20 Code Optimization temp1 := i2r ( 60 ) temp2 := id3 * temp1
id1 := id2 + temp1 A? Ab?

21 Code Generation temp1 := id3 * 60.0 id1 := id2 + temp Ab? mov id3, r2
mul #60.0, r2 mov id2, r1 add r2, r1 mov r1, id1 Ab? Abc?

22 Internal Compiler Structure –Front End
Source Program Lexical Analyzer Token Stream Parser Syntax Tree Semantic Analyzer Syntax Tree Intermediate Code Gen IR Series of filter passes Source program – Written in a HLL Lexical analysis – Convert keywords into “tokens” Parser – Forms a syntax “tree” (statements, expressions, etc.) Semantic analysis – Type checking, etc. Intermediate code generator – Three-address code, interface for back end

23 Internal Compiler Structure –Back End
IR Code Optimizer IR Code Generator Target program Code optimization – “improves” the intermediate code (most time is spent here) Consists of machine independent & dependent optimizations Code generation Register allocation, instruction selection

24 Traditional Compiler Infrastructures
GNU GCC Targets: everything (pretty much) Strength: Targets everything (pretty much) Weakness: Not as extensible as research infrastructures, poor optimization Stanford SUIF Compiler with Harvard MachSUIF Targets: Alpha, x86, IPF, C Strength: high level analysis, parallelization on scientific codes Intel Open Research Compiler (ORC) Targets: IPF Strength: robust with OK code quality Weakness: Many IR levels

25 Modern Compiler Infrastructures
IBM Jikes RVM Targets Linux, x86 or AIX Strengths: Open-source, wide user base Weaknesses: In maintenance mode Microsoft Phoenix Targets Windows Strengths: Actively developed Weaknesses: Closed source, extensive API

26 What will we learn in this course?
Structure of Compilers The Front End The Back End

27 Required Work Phaàn Lyù thuyeát: SV hoïc 45 tieát lyù thuyeát
Phaàn Thöïc haønh: SV tham döï thöïc haønh – thöïc hieän Baøi taäp Moân hoïc (1 Baøi taäp Moân hoïc / 1 SV) Hình thöùc ñaùnh giaù: Kieåm tra Baøi taäp Moân hoïc  Ñieåm TH Thi vieát Lyù thuyeát cuoái kyø  Ñieåm LT Điểm quaù trình hoïc taäp (10%+10%) Caùch tính ñieåm: Ñieåm toång keát moân = LT * 40% + TH * 40%+ 10%+10%

28 Course Materials 1) Alfred V.Aho, Jeffrey D.Ullman (2003|1986). Compilers, Principles techniques, and tools. Addison – Wesley Publishing Company. 2) Phan Thò Töôi (2003). Trình Bieân Dòch. Ñaïi hoïc Baùch Khoa TP. Hoà Chí Minh Other Helpful Books

29 Next Time… Read Compilers Chapter 3
We will begin discussing lexical analysis Look out for Assignment

30 Baûng 2.1. Caùc böôùc phaân tích cuù phaùp cuûa caâu xyyz
2. Söï phaân tích cuù phaùp ñoaùn nhaän tröôùc Daïng ñaëc bieät cuûa phaân tích cuù phaùp töø treân xuoáng laø phöông phaùp ñoaùn nhaän tröôùc. Phöông phaùp naøy seõ nhìn tröôùc moät kyù hieäu nhaäp ñeå quyeát ñònh choïn thuû tuïc cho kyù hieäu khoâng keát thuùc töông öùng. Thí duï 2.8. Cho vaên phaïm G: P: S  xA A  z  yA Duøng vaên phaïm G ñeå phaân tích caâu nhaäp xyyz Baûng 2.1. Caùc böôùc phaân tích cuù phaùp cuûa caâu xyyz Luaät aùp duïng Chuoãi nhaäp S xA yA A z - xyyz yyz yz

31 Baûng 2.2. Phaân tích cuù phaùp cho caâu xxxz khoâng thaønh coâng
Thí duï 2.9. Cho vaên phaïm vôùi caùc luaät sinh nhö sau : S  A  B A  xA  y B  xB  z Baûng 2.2. Phaân tích cuù phaùp cho caâu xxxz khoâng thaønh coâng Luaät aùp duïng Chuoãi nhaäp S A xA xxxz xxz xz z

32 Baûng 2.3. Phaân tích caâu nhaäp : x
- Ñieàu kieän 1 : A  1    ... n - Ñònh nghóa: first (i) = s  s laø kyù hieäu keát thuùc vaø   s… Ñieàu kieän 1 ñöôïc phaùt bieåu nhö sau : A  1    ...  n first (i)  first (j) =  vôùi i  j Löu yù: first (a ) = a 2. Neáu A 1    …  n; thì first (A) = first (1)  first (2) ...  first (n) Thí duï Cho vaên phaïm G coù taäp luaät sinh: S  Ax A  x   vôùi  laø chuoãi roãng Baûng 2.3. Phaân tích caâu nhaäp : x Luaät Chuoãi nhaäp A xx x -

33 Söï phaân tích thaát baïi
- Ñieàu kieän 2: first (A)  follow (A) =  Vôùi A 1    …  n   Follow (A) ñöôïc tính nhö sau: Vôùi moãi luaät sinh Pi coù daïng X  A thì follow (A) laø first ( ). ÔÛ thí duï 2.11 first (A)  follow (A) = x Löu yù vaên phaïm coù ñeä quy traùi seõ vi phaïm ñieàu kieän 1. Thí duï: A  B  AB (2.1) Vaäy first (A) = first (B) ; first (AB) = first (A) = first (B). first (B)  first (AB)   vi phaïm ñieàu kieän 1. Neáu söûa luaät (2.1) thaønh A    AB thì seõ vi phaïm ñieàu kieän 2. Thí duï Cho vaên phaïm nhö ôû thí duï 2.6, chuùng ta duøng phöông phaùp phaân tích ñoaùn nhaän tröôùc ñeå phaân tìch caâu array[num dotdot num] of integer (töï xem ôû trang 41). Caùc thuû tuïc ñöôïc goïi khi sinh caây phaân tích cho caùc caâu thuoäc vaên phaïm ôû thí duï 2.12.

34 CHÖÔNG 3 PHAÂN TÍCH TÖØ VÖÏNG
3.1. Vai troø cuaû boä phaân tích töø vöïng 1. Token, maãu, trò töø vöïng Baûng 3.1 Baûng danh bieåu cuûa token Token Trò töø vöïng YÙ nghóa cuûa maãu const if then ralation num id literal < , < =, < >, = , > = 3.14, 2.5, 7.6 abc, ou, bc1… ‘abcef’ caùc toaùn töû quan heä haèng soá baát kyø chuoãi goàm kyù töï chöõ vaø soá, baét ñaàu laø kyù töï chöõ laø chuoãi kyù töï baát kyø naèm giöõa 2 daáu ‘

35 3.2. CAÙC TÍNH CHAÁT CUÛA TOKEN 3.3. CHÖÙA TAÏM CHÖÔNG TRÌNH NGUOÀN
Hình 3.1. Söï giao tieáp giöõa boä phaân tích töø vöïng vaø boä phaân tích cuù phaùp 3.2. CAÙC TÍNH CHAÁT CUÛA TOKEN 3.3. CHÖÙA TAÏM CHÖÔNG TRÌNH NGUOÀN 1. Caëp boä ñeäm Caáu taïo Chöông trình nguoàn token Boä phaân tích töø vöïng Boä phaân tích töø vöïng yeâu caàu token Baûng danh bieåu

36 if p2 ôû ranh giôùi moät nöûa boä ñeäm then
Hình 3.2. Caëp boä ñeäm Quy trình hoaït ñoäng Giaûi thuaät: if p2 ôû ranh giôùi moät nöûa boä ñeäm then begin laáp ñaày N kyù hieäu nhaäp môùi vaøo nöûa beân phaûi p2 := p2 + 1; end else if p2 ôû taän cuøng beân phaûi boä ñeäm then begin laáp ñaày N kyø hieäu nhaäp vaøo nöûa beân traùi boä ñeäm chuyeån p2 veà kyù töï taän cuøng beân traùi cuûa boä ñeäm end else p2 := p2 + 1; A : = B * . - 2 eof p1 p2

37 Hình 3.3. Caëp boä ñeäm theo phöông phaùp caàm canh
: = B * X EOF - 2 N kyù töï N kyù töï p1 p2 Hình 3.3. Caëp boä ñeäm theo phöông phaùp caàm canh Giaûi thuaät: p2 := p2 + 1; if p2 ^ eof then if p2 ôû ranh giôùi moät nöûa boä ñeäm then begin chaát ñaày N kyø hieäu nhaäp vaøo nöûa beân phaûi boä ñeäm; p2 := p2 + 1 end

38 else if p2 ôû taän cuøng beân phaûi boä ñeäm then
begin laáp ñaày N kyù hieäu vaøo nöû beân traùi boä ñeäm; chuyeån p2 veà ñaàu boä ñeäm end else /* döøng söï phaân tích töø vöïng */ 3.4. Ñaëc taû token Caùc quy taéc ñònh nghiaõ bieåu thöùc chính quy 1.  laø bieåu thöùc chính quy, bieåu thò cho taäp  a laø kyù hieäu thuoäc , bieåu thò cho taäp a r vaø s laø hai bieåu thöùc chính quy, bieåu thò cho L (r) vaø L (s) thì: ø a) (r)  (s) laø bieåu thöùc chính quy, bieåu thò cho L(r)  L(s) b) (r) (s) laø bieåu thöùc chính quy, bieåu thò cho L(r) L(s). c) (r)* laø bieåu thöùc chính quy, bieåu thò cho (L(r))*. d) r laø bieåu thöùc chính quy, bieåu thò cho L(r).

39 Thí duï Cho  = a, b 1. ab (a b)  (b a) a* Hai bieåu thöùc chính quy töông ñöông r vaø s, kyù hieäu r = s. 2. Ñònh nghóa chính quy Neáu  laø taäp kyù hieäu caên baûn, thì ñònh nghiaõ chính quy laø chuoãi ñònh nghiaõ coù daïng: d1  r1 …… dn  rn Thí duï letter  A  B  …Z  a b … z digit  0 1 … 9 id  letter ( letter  digit)* Thí duï digit  0  1 …  9 digits  digit digit* optional_fraction  .digits   optional_exponent  (E (+ - ) digits)  

40 3.5. Nhaän daïng token Thí duï Cho vaên phaïm G: stmt  if exp then stmt  if exp then stmt else stmt   exp  term relop term  term term  id  num Ñònh nghóa chính quy if  if then  then else  else relop  <  <=  >  >=  <>  = id  letter (letter  digit)* num  digit+ (.digit+  ) ( E ( +  -  ) digit+   ) delim  blank  tab  newline ws  delim+ Töø ñònh nghóa chính quy ta xaây döïng baûng maãu cho token nhö ôû baûng 3.3 trang 74.

41 return (relop, NE) return (relop, LT) return (relop, EQ) (relop, EQ)
3.6. Sô ñoà dòch 1. Mieâu taû = > Baét ñaàu 6 7 Hình 3.4. Sô ñoà dòch cho >= vaø = * other 8 Start < = 1 return (relop, LE) 2 > return (relop, NE) 3 other * 4 return (relop, LT) = 5 return (relop, EQ) > = (relop, EQ) 6 7 * other 8 return (relop, EQ) Hình 3.5. Sô ñoà dòch nhaän daïng token relop

42 Hình 3.9. Xaây döïng boä phaân tích töø vöïng
3.7. Ngoân ngöõ ñaëc taû cho boä phaân tích töø vöïng Chöông trình nguoàn trong ngoân ngöõ Lex Lex – yy.c Trình bieân dòch Lex Trình bieân dòch c a.out Lex. I Lex – yy.c a.out Doøng nhaäp chuoãi token Hình 3.9. Xaây döïng boä phaân tích töø vöïng Lex-ñaëc taû Moät chöông trình Lex bao goàm ba phaàn : - Khai baùo - %% caùc quy taéc bieân dòch - %% caùc chöông trình con phuï trôï

43 Löu yù: - Phaàn khai baùo bao goàm khai baùo haèng, bieán bieåu thò vaø caùc ñònh nghóa chính quy. - Phaàn quy taéc bieân dòch laø caùc phaùt bieåu coù daïng: p1  haønh vi ngöõ nghóa 1 p2  haønh vi ngöõ nghóa 2 …… pn  haønh vi ngöõ nghóa n 3.8. Automat höõu haïn 1. Automat höõu haïn khoâng taát ñònh (NFA) Thí duï: Cho NFA: Taäp traïng thaùi S = 0, 1,2, 3;  = a, b; Traïng thaùi baét ñaàu so = 0; Taäp traïng thaùi keát thuùc F = 3.

44 Baûng 3.4. Baûng truyeàn cho NFA ôû hình 3.10
Traïng thaùi Kyù hieäu nhaäp a b 0, 1 0 1 - 2 2 3 NFA chaáp nhaän moät chuoãi nhaäp x neáu vaø chæ neáu toàn taïi moät ñöôøng naøo ñoù trong sô ñoà töø traïng thaùi baét ñaàu ñeán traïng thaùi keát thuùc sao cho taát caû teân cuûa caùc caïnh con ñöôøng cho chuoãi x. NFA chaáp nhaän chuoãi aabb. 2. Automat höõu haïn taát ñònh (DFA) DFA laø tröôøng hôïp ñaëc bieät cuûa NFA, noù khoâng coù: i) Söï truyeàn roãng. ii) Vôùi moãi traïng thaùi s vaø kyù hieäu nhaäp a chæ toàn taïi nhieàu nhaát moät caïnh coù teân a xuaát phaùt tö øs.

45 Hình 3.12. DFA nhaän daïng ngoân ngöõ (a  b)*abb
Giaûi thuaät 3.1. Moâ phoûng hoaït ñoäng cuûa DFA treân chuoãi nhaäp x. Thí duï 3.5 start a a b b 1 1 3 Hình DFA nhaän daïng ngoân ngöõ (a  b)*abb 3. Chuyeån NFA sang DFA Giaûi thuaät Xaây döïng taäp con (Taïo DFA töø NFA). Nhaäp: Cho NFA goïi laø N. Xuaát: DFA goïi laø D, nhaän daïng cuøng ngoân ngöõ nhö NFA. Phöông phaùp: Xaây döïng baûng truyeàn cho D. Moãi traïng thaùi cuûa D laø taäp traïng thaùi cuûa N. D moâ phoûng ñoàng thôøi moïi chuyeån ñoäng cuûa N treân chuoãi nhaäp cho tröôùc baèng caùc taùc vuï: -closure (s); -closure (T); move (T, a)

46 Hình 3.13. NFA nhaän daïng (a  b)* abb
Moâ phoûng Xaây döïng taäp con Giaûi thuaät: Tính -closure Ñaåy taát caû caùc traïng thaùi trong T leân stack; Khôûi taïo -closure (T) cho T. Moâ phoûng 3.3. Tính -closure Thí duï 3.6. (H.3.13 ) laø NFA nhaän daïng ngoân ngöõ (a  b )* abb. Chuùng ta duøng giaûi thuaät 3.2 ñeå xaây döïng DFA töông ñöông. a 2 3 start a b b 1 6 7 8 9 10 b 4 5 Hình NFA nhaän daïng (a  b)* abb

47 3.9. Töø bieåu thöùc chính quy ñeán NFA
Xaây döïng NFA töø bieåu thöùc chính quy Giaûi thuaät 3.3. Xaây döïng NFA töø bieåu thöùc chính quy (Caáu truùc Thompson’) Nhaäp: Bieåu thöùc chính quy r treân . Xuaát: NFA nhaän daïng ngoân ngöõ L (r). Phöông phaùp: Quy taéc: 1. Vôùi  , xaây döïng NFA 2. Vôùi a thuoäc , xaây döïng NFA start i f start a i f

48 3. Giaû söû N( s ) vaøN( t ) laø NFA cho bieåu thöùc chính quy s vaø t
- Vôùi s  t xaây döïng NFA hoãn hôïp N (s t) N(s) start f i N(t) - Vôùi bieåu thöùc st, xaây döïng NFA hoãn hôïp N (st) f N(s) N(t) start i

49 - Vôùi bieåu thöùc s* , xaây döïng NFA N (s*)
start i N(s) f - Bieåu thöùc s thì N (s) laø NFA nhaän daïng L (s) Caùc tính chaát cuaû NFA xaây döïng theo caáu truùc Thompson’ Thí duï 3.7. Giaûi thuaät Moâ phoûng NFA Nhaäp: NFA goïi laø N ñöôïc xaây döïng theo giaûi thuaät 3.3, chuoãi nhaäp x. X ñöôïc keát thuùc baèng eof, N coù traïng thai baét ñaàu s0 vaø taäp traïng thaùi keát thuùc F. Xuaát: Giaûi thuaät traû lôøi ñuùng neáu N chaáp nhaän x, ngöôïc laïi traû lôøi sai Phöông phaùp: Giaûi thuaät: Moâ phoûng 3.4.

50 Thí duï 3. 8. Giaû söû ta coù NFA ôû (H. 3
Thí duï 3.8. Giaû söû ta coù NFA ôû (H.3.13 ), x laø chuoãi nhaäp chöùa a. Duøng giaûi thuaät 3.4 xeùt xem NFA coù chaáp nhaän x ?. Keát quûa giaûi thuaät traû lôøi sai ( nghiaõ laø a khoâng thuoäc ngoân ngöõ do NFA nhaän daïng Thôøi gian vaø khoâng gian caàn thieát cho vieäc nhaän daïng moät chuoãi nhaäp: - Ñoái vôùi DFA: khoâng gian O (2 ( )) vaø thôøi gian O (x  ). - Ñoái vôùi NFA: khoâng gian O (r  ) vaø thôøi gian O ( r  *  x  ). 3.10. Xaây döïng DFA tröïc tieáp töø bieåu thöùc chính quy vaø vaán ñeà toái öu hoùa vieäc so truøng maãu 1. Traïng thaùi quan troïng cuûa NFA Traïng thaùi quan troïng laø töø noù coù söï truyeàn khaùc roãng. Nhö vaäy neáu hai taäp traïng thaùi coù cuøng soá traïng thaùi quan troïng thì chuùng ñöôïc ñoàng nhaát. NFA ñöôïc xaây döïng theo caáu truùc Thompson’ coù traïng thaùi keát thuùc khoâng coù söï truyeàn ra, nhö vaäy noù khoâng phaûi laø traïng thaùi quan troïng ( nhöng thöïc söï noù laïi raát quan troïng ). Ñeå traùnh tình traïng naøy ngöôøi ta theâm kyù hieäu # vaøo sau bieåu thöùc chính quy, vaø traïng thaùi keát thuùc coù söï truyeàn treân kyù hieäu #. Khi xaây döïng taäp con hoaøn taát thì traïng thaùi naøo coù söï truyeàn treân # laø traïng thaùi chaáp nhaän.

51 Hình 3.16. Caây phaân raõ cuûa bieåu thöùc gia toá (a b )* abb#
- Bieåu thöùc r# ñöôïc goïi laø bieåu thöùc chính quy gia toá. Vaên phaïm cuûa bieåu thöùc chính quy: exp  exp  term exp  term term  term  factor term  factor factor  factor* factor  ( exp ) factor  a factor  b Hình Caây phaân raõ cuûa bieåu thöùc gia toá (a b )* abb# #6 b5 * b4 a3 a1 b2

52 Hình 3.17. NFA ñöôïc xaây döïng töø ( a b )* abb#
Löu yù: - Caùc traïng thaùi ñöôïc kyù hieäu baèng soá laø traïng thaùi quan troïng; Caùc traïng thaùi ñöôïc kyù hieäu baèng chöõ laø traïng thaùi khoâng quan troïng. - ÔÛ thí duï 3.6 traïng thaùi A vaø C coù cuøng soá traïng thaùi quan troïng laø 2,4,7 , trong (H 3.17) laø 1,2,3: A = 0,1,2,4,7 C = 1,2,4,5,7 a 1 C start a a b b # A B F 3 4 5 6 F b 2 D

53 Baûng 3.6. Caùc quy taéc ñeå tính ba haøm nullable, firstpos, lastpos
Nuùt n nullable (n) firstpos (n) lastpos (n) n laø nuùt coù teân laø  true n laø nuùt coù teân laø vò trí i false i nullable(c1) or nullable(c2) firstpos(c1)  firstpos(c2) lastpos(c1)  lastpos(c2) nullable(c1) and nullable(c2) if nullable(c1) then firstpos(c1)  firstpos(c2) else firstpos(c1) if nullable(c2) then lastpos(c1)  lastpos(c2) else lastpos(c2) firstpos(c1) lastpos(c1) | n c1 c2 n c1 c2 n c1

54 Caùc quy taéc tính haøm followpos (n):
1. Neáu nuùt n laø nuùt cat vôùi con beân traùi laø c1, con beân phaûi laø c2 vaø i laø vò trí trong lastpos(c1), thì taát caû vò trí trong first(c2) seõ cho vaøo followpos(i). 2. Neáu n laø nuùt star vaø i laø vò trí trong lastpos(n) thì taát caû caùc vò trí trong firstpos(n) seõ cho vaøo followpos(i). Thí duï Ta xaùc ñònh DFA cho bieåäu thöùc (a  b)* abb 1,2,3 1,2,3 6 5 1,2,3 4 6 1,2,3 # 6 3 5b5 1,2 1,2 4b4 3a3 1,2 1,2 1a 1 2b 2 Hình Tính caùc haøm nullable, firstpos, lastpos cho caùc nuùt treân caây phaân tích cuûa bieåu thöùc ( a b )* abb

55 Baûng 3.7. caùc trò followpos cuûa caùc nuùt treân caây ôû (H.3.19)
Sau ñoù ta tính haøm followpos. Baûng caùc trò followpos cuûa caùc nuùt treân caây ôû (H.3.19) Nuùt followpos {1,2,3} {1,2,3} {4} {5} {6} _ Giaûi thuaät 3.5. Xaây döïng DFA töø bieåu thöùc chính quy Nhaäp: Bieåu thöùc chính quy r. Xuaát: DFA goïi laø D, nhaän daïng ngoân ngöõ L( r) Phöông phaùp :1. Xaây döïng caây phaân tích cho BTCQ gia toá r#. 2. Tính caùc haøm nullable, firstpos, lastpos vaø followpos cho caùc nuùt treân caây phaân tích 3. Xaây döïng caùc traïng thaùi, haøm truyeàn vaø baûng truyeàn cho D baèng thuû tuïc ôû (moâ phoûng 3.5).

56 Thuû tuïc taïo taäp con laø caùc traïng thaùi cuûa DFA:
Luùc ñaàu D chæ coù moät traïng thaùi baét ñaàu laø firstpos(root) , chöa ñöôïc ñaùnh daáu. Moâ phoûng 3.5. Thuû tuïc taïo taäp con while coù traïng thaùi T chöa ñöôïc ñaùnh daáu, trong taäp traïng thaùi cuûa D do begin ñaùnh daáu T; for vôùi moãi kyù hieäu nhaäp a do; begin vôùi U laø taäp caùc vò trí trong followpos (p), p laø vò trí trong T, sao cho kyù hieäu taïi vò trí p laø a; if U khoâng roãng vaø chöa coù trong taäp traïng thaùi cuûa D then begin theâm U vaøo taäp traïng thaùi cuûa D vaø laø traïng thaùi chöa ñöôïc ñaùnh daáu; D[T, a] := U; end; Löu yù: traïng thaùi keát thuùc cuûa D coù chöùa vò trí cuûa y.

57 Thí duï 3.10. Xaây döïng DFA töø btcq ( a b )* abb. (trang 103 -104)
3. Toái thieåu soá traïng thaùi cuûa DFA - Khaùi nieäm DFA ñaày ñuû, traïng taùi cheát d. - Chuoãi w phaân bieät traïng thaùi s vôùi traïng thaùi t. Thí duï: DFA ôû (H.3.14, tr. 90), neáu xuaát phaùt töø C ñeå nhaän daïng w=bb thì khoâng ñi ñöôïc ñeán traïng thaùi chaáp nhaän, ngöôïc laïi töø B thì ñi ñeán E laø traïng thaùi chaáp nhaän. Giaûi thuaät 3.6. Toái thieåu soá traïng thaùi cuûa DFA. Nhaäp: DFA, goïi laø M coù S, , s0, F. M laø DFA ñaày ñuû. Xuaát: DFA, goïi laø M’ chaáp nhaän ngoân ngöõ nhö M, vôùi soá traïng thaùi nhoû nhaát. Phöông phaùp: 1.Taïo  khôûi ñaàu coù 2 nhoùm: caùc traïng thaùi keát thuùc F, vaø caùc traïng thaùi khoâng keát thuùc S – F. 2. AÙp duïng thuû tuïc (moâ phoûng 3.6) ñeå taïo new . 3. Neáu new =  thì final = , tieáp tuïc böôùc 4, ngöôïc laïi laëp laïi böôùc 2, vôùi  = new

58 4. Chuùng ta choïn moãi nhoùm 1 traïng thaùi ñaïi dieän vaø ñoù laø traïng thaùi cuûa M’ .
5. Neáu M’ coù traïng thaùi cheát d thì loaïi noù ra khoûi M’. Taát caû caùc söï truyeàn ñeán traïng thaùi d ñeàu khoâng xaùc ñònh. Moâ phoûng Giaûi thuaät taïo new for vôùi moãi nhoùm G cuûa  do begin - chia G thaønh caùc nhoùm nhoû hôn sao cho hai traïng thaùi s vaø t cuûa G seõ ôû cuøng moät nhoùm nhoû hôn neáu vaø chæ neáu caùc söï truyeàn treân taát caû caùc kyù hieäu nhaäp a töø s vaø t ñeàu ñi ñeán caùc traïng thaùi keá tieáp ôû trong cuøng moät nhoùm cuûa ; - ta thay G baèng caùc nhoùm nhoû hôn vöøa ñöôïc taïo neân, cho chuùng vaøo new ; end; Thí duï Cho DFA nhö ôû (H. 3.14, tr. 90). Caùch giaûi ôû tr. 106 – 107.

59 4. Caùc phöông phaùp neùn baûng truyeàn FA
1. Thu giaûm haøng vaø coät dö thöøa Hình Baûng truyeàn ñöôïc neùn baèng phöông phaùp thu giaûm haøng vaø coät dö thöøa 0 – – – 0 -1 3 1 2 5 4 -2 y next yrmap

60 Hình 3.22. Baûng truyeàn neùn theo phöông phaùp neùn caëp
ynext 7 ‘0’,3 ‘0’,1 ‘1’,1 ‘2’,1 ‘3’,1 ‘4’,2 ‘5’,2 ynext 0 1 -1-1…12-1… …-1 5-1… ynext 1 2 6 ‘0’,2 ‘1’,2 ‘2’,3 ‘3’,4 ‘4’,1 ‘5’,1 ynext 2 3 ‘2’,2 ‘3’,2 ‘6’,2 ynext 3 4 ‘0’,4 ‘1’,4 ‘2’,4 ynext 4 5 ynext 5

61 Moâ phoûng 3.7. Giaûi thuaät tìm traïng thaùi keá tieáp treân baûng truyeàn ñaõ ñöôïc neùn
row := ynext [t]; I := row^[0], /* row^ laø ma traän 1 chieàu ynext t */ if I = 0 then begin c := ord (a) s := row^[c]; /* s laø traïng thaùi keá tieáp */ end else begin while (a < > row^ [i]. chart) and (i < I) do i := i + 1; if a = row^[i]. chart then s := row^[i]. State else writen (‘sai – loãi töø vöïng’); end;

62 3.11. Thieát keá boä sinh boä phaân tích töø vöïng
Hình Trình bieân dòch Lex vaø Boä phaân tích töø vöïng Chöông trình moâ phoûng FA vaø baûng truyeàn Ñaëc taû lex Trình bieân dòch Lex a) Chöông trình moâ phoûng FA Baûng truyeàn b) Boä ñeäm nhaäp

63 Hình 3.24. NFA ñöôïc tao ra töø söï ñaëc taû LEX
1. Maãu so truøng treân cô sôû NFA Hình NFA ñöôïc tao ra töø söï ñaëc taû LEX N(p1) so N(pi) N(pn)

64 CHÖÔNG 4 PHAÂN TÍCH CUÙ PHAÙP 4.1. Vai troø cuûa boä phaân tích cuù phaùp - Phöông phaùp toång quaùt: Cocke-Younger-Kasami vaø Earley. - Phaân tích töø treân xuoáng. - Phaân tích töø döôùi leân. 4.2. Xaây döïng vaên phaïm cho ngoân ngöõ laäp trình Loaïi boû söï khoâng töôøng minh stmt  if exp then stmt if exp then stmt else stmt  other Thí duï: phaùt bieåu: if E1 then if E2 then S1 else S2 laø phaùt bieåu khoâng töôøng minh - Loaïi boû söï khoâng töôøng minh. Quy öùôc hoaëc söûa vaên phaïm. stmt  matched-stmt lunmatched-stmt

65 matched-stmt if exp then matched-stmt else matched-stmt1
 other unmatched-stmt  if exp then stmt  if exp then matched-stmt else unmatched-stmt Loaïi boû ñeä quay traùi Vaên phaïm goïi laø ñeä quy traùi neáu toàn taïi daãn xuaát. A  A, vôùi   ( Vt  Vn) Ñeä quy traùi laø bao goàm ñeä quy traùi ñôn giaûn (tröïc tieáp) vaø ñeä quy traùi toång quaùt. Ñeå loaïi boû ñeä quy ñôn giaûn, ta seõ thay theáõ taäp luaät sinh: A  A1A …… Am…..n baèng caëp luaät sinh A 1A’2A’…nA.’ A’1A’A’ …..mA’ Thí duï 4.1. Loaïi boû ñeä quy traùi cho vaên phaïm: E  E + T  T T  T * F  F F  (E)  id

66 Giaûi thuaät 4.1. Loaïi boû ñeä qy traùi
Nhaäp: Vaên phaïm G khoâng coù voøng laëp hoäi luaät sinh roãng. Xuaát : Vaên phaïm töông ñöông G’ khoâng coù ñeä quy traùi. Phöông phaùp: AÙp duïng giaûi thuaät ôû moâ phoûng 4.1 cho G. G’ khoâng coøn ñeä quy traùi nhöng coù theå coù luaät sinh roãng. Saép xeáp caucus kyù hieäu khoâng keát thuùc theo moät thöù töï naøo ñoù: A1, A2, …. An . Moâ phoûng 4.1. Giaûi thuaät loaïi boû ñeä quy traùi töø vaên phaïm for i := 1 to n do for j := 1 to i - 1 do begin - Thay caùc luaät sinh coù daïng Ai  Aj  baèng caùc luaät sinh Ai …..k - Vôùi Aj luaät sinh coù daïng Aj   ….k - Loaïi taát caû caû caùc luaät sinh coù ñeä quy traùi tröïc tieáp trong caùc Ai luaät sinh end;

67 Thí duï: Chuùng ta coù aùp duïng giaûi thuaät 4
Thí duï: Chuùng ta coù aùp duïng giaûi thuaät 4.1 vaøo vaên phaïm sau ñeå loaïi boû ñeä quy traùi. S Aa b A  Ac Sd  Thöøa soá traùi: Thí duï ta coù hai luaät sinh: stmt  if exp then stmt else stmt if exp then stmt Caû hai luaät sinh ñeàu coù if daãn ñaàu neân ta seõ khoâng bieát choïn luaät sinh naøo ñeå trieån khai. Vì theá ñeå laøm chaäm laïi quyeát ñònh löïa choïn chuùng ta seõ taïo ra thöøa soá traùi. Giaûi thuaät 4.2. Taïo vaên phaïm coù thöøa soá traùi Nhaäp: cho vaên phaïm G. Xuaát: vaên phaïm G’ coù thöøa soá traùi töông ñöông. Phöông phaùp: Tìm chuoãi daãn ñaàu chung cuûa caùc veá phaûi luaät sinh, thí duï: A  …..n .  laø chuoãi khoâng baét ñaàu bôûi . Ta thay caùc luaät treân baèng caùc luaät AA’ A’ …n Thí du: ï Ta aùp duïng giaûi thuaät treân cho vaên phaïm phaùt bieåu if, đöôùc vaên phaïm töông ñöông S  i E t SS’ S’ e S

68 4.3. Phaân tích cuù phaùp töø treân xuoáng
Phaân tích cuù phaùp ñeä quy ñi xuoáng. Phaân tích cuù phaùp ñoaùn nhaän tröùôc. 1. Phaân tích cuù phaùp ñeä quy ñi xuoáng Thí duï: Cho vaên phaïm G : S cAd A  ab  a S S c c A d A d a b a a) b) Hình 4.4. Caùc böôùc phaân tích cuù phaùp töø treân xuoáng cho caâu: cad

69 2. Phaân tích cuù phaùp ñoaùn nhaän tröôùc
- Haõy loaïi boû ñeä quy traùi cho vaên phaïm maø chuùng ta thieát keá. - Haõy taïo vaên phaïm coù thöøa soá traùi neáu caàn thieát. Sô ñoà dòch cho boä phaân tích ñoaùn nhaän tröôùc Sô ñoà naøy coù ñaëc ñieåm nhö sau: - Moãi kyù hieäu khoâng keát thuùc coù moät sô ñoà. - Teân caùc caïnh laø token vaø caùc kyù hieäu khoâng keát thuùc. Söï truyeàn treân token seõ ñöôïc thöïc hieän neáu kyù hieäu nhaäp truøng vôùi token ñoù. Neáu coù söï truyeàn treân kyù hieäu khoâng keát thuùc A thì ta thöïc hieän moät leänh goïi thuû tuïc A. Ñeå xaây döïng sô ñoà chuùng ta seõ tieán haønh caùc böôùc sau ñaây: 1. Taïo traïng thaùi baét ñaàu vaø keát thuùc. 2. Vôùi moãi luaät sinh coù daïng A  X1X2…Xn , ta xaây döïng ñöôøng ñi töø traïng thaùi baét ñaàu ñeán traïng thaùi keát thuùc sao cho caùc caïnh coù teân X1, X2, X3…Xn.

70 Hình 4.5. Sô ñoà dòch cuûa caùc kyù hieäu khoâng keát thuùc cuûa G
Cô cheá hoaït ñoäng cuûa boä phaân tích ñoaùn nhaän tröôùc Thí duï 4.3. Chuùng ta haõy taïo sô ñoà dòch cho vaên phaïm G: E  TE’ E’  + TE’  T  FT’ T’   FT’  F  (E)  id T E’ + T E’ 3 4 5 2 6 E: 1 E’: F T’ T: 7 8 9 T’ ( ) F’ T’: 10 11 12 14 15 16 13 17 id F: Hình 4.5. Sô ñoà dòch cuûa caùc kyù hieäu khoâng keát thuùc cuûa G

71 else if c = id then match (id) else error;
+ ) T F ( E E: 3 6 T: 7 10 13 F: 14 15 16 17 id Hình 4.6. Sô ñoà dòch cuûa caùc kyù hieäu khoâng keát thuùc cuûa G, ñaõ ñöôïc thu giaûm Giaûi thuaät: procedure E; procedure T; procedure F; begin nextchar (c); if c = ‘(‘ then begin match (‘(‘); E; match (‘(‘); E; end else if c = id then match (id) else error;

72 3. Phaân tích cuù phaùp ñoaùn nhaän tröôùc khoâng ñeä quy
end; F begin F; while c = ‘*‘ do F; end; T T; while c = ‘+‘ do T; end; E 3. Phaân tích cuù phaùp ñoaùn nhaän tröôùc khoâng ñeä quy Caáu taïo cuûa boä phaân tích cuù phaùp

73 Hình 4.7. Moâ hình caáu taïo cuûa boä phaân tích ñoaùn nhaän tröôùc
Stack a1a2 … an $ boä ñeäm nhaäp X Chöông trình ñieàu khieån Y Z $ Baûng phaân tích M Xuaát Hình Moâ hình caáu taïo cuûa boä phaân tích ñoaùn nhaän tröôùc khoâng ñeä quy.

74 Hoaït ñoäng cuûa boä phaân tích
ÔÛ traïng thaùi baét ñaàu, stack chæ chöùa caùc kyù hieäu muïc tieâu cuûa vaên phaïm naèm treân $, treân ñænh stack. Baûng phaân tích M laø ma traän. Hai kyù hieäu X vaø a seõ xaùc ñònh haønh vi cuûa boä phaân tích. Boä phaân tích coù ba haønh vi nhö sau: 1. Neáu X = a = $. 2. Neáu X = a  $. 3. Neáu X laø kyù hieäu khoâng keá thuùc. Giaûi thuaät 4.2. Phaân tích cuù phaùp ñoaùn nhaän tröôùc khoâng ñeä quy. Nhaäp: chuoãi nhaäp w vaø baûng phaân tích M cho vaên phaïm G. Xuaát: neáu w thuoäc L (G), seõ taïo ra daãn xuaát traùi cuûa w, ngöôïc laïi seõ baùo loãi. Phöông phaùp: luùc ñaàu caáu hình cuûa boä phaân tích laø ($S, w$) vôùi S laø kyù hieäu muïc tieâu cuûa G. Ñaët ip (laø con troû hoaëc coøn goïi laø ñaàu ñoïc cuûa boä phaân tích) vaøo kyù hieäu nhaäp ñaàu tieân cuûa w$.

75 Moâ phoûng 4.2. Chöông trình phaân tích cuù phaùp ñoaùn nhaän tröôùc
repeat X treân stack vaø kyù hieäu a ñang ñöôïc ñaàu ñoïc ip ñoïc; if X laø kyù hieäu keát thuùc hoaëc $ then if X = a then begin - ñaåy X ra khoûi stack; - dòch ñaàu ñoïc ñeán kyù hieäu nhaäp keá tieáp; end else error () else if M [X, a] = X  X1X2…Xk then begin - ñaåy XkXk-1… X1 leân stack (X1 treân ñænh stack); - xuaát luaät sinh X  X1X2 … Xk ; end until X = $ Thí duï 4.4. Giaû söû chuùng ta coù vaên phaïm G. E  E + T  T T  T  F  F F  (E)  id

76 Baûng 4.1. Baûng phaân tích M cho vaên phaïm G
Chuùng ta seõ thöïc hieän loaïi boû ñeä quy traùi, nhaän ñöôïc G’: E  TE’ E’ + TE’  T  FT’ T   FT’  F  (E)  id Baây giôø chuùng ta seõ phaân tích cuù phaùp cho caâu nhaäp w = id + id * id baèng baûng phaân tích M cho tröôùc, ôû Baûng 4.1. Baûng 4.1. Baûng phaân tích M cho vaên phaïm G Kyù hieäu khoâng keát thuùc Kyù hieäu nhaäp id + * ( ) $ E E  TE’ E’ E’  +TE’ E’   T T  FT’ T’ T’   T * FT’ F F  id F  (E)

77 Baûng 4.2. Caùc böôùc phaân tích cuù phaùp caâu id + id  id
Quaù trình phaân tích cuù phaùp caâu nhaäp w = id + id  id seõ ñöôïc trình baøy ôû baûng 4.2. Baûng 4.2. Caùc böôùc phaân tích cuù phaùp caâu id + id  id Stack Chuoãi nhaäp Xuaát $E id + id  id $ $E’T’F id  id $ T  FT’ $E’T E  TE’ $E’T’id F  id $E’T’  id $ $E’T’F T’  FT’ + id  id $ id $ $E’ T’   $E’T+ E’  +TE’ $ E’  

78 Xaây döïng baûng phaân tích M
a. first vaø follow first() laø taäp kyù hieäu keát thuùc a, daãn ñaàu caùc chuoãi ñöôïc daãn xuaát töø ,   a. Neáu    thì  thuoäc first(). follow(A) laø taäp caùc kyù hieäu keát thuùc a, xuaát hieän ngay beân phaûi A trong daïng caâu. Nhö vaäy toàn taïi daãn xuaát S  Aa. Neáu giöõa A vaø a toàn taïi chuoãi kyù hieäu, thì noù seõ daãn xuaát ra chuoãi roãng. Neáu A ôû taän cuøng beân phaûi cuûa daïng caâu thì $ thuoäc follow(A). - Caùc quy taéc tính first(X) vôùi X laø kyù hieäu vaên phaïm. - Caùc quy taéc tính follow(A) cho taát caû caùc kyù hieäu khoâng keát thuùc A. Thí duï 4.5. Cho vaên phaïm G. E  TE’ E’ + TE’ T  FT’ T’  FT’ F (E)id

79 Toaøn boä caùc haøm first vaø follow cuûa caùc kyù hieäu vaên phaïm cuûa G :
first(E) = first(T) = first(F) = (, id first(E’) = +,  ; first(T’) = *,   follow(E) = follow(E’) = $, ) follow(T) = follow(T’) =  +, $, ) follow(F) = *, +, $, ) b. Xaây döïng baûng phaân tích M Giaûi thuaät 4.3. Xaây döïng baûng phaân tích M. Nhaäp: vaên phaïm G. Xuaát: baûng phaân tích M. Phöông phaùp: 1. Vôùi moãi luaät sinh A   haõy thöïc thi böôùc 2 vaø 3. 2. Vôùi moãi kyù hieäu keát thuùc a thuoäc first(), theâm A   vaøo M[A, a]. 3. Neáu kyù hieäu  thuoäc first(), theâm A   vaøo M[A, b] sao cho b thuoäc follow(A). 4. Nhöõng phaàn töû cuûa baûng M troáng, haõy ñaùnh daáu loãi.

80 S  iEtSS’a ; S’  eS ; E  b
Vaên phaïm LL (1) Thí duï Cho vaên phaïm G. S  iEtSS’a ; S’  eS ; E  b Baûng Baûng phaân tích M cho thí duï 4.7. Caùc kyù hieäu khoâng KT Kyù hieäu nhaäp a b e i t $ S S  a S  iEtSS’ S’ S’   S’  eS E E  b

81 - Vaên phaïm khoâng coù phaàn töû naøo cuûa baûng phaân tích M coù nhieàu hôn moät trò thì ñöôïc goïi laø vaên phaïm LL (1). - Vaên phaïm LL (1) coù caùc tính chaát sau. Khaéc phuïc loãi trong phaân tích cuù phaùp ñoaùn nhaän tröôùc Loãi xuaát hieän trong caùc tröôøng hôïp sau: Moät laø kyù hieäu keát thuùc treân stack khoâng truøng vôùi kyù hieäu nhaäp ñang ñöôïc ñoïc. Hai laø A laø kyù hieäu khoâng keát thuùc treân ñænh stack, a treân chuoãi nhaäp, ñöôïc ñoïc, maø M [A, a] laø troáng. Moät soá heuristics ñöôïc aùp duïng cho vieäc khaéc phuïc loãi. Thí duï 4.8. Cho vaên phaïm E  TE’ ; E’  + TE’ ; T  FT’ ; T’  * FT’; F  (E)id first(E) = first(T) = first(F) = (, id) first(E’) = +, ; first (T’) = *,  follow(E) = follow(E’) = $, ) follow(T) = follow(T’) = +, $, ) follow(F) = *, +, $, )

82 Baûng 4.4. Phaân tích M coù kyù hieäu khaéc phuïc loãi.
khoâng KT Kyù hieäu nhaäp id + * ( ) $ E E  TE’ synch E’ E’  +TE’ E’   T T  FT’ T’ T’   T’  * FT’ F F  id F  (E)

83 4.4. Phaân tích cuù phaùp töø döôùi leân
Phaân tích cuù phaùp töø döôùi leân ñöôïc hieåu laø phaân tích ñaåy vaø thu giaûm (Shift-Reduce parsing) laø phöông phaùp phaân tích LR. Thí duï 4.9. Cho vaên phaïm G. S  aABe ; A  Abcb ; B d Phaân tích caâu w = abbcde. Toùm taét caùc böôùc thu giaûm nhö sau: Quaù trình thu giaûm neáu theo chieàu ngöôïc laïi thì ñoù chính laø quaù trình daãn xuaát phaûi. Quaù trình naøy ñaõ sinh caây cuù phaùp cuûa caâu phaân tích töø döôùi leân.

84 Hình 4.8. Caây cuù phaùp ñöôïc xaây döïng töø döôùi leân cuûa caâu w = abbcde.

85 Handle Tìm kieám handle Baét ñaàu töø chuoãi caàn phaân tích w, ta ñaët w = n . n laø daïng caâu ñöôïc daãn xuaát ôû laàn thöù n. S = 0  1  2  … n-1  n = w Xaây döïng daãn xuaát phaûi ngöôïc töø w = n . Ta tìm n trong n sao cho n laø veá phaûi luaät sinh An  n . Thay n trong n baèng An , ta nhaän ñöôïc daïng caâu thöù (n – 1) laø n – 1. Quaù trình thu giaûm cöù tieáp tuïc nhö vaäy cho ñeán khi ñaït ñöôïc o chæ coøn laø moät kyù hieäu khoâng keát thuùc vaø laø kyù hieäu muïc tieâu. 1. Phaân tích cuù phaùp thöù töï yeáu Vaên phaïm coù tính chaát: khoâng coù luaät sinh naøo coù veá phaûi laø chuoãi roãng (A  ) hoaëc ôû veá phaûi khoâng coù hai kyù hieäu khoâng keát thuùc ñöùng keà nhau goïi laø vaên phaïm thöù töï yeáu. 1 2 r -1 n rm rm rm rm rm

86 Boä phaân tích cuù phaùp thöù töï yeáu 1. Caáu taïo
$ X1 X2 Xn-1 Xn Y1 Y2 Yn-1 Yn Chöông trình phaân tích Baûng phaân tích S-R Xuaát Hình 4.9. Moâ hình boä phaân tích cuù phaùp thöù töï yeáu

87 2. Hoaït ñoäng Thí duï Cho vaên phaïm cuûa phaùt bieåu gaùn < assign stmt >  id = < exp > < exp >  < exp > + < term > < term >  < term > * < factor >  < factor > < factor >  id  (< exp >) Kyù hieäu <assign stmt> laø kyù hieäu muïc tieâu.

88 Baûng 4.6. Baûng phaân tích S-R cho vaên phaïm ôû thí duï 4.10.
id + ( ) = $ <assign stmt> R* <exp> S R <term> <factor> * Giaûi thuaät 4.4. Phaân tích cuù phaùp thöù töï yeáu Moâ phoûng 4.3. Giaûi thuaät cuûa chöông trình phaân tích thöù töï yeáu

89 - Luùc ñaàu stack traïng thaùi chæ coù kyù hieäu $
- Luùc ñaàu stack traïng thaùi chæ coù kyù hieäu $. Stack nhaäp chöùa chuoãi nhaäp, ñöôïc keát thuùc bôûi daáu $ ; c:=false ; repeat if Kyù hieäu muïc tieâu ôû treân ñænh vaø kyù hieäu $ ôû ñaùy stack traïng thaùi, ñoàng thôøi stack nhaäp chæ chöùa $ then c:=true /phaân tích thaønh coâng, caây cuù phaùp xaây döïng xong/ else begin - X ôû treân ñænh stack traïng thaùi, Y ôû treân ñænh stack nhaäp. - Giaû söû T laø trò cuûa phaàn töû S-R [X, Y]; if T laø roãng then error () else if T = R then if treân ñænh stack coù chöùa veá phaûi cuûa luaät sinh naøo ñoù then begin - Goïi A  X1 X2 … Xn laø luaät sinh naøo coù veá phaûi daøi nhaát so truøng vôùi chuoãi treân stack traïng thaùi: (a) Giaûi toûa X1 X2 … Xn ra khoûi stack; (b) Thay A leân stack. (c) Taïo nuùt môùi A treân caây cuù phaùp, coù caùc con laø X1 X2 … Xn end

90 else error () else begin (a) Giaûi toûa Y ra khoûi stack nhaäp; (b) Ñaåy Y leân ñænh stack traïng thaùi; (c) Tao nuùt môùi teân Y treân caây cuù phaùp; end; until c; 3. Xaây döïng baûng phaân tích S-R Ñònh nghóa caùc quan heä < , = ,  >: - Chuùng ta noùi X < Y neáu vaø chæ neáu toàn taïi moät luaät sinh maø veá phaûi coù daïng … XA vôùi A laø kyù hieäu khoâng keát thuùc vaø sinh ra moät chuoãi baét ñaàu baèng Y (A  Y…). - X > Y neáu vaø chæ neáu toàn taïi moät luaät sinh maø veá phaûi coù daïng …AB. A sinh ra moät chuoãi kyù hieäu ñöôïc keát thuùc baèng X (A  …X). B sinh ra moät chuoãi ñöôïc baét ñaàu baèng Y (B  Y…), hoaëc B = Y. ÔÛ ñaây coù hai tröôøng hôïp xaûy ra trong quaù trình tìm caùc moái quan heä cho caëp (X, Y):

91 Tröôøng hôïp 1: Y laø kyù hieäu keát thuùc
Tröôøng hôïp 2: Y laø kyù hieäu khoâng keát thuùc. a. Toàn taïi $  A vôùi A laø kyù hieäu muïc tieâu cuûa vaên phaïm cho tröôùc. b. Neáu veá phaûi luaät sinh coù X naèm keà ngay Y veà phía traùi (…XY…) thì X  Y c. Neáu X  Y maø toàn taïi moät luaät sinh Y  Z1 … Zn thì X  • Z1 d. Toàn taïi A > $ vôùi A laø kyù hieäu muïc tieâu e. Neáu X  •Y vaø toàn taïi moät luaät sinh X  Z1 … Zn thì Zn • > Y g. Neáu X > Y vaø toàn taïi moät luaät sinh Y  Z1 … Zn thì X • > Z1 4. Vaên phaïm thöù töï yeáu Moät vaên phaïm ñöôïc goïi laø thöù töï yeáu neáu thoûa caùc ñieàu kieän sau: 1. Khoâng coù hai luaät sinh coù cuøng moät veá phaûi. 2. Khoâng coù phaàn töû S-R [X, Y] naøo cuûa baûng S-R vöøa coù trò S vöøa coù trò R. 3. Neáu toàn taïi luaät sinh AX1 X2 … Xn vaø luaät sinh BXiXi+1… Xn thì khoâng toàn taïi quan heä Xi – 1  • B.

92 Hình 4.11. Moâ hình boä phaân tích cuù phaùp LR
- Caùc tính chaát cuûa phöông phaùp phaân tích LR - Giaûi thuaät phaân tích cuù phaùp LR 1. Boä phaân tích cuù phaùp coù caáu taïo nhö sau: a1 a2 ai an $ boä ñeäm nhaäp Stack Sm Xm Chöông trình ñieàu khieån Sm –1 Xm – 1 action goto baûng phaân tích xuaát Hình Moâ hình boä phaân tích cuù phaùp LR

93 2. Hoaït ñoäng Stack ñöôïc duøng ñeå chöùa chuoãi kyù hieäu coù daïng s0 X1 s1 X2 … Xm sm. Caëp (sm, ai ) seõ xaùc ñònh moät trò ñöôïc löu chöùa trong baûng phaân tích. Baûng phaân tích goàm hai phaàn bieåu thò bôûi haøm action vaø goto. Caáu hình (configuration) cuûa boä phaân tích LR: s0 X1 s1 … Xi si … Xm sm, ai ai+1 … an $). Caáu hình naøy cho chuùng ta daïng caâu X1 X2 … Xm ai ai+1 … an. Giaûi thuaät 4.5. Phaân tích cuù phaùp LR Nhaäp: chuoãi nhaäp w, baûng phaân tích action goto cuûa vaên phaïm G. Xuaát: neáu w thuoäc L (G), noù taïo ra söï phaân tích töø döôùi leân. Ngöôïc laïi, boä phaân tích seõ baùo loãi. Phöông phaùp: - Thôøi ñieåm ban ñaàu stack coù traïng thaùi s0. Chuoãi w$ naèm treân boä ñeäm nhaäp. Boä phaân tích ñaët ñaàu ñoïc (con troû ip) vaøo kyù hieäu nhaäp ñaàu tieân cuûa w.

94 c:=false; /*c laø bieán luaän lyù, baùo cho bieát quaù trình phaân tích keát thuùc*/
repeat - Ñaët s laø traïng thaùi treân ñænh stack a laø kyù hieäu nhaäp ñöôïc ip chæ ñeán if action [s, a] = shift(s’) then begin (a)ñaåy a leân stack (b)sau ñoù ñaåy s’ leân ñænh stack (c)chuyeån ip sang kyù hieäu nhaäp keá tieáp; end else if action [s, a] = reduce(A  ) then begin (a)ñaåy (2*) kyù hieäu ra khoûi stack, s’ laø traïng thaùi treân ñænh stack (b)Tìm j = goto [s’, A]; (c)ñaåy A vaø sau ñoù laø j leân ñænh stack; (d)xuaát luaät A   end else if action [s, a] = accept then c := true else error (); until c;

95 Baûng 4.8. Baûng phaân tích cho vaên phaïm G ôû thí duï 4.12.
Thí duï Cho vaên phaïm G (1) E  E + T (2) E  T (3) T  T * F (4) T  F (5) F  (E) (6) F  id Baûng 4.8. Baûng phaân tích cho vaên phaïm G ôû thí duï 4.12. Traïng thaùi action goto id + * ( ) $ E T F s5 s4 1 2 3 s6 acc r2 s7 r4 4 8 5 r6 6 9 7 10 s11 r1 r3 11 r5

96 Thí duï: Phaân tích caâu w = id  id + id
Vaên phaïm LR Xaây döïng baûng phaân tích SLR Ñònh nghóa thöïc theå LR (0) Thí duï: G coù luaät sinh A  XYZ, seõ cho boán thöïc theå: AXYZ; AXYZ; A XYZ; AXYZ Neáu A   seõ cho ta thöïc theå A   YÙ töôûng cô baûn cuûa giaûi thuaät xaây döïng baûng phaân tích SLR laø töø vaên phaïm, chuùng ta ñi tìm DFA, nhaän daïng chuoãi daãn ñaàu beân traùi cuûa daïng caâu (viable prefixe). Ñònh nghóa vaên phaïm gia toá: neáu G laø vaên phaïm, thì G’ laø vaên phaïm gia toá, laø G coù S’ laø kyù hieäu muïc tieâu vaø coù theâm luaät sinh S’  S. Pheùp bao ñoùng – Closure. Giaûi thuaät tính closure.

97 Moâ phoûng 4.4. Giaûi thuaät tính haøm closure
function closure (| : item) : item; begin J := |; repeat for vôùi moãi thöïc theå A  .B trong J vaø vôùi moãi luaät sinh B   trong G sao cho thöïc theå B  •  chöa coù trong J do theâm B  •  vaøo J; until khoâng theå theâm thöïc theå môùi vaøo J; closure := J; end; Giaûi thuaät tính goto: haøm goto (I, X) vôùi I laø taäp caùc thöïc theå, X laø kyù hieäu vaên phaïm. Goto (I, X) laø closure cuûa taäp caùc thöïc theå coù daïng A  X. sao cho thöïc theå A  .X ôû trong I.

98 Moâ phoûng 4.5. Giaûi thuaät tính taäp tuyeån caùc taäp thöïc theå
procedure items (G’); begin C := closure (S’  • S repeat for vôùi moãi taäp thöïc theå I trong C vaø vôùi moãi kyù hieäu vaên phaïm X sao cho pheùp goto (I, X) khoâng roãng vaø khoâng coù trong C do theâm goto (I, X) vaøo C; until khoâng theå theâm taäp thöïc theå môùi vaøo C; end; Thí duï Cho vaên phaïm gia toá G’ E’  E ; E  E + T ; E  T T  T* F ; T  F ; F  (E) ; F  id Haõy tìm taäp C vaø sô ñoà DFA. Xaây döïng baûng phaân tích SLR

99 Giaûi thuaät 4.6. Xaây döïng baûng phaân tích Nhaäp: vaên phaïm gia toá G’ Xuaát: baûng phaân tích SLR vôùi haøm action vaø goto cho vaên phaïm G’ Phöông phaùp: 1. Xaây döïng C = Io, I1, … In. 2. i laø traïng thaùi ñaïi dieän cho taäp thöïc theå Ii. a. Neáu A  a laø thöïc theå ôû trong Ii vaø goto (Ii, a) = Ij thì phaàn töû action [i, a] = shift(j), vôùi a phaûi laø kyù hieäu keát thuùc. b. Neáu A   ôû trong Ii thì action [i, a] = reduce(A ) vôùi a laø taát caû caùc kyù hieäu naèm trong follow (A). A khoâng phaûi laø S’ (kyù hieäu muïc tieâu môùi). c. Neáu S’  S ôû trong Ii thì action [i, $] = accept. 3. Cho taát caû caùc kyù hieäu khoâng keát thuùc A. Neáu goto [Ii, A]=Ij thì haøm goto [i, A]=j. 4. Taát caû caùc phaàn töû cuûa baûng phaân tích khoâng ñöôïc xaùc ñònh baèng quy taéc 2 vaø 3, chuùng ta coi laø loãi. 5. Traïng thaùi baét ñaàu cuûa boä phaân tích laø taäp thöïc theå coù chöùa thöïc theå S’ S.

100 Thí duï Xaây döïng baûng phaân tích SLR cho vaên phaïm G ôû thí duï Thí duï Cho vaên phaïm G. (1) S  L = R (2) S  R (3) L  * R (4) L  id (5) R  L Ta nhaän thaáy ñuïng ñoä khi action [2, =] = s6 ñoàng thôøi action [2, =] = r5 vaø action [2, $] = r5. Do ñoù taïi phaàn töû action [2, =] coù hai trò s6 vaø r5. Nhö vaäy G khoâng phaûi laø vaên phaïm SLR. Xaây döïng baûng phaân tích Canonical LR Daïng toång quaùt cuûa thöïc theå laø [A  ., a] vôùi A   laø luaät sinh vaø a laø kyù hieäu keát thuùc hoaëc daáu $. Thöïc theå coù daïng nhö theá ñöôïc goïi laø thöïc theå LR (1). Neáu  =  thì thöïc theå seõ coù daïng [A  • , a]. Luùc naøy chuùng ta thöïc hieän thu giaûm baèng luaät sinh A   chæ vôùi ñieàu kieän kyù hieäu nhaäp keá tieáp laø a.

101 Chuùng ta noùi thöïc theå LR (1) [A  
Chuùng ta noùi thöïc theå LR (1) [A  ., a] laø hôïp leä vôùi chuoãi kyù hieäu daãn ñaàu daïng caâu  neáu toàn taïi daãn xuaát phaûi: S  Aw  w vôùi rm rm 1.  =  vaø 2. hoaëc a laø kyù hieäu daãn ñaàu cuûa w, hoaëc w =  thì a laø $. Thí duï Cho vaên phaïm G S  BB B  aB  b Tính taäp tuyeån caùc thöïc theå LR (1) Pheùp tính closure Giaûi thuaät 4.7. Xaây döïng caùc taäp thöïc theå LR (1).

102 Moâ phoûng 4.7. Giaûi thuaät tính caùc taäp thöïc theå LR (1) cho vaên phaïm gia toá G’
function closure (I: items): items; begin repeat for vôùi moãi thöïc theå [A   • B, a] trong , vôùi moãi luaät sinh B   trong G’ vaø vôùi moãi kyù hieäu keát thuùc b thuoäc first(a) sao cho thöïc theå [B  • , b] khoâng coù trong | do theâm thöïc theå [B  , b] vaøo | until khoâng theå theâm thöïc theå môùi vaøo |; closure := |; end; function goto (| :items; X: symbol): items; begin j laø taäp caùc thöïc theå coù daïng [A  X• , a] sao cho thöïc theå [A  • X, a] ôû trong | ; goto := closure (J); end;

103 procedure items (G’);. begin. d := closure (S’ • S, $;. repeat
procedure items (G’); begin d := closure (S’ • S, $; repeat for vôùi moãi taäp thöïc theå | ôû trong C vaø vôùi moãi kyù hieäu vaên phaïm X sao cho goto (|, X) khoâng roãng vaø chöa coù trong C do theâm goto (|, X) vaøo C; until khoâng theå theâm taäp thöïc theå môùi vaøo C; end; Thí duï Xaây döïng caùc taäp thöïc theå LR (1) cho vaên phaïm gia toá G’: S’  .S ; S  CC ; C  cCd Giaûi thuaät 4.8. Xaây döïng baûng phaân tích Canonical LR. Nhaäp: vaên phaïm gia toá G’ Xuaát: baûng phaân tích Canonical LR vôùi hai haøm action vaø goto cho G’ Phöông phaùp: 1. Xaây döïng C = Io, I1, …, In. 2. Traïng thaùi i ñaïi dieän cho Ii.

104 a. Neáu thöïc theå [A  .a, b] ôû trong Ii vaø goto (Ii , a) = Ij thì phaàn töû action [i, a] = shift(j), a phaûi laø kyù hieäu keát thuùc b. Neáu [A   , a] ôû trong Ii, A  S’ thì action[i, a]=reduce(A) c. Neáu [S’  S , $] ôû trong Ii thì action [i, $] = accept. 3. Neáu goto (Ii , A) = Ij thì phaàn töû goto [i, A] = j. 4. Taát caû caùc phaàn töû khoâng aùp duïng ñöôïc quy taéc 2 vaø 3 thì laø loãi. 5. Traïng thaùi baét ñaàu cuûa boä phaân tích cuù phaùp laø taäp thöïc theå co chöùa thöïc theå [S’  S , $]. Baûng phaân tích Canonical LR cho vaên phaïm ôû thí duï ñöôïc xaây döïng döïa vaøo giaûi thuaät 4.7.

105 Baûng 4.10. Baûng phaân tích Canonical LR
Traïng thaùi action goto c d $ S C 1 2 3 4 5 6 7 8 9 s3 s6 r3 r2 s4 s7 acc r1

106 Hình 4.14. Taïo boä phaân tích cuù phaùp baèng Yacc.
Boä sinh phaân tích cuù phaùp Boä sinh phaân tích cuù phaùp Yacc y.tab.c Taäp tin ñaëc taû Yacc translate.y Trình bieân dòch Yacc Trình bieân dòch C a.out daãn xuaát y.tab.c chuoãi token Hình Taïo boä phaân tích cuù phaùp baèng Yacc.

107 Thí duï Chuùng ta seõ taïo taäp tin ñaëc taû vaên phaïm cho Yacc cuûa vaên phaïm G E  E + T  T T  T * F  F F  (E)  digit Moâ phoûng Taäp tin ñaëc taû vaên phaïm cho Yacc ôû thí duï 4.23. %  # include <ctype.h> %  % token DIGIT % % line : exp \nprintf (% d\n, $1) ; ; exp : exp + term $$ = $1 + $3; : term term : term * factor $$ = $1 + $3; : factor

108 factor : (exp) $$ = $2;
: DIGIT ; %% yylex ( )  int c ; c = getchar ( ) ; if (isdigit (c))  yylval = c - 0 ; return DIGIT;  return c;  Phaàn ñaëc taû Phaàn caùc luaät bieân dòch: <veá traùi luaät sinh>  <veá phaûi thöù nhaát> |… | <veá phaûi thöù n>

109 Luaät bieân dòch trong Yacc:. <veá traùi LS>
Luaät bieân dòch trong Yacc: <veá traùi LS> : <veá phaûi 1> haønh vi ngöõ nghóa 1 : <veá phaûi 2> haønh vi ngöõ nghóa 2 … : <veá phaûi n> haønh vi ngöõ nghóa n Phaàn caùc chöông trình con C phuï trôï

110 CHÖÔNG 5 BIEÂN DÒCH TRÖÏC TIEÁP CUÙ PHAÙP
Coù hai khaùi nieäm veà caùc luaät ngöõ nghóa coù lieân quan ñeán luaät sinh: ñònh nghóa tröïc tieáp cuù phaùp vaø löôïc ñoà dòch. - Ñònh nghóa tröïc tieáp cuù phaùp. - Löôïc ñoà dòch. Chuoãi nhaäp  caây phaân tích  ñoà thò phuï thuoäc   ñaùnh giaù thöù töï caùc luaät ngöõ nghóa. Hình 5.0. Khaùi nieäm veà dòch tröïc tieáp cuù phaùp

111 Khaùi nieäm toång quan cuûa bieân dòch tröïc tieáp cuù phaùp
5.1. Ñònh nghóa tröïc tieáp cuù phaùp Laø vaên phaïm phi ngöõ caûnh maø trong ñoù moãi kyù hieäu vaên phaïm coù taäp thuoäc tính. Taäp thuoäc tính naøy coù hai loaïi: thuoäc tính toång hôïp vaø thuoäc tính keá thöøa. Caây cuù phaùp coù giaù trò thuoäc tính ôû moãi nuùt ñöôïc goïi laø caây phaân tích chuù thích. Daïng cuûa ñònh nghóa tröïc tieáp cuù phaùp Moãi luaät sinh coù daïng A   ñeàu coù moät taäp luaät ngöõ nghóa coù daïng b:= f (c1, c2, …, ck) vôùi f laø haøm soá vaø: 1. b laø thuoäc tính toång hôïp cuûa A vaø c1, c2, …, ck laø caùc thuoäc tính cuûa kyù hieäu vaên phaïm cuûa luaät sinh, hoaëc 2. b laø thuoäc tính keá thöøa cuûa moät trong caùc kyù hieäu vaên phaïm beân veá phaûi cuûa luaät sinh vaø c1, c2, …, ck laø caùc thuoäc tính cuûa caùc kyù hieäu vaên phaïm cuûa luaät sinh.

112 Thí duï 5.1. Ñònh nghóa tröïc tieáp cuù phaùp ôû baûng 5.1.
Baûng 5.1. Ñònh nghóa tröïc tieáp cuù phaùp cho baûng tính ñôn giaûn Luaät sinh Luaät ngöõ nghóa L  En Print (E.val) E  E1 + T E.val: = E1.val + T.val E  TE.val: = T.val E.val: = T.val T  T1* F T.val: = T.val x F.val T  FT.val: = F.val T.val: = F.val F  (E) F.val: = E.val F  digit F.val: = digit . lexval Thuoäc tính toång hôïp Ñònh nghóa tröïc tieáp cuù phaùp duøng caùc thuoäc tính toång hôïp goïi laø ñònh nghóa thuoäc tính S. Thuoäc tính S cuûa moät nuùt coù theå ñöôïc töø caùc thuoäc tính ôû moãi nuùt töø döôùi leân.

113 Thí duï 5.2. Ñònh nghóa thuoäc tính S ôû thí duï 5.1
L n E.val = 19 E.val = 15 T.val = 4 + T.val = 15 F.val = 4 T.val = 3 F.val = 5 * digit.lexval = 4 F.val = 3 digit.lexval = 5 digit.lexval = 3 Hình 5.1. Caây phaân tích chuù thích 3 * 5 + 4n

114 ñònh nghóa tröïc tieáp cuù phaùp ôû (baûng 5.2).
Thuoäc tính keá thöøa Thuoäc tính keá thöøa laø thuoäc tính maø giaù trò cuûa noù ôû moät nuùt treân caây phaân tích ñöôïc xaùc ñònh bôûi thuoäc tính cha meï vaø/hoaëc anh chò cuûa nuùt ñoù. Thí duï 5.3. Söï khai baùo ñöôïc taïo bôûi kyù hieäu khoâng keát thuùc D trong ñònh nghóa tröïc tieáp cuù phaùp ôû (baûng 5.2). Baûng 5.2. Ñònh nghóa tröïc tieáp cuù phaùp vôùi thuoäc tính keá thöøa L.in. Luaät sinh Luaät ngöõ nghóa D  TL L.in: = T.type T  int T.type: = integer T  real T.type: = real L  L1, id L1.in: = L.in L  id Addtype (id.entry, L.in)

115 Hình 5.2 laø caây phaân tích chuù thích cho caâu real id1, id2, id3.
L.in = real T.type = real L.in = real id3 , real L.in = real id2 , id1 Hình 5.2. Caây phaân tích vôùi thuoäc tính keá thöøa in ôû moãi nuùt coù nhaõn L.

116 Ñoà thò phuï thuoäc Caùc söï phuï thuoäc trung gian: thuoäc tính keá thöøa vaø toång hôïp treân caùc nuùt cuûa caây phaân tích coù theå ñöôïc mieâu taû baèng ñoà thò coù höôùng ñöôïc goïi laø ñoà thò phuï thuoäc (dependency graph). Caây phuï thuoäc cuûa moät caây phaân tích cho tröôùc, ñöôïc xaây döïng nhö sau: for vôùi moãi nuùt n treân caây phaân tích do for vôùi moãi thuoäc tính a cuûa kyù hieäu vaên phaïm taïi nuùt n do - xaây döïng nuùt treân ñoà thò phuï thuoäc cho a; for vôùi moãi luaät ngöõ nghóa b:= f (c1, c2, …, ck) töông öùng vôùi luaät sinh ñöôïc duøng taïi nuùt n for i := 1 to k do xaây döïng caïnh ñi töø nuùt cuûa c1 ñeán nuùt b.

117 Hình 5.3. Ñoà thò phuï thuoäc cuûa caây phaân tích cho E  E1+ E2
Thí duï 5.4. Khi ta duøng luaät sinh E  E1 + E2 treân caây phaân tích, chuùng ta theâm caùc caïnh sau vaøo (H.5.3) chuùng ta seõ ñöôïc ñoà thò phuï thuoäc. Luaät sinh Luaät ngöõ nghóa E  E1 + E2 E.val := E1.val + E2.val E val E1 E2 val + val Hình 5.3. Ñoà thò phuï thuoäc cuûa caây phaân tích cho E  E1+ E2

118 Hình 5.4. Ñoà thò phuï thuoäc cho caây phaân tích ôû (H.5.2).
Thí duï 5.5. (H.5.4) laø ñoà thò phuï thuoäc cho caây phaân tích cuûa (H.5.2). Ñaùnh giaù thöù töï Trong saép xeáp logic topo, caùc thuoäc tính phuï thuoäc c1, c2, …, ck trong luaät ngöõ nghóa b:= f (c1, c2, …, ck) ñöôïc ñaùnh giaù tröôùc f. D 6 5 L 4 type in T 3 entry 7 id3 L 8 real 2 entry 9 10 id2 in L 1 entry id1 Hình 5.4. Ñoà thò phuï thuoäc cho caây phaân tích ôû (H.5.2).

119 Thí duï 5. 6. Moãi moät caïnh cuûa ñoà thò phuï thuoäc ôû (H. 5. 4
Thí duï 5.6. Moãi moät caïnh cuûa ñoà thò phuï thuoäc ôû (H.5.4.) ñi töø soá thaáp ñeán soá cao cuûa caùc nuùt. Töø thöù töï logic topo chuùng ta seõ coù chöông trình. Chuùng ta vieát an cho thuoäc tính lieân quan ñeán nuùt ñöôïc ñaùnh soá n. treân ñoà thò phuï thuoäc. a4 := real a5 := a4 addtype (id3.entry, a5); a7 := a5 addtype (id2.entry, a7); a9 := a7 addtype (id1.entry, a9); Moät soá phöông phaùp ñöôïc ñeà nghò cho vieäc ñaùnh giaù caùc luaät ngöõ nghóa 1. Phöông phaùp caây phaân tích (parse-tree method) 2. Phöông phaùp cô sôû luaät (rule-based method) 3. Phöông phaùp roõ raøng

120 5.2. Caáu truùc cuûa caây phaân tích
Caây cuù phaùp: laø daïng thu goïn cuûa caây phaân tích, ñöôïc duøng ñeå bieåu dieãn cho caáu truùc ngoân ngöõ. Caây phaân tích ôû (H.5.1) seõ ñöôïc veõ laïi thaønh caây cuù phaùp. Xaây döïng caây cuù phaùp cho bieåu thöùc Chuùng ta seõ duøng caùc haøm ñeå taïo caùc nuùt cho caây cuù phaùp cuûa bieåu thöùc vôùi pheùp toaùn hai ngoâi. Moãi haøm traû veà con troû chæ ñeán nuùt môùi ñöôïc taïo ra. 1. mknode(op, left, right). 2. mkleaf(id, entry). 3. mkleaf(num, val). + 4 3 5

121 Hình 5.5. Caây cuù phaùp cho bieåu thöùc a – 4 + c
Thí duï 5.7. Moät chuoãi caùc haøm ñöôïc goïi ñeå taïo caây cuù phaùp cho bieåu thöùc a – 4 + c ôû (H.5.5). (1) p1 := mkleaf(id, entry a); (4) p4 := mkleaf(id, entry c); (2) p2 := mkleaf(num, 4); (5) p5 := mknode(‘+’, p3, p4)’ (3) p3 := mknode(‘-‘, p1, p2) + id chæ ñeán vò trí cuûa c id Num 4 chæ ñeán vò trí cuûa a Hình 5.5. Caây cuù phaùp cho bieåu thöùc a – 4 + c

122 Ñònh nghóa tröïc tieáp cuù phaùp vaø caáu truùc caây cuù phaùp
Thí duï ôû baûng 5.3 laø ñònh nghóa thuoäc tính S duøng ñeå xaây döïng caây cuù phaùp cho bieåu thöùc soá hoïc coäng (+) vaø tröø (-). Baûng 5.3. Ñònh nghóa tröïc tieáp cuù phaùp cho caáu truùc caây cuù phaùp cuûa bieåu thöùc Luaät sinh Caùc luaät ngöõ nghóa E  E1 + T E. nptr: = mknode(‘+’, E1 .nptr), T. nptr) E  E1 – T E. nptr: = mknode(‘-‘, E1 .nptr, T.nptr) E  T E. nptr: = T. nptr T  (E) T. nptr: = E. nptr T  id T. nptr: = mkleaf(id, id, entry) T  num T. nptr: = mkleaf(num, num, val)

123 Hình 5.6. Toå chöùc cuûa caây cuù phaùp cho bieåu thöùc a – 4 + c
Thí duï 5.8. Caây phaân tích chuù thích duøng ñeå mieâu taû caây cuù phaùp cho bieåu thöùc a c ñöôïc trình baøy ôû (H.5.6). E E nptr nptr E nntr T + T nptr nptr T num + id id con troû chæ ñeán c trong baûng danh bieåu id num 4 con troû chæ ñeán a trong baûng danh bieåu Hình 5.6. Toå chöùc cuûa caây cuù phaùp cho bieåu thöùc a – 4 + c

124 Hình 5.7. Dag cho bieåu thöùc a + a * (b – c) + (b – c) * d.
Ñoà thò coù höôùng khoâng laëp voøng mieâu taû bieåu thöùc Ñoà thò coù höôùng khoâng laëp voøng (directed acyclic graph) goïi taét laø dag. + + a d c b Hình 5.7. Dag cho bieåu thöùc a + a * (b – c) + (b – c) * d.

125 Baûng 5.4. Caùc leänh ñeå taïo DAG ôû (H.5.7)
Haøng Leänh 1 p1 := mkleaf(id, a) 8 p8 := mkleaf(id, b) 2 p2 := mkleaf(id, a) 9 p9 := mkleaf(id, c) 3 p3 := mkleaf(id, b) 10 p10 := mknode(’ ‘, p8, p5) 4 p4 := mkleaf(id, c) 11 p11 := mkleaf(id, d) 5 p5 := mknode(‘‘, p3, p4) 12 p12 := mknode(‘*’, p10, p11) 6 p6 := mknode(‘*’, p2, p5) 13 p13 := mknode(‘+’, p7, p12) 7 p7 := mknode(‘+’, p1, p6)

126 Bieåu dieãn caáu truùc döõ lieäu
Maãu tin töôïng tröng cho nuùt ñöôïc löu chöùa trong daõy nhö ôû (H.5.8). Pheùp gaùn Dag i := i + 10 Bieåu dieãn caáu truùc döõ lieäu := 1 id Chæ ñeán danh bieåu i 2 num 10 3 + 4 := 5 …………………………………….... + i 10 Giaûi thuaät 5.1. Phöông phaùp soá trò cho vieäc taïo nuùt cuûa dag. Giaû söû moãi nuùt laø moät phaàn töû cuûa daõy ôû (H.5.8). Nhaäp: nhaõn op, nuùt 1 vaø nuùt r. Xuaát: nuùt vôùi kyù hieäu < op, 1, r > Phöông phaùp

127 5.3. Ñaùnh giaù töø döôùi leân cho ñònh nghóa thuoäc tính S
Thuoäc tính toång hôïp treân stack cuûa boä phaân tích. Boä bieân dòch cho ñònh nghóa thuoäc tính S coù theå ñöôïc thöïc hieän döïa theo boä sinh boä phaân tích cuù phaùp LR. Baûng 5.5. Stack cuûa boä phaân tích coù vuøng löu chöùa caùc thuoäc tính toång hôïp state val . X X.x Y Y.y Z Z.z ………. ……….. top

128 Baûng 5.6. Hieän thöïc baûng tính baèng boä phaân tích cuù phaùp LR
Luaät sinh Ñoaïn maõ L  En Print (val top) E  E1 + T val ntop: = val top - 2 + val top E  T T  T1 * F val ntop: = val top - 2 x val top T  F F  (E) val ntop: = val top - 1 F  digit

129 Baûng 5.7. Quaù trình bieân dòch cho chuoãi nhaäp 3 * 5 + 4n.
Traïng thaùi Trò val Luaät aùp duïng 3 * 5 + 4n * 5 + 4n 3 F F  digit T T  F 5 + 4n T * 3  + 4n T * 5 3  5 T * F 3 – 5 15 T  T * F E E  T 4n E + 15  n E + 4 15 – 4 E + F E + T 19 E  E + T En L L  En

130 5.4. Ñònh nghóa thuoäc tính L
Moâ phoûng 5.1. Thöù töï ñaùnh giaù depth – first cho caùc thuoäc tính treân caây phaân tích procedure dfvisit (n: node); begin for vôùi moãi nuùt m laø con cuûa nuùt n, töø traùi sang phaûi do begin ñaùnh giaù thuoäc tính keá thöøa cuûa m dfvisit (m) end ñaùnh giaù thuoäc tính toång hôïp cuûa n end; Chuùng ta trình baøy lôùp cuûa ñònh nghóa tröïc tieáp cuù phaùp, ñöôïc goïi laø ñònh nghóa thuoäc tính L nhö sau: thuoäc tính L luoân ñöôïc ñaùnh giaù theo thöù töï depth – first. Ñònh nghóa thuoäc tính L bao goàm taát caû caùc ñònh nghóa tröïc tieáp cuù phaùp, ñöôïc döïa treân cô sôû vaên phaïm LL (1).

131 Ñònh nghóa thuoäc tính L
Ñònh nghóa tröïc tieáp cuù phaùp, ñöôïc goïi laø ñònh nghóa thuoäc tính L, neáu moãi thuoäc tính keá thöøa cuûa xj vôùi 1 < j  n maø xj naèm ôû veá phaûi luaät sinh A  x1x2…xn, chæ phuï thuoäc vaøo: 1. Caùc thuoäc tính cuûa caùc kyù hieäu x1, x2, …, xj-1 ôû phía traùi cuûa xj trong luaät sinh. 2. Thuoäc tính keá thöøa cuûa kyù hieäu A. Baûng 5.8. Ñònh nghóa tröïc tieáp cuù phaùp khoâng phaûi thuoäc tính L. Luaät sinh Luaät ngöõ nghóa A  LM L.i : = l (A.i) M.i := m (L.s) A.s : = f (M.s) A  QR R.i : = r (A.i) Q.i : = q (R.s) A.s : = f (Q.s)

132 Moâ phoûng 5.2. Löôïc ñoà dòch ñôn giaûn cho bieåu thöùc soá hoïc
Tröôøng hôïp ñôn giaûn nhaát neáu haønh vi chæ caàn thuoäc tính toång hôïp. Nhö vaäy chuùng ta seõ xaây döïng löôïc ñoà dòch baèng caùch taïo ra haønh vi laø pheùp gaùn cho moãi luaät ngöõ nghóa vaø gaén haønh vi naøy vaøo taän cuøng cuûa veá phaûi luaät sinh. Thí duï: ta coù luaät sinh vaø luaät ngöõ nghóa sau: Luaät sinh Luaät ngöõ nghóa T  T1 * F T.val:= T1.val x F.val ta ñöa luaät ngöõ nghóa ‘nhuùng’ vaøo luaät sinh vaø ñöôïc: T  T1 * F T.val:= T1.val x F.val Neáu caùc haønh vi caàn caû thuoäc tính toång hôïp vaø keá thöøa thì chuùng ta phaûi löu yù: E  TR R  addop T print (addop. Lexeme) R T  num print (num. val)

133 Moâ phoûng 5.3. Löôïc ñoà dòch vôùi vaên phaïm coù ñeä quy traùi.
1. Thuoäc tính keá thöøa cuûa moät kyùhieäu naèm ôû veá phaûi luaät sinh phaûi ñöôïc tính tröôùc trong haønh vi ñöùng tröôùc kyùhieäu ñoù. 2. Haønh vi khoâng ñöôïc tham khaûo ñeán thuoäc tính toång hôïp cuûa kyù hieäu naèm ôû beân phaûi haønh vi ñoù. 3. Thuoäc tính toång hôïp cuûa kyù hieäu khoâng keát thuùc ôû veá traùi luaät sinh chæ coù theå ñöôïc tính sau taát caû caùc thuoäc tính maø noù tham khaûo tôùi. 5.5. Bieân dòch töø treân xuoáng Loaïi boû ñeä quy traùi cho löôïc ñoà dòch Moâ phoûng 5.3. Löôïc ñoà dòch vôùi vaên phaïm coù ñeä quy traùi. E  E1 + T E.val := E1.val + T. val E  E1 – T E.val := E1.val - T. val E  T E.val := T. val T  E T.val := E. val T  num T.val := num. val

134 Hình 5.10. Ñaùnh giaù bieåu thöùc 9 – 5 + 2.
R.i = 9 T.val = 9 T.val = 5 R.i = 4 num. val = 9 num. val = 5 + T.val = 5 num. val = 2 Hình Ñaùnh giaù bieåu thöùc 9 –

135 Moâ phoûng 5.4. Löôïc ñoà dòch chuyeån ñoåi vôùi vaên phaïm ñeä quy traùi.
E  T R  + R  - R   T  ( ) T  num R.i := T.val R E.val := R.s T R1.i := R.i + T.val R R.s := R1.s T R1.i := R.i - T.val R.s := R.i E T.val := E.val T.val := num.val

136 Giaû söû chuùng ta coù löôïc ñoà dòch sau (vôùi thuoäc tính toång hôïp): A  A1Y A.a := g (A1.a, Y.y A  X A.a := f (X.x) (5.1) Sau khi loaïi boû ñeä quy traùi chuùng ta coù vaên phaïm töông ñöông; A  X R.i := f (X.x) R A.a := R.s R  Y R1.i := g (R.i, Y.y) (5.3) R1 R.i := R1.s R   R.s := R.i Thí duï Ñònh nghóa tröïc tieáp cuù phaùp ôû baûng 5.3. duøng ñeå xaây döïng caây cuù phaùp ñöôïc chuyeån thaønh löôïc ñoà dòch. E  E1 + T E.nptr := mknode (‘+’, E1.nptr, T.nptr) E  E1 – T E.nptr := mknode (‘-’, E1.nptr, T.nptr) (5.9) E  T E.nptr := T.nptr

137 Hình 5.11. Hai caùch tính giaù trò thuoäc tính.
A.a = g(g(f(X.x), Y1, y), Y2, y) A R.i = f(X.x) X Y2 A.a = g(f(X.x), Y1, y) Y1 Y1 A.a = f(X.x) Y2 R.I = g(g(f(X.x), Y1, y), Y2,y) X Hình Hai caùch tính giaù trò thuoäc tính.

138 Moâ phoûng 5.5. Löôïc ñoà dòch chuyeån ñoåi cho caáu truùc caây cuù phaùp.
E  T Rj := T.nptr R E.nptr := R.s R  + T R1j := mknode (‘+’, Rj.T.nptr) R1 R.s := R1.s R   T R1j := mknode (‘-’, Rj.T.nptr) R   R.s := Rj T  ( E ) T.nptr := E.nptr T  id T.nptr := mkleaf (id.id.entry) T  num T.nptr := mkleaf (num.num.val)

139 Thieát keá boä dòch ñoaùn nhaän tröôùc
Hình bieåu dieãn toaøn boä caùc haønh vi trong moâ phoûng 5.5. cho caáu truùc caây cuù phaùp cuûa caâu a – 4 + c. Thieát keá boä dòch ñoaùn nhaän tröôùc E R R R Tnptr i s i nptr Tnptr = + num id + id id c id num 4 a Hình Duøng caùc thuoäc tính keá thöøa ñeå xaây döïng caây cuù phaùp.

140 Giaûi thuaät 5.2: xaây döïng trình bieân dòch tröïc tieáp cuù phaùp ñoaùn nhaän tröôùc.
Nhaäp: cho löôïc ñoà dòch tröïc tieáp cuù phaùp vôùi vaên phaïm cô sôû phuø hôïp cho phaân tích ñoaùn nhaän tröôùc. Xuaát: maõ cho trình bieân dòch tröïc tieáp cuù phaùp. Phöông phaùp: 1. Vôùi moãi kyù hieäu khoâng keát thuùc A, xaây döïng haøm, thoâng soá laø thuoäc tính keá thöøa cuûa A, traû veà giaù trò cuûa caùc thuoäc tính toång hôïp cuûa A. 2. Maõ cho kyù hieäu khoâng keát thuùc A seõ quyeát ñònh luaät sinh naøo seõ ñöôïc duøng treân cô sôû kyù hieäu nhaäp ñang ñöôïc ñoïc. 3. Maõ cho moãi luaät sinh seõ ñöôïc taïo ra: i) Vôùi moãi token X vôùi thuoäc tính toång hôïp x, caát giaù trò x vaøo bieán X.x. Taïo ra leänh goïi chöông trình con ñeå so truøng token X vôùi kyù hieäu nhaäp ñöôïc ñoïc. ii) Vôùi B, taïo ra phaùt bieåu gaùn C1 = B (b1, b2, …, bk), b1, b2, …, bk laø caùc bieán chöùa caùc thuoäc tính keá thöøa cuûa B vaø C laø bieán chöùa thuoäc tính toång hôïp cuûa B.

141 iii) Vôùi moãi haønh vi, haõy cheùp maõ vaøo cho boä phaän tích, thay moãi tham chieáu ñeán caùc thuoäc tính baèng bieán chöùa caùc thuoäc tính ñoù. Thí duï Vaên phaïm ôû moâ phoûng 5.5 laø LL (1), noù phuø hôïp cho vieäc phaân tích töø treân xuoáng. function E:  nuùt caây cuù phaùp function R: (i:  nuùt caây cuù phaùp):  nuùt caây cuù phaùp; function T:  nuùt caây cuù phaùp; Keát hôïp hai luaät sinh R ôû moâ phoûng 5.5. R  addop T R1.i :=mknode (addop.lexeme, R.i, T.nptr) R1 R.s := R1.s R   R.s := R.i

142 Moâ phoûng 5.6. Thuû tuïc phaân tích cuù phaùp cho caùc luaät sinh
R: R  addop TR  Procedur R: begin if lookahead = addop then begin match (addop): T; R; end else begin /*khoâng laøm gì caû*/ Moâ phoûng 5.7. Caây cuù phaùp ñeä quy ñi xuoáng function R (i:  nuùt caây cuù phaùp):  nuùt caây cuù phaùp; var nptr. ll, sl, s:  nuùt caây cuù phaùp; addoplexeme: char; begin if lookahead = addop then begin /* luaät sinh R  addop TR*/ addoplexeme := lexval; match (addop);

143 il := mknode (addoplexeme, i, nptr);
sl := R (il); s := sl; end else s := i; /* luaät sinh R   */ return s end; 5.6. Ñaùnh giaù thuoäc tính keá thöøa töø döôùi leân Loaïi boû haønh vi ñöôïc nhuùng trong löôïc ñoà dòch Ví duï: chuùng ta coù löôïc ñoà dòch E  TR R  + T print (‘+’) R  - T print (‘‘) R T  num print (num.val)

144 Taïo ra löôïc ñoà dòch vôùi vieäc duøng caùc kyù hieäu ñaùnh daáu khoâng keát thuùc môùi N, M.
E  TR R  + T MR - TNR  T  num print (num.val) M   print (‘+’)  N   print (‘’)  Thuoäc tính keá thöøa treân stack cuûa boä phaân tích Thí duï Quaù trình ñaùnh giaù thuoäc tính keá thöøa baèng boä phaân tích töø döôùi leân cho caâu nhaäp real p, q, r ôû (H.5.13). D  T L.in := T.type T  int T.type := integer T  real T.type := real L  L1.in := L.in L1, id add type (id.entry, L.in) L  id add type (id.entry, L.in)

145 Hình 5.13. Taïi moãi nuùt L coù L.in := T.type.
D L T in in r L in real L q , p Hình Taïi moãi nuùt L coù L.in := T.type.

146 Baûng 5.9. Baát cöù luùc naøo veá phaûi cuûa L ñöôïc thu giaûm thì T luoân ôû
treân veá phaûi ñoù. Nhaäp Traïng thaùi Luaät ñöôïc aùp duïng Real p, q, r p, q, r , q, r , r r - real T Tp TL TL, TL, q TL, r D T  real L  id L  L, id D  TL

147 Baûng 5.10. Giaù trò cuûa T.type ñöôïc duøng ôû vò trí L.in.
Ñaùnh giaù caùc thuoäc tính keá thöøa Thí duï Ñaây laø ví duï veà tröôøng hôïp khoâng theå ñoaùn nhaän tröôùc vò trí cuûa thuoäc tính trong löôïc ñoà dòch. Luaät sinh Ñoaïn maõ D  TL T  int T  real L  L, id L  id val [ntop] := integer val [ntop] := real addtype (val[top], val[top – 3]) addtype (val[top], val[top – 1]) Luaät sinh Luaät ngöõ nghóa S  aAC S  aABC C  c C.i:= A.s C.i := A.s C.i := g (C.i) (5.4)

148 Hình 5.14. Sao cheùp thuoäc tính thoâng qua kyù hieäu M.
Luaät sinh Luaät ngöõ nghóa S  aAC S  bABMC C  c M   C.i := A.s M.i := A.s ; C.i := M.s C.i := g(C.i) M.S := M.i S S b b C A C B M i A B s s i i a) b) Hình Sao cheùp thuoäc tính thoâng qua kyù hieäu M. a) Luaät sinh chöa bieán ñoåi; b) Luaät sinh ñaõ ñöôïc bieán ñoåi.

149 Nhaäp: ñònh nghóa thuoäc tính L vôùi vaên phaïm cô sôû LL (1).
Kyù hieäu khoâng keát thuùc N cuõng coù theå ñöôïc duøng ñeå moâ phoûng cho luaät ngöõ nghóa maø noù khoâng phaûi laø luaät sao cheùp. Ví duï ta coù luaät sinh vaø luaät ngöõ nghóa: Luaät sinh Luaät ngöõ nghóa S  aAC C.i := f(A.s) (5.5) Luaät sinh Luaät ngöõ nghóa S  aANC N   N.i := A.s ; C.i := N.s N.s := f(N.i) (5.6) Giaûi thuaät 5.3. Phaân tích töø döôùi leân vaø söï bieân dòch vôùi caùc thuoäc tính keá thöøa. Nhaäp: ñònh nghóa thuoäc tính L vôùi vaên phaïm cô sôû LL (1). Xuaát: boä phaân tích cuù phaùp tính caùc giaù trò cuûa taát caû caùc thuoäc tính treân stack cuûa boä phaân tích. Phöông phaùp: giaû söû moãi kyù hieäu khoâng keát thuùc A coù moät thuoäc tính keá thöøa A.i vaø moãi kyù hieäu vaên phaïm X coù moät thuoäc tính toång hôïp X.x.

150 Vôùi moãi luaät sinh A  X1 … Xn, seõ coù n kyù hieäu khoâng keát thuùc ñaùnh daáu M1 …Mn, seõ thay luaät treân thaønh luaät sinh A  M1X1 … MnXn. Ñeå nhaän thaáy caùc thuoäc tính coù theå ñöôïc tính trong quaù trình phaân tích töø döôùi leân, haõy xeùt hai tröôøng hôïp. Tröôøng hôïp thöù nhaát neáu ta thu giaûm veà kyù hieäu Mj ta phaûi bieát luaät sinh A  Mj X1 … MnXn maø Mj coù trong ñoù. Chuùng ta phaûi bieát caùc vò trí cuûa caùc thuoäc tính maø thuoäc tính keá thöøa Xj.i caàn ñeå tính giaù trò cho noù. A.i ôû valtop – 2j + 2, X1.i ôû valtop – 2j + 3, X1.s ôû taïi valtop – 2i + 4, X2.i ôû valtop – 2j + 5… Tröôøng hôïp thöù hai seõ xuaát hieän khi ta thu giaûm veà moät kyù hieäu khoâng keát thuùc cuûa vaên phaïm giaû söû baèng luaät sinh A  M1X1 … MnXn, vaø giaû söû ta chæ tính A.s, coøn A.i ñaõ ñöôïc sinh vaø naèm treân stack ôû vò trí treân vò trí cuûa A. Caùc thuoäc tính caàn thieát ñeå tính A.s ñaõ saün saøng treân stack, ñaõ ñöôïc bieát, ñoù chính laø caùc vò trí cuûa caùc Xj trong quaù trình thu giaûm.

151 Thay theá thuoäc tính keá thöøa baèng thuoäc tính toång hôïp
Chuùng ta coù theå traùnh duøng thuoäc tính keá thöøa baèng vieäc thay ñoåi vaên phaïm cô sôû. Trong ngoân ngöõ cuûa Pascal cho pheùp khai baùo moät chuoãi caùc bieán vaø sau ñoù laø kieåu döõ lieäu cuûa chuùng. Thí duï: m, n: integer. D  L : T T  integer  char L  L, id  id D  id L L  ,id Ll:T

152 CHÖÔNG 6 XÖÛ LYÙ NGÖÕ NGHÓA
Xöû lyù ngöõ nghóa coù hai caùch: kieåm tra tónh (static check) vaø kieåm tra ñoäng (dynamic check). Trong chöông naøy chuùng ta chæ baøn ñeán kieåm tra ngöõ nghóa tónh. Xöû lyù ngöõ nghóa tónh bao goàm: 1. Truyeàn thuoäc tính 2. Kieåm tra kieåu 3. Kieåm tra trình töï ñieàu khieån 4. Kieåm tra tính duy nhaát 5. Kieåm tra moái lieân heä cuûa teân 6. Xöû lyù caùc phaùt bieåu goto tham khaûo tröôùc.

153 Hình 6.1. Vò trí cuûa boä xöû lyù ngöõ nghóa.
caây chuoãi caây maõ Boä phaân tích cuù phaùp Boä xöû lyù ngöõ nghóa Sinh maõ trung gian token trung gian cuù phaùp cuù phaùp Hình 6.1. Vò trí cuûa boä xöû lyù ngöõ nghóa. 6.1. Truyeàn thuoäc tính 1. Maõ trung gian Maõ trung gian coù nhieàu loaïi: maõ cambridge, maõ Balan ngöôïc, maõ boä tam (triple code), maõ boä töù (quadruple code). Boä töù cho bieåu thöùc soá hoïc Daïng toång quaùt: <toaùn töû> (<taùc toá 1>, <taùc toá 2>, <keát quaû>) Moät caùch bieåu thò bieán taïm ôû baûng danh bieåu: Teân:roãng Loaïi: 4 Kieåu döõ lieäu: tuøy theo kieåu cuûa caùc toaùn haïng tham gia pheùp toaùn. Ñòa chæ : ñòa chæ töông ñoái. Ñòa chæ naøy ñöôïc gaùn khi sinh maõ.

154 Moät soá maõ boä töù cho caùc pheùp toaùn hoïc
JMP (i, 0, 0) nhaûy ñeán boä töù coù chæ soá i JPG (i, p1, p2) nhaûy ñeán boä töù i neáu toaùn haïng thöù nhaát lôùn hôn toaùn haïng hai as1 (p1, p2, 0) gaùn trò p1 cho p2. p2 laø bieán ñôn FLT (p1, p2, 0) Ñoåi trò cuûa p1 thaønh soá thöïc, gaùn sang p2 FIX (p1, p2, 0) Ñoåi trò cuûa p1 thaønh soá nguyeân, gaùn sang p2 6.2. Xöû lyù ngöõ nghóa vôùi phaân tích cuù phaùp töø döôùi leân 1. Vaán ñeà truyeàn thuoäc tính Thí duï 6.1. Chuùng ta coù vaên phaïm G. <assign stmt>  id := <expr> <expr>  <expr> + <term>  <term> <term>  <term> * <factor>  < factor> < factor >  id  (< expr>)

155 Hình 6.2. Caây cuù phaùp A := X * (R + Q).
<assign stmt> n11 <expr> n10 <term> n9<factor> n8<expr> n2 <term> n5 <expr> <term> n7 n4 <term> n1 <factor> n6 <factor> n3 <factor> + id4 ) id1 := id2 * ( id3 Hình 6.2. Caây cuù phaùp A := X * (R + Q).

156 - Sinh ra bieán taïm khi thu giaûm
Baûng danh bieåu - Truyeàn thuoäc tính - Sinh ra bieán taïm khi thu giaûm 2. Phöông phaùp thöïc hieän söï truyeàn thuoäc tính Ñeå thöïc hieän xöû lyù ngöõ nghóa trong quaù trình phaân tích cuù phaùp, chuùng ta seõ duøng moät stack ñaëc bieät goàm caùc phaàn: A: kyù hieäu vaên phaïm (töôïng tröng cho moät danh hieäu) B: coù trò 0 hoaëc 1 (kyù hieäu 1 laø bieán taïm) C: con troû chæ ñeán baûng danh bieåu (thöïc chaát laø vò trí cuûa danh bieåu ôû trong baûng danh bieåu Token Trò töø vöïng Kieåu döõ lieäu 1 2 3 4 id A X R Q thöïc

157 Thí duï 6.2. Cho vaên phaïm G nhö ôû thí duï 6.1.
<asign stmt>  id := <expr> <expr>  <expr> + <term>  <term> <term>  <expr> * <factor>  <factor> <factor>  id  (<expr>) 3. Nguyeân taéc xöû lyù ngöõ nghóa Khi coù moät chuoãi con x = x1x2…xn saép ñöôïc thu giaûm veà KHKKT U (vôùi luaät sinh U  x1, x2 …xn) thì haønh vi xöû lyù ngöõ nghóa taïi nuùt V laø haøm cuûa: 1) Luaät sinh U  x1x2…xn 2) Caùc xöû lyù ngöõ nghóa cuûa caùc nuùt xi, töùc laø caùc nuùt con cuûa V coù theå laø: i) Tra cöùu baûng danh bieåu ii) Taïo ra bieán taïm iii) Sinh maõ trung gian iv) Truyeàn thuoäc tính töø x veà V

158 6.3. Kieåm tra kieåu döõ lieäu
1. Heä thoáng kieåu Ñònh nghóa bieåu thöùc kieåu 1. Kieåu döõ lieäu cô baûn 2. Khi bieåu thöùc kieåu ñöôïc ñaët teân 3. Boä kieán thieát kieåu bao goàm: 1) Daõy (array): array (I, T). 2) Tích soá (product): tích soá cartesian T1 x T2. 3) Baûn ghi (record): kieåu cuûa baûn ghi laø tích soá cuûa bieåu thöùc kieåu caùc thaønh phaàn cuûa noù. Thí duï: type row = record address : integer; lexeme : array 1..15 of char; end; var table : array 1..10 of row; Kieåu row ñöôïc bieåu dieãn baèng bieåu thöùc kieåu: record ((address x integer) x (lexeme x array (1...15, char))).

159 4) Con troû (pointer): pointer (T).
5) Haøm (function): D  R. Thí duï: trong Pascal coù khai baùo: function f (a, b : char) :  integer; Bieåu thöùc kieåu cuûa f laø: char x char  pointer (integer) 4. Bieåu thöùc kieåu chöùa caùc bieán maø trò cuûa chuùng laø bieåu thöùc kieåu. Ñeå bieåu dieãn bieåu thöùc kieåu ta duøng ñoà thò. (H.6.4) laø caây vaø dag, bieåu thò cho bieåu thöùc kieåu char x char  pointer (integer). Heä thoáng kieåu x pointer x pointer char char interger char interger Hình 6.4. Caây vaø dag, bieåu thò cho bieåu thöùc char x char  point (interger)

160 Kieåm tra kieåu tónh vaø kieåm tra kieåu ñoäng
Phaùt hieän loãi 2. Ñaëc taû boä kieåm tra kieåu ñôn giaûn Ngoân ngöõ ñôn giaûn Chuùng ta coù ngoân ngöõ ñôn giaûn ñöôïc sinh ra töø vaên phaïm G P  D ; E D  D ; D  id : T T  char  integer  array num of T   T E  literal  num  id E mod E  E  E  Moâ phoûng 6.1. Sô ñoà bieân dòch duøng ñeå löu giöõ kieåu cuûa caùc danh bieåu 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 (num. val, T1 . type)

161 Kieåm tra cho bieåu thöùc
1. Kieåu token laø literal vaø num thí coù kieåu laø char vaø integer. E  literal E. type := char E  num E. type := integer 2. E  id E. type := lookup (id. Entry) 3. E  E1 mod E2 E. type := if (E1 . type = integer) and (E2. type := integer) then integer else type - error 4. E  E1 E2 E. type := if (E1 . type = integer) and (E1. type E2 = array (s, t)) then t else type – error 5. E  E1  E. type := if E1. type = pointer (t) then t else type – error Kieåm tra kieåu döõ lieäu cho caùc phaùt bieåu Moät chöông trình bao goàm caùc khai baùo, sau ñoù laø caùc phaùt bieåu, ñieàu naøy ñöôïc bieåu thò baèng luaät sinh P  D; S.

162 Moâ phoûng 6.2. Sô ñoà bieân dòch cho kieåu döõ lieäu cuûa caùc phaùt bieåu
P  D; S 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 S  S1; S2 S.type := if (S1. type = void) and (S2. Type = void) then void else type - error Kieåm tra kieåu cuûa haøm E  E (E) Ñeå dieãn taû kieåu cho bieåu thöùc kieåu ta duøng kyù hieäu T vaø theâm luaät sinh T  T1’  ‘ T2 T. type := T1. type  T2. type

163 Quy taéc kieåm tra kieåu cuûa haøm laø
E  E1 (E2) E. type := if (E2. type = s) and (E1. type = s  t) then t else type - error T1 x T2 x .. x Tn Thí duï: root  (real  real) x real  real Chuùng ta seõ hieåu laø coù khai baùo: function root (functionf (real) : real; x : real) : real 3. Söï töông ñöông cuûa bieåu thöùc kieåu Söï töông ñöông caáu truùc cuûa bieåu thöùc kieåu Giaûi thuaät kieåm tra töông ñöông caáu truùc cuûa caùc bieåu thöùc kieåu

164 Moâ phoûng 6.3. Kieåm tra töông ñöông caáu truùc cuûa hai bieåu thöùc
kieåu s vaø t. function sequiv (s, t): boolean; begin if s vaø t cuøng moät kieåu cô baûn then true else if s = array (s1, s2) and t = array (t1, t2) then return sequiv (s1, s2) and sequiv (s2, t2) else if s = s1 x s2 and t = t1 x 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 else return false; end; Thí duï 6.3. Chuùng ta seõ giôùi thieäu caùch maõ hoaù caùc bieåu thöùc kieåu cuûa trình bieân dòch C do D.M. Ritchie vieát.

165 Moâ phoûng 6.4. Caùc thí duï veà bieåu thöùc kieåu.
char freturns (char) pointer (freturns (char)) array (pointer (freturns (char)) Caùc kieåu cô baûn cuûa ngoân ngöõ C ñöôïc John (1979) maõ hoùa baèng 4 bit Boä kieán thöùc kieåu Maõ hoùa pointer array freturns 01 10 11 Kieåu cô baûn Maõ hoùa boolean char integer real 0000 0001 0010 0011

166 Moâ phoûng 6.5. Maõ hoùa bieåu thöùc kieåu ôû moâ phoûng 6.4.
- Teân cho bieåu thöùc kieåu Sau ñaây laø moät ñoaïn khai baùo kieåu trong Pascal: type link =  cell; var next : link; last : link; p :  cell; q, r :  cell; Bieåu thöùc kieåu Maõ hoùa char freturns (char) pointer (freturns (char)) array (pointer (freturns (char))

167 Hình 6.11. Bieán vaø caùc bieåu thöùc kieåu töông öùng
Thí duï 6.4. Bieán Bieåu thöùc kieåu next last p q r link pointer (cell) Hình Bieán vaø caùc bieåu thöùc kieåu töông öùng 6.4. Chuyeån ñoåi kieåu Thí duï kyù hieäu haäu toá cuûa bieåu thöùc a + i sau khi thöïc hieän haønh vi chuyeån ñoåi kieåu: a i intereal real + - AÙp ñaët toaùn töû (Coercion) Thí duï 6.5.

168 Moâ phoûng 6.6. Quy taéc kieåm tra kieåu cho vieäc aùp ñaët toaùn töû ñeå ñoåi trò toaùn haïng töø soá nguyeân sang soá thöïc. Luaät sinh Luaät ngöõ nghóa E  num E  num. num E  id E  E1 op E2 E. type := integer E. type := real E. type := lookup (id. entry) E. type := if (E1. type = integer) and (E2. type = integer) then integer else if (E1. type = integer) and (E2. type = real) then real else if (E1. type = real) and (E2. type = integer) then real else if (E1. type = real) and (E2. type = real) else type - error

169 Löu yù: for | := 1 to N do x i := 1 (1) for | := 1 to N do x i := 1.0 (2) 6.5. Xöû lyù ngöõ nghóa cho phaùt bieåu goto tham khaûo tröôùc Thí duï 6.6. Giaû söû chuùng ta coù ñoaïn chöông trình goto L (10) JMP (0,0,0) goto L (50) JMP (10,0,0) goto L (90) JMP (50,0,0) L: x := x + 1 (120)

170 Baûng 6.3. Ñieàn chæ soá cuûa teân L vaøo caùc leänh nhaûy
Baûng 6.2. Baûng löu giöõ teân phaùt bieåu vaø chæ soá ñaàu danh saùch lieân keát Baûng 6.3. Ñieàn chæ soá cuûa teân L vaøo caùc leänh nhaûy Teân p/b Ñòa chæ Ñònh nghóa L 90 Teân p/b Ñòa chæ Ñònh nghóa L 120 1 (10) JMP (120,0,0) (50) JMP (120,0,0) (90) JMP (120,0,0)

171 CHÖÔNG 7 QUAÛN LYÙ BOÄ NHÔÙ TRONG THÔØI GIAN THÖÏC THI
7.1. Caùc phaàn töû yeâu caàu caáp phaùt boä nhôù trong thôøi gian thöïc thi Taát caû caùc phaàn töû caàn ñöôïc caáp phaùt boä nhôù, bao goàm: 1. Ñoaïn maõ cuûa chöông trình ñöôïc bieân dòch. 2. Caùc chöông trình heä thoáng caàn thieát trong thôøi gian thöïc thi. 3. Caáu truùc döõ lieäu vaø haèng do ngöôøi söû duïng ñònh nghóa. 4. Caùc ñieåm trôû veà cuûa chöông trình con. 5. Moâi tröôøng tham khaûo. 6. Caùc vò trí nhôù taïm cho vieäc tính trò bieåu thöùc. 7. Nhaäp, xuaát boä ñeäm. 8. Caùc baûng, traïng thaùi thoâng tin. Ngoaøi döõ lieäu vaø caùc chöông trình ñöôïc bieân dòch, caùc taùc vuï cuõng caàn boä nhôù: 1) Goïi chöông trình con vaø caùc taùc vuï trôû veà. 2) Khôûi taïo vaø huûy boû caáu truùc döõ lieäu. 3) Taùc vuï theâm vaøo hoaëc loaïi boû caùc phaàn töû.

172 Moâ phoûng 7.1. Chöông trình Pascal ñoïc vaø saép xeáp thöù töï caùc
7.2. Caùc vaán ñeà veà ngoân ngöõ nguoàn Chöông trình con Moâ phoûng 7.1. Chöông trình Pascal ñoïc vaø saép xeáp thöù töï caùc soá nguyeân (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) program sort (input, output); var a: array [0…10]; procedure readarray; var i: integer; begin for i := 1 to 9 do read (a [1]); end; function partition (y, z: integer): integer; var i, j, x, v: integer; begin … procedure quicksort (m, n: integer);

173 (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) var i: integer; begin if (n > m) then begin i := partition (m, n); quicksort (m, i – 1); quicksort (i + 1, n); end; a[0] := -9999; a[10] := 9999; readarray; quicksort (1, 9); end

174 Caây hoaït ñoäng (activation tree)
Caây hoaït ñoäng duøng ñeå mieâu taû con ñöôøng maø söï ñieàu khieån ñi vaøo vaø ñi ra khoûi caùc hoaït ñoäng cuûa chöông trình. Moät soá tính chaát cuûa caây hoaït ñoäng: 1. Moãi nuùt cuûa caây töôïng tröng cho moät hoaït ñoäng cuûa chöông trình con. 2. Nuùt goác (root) töôïng tröng cho hoaït ñoäng cuûa chöông trình chính. 3. Nuùt a laø cha cuûa nuùt b neáu vaø chæ neáu doøng ñieàu khieån ñi töø söï hoaït ñoäng a sang söï hoaït ñoäng b. 4. Nuùt a ôû beân traùi nuùt b neáu vaø chæ neáu thôøi gian soáng cuûa a xuaát hieän tröôùc thôøi gian soáng cuûa b.

175 mieâu taû söï thöïc thi cuûa noù.
Moâ phoûng 7.2. Caùc phaùt bieåu in cuûa chöông trình ôû moâ phoûng 7.1 mieâu taû söï thöïc thi cuûa noù. Söï thöïc thi chöông trình baét ñaàu vaøo readarray ra khoûi readarra vaøo quicksort (1,9) vaøo partition (1,9) ra khoûi partition (1,9) vaøo quicksort (1,3) …… ra khoûi quicksort (1,3) vaøo quicksort (5,9) ra khoûi quicksort (5,9) ra khoûi quicksort (1,9) Söï thöïc thi keát thuùc

176 Thí duï 6.1. s: vieát taét cho sort p: vieát taét cho partition r: vieát taét cho readarray q: vieát taét cho quicksort S r q(1,9) q(5, 9) p(1,9) q(7,9) q(1,3) p(5,9) q(5,5) p(7,9) q(7,7) p(1,3) q(2,3) q(1,0) p(2,3) q(2,1) q(3,3) Hình 7.1. Caây hoaït ñoäng ñöôïc xaây döïng töø chuoãi xuaát ôû moâ phoûng 7.2.

177 Stack ñieàu khieån (Control stack)
q(1,9) r p(1,9) q(1,3) q(2.3) p(1,3) q(1,0) Hình 7.2. Stack ñieàu khieån bao goàm caùc nuùt treân con ñöôøng töø s ñeán q (2,3) vaø trôû veà

178 Hình 7.3. Pheùp chieáu hai möùc töø teân ñeán trò
Taàm vöïc cuûa söï khai baùo Khai baùo coù theå töôøng minh, Var I: integer nhöng coù theå laø khai baùo ngaàm nhö Fortran, khi ta duøng teân bieán i maø khoâng khai baùo, Fortran maëc nhieân hieåu i laø bieán nguyeân. Taàm aûnh höôûng cuûa caùc khai baùo ñöôïc quy taéc taàm vöïc quyeát ñònh. Söï raøng buoäc cuûa teân Moâi tröôøng laø teân cuûa haøm, aùnh xaï teân ñeán vò trí nhôù vaø traïng thaùi laø haøm aùnh xaï töø vò trí nhôù ñeán trò maø noù löu giöõ. teân vò trí nhôù trò Hình 7.3. Pheùp chieáu hai möùc töø teân ñeán trò Söï raøng buoäc chính laø baûn sao ñoäng cuûa khai baùo, trong thôøi gian thöïc thi.

179 Baûng 7.1. Caùc khaùi nieäm tónh vaø ñoäng cuûa chöông trình con
7.3. Toå chöùc kyù öùc Söï phaân chia boä nhôù trong thôøi gian thöïc thi Trong thôøi gian dòch, trình bieân dòch ñaõ tính toaùn kích thöôùc boä nhôù daønh cho chöông trình ñoái töôïng, noù bao goàm: 1. Maõ cuûa chöông trình ñoái töôïng. 2. Caùc ñoái töôïng döõ lieäu. 3. Moät phaàn trong stack ñieàu khieån (stack trung taâm) löu giöõ baûn ghi hoaït ñoäng cuûa chöông trình con. Khaùi nieäm tónh Baûn sao ñoäng Ñònh nghóa chöông trình con Söï hoaït ñoäng cuûa chöông trình con Khai baùo teân Söï raøng buoäc teân vôùi vò trí nhôù Taàm vöïc yù nghóa cuûa khai baùo Thôøi gian soáng cuûa söï raøng buoäc teân

180 Maõ cuûa chöông trình ñoái töôïng
Moâ phoûng 7.2. Söï phaân chia boä nhôù trong thôøi gian thöïc thi cho vuøng maõ cuûa chöông trình vaø vuøng döõ lieäu. Khoâng phaûi taát caû caùc ngoân ngöõ laäp trình ñeàu duøng stack ñieàu khieån vaø heap, nhöng Pascal vaø C thì duøng caû hai. Baûn ghi hoaït ñoäng (Activation record) 1. Vuøng giaù trò khöù hoài 2. Vuøng thoâng soá 3. Ñöôøng lieân keát ñoäng 4. Ñöôøng lieân keát tónh 5. Caùc traïng thaùi maùy 6. Vuøng döõ lieäu cuïc boä 7. Vuøng nhôù taïm Maõ cuûa chöông trình ñoái töôïng Döõ lieäu tónh Stack ñieàu khieån heap

181 Moâ phoûng 7.3. Daïng toång quaùt cuûa baûn ghi hoaït ñoäng
7.4. Chieán thuaät caáp phaùt boä nhôù 1. Caáp phaùt tónh 2. Quaûn trò boä nhôù theo cô cheá stack 3. Cô cheá heap Giaù trò khöù hoài Thoâng soá thöïc Ñöôøng lieân keát ñoäng Ñöôøng lieân keát tónh Caùc traïng thaùi maùy Döõ lieäu cuïc boä Vuøng nhôù taïm

182 Moâ phoûng 7.4. Chöông trình trong ngoân ngöõ Fortran.
1. Caáp phaùt tónh (Static allocation) Cô cheá naøy seõ daãn ñeán moät soá haïn cheá sau ñaây: 1) Kích thöôùc vaø vò trí cuûa ñoái töôïng döõ lieäu phaûi ñöôïc xaùc ñònh ngay trong thôøi gian bieân dòch. 2) Khoâng cho pheùp goïi ñeä quy. 3) Khoâng cho pheùp caáp phaùt ñoäng caùc ñoái töôïng döõ lieäu. Moâ phoûng 7.4. Chöông trình trong ngoân ngöõ Fortran. (1) (2) (3) (4) (5) (6) (7) (8) (9) PROGRAM CNSUME CHARACTER * 50 BUF INTEGER NEXT CHARACTER C, PRDUCE DATA NEXT /1/, BUF /’’/ C = PRDUCE () BUF (NEXT: NEXT) = C NEXT = NEXT + 1 IF (C. NE. ‘’) GOTO 6

183 (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) WRITE (*, ‘(A)’) BUF END CHARACTER FUNCTION PRDUCE () CHARACTER * 80 BUFFER INTEGER NEXT SAVE BUFFER, NEXT DATA NEXT /81/ IF (NEXT. GT. 80) THEN READ (*, ‘’(A)’’) BUFFER NEXT = 1 END IF PRDUCE = BUFFER (NEXT: NEXT) NEXT = NEXT + 1

184 Baûn ghi hoaït ñoäng CNSUME Döõ lieäu tónh
Maõ cho CNSUME Maõ cho PRDUCE CHARACTER * 50 BUF INTEGER NEXT CHARACTER C CHARACTER * 80 BUFFER INTEGER NEXT maõ cuûa chöông trình Baûn ghi hoaït ñoäng CNSUME Döõ lieäu tónh Baûn ghi hoaït ñoäng PRDUCE Hình 7.4. Vò trí nhôù tónh cho caùc bieán cuïc boä cho chöông trình Fortran 77

185 2. Caáp phaùt theo cô cheá stack CNSUME
Thí duï 7.2. Chöông trình ôû (moâ phoûng 7.4) seõ laøm vieäc vôùi caùc giaù trò cuïc boä ñöôïc löu laïi qua caùc laàn hoaït ñoäng. Caùc kyùhieäu xuaát ra trong chöông trình chính CNSUME, ñöôïc laáy töø baûn ghi hoaït ñoäng cuûa PRDUCE laø hello, do CNSUME goïi PRDUCE 6 laàn, nhö ôû (H.7.5). 2. Caáp phaùt theo cô cheá stack CNSUME PRDUCE h PRDUCE e PRDUCE l PRDUCE l PRDUCE o PRDUCE Hình 7.5. Caùc kyù hieäu ñöôïc traû veà qua caùc laàn hoaït ñoäng cuûa PRDUCE

186 caây hoaït ñoäng stack ñieàu khieån s s r s r q(1,9) s a: array r
i: integer q(1,9) s r s r q(1,9)

187 s r q(1,9) p(1,9) s r q(1,9) p(1,9) q(1,3) p(1,3) q(1,0) s a: array
i: integer p(1,9) i, j, x, v: integer q(1,3) q(1,0) r q(1,9) p(1,9) s r q(1,9) p(1,9) q(1,3) p(1,3) q(1,0)

188 Söï goïi chöông trình con
a: array q(1,9) i: integer q(1,3) q(1,9) p(1,9) q(1,3) p(1,3) q(1,0) Hình 7.6. Caùc baûn ghi hoaït ñoäng ñöôïc caáp phaùt vaø loaïi boû khoûi stack ñieàu khieån. Söï goïi chöông trình con 1. Chöông trình goïi tính toaùn caùc thoâng soá thöïc vaø caát vaøo vuøng thoâng soá cuûa baûn ghi hoaït ñoäng cuûa chöông trình bò goïi. 2. Chöông trình bò goïi löu giöõ ñòa chæ khöù hoài vaøo vuøng trò traû veà vaø trò top-sp vaøo vuøng lieân keát, taêng top-sp leân moät khoaûng vò trí nhôù, chính laø kích thöôùc cuûa vuøng bieán taïm vaø bieán cuïc boä cuûa noù vôùi kích thöôùc vuøng thoâng soá, trò trôû veà, ñöôøng lieân keát vaø caùc traïng thaùi maùy cuûa chöông trình bò goïi.

189 3. Chöông trình bò goïi seõ löu boä nhôù giaù trò, caùc thanh ghi, ñöôøng lieân keát vaø traïng thaùi khaùc. 4. Chöông trình bò goïi khôûi ñoäng caùc giaù trò cuïc boä cuûa noù vaø baét ñaàu thöïc thò. …………………….. Thoâng soá vaø trò trôû veà Ñöôøng lieân keát vaø traïng thaùi cuûa maùy Bieán taïm vaø bieán cuïc boä Ñöôøng lieân keát vaø traïng thaùi cuûa maùy Ñöôøng lieân keát Baûn hoaït ñoäng cuûa chöông trình goïi Nhöõng thoâng tin chöông trình goïi coù traùch nhieäm cung caáp Baûn hoaït ñoäng cuûa chöông trình bò goïi top-sp Caùc thoâng tin chöông trình bò goïi coù traùch nhieäm cung caáp Hình 7.7. Söï phaân chia coâng vieäc giöõa chöông trình goïi vaø bò goïi

190 Chuoãi trôû veà coù theå laø caùc coâng vieäc sau
1. Chöông trình bò goïi göûi caùc giaù trò trôû veà vaøo baûn ghi hoaït ñoäng cuûa chöông trình con. 2. Chöông trình bò goïi xaùc laäp laïi trò: top-sp cho chöông trình goïi, trò caùc thanh ghi, ñòa chæ khöù hoài. 3. Chöông trình goïi seõ söû duïng caùc giaù trò trong vuøng bieán taïm, giaù trò trôû veà ñeå tính toaùn caùc bieåu thöùc sau naøy khi noù thöïc thi tieáp tuïc. Döõ lieäu coù kích thöôùc thay ñoåi ÔÛ moät soá ngoân ngöõ nhö C, Algol, daõy ñöôïc pheùp coù kích thöôùc thay ñoåi trong thôøi gian thöïc thi. Thí duï 7.4. Cho khai baùo daõy trong Algol nhö sau: DIMENSION A [L1 : U1, L2: U2, …Ln: Un] di laø kích thöôùc chieàu thöù I, ñöôïc tính: di = Ui – Li + 1 Vuøng thoâng tin cho daõy A laø:

191 Hình 7.8. Vuøng thoâng tin cuûa daõy trong baûn ghi hoaït ñoäng
L1 U1 d1 L2 U2 d2 Ln Un dn n Vuøng p seõ chöùc ñòa chæ baét ñaàu cuûa vò trí nhôù daõy A Hình 7.8. Vuøng thoâng tin cuûa daõy trong baûn ghi hoaït ñoäng Thí duï 7.5. DIMENSION p[1: n, x: y], q[1: m];

192 Thoâng soá vaø trò trôû veà
Lieân keát vaø caùc traïng thaùi maùy Bieán taïm vaø bieán cuïc boä 1 n d1 x y d2 2 m p q Baûn ghi hoaït ñoäng cuûa chöông trình goïi chöông trình con A Phaàn tónh cuûa baûn ghi hoaït ñoäng cuûa chöông trình con A Vuøng bieán taïm vaø caùc bieán cuïc boä cuûa baûn ghi hoaït ñoäng cuûa A Baûn ghi hoaït ñoäng cuûa chöông trình con A Phaàn bieán thieân cuûa A Hình 7.9. Baûn ghi hoaït ñoäng cuûa chöông trình con A, coù caùc bieán daõy p, q vôùi kích thöôùc thay ñoåi

193 Moâ phoûng 7.5. Ñoaïn chöông trình Pascal gaây ra tham chieáu treo.
Tham chieáu treo (Dangling reference) Moâ phoûng 7.5. Ñoaïn chöông trình Pascal gaây ra tham chieáu treo. var p, q: ^ integer; begin… new(p); q: = p; dispose (p) end;

194 Hình 7.10. Tham chieáu treo q xuaát hieän do leänh dispose (p).
ñoái töôïng ñöôïc caáp phaùt new (p) p q = p q p dispose (p) q ñoái töôïng döõ lieäu bò loaïi boû Hình Tham chieáu treo q xuaát hieän do leänh dispose (p). 3. Caáp phaùt theo cô cheá heap 1. Trò cuûa caùc bieán cuïc boä ñöôïc löu giöõ ngay caû khi söï hoaït ñoäng cuûa chöông trình con töông öùng khoâng coøn nöõa. 2. Söï hoaït ñoäng cuûa chöông trình bò goïi soáng sau caû chöông trình goïi.

195 Baûng 7.2. Caùc baûn ghi hoaït ñoäng cuûa heap vaø stack cuøng söï so saùnh vôùi caây hoaït ñoäng.
Caùc baûn ghi hoaït ñoäng treân stack Vò trí treân caây hoaït ñoäng Caùc baûn ghi hoaït ñoäng trong heap Ghi chuù Theo cô cheá heap r ñaõ heát thöïc thi nhöng baûn ghi hoaït ñoäng cuûa noù vaãn coøn toàn taïi s lieân keát ñoäng q(1,9) S s lieân keát ñoäng r q(1,9) r q(1,9)

196 Hình 7.12. Caùc khoái ñang ñöôïc söû duïng vaø ñang troáng
Caáp phaùt vò trí nhôù cho caùc khoái coù kích thöôùc coá ñònh Caáp phaùt vò trí nhôù cho caùc khoái coù kích thöôùc thay ñoåi ñaàu danh saùch a) 1 2 3 4 5 6 ñaàu danh saùch b) Hình Caùc khoái bò loaïi boû seõ ñöôïc theâm vaøo danh saùch cuûa caùc khoái chöa söû duïng. 2 3 4 5 6 Hình Caùc khoái ñang ñöôïc söû duïng vaø ñang troáng

197 Loaïi boû ngaàm vò trí nhôù Moâ phoûng 7.6. Daïng cuûa moät khoái
1. Ñeám caùc tham khaûo 2. Kyõ thuaät ñaùnh daáu kích thöôùc khoái soá löôïng con troû tham khaûo tôùi ñaùnh daáu caùc con troû chæ ñeán caùc khoái thoâng tin cuûa ngöôøi söû duïng 1 Hình Hai khoái naøy laø raùc maëc duø vaãn coù soá ñeám tham khaûo laø 1

198 7.5. Truy xuaát bieán khoâng cuïc boä
Moâ phoûng 7.7. Chöông trình duøng ñeå minh hoïa vieäc truy xuaát bieán khoâng cuïc boä. program MAIN var x: integer; procedure sub1; var x: real; begin read (x) sub2; end; procedure sub2; (Khoâng coù khai baùo x)

199 begin write (x); end begin main sub1; end. Caáu truùc khoái Quaûn trò boä nhôù vaø vieäc caáp phaùt vò trí nhôù cho caùc khoái cuûa Algol

200 Moãi baûn ghi hoaït ñoäng goàm caùc thaønh phaàn chính sau ñaây:
Daõy display cuûa chöông trình con. Neáu chöông trình ôû caáp i thì display chieám i + 1 oâ nhôù. Vò trí nhôù chöùa trò stack top cuûa chöông trình con. Caùc thoâng tin veà ñòa chæ khöù hoài, lieân keát tónh vaø lieân keát ñoäng, stack_top cuûa chöông trình con goïi. Caùc vò trí nhôù daønh cho caùc thoâng soá cuûa chöông trình con. Caùc phaàn 1, 2, 3, 4 taïo thaønh phaàn cô baûn cuûa chöông trình con. Moãi chöông trình con coù theå coù nhieàu khoái, moãi khoái ñöôïc caáp phaùt moät khoaûng kyù öùc ñeå chöùa caùc thaønh phaàn sau: 1) Vò trí nhôù chöùa trò stack top cuûa khoái. 2) Vò trí nhôù daønh cho caùc bieán cuïc boä laø bieán ñôn. 3) Caùc thoâng tin veà daõy (neáu khoái coù khai baùo daõy). 4) Vò trí nhôù chöùa caùc bieán taïm.

201 Thí duï 7.9. Cho chöông trình con trong Algol.
procedure A (x, y); integer x, y; L1: begin real z; array B x: y; L2: begin real: D, E; ….. end; L3: begin array aa: x; L4: begin real E; …….. …. B1 B2 B3 B4

202 ………………… Display cuûa A Stack-top cuûa A Caùc thoâng soá RA, SL, DL Thoâng soá X, Y Trò stack-top cuûa B1 Z Vuøng thoâng tin cuûa daõy B Stack-top cuûa B2 d, E B a B Phaàn cô baûn cuûa A Phaàn coá ñònh cuûa chöông trình con A Vò trí nhôù cuûa khoái B1 Stack-top cuûa B3 Vuøng thoâng tin cuûa daõy a Stack-top cuûa B4 E Hình Baûn ghi hoaït ñoäng cuûa chöông trình con A coù chöùa caùc khoái

203 Caùc haønh vi thaâm nhaäp vaøo moät khoái vaø ra khoûi khoái
Haønh vi ra khoûi khoái Taàm vöïc tónh vôùi caùc chöông trình con khoâng loàng nhau Taàm vöïc tónh vôùi caùc chöông trình con loàng nhau Baûng taàm vöïc (display) Ñeå truy xuaát bieán khoâng cuïc boä, ngöôøi ta söû duïng baûng taàm vöïc. Tuy nhieân, lieân keát tónh vaãn toàn taïi trong caùc baûn ghi hoaït ñoäng, duøng ñeå phuïc hoài hình aûnh baûng taàm vöïc khi chöông trình con caáp i goïi chöông trình con caáp j, vôùi i > j vaø sau khi chöông trình con caáp j hoaøn taát söï thöïc thi. Thí duï Cho chöông trình sau:

204 Moâ phoûng 7.10. Chöông trình Pascal coù caáu truùc khoái
program M; : procedure P; procedure Q; begin : P ; end; procedure R; Q; begin; R; P;

205 Möùc taàm vöïc cuûa caùc chöông trình con laø: M P Q R
vaø M goïi P goïi R goïi Q goïi P Caùc böôùc thöïc thi Display Stack ñieàu khieån 1 M 2 M goïi P P

206 3 P goïi R M 1 P 2 R 4 R goïi Q Q 5 Q goïi P P’ SL

207 P’ hoaøn taát thöïc thi traû söï ñieàu khieån cho Q
6 P’ hoaøn taát thöïc thi traû söï ñieàu khieån cho Q M 1 P Q R Hình Caùc böôùc goïi chöông trình con cuøng vôùi söï thay ñoåi noäi dung cuûa display vaø stack ñieàu khieån Taàm vöïc ñoäng 7.6. Truyeàn thoâng soá Thoâng soá nhaäp – xuaát - Truyeàn baèng tham khaûo - Truyeàn baèng trò

208 2. Thoâng soá chæ nhaäp - Truyeàn baèng trò - Truyeàn baèng trò haèng Thoâng soá chæ xuaát - Truyeàn thoâng soá baèng teân

209 Thí duï 7.6. Cho chöông trình type VECT = array [1 .. 3] of integer;
procedure SUB2 (var I, J: integer); begin I := I + 1; J := J + 1; write (I, J); end; procedure SUB1; var A: VECT; K :integer; begin A[1] := 7; A[2] := 8; A[3] := 9; K :=2: SUB2 (K, A[K]); for K := 1 to 3 do write (A [K]);

210 Stack trung taâm stack trung taâm sub 1 lieân keát A[1] A[2] A[3] K sub 2 Thunk tính toaùn K I J Thunk tính toaùn A[k] a) b) Hình Phöông phaùp truyeàn thoâng soá baèng teân vaø baèng tham khaûo

211 Chöông trình con ñoùng vai troø thoâng soá
Thí duï 7.7. Cho chöông trình program MAIN; var X : real; procedure SUB2 (X, Y: real; function F (u: real): real); var z: real; begin z := abs (Y - X); z := (F (X) + F (Y)) * Z/2; write (Z); end; procedure SUB1; var Y :real;

212 function FUNC: (V: real): real;
begin FUNC := X + V + Y end; Y := 1 SUB2 (0, 1, FUNC) X := 3; SUB1; end. Nhìn vaøo chöông trình treân chuùng ta thaáy trình töï thöïc thi cuûa chöông trình nhö sau: MAIN goïi SUB1 goïi SUB2 (0, 1, FUNC) goïi FUNC

213 Baûng Stack trung taâm khi moät chöông trình con goïi chöông trình con khaùc thoâng qua thoâng soá hình thöùc Böôùc 1 Söï thöïc thi Stack trung taâm 1 2 3 MAIN MAIN goïi SUB1 lieân keát tónh MAIN X = 3 SUB2 SUB1

214 F ñòa chæ phaàn maõ cuûa FUNC
3 SUB1 goïi SUB2 lieân keát tónh Y = 1 SUB1 FUNC MAIN X = 1 SUB2 X Y F ñòa chæ phaàn maõ cuûa FUNC

215 F ñòa chæ phaàn maõ cuûa FUNC
4 SUB2 goïi FUNC z lieân keát tónh MAIN X = 1 SUB2 SUB1 Y FUNC X F ñòa chæ phaàn maõ cuûa FUNC Z

216 FUNC lieân keát tónh V

217 TOÅ CHÖÙC BAÛNG DANH BIEÅU
CHÖÔNG 8 TOÅ CHÖÙC BAÛNG DANH BIEÅU 8.1. Giôùi thieäu Coù boán phöông phaùp truy xuaát treân baûng danh bieåu: Tìm kieám tuyeán tính (linear search) Tìm kieám nhò phaân (binary search) Tìm kieám treân caây (tree search) Maõ hoùa baêm (hash coding) 8.2. Caùc taùc vuï treân baûng danh bieåu

218 Baûng 8.1. Caùc taùc vuï treân baûng danh bieåu
Teân chöông trình con Caùch goïi Haønh vi thöïc thi Enter Enter (id) Khi gaëp moät danh bieåu môùi ñöôïc khai baùo, thuû tuïc naøy seõ kieåm tra xem danh bieåu môùi ñoù coù truøng vôùi teân naøo trong cuøng moät taàm vöïc? Neáu khoâng, thuû tuïc enter seõ ñöa danh bieåu môùi vaøo baûng danh bieåu. Ngöôïc laïi enter seõ thoâng baùo loãi veà vieäc khai baùo moät danh bieåu nhieàu laàn trong cuøng moät taàm vöïc. loc (haøm) n := loc (id) Khi caàn truy xuaát moät danh bieåu, loc seõ tìm treân baûng danh bieåu töø phaân töû môùi nhaát cuûa taàm vöïc môùi nhaát ñeán phaân töû cuõ nhaát cuûa taàm vöïc cuõ nhaát ñeå tìm vò trí cuûa id vaø traû veà thoâng qua teân loc cuûa haøm. Scopeentry Khi trình bieân dòch ñi vaøo moät taàm vöïc môùi, scopeentry seõ ñaùnh daáu treân Stack (baûng danh bieåu) moät taàm vöïc môùi.

219 8.3. Baûng danh bieåu tuyeán tính (linear symbol table)
Scopeexit Khi trình bieân dòch ñi heát moät taàm vöïc scopeenxit seõ thaûi hoài nhöõng teân bieán khoâng coøn coù yù nghóa vaø taùi laäp moät taàm vöïc ngoaøi cuøng gaàn nhaát. 8.3. Baûng danh bieåu tuyeán tính (linear symbol table) Thí duï 8.1. Cho ñoaïn chöông trình trong ngoân ngöõ Algol. begin real A, B; begin real C, A; end;

220 Hình 8.1. Baûng danh bieåu tuyeán tính cuûa thí duï 8.1
Caùc taùc vuï treân baûng danh bieåu tuyeán tính ñöôïc trình baøy nhö sau: Giaûi thuaät: const tab lim = …..; btablim = …..; I = 5 5 4 A 3 C 2 B 1 3 2 1 B = 3 TAB BTAB

221 type tabinden = 1 .. tablim;
item = record key: alfa; /* alfa laø kieåu chuoãi caùc kyù töï */ end; var btab: array [1 .. btablim] of integer; tab: array [1 .. Tablim] of item; b: 1   tablim; t: tabindex; procedure enter (id: alfa) var sb: tabindex; begin sb := btab [b –1];

222 Tìm kieám treân baûng TAB töø vò trí sb ñeán vò trí t – 1, xem coù phaàn töû naøo mang key baèng id khoâng? Neáu coù, thuû tuïc error seõ thoâng baùo loãi 1 laø loãi coù hai danh bieåu cuøng teân trong cuøng taàm vöïc. Ngöôïc laïi, if t = tablim then error (12) else begin tab [t] key := id; t := t + 1 end; function loc (id: alfa): tabindex; begin Tìm kieám töø vò trí ñaàu TAB ñeán vò trí t –1, xem coù phaàn töû naøo coù key laø id? Neáu khoâng coù thì error seõ thoâng baùo loãi 13. Ngöôïc laïi neáu tìm thaáy danh bieåu coù khoùa id taïi vò trí index thì thöïc thi leänh loc := index;

223 end; Procedure scopeentry; begin if b = btablim then error (14) else begin btab [b] := t; b := b + 1 Procedure Scope exit; begin b := b – 1; t := btab [b] 8.4. Baûng danh bieåu baêm (hash symbol table) Moät danh bieåu chæ soá k H

224 Hình 8.2. Baûng danh bieåu baêm
Chuùng ta laáy laïi thí duï 8.1 ñeå minh hoïa vieäc xaây döïng baûng danh bieåu theo phöông phaùp baêm ôû (H.8.2). Giaû söû A bieán ñoåi H coù k = 3, B coù k = 6 vaø C coù k = 5. 8 7 6 2 5 3 4 A 1 C B TAB BTAB HASH T = 5 B = 3 B = 3 H A k = 3 H A k = 6 Hình 8.2. Baûng danh bieåu baêm H A k = 5

225 Caùc taùc vuï laøm vieäc treân baûng danh bieåu baêm ñöôïc trình baøy baèng caùc chöông trình con sau: const hashsize = …; tabsize = …; btabsize = …; type tabindex = 1 .. tabsize; hashindex = 1 .. hashsize; iterm = record key: id; ptr: tabindex; end; var tab: array [1 .. tablim] of item hash: array [hashindex] of tabindex; btab: array [i .. btabsize] of tabindex;

226 t: tabindex; b: 1 .. Btabsize;
function H (id: alfa): hashindex; begin end; procedure enter (id: alfa); var sb: tabindex; k: hashindex; ind: tabindex; k := H(id); ind := HASH [k]; sb := btab [b – 1]; if HASH [k] < > 0 then while ind > = sb do if id = tab [ind]. key then error (11) …

227 /* truøng teân danh bieåu trong cuøng taàm vöïc */
else ind := tab [ind]. Ptr; khoâng truøng teân if t = tabsize then error (12) else begin tab [t]. Key := id; tab [t]. Ptr := HASH [k]; HASH [k] := t; t := t + 1; end; function loc (id: alfa): tabindex; var q: boolean; ind: tabindex; begin ind := HASH [H(id)];

228 q := false; while (ind < > 0) and (not (q)) do begin q := id = tab [ind]. Key; if not (q) then ind := tab [ind]. Ptr end; if q then loc := ind else error (13); /* chöa coù danh bieåu trong baûng danh bieåu */ procedure Scopeentry; begin if b = tabsize then error (14) else begin btab [b] := t; b := b + 1;

229 8.5. Haøm baêm (hashing function)
procedure Scopeexit; var ind: tabindex; k: hashindex; begin ind := t; t := btab [b – 1]; b := b – 1; while ind > t do begin ind := ind – 1; k := H (tab [ind]. Key); HASH [k] := tab [HASH [k]]. Ptr; end; 8.5. Haøm baêm (hashing function)

230 8.6. Löu giöõ thoâng tin cuûa taàm vöïc yù nghóa
nil header sort a x readarray baûng readarray exchange baûng exchange quicksort k v partition i

231 Muoán thöïc hieän vieäc taïo baûng danh bieåu cho chöông trình con bò goïi, ta phaûi taïo caùc haøm nhö sau: mktable (x) enter (table, name, type, offset) addwidth (table, width) enterproc (table, name, newtable)

232 Hình 9.1. Vò trí cuûa boä sinh maõ ñoái töôïng
CHÖÔNG 9 SINH MAÕ ÑOÁI TÖÔÏNG Hình 9.1. Vò trí cuûa boä sinh maõ ñoái töôïng 9.1. Caùc vaán ñeà thieát keá boä sinh maõ Ñaàu vaøo cuûa boä sinh maõ Chöông trình ñích Chöông Maõ Maõ Maõ Chöông Bieân dòch phía tröôùc Boä toái öu maõ Boä sinh maõ ñoái töôïng trình nguoàn trung gian trung gian trình dòch Baûng danh bieåu

233 Söï löïa choïn chæ thò Giaû söû ñoái vôùi phaùt bieåu ba ñòa chæ coù daïng x := y + z vôùi x, y, z töôïng tröng cho caùc vò trí nhôù. Chuùng ta coù theå dòch sang chuoãi maõ ñoái töôïng: MOV y, Ro /* caát y vaøo thanh ghi Ro */ ADD z, Ro /* coäng z vaøo noäi dung Ro, keát quaû chöùa trong Ro */ MOV Ro, x /* caát noäi dung Ro vaøo x */ Tuy nhieân vieäc sinh maõ cho chuoãi caùc phaùt bieåu seõ daãn ñeán söï dö thöøa maõ. Nhö thí duï sau: a := b + c; d := a + e Chuùng ta chuyeån sang maõ ñoái töôïng: (1) MOV b, R0 (2) ADD c. R0

234 (3) MOV R0, a (4) MOV a, R0 (5) ADD e, R0 (6) MOV R0, d Chæ thò thöù tö laø thöøa. Chaát löôïng maõ ñöôïc taïo ra, ñöôïc xaùc ñònh baèng toác ñoä cuûa maõ vaø kích thöôùc taäp maõ. Thí duï: MOV a, R0 ADD # 1, R0 MOV R0, a Caáp phaùt thanh ghi Söï löïa choïn cho vieäc ñaùnh giaù thöù töï

235 Thí duï moät soá chæ thò:
9.2. Maùy ñích Chuùng ta seõ duøng maùy ñích nhö laø maùy thanh ghi (register machine). Maùy ñích coù moãi töø goàm boán byte vaø coù n thanh ghi: R0, R1 … Rn-1, coù chæ thò hai ñòa chæ, vôùi daïng toång quaùt: op source, destination Thí duï moät soá chæ thò: MOV: chuyeån trò cuûa source ñeán destination ADD: coäng noäi dung source vaø destination SUB: tröø noäi dung source cho destination Mode ñòa chæ Thí duï: Module Daïng Ñòa chæ Giaù 1 2 3 Absolute Register indexed M R c (R) c + contents (R)

236 contents (c + contents (R))
4 5 6 indirect register inderect indexed literal *R *c (R) # C contents (R) contents (c + contents (R)) haèng C 1 Giaù chæ thò (instruction cost) Giaù chæ thò ñöôïc tính baèng moät coâng giaù keát hôïp trong baûng mode ñòa chæ nguoàn vaø ñích ôû treân. Qua caùc thí duï treân chuùng ta thaáy muoán sinh maõ toát thì laøm sao phaûi haï giaù cuûa caùc chæ thò. Sinh maõ ñeå quaûn lyù caùc baûn ghi hoaït ñoäng trong thôøi gian thöïc thi. Caùc maõ quaûn lyù naøy phaûi ñaùp öùng ñöôïc hai kyõ thuaät quaûn lyù boä nhôù tónh vaø caáp phaùt boä nhôù theo cô cheá stack. Vieäc caáp phaùt vaø giaûi toûa vò trí nhôù cho baûn ghi hoaït ñoäng laø moät phaàn trong chuoãi haønh vi goïi vaø trôû veà cuûa chöông trình con.

237 3. halt 4. action /* töôïng tröng cho caùc phaùt bieåu khaùc */
1. call 2. return 3. halt 4. action /* töôïng tröng cho caùc phaùt bieåu khaùc */ Thí duï: Hình 9.2. Thoâng tin nhaäp vaøo cho boä maõ sinh /*maõ cho c*/ action 1 call p action 2 halt 0: ñòa chæ khöù hoài /*maõ cho p*/ action 3 return 8: arr 4: buf 56 i 60 j 84: n Baûng maõ Baûng ghi hoaït ñoäng cho c Baûng ghi hoaït ñoäng cho p

238 Moâ phoûng 9.1. Maõ ñoái töôïng cho chöông trình con c vaø p
Caáp phaùt tónh Phaùt bieåu call ñöôïc hieän thöïc baèng hai maõ ñoái töôïng MOV vaø GOTO. MOV # here + 20, callee.static - area GOTO callee. code – rea Thí duï 9.1. Moâ phoûng 9.1. Maõ ñoái töôïng cho chöông trình con c vaø p 100: action1 120: MOV 140, 364 132: GOTO 200 140: action2 160: halt /* maõ cho c */ /* caát ñòa chæ khöù hoài 140 */ /* goïi p */ /* maõ cho p */

239 Caáp phaùt theo cô cheá stack
200: action3 220: GOTO * 364 300: 304: 364: 368: /* trôû veà ñòa chæ ñöôïc caát taïi vò trí 364 */ /* caát baûn ghi hoaït ñoäng cuûa c */ /* chöùa ñòa chæ khöù hoài */ /* döõ lieäu cuïc boä cuûa c */ /* chöùa baûn ghi hoaït ñoäng cuûa p*/ /* döõ lieäu cuïc boä cuûa p */ Caáp phaùt theo cô cheá stack Maõ cho chöông trình ñaàu tieân laø maõ khôûi ñoäng stack, caát ñòa chæ baét ñaàu stack vaøo sp baèng chæ thò MOV # stackstart, SP. Nhö vaäy maõ ñoái töôïng cho chöông trình con ñaàu tieân bao goàm: MOV # stackstart, SP /* khôûi ñoäng stack */ ñoaïn maõ cho chöông trình con HALT /* keát thöùc söï thöïc thi */

240 Hình 9.3. Maõ trung gian cuûa chöông trình ôû moâ phoûng 9.1
ADD # caller.recordsize, SP MOV # here + 16, * SP /* löu ñòa chæ khöù hoài */ GOTO callee.code-area Chuoãi trôû veà goàm hai chæ thò: GOTO *0 (SP) /* trôû veà chöông trình goïi */ SUB # callee.recordsize, SP Chæ thò GOTO *0 (SP) Thí duï 9.2 /* maõ cho s */ action1 callq action2 halt /* maõ cho p */ action3 return /* maõ cho q */ action4 callp action5 callq action6 return Hình 9.3. Maõ trung gian cuûa chöông trình ôû moâ phoûng 9.1

241 Moâ phoûng 9.2. Maõ ñoái töôïng cho maõ trung gian ôû (H.9.3)
/* maõ cho */ 100: MOV # 600, SP /* khôûi ñoäng stack */ 108: action1 128: ADD # ssize, SP /* chuoãi goïi baét ñaàu */ 136: MOV 152, * SP /* caát ñòa chæ khöù hoài */ 144: GOTO 300 /* goïi q */ 152: SUB # ssize, SP /* giaûm trò cuûa SP moät khoaûng ssize */ 160: action2 180: HALT /* maõ cho p */ 200: action3 220: GOTO * 0(SP) /* trôû veà chöông trình goïi */ /* maõ cho q */ 300: action4 /* nhaûy coù ñieàu kieän veà 456 */ 320: ADD # qsize, SP 328: MOV 344, * SP /* caát ñòa chæ khöù hoài */ 336: GOTO 200 /* goïi P */

242 344: SUB # qsize, SP 352: action5 372: ADD # qsize, SP 380: MOV 396, * SP /* caát ñòa chæ khöù hoài */ 388: GOTO 300 /* goïi q */ 396: SUB # qsize, SP 304: action6 424: ADD # qsize, SP 432: MOV 440, * SP /* caát ñòa chæ khöù hoài */ 440: GOTO 300 /* goïi q */ 448: SUB # qsize, SP 456: GOTO *0 (SP) /* trôû veà chöông trình goïi */ 600: /* ñòa chæ baét ñaàu cuûa stack trung taâm */

243 Xaùc ñònh ñòa chæ cho teân danh bieåu trong thôøi gian thöïc thi
Neáu chuùng ta duøng cô cheá caáp phaùt tónh, vuøng döõ lieäu ñöôïc caáp phaùt taïi ñòa chæ static, coù phaùt bieåu x := 0. Ñòa chæ töông ñoái cuûa x laø 12. Vaäy ñòa chæ cuûa x trong boä nhôù laø static Neáu static laø 100. Ñòa chæ cuûa x trong boä nhôù laø 112. Phaùt bieåu x := 0 ñöôïc dòch sang maõ ñoái töôïng vôùi ñòa chæ tuyeät ñoái laø: MOV # 0, 112. Giaû söû x laø bieán cuïc boä cuûa chöông trình con hieän haønh, thanh ghi R3 löu giöõ ñòa chæ baét ñaàu cuûa baûn ghi hoaït ñoäng thì chuùng ta seõ dòch phaùt bieåu x := 0 sang maõ trung gian. t1 := 12 + R3 * t1 := 0 Chuyeån sang maõ ñoái töôïng: MOV # 0, 12 (R3) Giaù trò trong R3 chæ coù theå ñöôïc xaùc ñònh trong thôøi gian thöïc thi.

244 9.3. Khoái cô baûn vaø löu ñoà
Khoái cô baûn (basic block) t1 := a * a; t2 := a * b; t3 := 2 * t2 t4 := t1 + t2 t5 := b * b; t6 := t4 + t5 Giaûi thuaät 9.1. Phaân chia caùc khoái cô baûn Nhaäp: caùc phaùt bieåu ba ñòa chæ Xuaát: danh saùch caùc khoái cô baûn vôùi töøng chuoãi caùc phaùt bieåu ba ñòa chæ cho töøng khoái. Phöông phaùp: 1. Xaùc ñònh taäp caùc phaùt bieåu daãn ñaàu cuûa caùc khoái chuùng ta duøng caùc quy taéc sau ñaây: i) Phaùt bieåu ñaàu tieân laø phaùt bieåu daãn ñaàu (leader) (töø ñaây ta seõ duøng töø leader thay cho cuïm töø tieáng Vieät phaùt bieåu daãn ñaàu).

245 Moâ phoûng 9.3. Chöông trình tích tích vectô voâ höôùng
ii) Baát kyø phaùt bieåu naøo laø ñích nhaûy ñeán cuûa phaùt bieåu GOTO coù ñieàu kieän hoaëc khoâng ñieàu kieän ñeàu laø leader. iii) Baát kyø phaùt bieåu naøo ñi ngay sau phaùt bieåu goto hoaëc khoâng ñieàu kieän coù ñieàu kieän ñeàu laø leader. 2. Vôùi moãi leader thì khoái cô baûn goàm coù noù vaø taát caû caùc phaùt bieåu nhöng khoâng bao goàm moät leader naøo khaùc hay laø leänh keát thuùc chöông trình. Thí duï 9.3. Moâ phoûng 9.3. Chöông trình tích tích vectô voâ höôùng begin prod := 0 i := 1 repeat prod := prod + a1 * b1; i := i + 1 until i > 20 end

246 Moâ phoûng 9.4. Maõ trung gian ñeå tính tích vectô voâ höôùng
(1) prod :=0 (2) i := 1 (3) t1 := 4 * i (4) t2 := at1 /* tính ai (5) t3 := 4 * I (6) t4 := bt3 (7) t5 := t2 * t4 (8) t6 := prod + t5 (9) prod := t6 (10) t7 := i + 1 (11) i := t7 (12) if i <= 20 goto (3) Söï luaân chuyeån treân caùc khoái Löu chuyeån baûo toàn caáu truùc

247 1. Loaïi boû caùc bieåu thöùc con chung.
Thí duï: a := b + c; b := a – d; c := b + c; d := a – d Nhö vaäy ta chuyeån boán phaùt bieåu treân thaønh: a := b + c; b := a – d; c := b + c; d := b 2. Loaïi boû maõ cheát Giaû söû x laø cheát, neáu xuaát hieän phaùt bieåu x := y + z trong khoái cô baûn thì seõ bò loaïi maø khoâng laøm thay ñoåi giaù trò cuûa khoái. 3. Ñaët teân laïi bieán taïm t := b + c vôùi t laø bieán taïm. u := b + c maø u laø bieán taïm môùi ta cuõng phaûi thay t baèng u ôû baát cöù choã naøo xuaát hieän t. 4. Hoaùn ñoåi phaùt bieåu t1 := b + c t2 := x + y Coù theå hoaùn ñoåi thöù töï hai phaùt bieåu neáu x vaø y ñeàu khoâng phaûi t1 ñoàng thôøi b vaø c ñeàu khoâng phaûi laø t2. Chuyeån ñoåi ñaïi soá x := x + 0 hoaëc x := x * 1, x := y ** 2, x := y * y

248 Hình 9.4. Löu ñoà cuûa chöông trình
Löu ñoà (flow graph) Ñoà thò tröïc tieáp ñöôïc goïi laø löu ñoà. Caùc nuùt cuûa löu ñoà laø khoái cô baûn. Moät nuùt ñöôïc goïi laø khoái ñieåm, neáu noù coù chöùa phaùt bieåu ñaàu tieân cuûa chöông trình. prod := 0 i := 1 t1 := 4 * I t2 := a [t1] t3 := 4 * i t4 := b [t3] t5 := t2 * t4 t6 := prod + t5 prod := t6 t7 := i + 1 I := t7 if I < = 20 goto B2 B1 B2 Hình 9.4. Löu ñoà cuûa chöông trình

249 Voøng laëp 9.4. Boä sinh maõ ñôn giaûn Boä sinh maõ naøy seõ sinh maõ ñoái töôïng cho caùc maõ trung gian ba ñòa chæ. Ñaëc taû thanh ghi vaø ñòa chæ 1. Boä ñaëc taû thanh ghi seõ löu giöõ nhöõng gì toàn taïi trong töøng thanh ghi. 2. Boä ñaëc taû ñòa chæ seõ löu giöõ caùc vò trí nhôù chöùa trò cuûa caùc danh bieåu. Giaûi thuaät sinh maõ ñoái töôïng Nhaän vaøo chuoãi maõ trung gian ba ñòa chæ cuûa moät khoái cô baûn. Vôùi moãi phaùt bieåu ba ñòa chæ coù daïng x := y op z chuùng ta thöïc thi caùc böôùc sau: 1. Goïi haøm getreg ñeå xaùc ñònh L. 2. Xaùc ñònh ñòa chæ ñaëc taû cho y. 3. Taïo chæ thò OP z’,. 4. Neáu trò hieän taïi cuûa y vaø hoaëc z seõ khoâng coøn ñöôïc duøng nöõa.

250 Haøm getreg 1. Neáu y ñang ôû trong thanh ghi vaø y seõ khoâng ñöôïc duøng nöõa sau phaùt bieåu x := y op z. 2. Ngöôïc laïi. 3. Neáu khoâng coù thanh ghi roãng. 4. Neáu X seõ khoâng ñöôïc duøng tieáp vaø cuõng khoâng theå tìm ñöôïc moät thanh ghi nhö ñaõ noùi ôû böôùc 3. Thí duï Ta coù phaùt bieåu gaùn d := (a – b) + (a – c) + (a – c) Chuyeån thaønh maõ trung gian t := a – b; u := a – c; v := t + u; d := v + u

251 Baûng 9.1. Chuoãi maõ ñoái töôïng sinh ra cho thí duï 9.3
Maõ trung gian Maõ ñoái töôïng Giaù Boä ñaëc taû thanh ghi ñòa chæ t := a – b u := a – c v := t + u d := v + u MOV a, R0 SUB b, R0 MOV a, R1 SUB c, R1 ADD R1, R0 MOV R0, d 2 1 Thanh ghi roãng, R0 chöùa t R0 chöùa t R1 chöùa u R0 chöùa v R1 chöùa u R0 chöùa d t ôû trong R0 t trong R0 u trong R1 v trong R0 d trong R0 d ôû trong boä nhôù

252 Sinh maõ cho loaïi phaùt bieåu khaùc
Baûng 9.2. Chuoãi maõ ñoái töôïng cho phaùt bieåu xaùc ñònh chæ soá vaø gaùn. Phaùt bieåu (1) i trong thanh ghi R1 (2) i trong boä nhôù M1 (3) i treân stack maõ giaù a := b1 a1 := b MOV b (Ri), R MOV b, a (R1) 2 3 MOV Mi , R MOV b(R), R MOV b, a(R) 4 5 MOV Si (A), R

253 Baûng 9.3. Maõ ñoái töôïng cho pheùp gaùn con troû
Phaùt bieåu p trong thanh ghi Rp p trong boä nhôù Mp p trong stack + maõ giaù a := * p * p := a MOV * Rp , a MOV a * Rp 2 MOV Mp , R MOV * R, R MOV a , * R 3 4 MOV Sp(A), R MOV * R , R MOV a , R MOV R , * Sp(A) 5

254 Sinh maõ cho phaùt bieåu ñieàu kieän
if x < y goto z. Chæ thò so saùnh CMP. Thí duï CMP x, y neáu x > y thì maõ ñieàu kieän seõ ñöôïc xaùc laäp döông. Chæ thò nhaûy coù ñieàu kieän ñöôïc thöïc thi neáu ñieàu kieän ñöôïc xaùc laäp <, =, >, > =, < >, < = chuùng ta duøng chæ thò nhaûy coù ñieàu kieän CJ < = z. Nhö vaäy phaùt bieåu ñieàu kieän if x < y goto z ñöôïc dòch sang maõ maùy nhö sau: CMP x, y; CJ < z 9.5. Dag bieåu dieãn khoái cô baûn Dag laø caáu truùc döõ lieäu raát thích hôïp ñeå hieän thöïc vieäc chuyeån ñoåi caùc khoái cô baûn. 1. Caùc laù ñöôïc ñaët teân baèng caùc danh bieåu duy nhaát, hoaëc laø teân bieán hoaëc haèng soá. Haàu heát caùc laù laø r-value. 2. Caùc nuùt trung gian ñöôïc ñaët teân baèng kyù hieäu pheùp toaùn. 3. Caùc nuùt cuõng coù theå laø chuoãi caùc danh bieåu cho tröôùc. Löu yù phaûi phaân bieät söï khaùc nhau giöõa löu ñoà vaø dag.

255 Moâ phoûng 9.5. Maõ trung gian cuûa khoái B2
Thí duï 9.4. Moâ phoûng 9.5. Maõ trung gian cuûa khoái B2 (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) t1 := 4 * i t2 := a t1 t3 := 4 * i t4 := b  t3 t5 := t2 * t4 t6 := prod + t5 prod := t6 t7 := i + 1 i := t7 if i < = 20 goto (1)

256 Hình 9.5. Dag cho khoái B2 ôû moâ phoûng 9.5
t6 , prod (1) + t5 t4 prod0 [ ] 20 [ ] + t1, t3 t7 , i a 1 i0 b 4 Hình 9.5. Dag cho khoái B2 ôû moâ phoûng 9.5 Xaây döïng dag Giaûi thuaät 9.2. Xaây döïng dag. Nhaäp: khoái cô baûn Xuaát: dag cho khoái cô baûn, chöùa caùc thoâng tin sau: 1. Teân cho töøng nuùt. 2. Moãi nuùt ñeàu coù danh saùch caùc danh bieåu gaén vaøo noù.

257 Phöông phaùp: Giaû söû toàn taïi haøm node indentifier, haøm naøy khi ta xaây döïng dag, seõ traû veà nuùt môùi nhaát coù lieân quan vôùi identifier. Caùc daïng phaùt bieåu ba ñòa chæ nhö sau (i) x := y op z, (ii) x := op y, (iii) x := y coù tröôøng hôïp phaùt bieåu ñieàu kieän, thí duï if i < = 20 goto ta coi laø tröôøng hôïp (i) maø x khoâng ñöôïc ñònh nghóa. 1. Neáu node (y) khoâng ñöôïc ñònh nghóa, ta taïo laù coù teân y vaø node (y) chính laø nuùt ñoù. Trong tröôøng hôïp (i) neáu node (z) khoâng ñöôïc ñònh nghóa, ta taïo laù teân z vaø laù chính laø node (z). 2. Trong tröôøng hôïp (i), xaùc ñònh xem treân dag coù nuùt naøo coù teân op maø con traùi laø node (y) vaø con phaûi laø node (z). Trong tröôøng hôïp (ii) ta xaùc ñònh xem coù nuùt naøo coù teân op, maø noù chæ coù moät con duy nhaát laø node (y). Tröôøng hôïp thöù (iii) thì ñaët n laø node (y). 3. Loaïi x ra khoûi danh saùch bieåu gaén vaøo nuùt node (x). Theâm x vaøo danh saùch caùc danh bieåu gaén vaøo nuùt ñöôïc tìm ôû böôùc (2) vaø ñaët node (x) vaøo n. Thí duï 9.5. Khoái B2 ôû moâ phoûng 9.5 cuûa thí duï 9.4.

258 t5 t2 t2 t4 a) t1, t3 a b i0 4 t6 t5 t4 t2 prod0 b) t1, t3 a b i0 4 *
[ ] [ ] t1, t3 a b i0 4 t6 + t5 t4 t2 prod0 [ ] b) [ ] t1, t3 a b i0 4

259 t6, prod t6, prod t5 t4 c) t2 prod0 t1, t3 a b i0 4 t6, prod t5 t2
+ t5 t4 c) t2 prod0 [ ] [ ] t1, t3 a b i0 4 t6, prod + t5 t2 prod0 t4 d) [ ] [ ] t1, t3 a t7 + b i0 1 4

260 Hình 9.7. Caùc böôùc xaây döïng dag cuûa khoái B2 ôû thí duï 9.5.
t6, prod + t5 t2 (1) prod0 t4 [ ] [ ] t7, i t1, t3 a 20 + b i0 4 1 e) Hình 9.7. Caùc böôùc xaây döïng dag cuûa khoái B2 ôû thí duï 9.5.

261 ÖÙng duïng cuûa dag ÔÛ thí duï 9.5 chuùng ta ñaõ xaây döïng dag, noù giuùp cho vieäc töï ñoäng loaïi boû caùc bieåu thöùc con gioáng nhau. Noù xaùc ñònh nhöõng bieán maø trò cuûa chuùng ñöôïc söû duïng trong khoái cô baûn. Dag coøn giuùp ta xaùc ñònh nhöõng phaùt bieåu maø trò cuûa chuùng ñöôïc söû duïng ôû ngoaøi phaïm vi cuûa khoái cô baûn. Thí duï 9.6. Chuùng ta seõ xaây döïng laïi khoái cô baûn töø dag cuûa (H.9.7e). Daõy, con troû vaø leänh goïi chöông trình con Chuùng ta khaûo saùt khoái cô baûn sau ñaây: x := ai aj := y z := ai Giaûi thuaät 9.2 thì ai seõ trôû thaønh bieåu thöùc chung. Töø dag chuùng ta taïo laïi khoái cô baûn cuûa noù seõ toái öu vaø coù daïng: z := x

262 Nhöng khoái (9.1) vaø (9.2) seõ tính trò z khaùc nhau neáu j = I vaø y  ai.
Ñoái vôùi con troû cuõng xaûy ra vaán ñeà khi ta coù phaùt bieåu gaùn * p := w. Neáu ta khoâng bieát p seõ chæ ñeán ñoái töôïng naøo, thì phaûi loaïi taát caû caùc nuùt coù daïng treân. Vieäc goïi chöông trình con seõ gieát taát caû caùc nuùt bôûi vì ta chöa bieát gì veà chöông trình bò goïi, neân ta buoäc phaûi giaû söû raèng baát cöù bieán naøo cuõng coù theå bò thay ñoåi trò do hieäu öùng leà. 9.6. Taïo maõ ñoái töôïng töø dag Saép xeáp laïi thöù töï t1 := a + b t2 := c + d t3 := e – t2 t4 := t1 – t3 Ta coù theå saép xeáp laïi chuoãi maõ trung gian sao cho vieäc tính toaùn t1 chæ xaûy ra ngay tröôùc t4. t2 := c + d t1 := a + b t3 := e – t2 t4 := t1 – t3

263 Moâ phoûng 9.7. Chuoãi maõ sau khi ñaõ saép xeáp laïi maõ trung gian
Moâ phoûng 9.6. Maõ ñoái töôïng cho chuoãi phaùt bieåu ôû (H.9.8) Moâ phoûng 9.7. Chuoãi maõ sau khi ñaõ saép xeáp laïi maõ trung gian MOV a, R0 ADD b, R0 MOV c, R1 ADD d, R1 MOV R0 , t1 MOV e, R0 SUB R1, R0 MOV t1, R1 SUB R0 , R1 MOV R1 , t4 MOV c, R0 ADD d, R0 MOV e, R1 SUB R0 , R1 MOV a, R0 ADD b, R0 SUB R1 , R0 MOV R0 , t4

264 Moâ phoûng 9.8. Giaûi thuaät saép xeáp caùc nuùt cuûa dag
Heuristics duøng ñeå saép xeáp dag Moâ phoûng 9.8. Giaûi thuaät saép xeáp caùc nuùt cuûa dag (1) While neáu coøn caùc nuùt trung gian chöa ñöôïc lieät keâ ra do begin (2) Choïn nuùt chöa lieät keâ n; taát caû caùc nuùt cha meï cuûa noù ñaõ lieät keâ (3) lieät keâ n; (4) While con m ôû taän cuøng beân traùi cuûa n, coù caùc cha meï ñaõ lieät keâ vaø noù khoâng phaûi laø nuùt laù do begin (5) lieät keâ m; (6) n := m; end; end

265 Thí duï 9. 7. Giaûi thuaät ôû moâ phoûng 9
Thí duï 9.7. Giaûi thuaät ôû moâ phoûng 9.8 ñeå taïo söï saép xeáp cuûa caùc maõ trung gian ôû (H.9.9). 1 3 + 2 4 8 + 5 + 6 e c d 12 7 11 a 9 b 10 Hình 9.9. Dag cho thí duï

266 t8 := d + e t6 := a + b t5 := t6 - c t4 := t5 * t8 t3 := t4 - e t2 := t6 + t4 t1:= t2 * t3 Saép xeáp toái öu cho caây Giaûi thuaät coù hai phaàn: phaàn ñaàu ñaùnh teân cho caùc nuùt cuûa caây, phaàn thöù hai cuûa giaûi thuaät mieâu taû loä trình treân caây. Maõ ñoái töôïng seõ sinh ra trong quaù trình thöïc hieän loä trình treân caây. Giaûi thuaät xaùc ñònh nhaõn cuûa nuùt treân caây

267 Moâ phoûng 9.9. Giaûi thuaät tính teân cuûa nuùt
label (n) = m a x (l1 , l2) neáu l1  l2 l neáu l1 = l2 (1) if n laø laù then (2) if n laø con taän cuøng beân traùi cuûa nuùt cha cuûa noù then (3) label (n) := 1 (4) else label (n) := 0 else begin /* n laø nuùt trung gian */ (5) giaû söû n1 , n2 , …, nk laø con cuûa nuùt n, ñöôïc saép theo thöù töï cuûa teân, sao cho label (n1) > label (n2)  …  label (nk ) (6) label (n) := max (label (ni ) + i – 1) 1 < i < k end

268 Hình 9.10. Caây ñöôïc xaùc ñònh teân
Thí duï 9.8. Chuùng ta xeùt caây ôû (H.9.8) Hình Caây ñöôïc xaùc ñònh teân Sinh maõ ñoái töôïng töø caây coù teân 2 t4 2 t1 t3 1 a b e t2 1 1 1 c d 1

269 Moâ phoûng 9.10. Giaûi thuaät cuûa thuû tuïc gencode
procedure gencode (n); begin /* tröôøng hôïp 0 */ if n laø laù beân traùi bieåu thò cho toaùn haïng name and n laø con taän cuøng beân traùi cuûa nuùt cha cuûa noù then print ‘MOV’  name  ‘,’  top (rstack) else if n laø nuùt trung gian vôùi toaùn töû laø op, con beân traùi laø n1 vaø con beân phaûi laø n2 then /* tröôøng hôïp thöù nhaát */ if label (n2) = 0 then begin ñaët name laø toaùn haïng ñöôïc bieåu thò baèng n2. gencode (n1); print op  name  ‘,’  top (rstack) end

270 /* tröôøng hôïp thöù hai */
else if 1  label (n1) < label (n2) and label (n1) < r then begin swap (rstack); gencode (n2); R := pop (rstack); /* n2 ñaõ ñöôïc tính, naèm trong R */ gencode (n1); print op  R  ‘,’  top (rstack); push (rstack, R); swap (rstack) end /* tröôøng hôïp thöù ba */ else if 1  label (n2)  label (n1) and label (n2) < r then begin gencode (n1); R := pop (rstack); /* n1 ñaõ ñöôïc tính, naèm trong thanh ghi R*/

271 gencode (n2); print op  top (rstack)  ‘,’  R; push (rstack, R); end /* tröôøng hôïp thöù tö, caû hai teân  r, r laø soá löôïng toái ña cuûa thanh ghi */ else begin T := pop (rstack); print ‘MOV’  top (rstack)  ‘,’  T; gencode (n1) push (tstack, T); print op  T  ‘,’  top (rstack) end;

272 gencode (t4) [R1R0] /* tröôøng hôïp 2 */
Moâ phoûng Chuoãi caùc leänh goïi thuû tuïc gencode vaø caùc leänh print cuûa caùc tröôøng hôïp gencode (t4) [R1R0] /* tröôøng hôïp 2 */ gencode (t3) [R0R1] /* tröôøng hôïp 3 */ gencode (e) [R0R1] /* tröôøng hôïp 0 */ print MOV e, R1 gencode (t2) [R0) /* tröôøng hôïp 1 */ gencode (c) [R0] /* tröôøng hôïp 0 */ print MOV c, R0 print ADD d, R0 print SUB R0 , R1 gencode (t1) [R0] /* tröôøng hôïp 1 */ gencode (a) [R0] /* tröôøng hôïp 0 */ print MOV a, R0 print ADD b, R0 print SUB R1 , R0

273 Taùc vuï (toaùn töû pheùp toaùn) cho moãi nuùt trung gian.
Caát moãi nuùt laù laø nuùt con taän cuøng beân traùi vaøo thanh ghi. Löu giöõ cho töøng nuùt caû hai con maø chuùng coù teân baèng hoaëc nhieàu hôn r. Caùc taùc vuï vôùi nhieàu thanh ghi Caùc tính chaát ñaïi soá

274 Hình 9.11. Chuyeån ñoåi caây baèng pheùp hoaùn vò, keát hôïp
+ l max (2, l) + l 1 T1 b) T1 a) + + + + + ti4 T1 + + ti3 + T4 d) Ti1 Ti3 T2 T3 Hình Chuyeån ñoåi caây baèng pheùp hoaùn vò, keát hôïp c)

275 Hình 9.12. Phaân chia thaønh caùc caây con
Caùc bieåu thöùc chung 4 1 8 3 5 2 6 7 11 12 6 4 4 12 6 12 9 10 8 Hình Phaân chia thaønh caùc caây con

276 Tieâu chuaån chuyeån maõ toát Toå chöùc cuûa trình bieân dòch toái öu
CHÖÔNG 10 TOÁI ÖU MAÕ 10.1. Giôùi thieäu Tieâu chuaån chuyeån maõ toát Toå chöùc cuûa trình bieân dòch toái öu Hình Toå chöùc cuûa boä toái öu maõ front end Boä toái öu maõ Boä sinh maõ Phaân tích doøng ñieàu khieån Phaân tích doøng döõ lieäu Chuyeån ñoåi

277 Maõ trung gian Thí duï Chuyeån ñoåi sang maõ trung gian ba ñòa chæ cho ñoaïn chöông trình trong ngoân ngöõ Pascal for i := n – 1 down to 1 do for j:= 1 to i do if A [j] > A [j + 1] then begin temp := A [j]; A [j] := A [j + 1]; A [j + 1] := temp; end; Giaû söû moãi oâ nhôù laø 4 byte. Ñòa chæ neàn cuûa daõy A vaäy ñòa chæ phaàn töû thöù j cuûa daõy A laø: addr (A[j]) = addr (A) + (j – 1) * 4.

278 (1) i = n - 1 (2) ij i < 1 goto (31) (3) j = 1 (4) if j > i goto (29) (5) t1 = j - 1 (6) t2 = 4 * t1 (7) t3 = A [t2] (8) t4 = j + 1 (9) t5 = t4 - 1 (10) t6 = 4 * t5 (11) t7 = A [t6] (12) ij t3 < t7 goto (27) (13) t8 = j - 1 (14) t9 = 4 * t8 (15) temp = A [t9] (16) t10 = j + 1 (17) t11 = t10 - 1 (18) t12 = 4 * t11 (19) t13 = A [t12] (20) t4 = j - 1 (21) t15 = 4 * t14 (22) A [t5] = t13 (23) t16 = j + 1 (24) t17 = t16 - 1 (25) t18 = 4 * t17 (26) A [t18] = temp (27) j = j + 1 (28) goto (4) (29) i = i - 1 (30) goto 2

279 Thí duï 10.2. Ñoaïn maõ trung gian sau ñöôïc xaùc ñònh 4 khoái cô baûn
(1) read L (2) n := 0 (3) k := 0 (4) m := 1 (5) k := k + m (6) c := k > L (7) if (c) goto (11) (8) n := n + 1 (9) m := m + 2 (10) goto (5) (11) write n BB2 BB3 BB4 BB1

280 10.2. Phaân tích doøng döõ lieäu
Caùc caáu truùc ñieàu khieån nhö if, while, for gaây ra söï reõ nhaùnh cuûa chöông trình. Xaùc ñònh ñöôïc söï reõ nhaùnh seõ xaùc ñònh ñöôïc söï thay ñoåi trò cuûa bieán trong chöông trình, töø ñoù söû duïng caùc bieán naøy trong quaù trình toái öu hoùa. Muïc ñích Xaùc ñònh caáu truùc ñieàu khieån cuûa chöông trình laø: moâ taû caùc con ñöôøng thöïc hieän chöông trình xaùc ñònh caùc voøng laëp Ñoà thò doøng ñieàu khieån (control F low Graphs) Ñònh nghóa: Ñoà thò doøng ñieàu khieån (CFG) cuûa moät chöông trình laø moät ñoà thò coù höôùng, ñöôïc kyù hieäu G = (N, E) maø trong ñoù N laø caùc khoái cô baûn, E laø taäp caïnh theå hieän cho doøng ñieàu khieån giöõa caùc khoái cô baûn.

281 Hình 10.2. Ñoà thò doøng ñieàu khieån
Thí duï Ñoaïn maõ trung gian (goàm 4 khoái cô baûn) ôû thí duï 10.2 ñöôïc bieåu dieãn thaønh ñoà thò doøng döõ lieäu. BB1 BB2 BB3 BB4 Hình Ñoà thò doøng ñieàu khieån Successor, predcessor cuûa moät khoái cô baûn Cho moät ñoà thò doøng ñieàu khieån G = (N, E) vaø moät khoái cô baûn b  N, xaùc ñònh successor vaø predcessor cho khoái cô baûn b nhö sau:

282 * Successor cuûa b, kyù hieäu succ (b) laø taäp caùc khoái cô baûn n, maø coù theå ñaït ñeán töø b treân 1 caïnh succ (b) = n  N  (b, n)  E nhö ôû thí duï 10.3: succ (BB1) = BB2; succ (BB2) = BB3, BB4, succ (BB3) = BB2 * Predcessor cuûa b, kyù hieäu pred (b) laø taäp caùc khoái cô baûn m, maø coù theå ñaït ñeán b treân 1 caïnh pred (b) = m  N  (m, b)  E nhö ôû thí duï 10.3: pred (BB2) = BB1 , BB3 pred (BB3) = BB2, pred (BB4) = BB2 Entry cuûa G: laø moät nuùt khoâng coù predcessor Exit cuûa G: laø moät nuùt khoâng coù successor nuùt reõ (branch node) trong G laø nuùt coù nhieàu hôn moät successor nuùt hoäp (join node) trong G laø nuùt coù nhieàu hôn moät predcessor

283 Hình 10.3. Nuùt Entry vaø Exit trong G
Ñoà thò doøng ñieàu khieån ôû thí duï 10.3 ñöôïc theâm 2 nuùt Entry, Exit. Entry BB1 BB2 BB3 BB4 Exit Hình Nuùt Entry vaø Exit trong G

284 Thí duï minh hoïa caùc nuùt reõ nhaùnh vaø hoäp.
BB1 BB2 BB3 BB4 BB5 BB6 BB7 BB8 BB9 BB10 (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) i := 1 if(I>n) goto (15) t := 0 j := 1 if(j>n) goto (13) tmp := te + ts if(tmp < 0) goto (10) t1 := t1 + ts goto (11) t1 := 4*j j := j+1 goto (5) i := I+1 goto (2) t1 := 0

285 Hình 10.4. Caùc nuùt reõ nhaùnh vaø hoäp
BB1 BB2 BB3 BB4 BB5 BB6 BB7 BB8 BB9 BB10 BB1 BB2 BB3 BB4 BB5 BB6 BB7 BB8 BB9 BB10 branch node join node Hình Caùc nuùt reõ nhaùnh vaø hoäp

286 Chi phoái (dominater) Ñònh nghóa dominater: nuùt n cuûa G chi phoái nuùt n’ , kyù hieäu n dom n’ (hay n  n’ ), neáu moïi con ñöôøng töø nuùt Entry cuûa G ñeán n’ ñeàu phaûi ñi qua n. Vôùi ñònh nghóa naøy thì moïi nuùt n chi phoái chính noù. Nuùt laø ñieåm vaøo voøng laëp seõ chi phoái caùc nuùt trong voøng laëp. BB1  BB1 ; BB1  BB2 ; BB1  BB3 ; BB1  BB4 BB2  BB2 ; BB2  BB3 ; BB2  BB4 BB3  BB3 BB4  BB4 Entry BB1 BB2 BB3 BB4 Exit

287 properdominate N laø proper dominate n’ , kyù hieäu n  p n’ , neáu n  n’ vaø n  n’ nhö thí duï ôû treân thì BB1  p BB2 ; BB1  p BB3 ; BB1  p BB4 ; BB2  p BB3 ; BB2  p BB4 direct dominate Nuùt n ñöôïc goïi laø direct dominate n’ , kyù hieäu n  d n’ , neáu n  p n’ vaø khoâng toàn taïi n”  N maø n  p n”. BB1  d BB2 ; BB2  d BB3 ; BB2  d BB4 caây dominate (dominate tree); kyù hieäu vieát taét DT, laø caây maø nuùt goác laø Entry; nuùt thuoäc G vaø caïnh laø quan heä direct dominator. ÔÛ thí duï treân DT coù daïng:

288 Entry BB1 BB2 BB3 BB4 Hình Caây dominate

289 Giaûi thuaät 2.2: tìm caùc dominator.
Nhaäp: ñoà thò doøng ñieàu khieån G. Xuaát: taäp dominator cuûa moãi nuùt thuoäc G. Giaûi thuaät: DOM (Entry) = Entry DOM () = N    N - Entry, Exit change = true while (change) change = false for each   N - Entry, Exit  old DOM = DOM ()’ DOM () =    OM (p) pepred ()

290 if (DOM () = old DOM) change = true
Direct dominator Direct dominator cuûa moät nuùt n. Giaûi thuaät tìm direct dominator cuûa moät nuùt: Khôûi ñoäng taäp proper dominator cuûa nuùt n Loaïi boû nhöõng nuùt maø noù laø proper dominator nhöõng nuùt khaùc trong taäp Giaûi thuaät Tìm direct dominator Nhaäp: ñoà thò doøng G. Xuaát: direct dominator cuûa moãi nuùt cuûa G.

291 Giaûi thuaät: for vôùi moãi nuùt n  N - Entry do DOMd (n) = DOM (n) - n for vôùi moãi nuùt s  DOMd (n) - s do if t  DOMd (s) then DOMd (n) = DOMd (n) - t; ÔÛ thí duï ôû hình 10.1, ta coù: DOMd (1) = Entry; DOMd (2) = 1; DOMd (3) = 2; DOMd (4) = 2

292 Post – dominator Ñònh nghóa: Cho ñoà thò doøng ñieàu khieån G = (N, E) vaø n, n’  N. - Nuùt n ñöôïc goïi laø post – dominator cuûa nuùt n’, kyù hieäu n  n’ neáu moïi con ñöôøng töø n ñeán nuùt Exit chöùa n’. ÔÛ thí duï hình 10.3, ta coù caùc post – dominator: 1  1; 1  2; 1  3; 1  4; 2  2; 2  3; 2  4; 3  3; 4  4 Nuùt n ñöôïc goïi laø direct post – dominator cuûa nuùt n’, kyù hieäu n  n’, neáu n  pn’ vaø khoâng toàn taïi n”  N maø n  pn”  pn’. Nuùt n ñöôïc goïi laø proper post – dominator cuûa nuùt n’, kyù hieäu laø n  pn’, neáu n  n’ vaø n  n’.

293 Thí duï veà post – dominator trong G laø dominator trong G-1
Entry BB1 BB2 BB3 BB4 Exit Entry BB1 BB2 BB3 BB4 Exit

294 Voøng laëp Caùc yeáu toá xaùc ñònh voøng laëp töï nhieân: Moät voøng laëp phaûi coù 1 ñieåm vaøo ñôn, goïi laø header. Ñieåm vaøo header dominate taát caû caùc nuùt coøn laïi trong voøng laëp. Phaûi coù ít nhaát moät caùch laëp, nghóa laø phaûi coù ít nhaát moät caïnh quay veà header. Giaûi thuaät Tìm voøng laëp Nhaäp: ñoà thò doøng G vaø moät caïnh veà t  h. Xuaát: voøng laëp bao goàm taát caû caùc nuùt trong voøng laëp töï nhieân t  h. Phöông phaùp: Tìm dominator cuûa moãi nuùt trong CFG. Xaùc ñònh caïnh veõ. Tìm taát caû nhöõng nuùt lieân quan ñeán caïnh veõ.

295 Ñeå tìm caïnh veõ: thöïc hieän duyeät caây CFG theo chieàu saâu tröôùc
Ñeå tìm caïnh veõ: thöïc hieän duyeät caây CFG theo chieàu saâu tröôùc. Moät caïnh luøi e = (t, h)  E laø caïnh luøi neáu h  t. Moät caïnh luøi luoân laø caïnh veõ trong voøng laëp baèng caùch söû duïng ñieàu khieån coù caáu truùc. Giaûi thuaät: stack s = empty set loop = h insert – on – stack (t); /* stack s* while S is not empty do beg m = pop (s); for each pred (m) do insert – on – stack (p); end insert – on – stack (a) begin if (a  loop) then begin loop = loop  a push – on – stack (a); end

296 Thí duï veà tìm voøng laëp
Cho grap nhö sau: Entry BB1 BB2 BB3 BB4 BB5 BB6 BB7 BB8 BB9 BB10 Exit

297 Ñaàu tieân xaùc ñònh caïnh veà h  t.
Loop = BB3 , BB8, stack = BB8 Loop = BB3 , BB8, stack =  Loop = BB3 , BB8 , BB7, stack = BB7 Loop = BB3 , BB8 , BB7, stack =  Loop = BB3 , BB8 , BB7 , BB5, stack = BB5 Loop = BB3 , BB8 , BB7 , BB5 , BB6, stack = BB5 , BB6 Loop = BB3 , BB8 , BB7 , BB5 , BB6, stack = BB5 Loop = BB3 , BB8 , BB7 , BB5 , BB6 , BB4, stack = BB5 , BB4 Loop = BB3 , BB8 , BB7 , BB5 , BB6 , BB4, stack = BB5 Loop = BB3 , BB8 , BB7 , BB5 , BB6 , BB4, stack =  Voøng laëp tìm ñöôïc laø BB3 , BB4 , BB5 , BB6 , BB7 , BB8, BB3 laø header, BB8 laø node keát thuùc.

298 10.3. Phaân tích doøng döõ lieäu (Data Flow Analyst) – DFA
Muïc ñích cuûa phaân tích doøng döõ lieäu Xaùc ñònh döõ lieäu ñöôïc duøng trong chöông trình. Söû duïng döõ lieäu ñeå trình bieân dòch quyeát ñònh toái öu maõ. Trong moät khoái cô baûn: xaùc ñònh tính hieäu quaû trong caâu leänh, töø ñaàu ñeán cuoái khoái cô baûn. Ñieåm vaø ñöôøng Ñieåm laø vò trí giöõa hai phaùt bieåu lieàn nhau. Toàn taïi ñieåm tröôùc vaø sau phaùt bieåu. Thí duï ñoaïn chöông trình: p0 • d1 i := m - 1

299 p1 • d2 j := n p2 • d3 a := u1 p3 • ÔÛ ñaây coù 4 ñieåm p0 tröôùc d1 , p1 tröôùc d2 , tröôùc d3 , p3 sau d3 Ñöôøng: töø p1 ñeán pn laø con ñöôøng ñi töø p1 ñeán ñieåm pn trong chöông trình. Ñaït ñeán söï ñònh nghóa (Reaching definition) Ñònh nghóa cuûa moät bieán x laø taùc vuï gaùn trò cho bieán x. Ñònh nghóa d cho moät bieán x ñöôïc goïi laø ñaït ñeán moät ñieåm p trong chöông trình neáu toàn taïi moät con ñöôøng töø ñieåm ngay sau d ñeán p maø x khoâng bò thay ñoåi trò bôûi moät ñònh nghóa cuûa x doïc theo con ñöôøng naøy.

300 Taäp Gen Gen (b) laø taäp caùc ñònh nghóa ôû trong b vaø ñaït ñeán ñieåm keát thuùc cuûa b. Taäp Kill Kill (b) laø taäp ñònh nghóa ôû moät khoái cô baûn khaùc b nhöng bò thay ñoåi trong b (bôûi moät taùc vuï trong b),  laø bieán ñöôïc ñònh nghóa trong b, taäp kill chöùa taát caû caùc ñònh nghóa cuûa v trong caùc khoái cô baûn khaùc. Söï caân baèng doøng döõ lieäu RDin (b): taäp caùc ñònh nghóa maø ñaït ñeán söï baét ñaàu cuûa b RDout (b): taäp caùc ñònh nghóa maø ñaït ñeán söï keát thuùc cuûa b. Coâng thöùc xaùc ñònh: RDin (b) =  RDout (i) i  pred (b) RDout (b) = Gen (b)  [RDin (b) – Kill (b)]

301 Giaûi thuaät: xaùc ñònh vieäc ñaït ñeán söï ñònh nghóa.
Nhaäp: ñoà thò doøng G vôùi taäp Gen (b) vaø kill (b) ñaõ ñöôïc tính toaùn tröôùc cho moãi khoái cô baûn b. Xuaát: RDin (b) vaø Rdout (b) cho moãi khoái cô baûn b Giaûi thuaät: RDout (Entry) =  RDout (b) =   b  N - Entry, Exit /* Gen (b) thì toát hôn */ change = true while (change)  change = false for each b  N - Entry, Exit  oldout = RDout (b)

302 RDin (b) =  RDout (i) i  pred (b) RDout (b) = Gen (b)  [RDin (b) – kill (b)] if (RDout (b)  oldout) change = true RDin (Exit) =  RDout (i) i  pred (Exit)

303 RDout(b) = Gen(b) [RDin(b) - kill(b)]
Thí duï: d1 : i := m - 1 d2 : j := n d3 : a := u1 d4 : i := i + 1 d5 : j := j - 1 d6 : a := u2 d7 : a := u3 Entry i := m -1 j := n a := u1 BB1 BB Gen (BB) Kill(BB) 1 2 3 4 d1,d2,d3 d4,d5 d6 d7 d4,d5,d6,d7 d1,d2 d3,d7 d3,d6 d1,d2,d3 d1,d2,d3,d4,d5,d6 i := j + 1 j := j - 1 e1? BB2 d4,d5,d3,d6 d4,d5,d3,d6 d4,d5,d3,d6 RDin(b) =  RDout(i) i  pred(b) RDout(b) = Gen(b) [RDin(b) kill(b)] a := u2 BB3 BB4 a := u3 d4,d5,d6 d4,d5,d7 Exit

304 Bieán soáng Bieán  ñöôïc goïi laø soáng taïi ñieåm p trong chöông trình neáu giaù trò hieän taïi cuûa  ñöôïc duøng tröôùc khi  ñöôïc gaùn giaù trò môùi hoaëc tröôùc khi chöông trình keát thuùc, ngöôïc laïi goïi laø bieán cheát. ÖÙng duïng bieán soáng laø xaùc ñònh xem coù caàn löu giöõ trò cuûa noù khi ra khoûi khoái cô baûn, trong thanh ghi. Caàn xaùc ñònh bieán soáng ôû ñieåm vaøo vaø ra cuûa moãi khoái cô baûn. Taäp Use Use (b) laø taäp caùc bieán ñöôïc söû duïng tröôùc khi (hoaëc coù theå) ñöôïc ñònh nghóa trong b. Taäp Def Def (b) laø taäp caùc bieán ñöôïc ñònh nghóa trong b.

305 10.3.4.3. Söï caân baèng doøng döõ lieäu
LVin (b): taäp caùc bieán soáng taïi ñieåm vaøo cuûa b LVout (b): taäp caùc bieán soáng taïi ñieåm ra cuûa b Coâng thöùc: LVout (b) =  LVin (i) i  succ (b) LVin (b) = Use (b)  [LVout (b) – Def (b)] Giaûi thuaät 3.2. Giaûi thuaät tìm bieán soáng Nhaäp: ñoà thò doøng G vôùi Def (b) vaø Use (b) ñöôïc xaùc ñònh tröôùc. Xuaát: LVout (b) laø taäp bieán soáng taïi ñieåm ra cuûa khoái cô baûn b. Giaûi thuaät:

306 LVin (Entry) =  Lvin (b) =   b  N - Entry, Exit change = true while change change = false for each b  N - Entry, Exit  oldin = LVin (b) LVout (b) =  LVin (i) i  succ (b) LVin (b) = Use (b)  [LVout (b) - Def (b)] if (LVin (b)  oldin) change = true

307 LVin(b) = Use(b) [LVout(b) - Def(b)]
Thí duï: cho doøng ñieàu khieån nhö sau, tìm taäp caùc bieán soáng khi ra khoûi caùc khoái cô baûn. Entry BB Use (BB) Def (BB) 1 2 3 4 c b,d a,b,d,e,g b,d,e,g d,f,g c a := 2 b := 3 d := c e := a g := c + 1 a < d ? BB1 b,d,e,g a,b,d,e,g LVout(b) =  LVin(i) i  succ(b) LVin(b) = Use(b) [LVout(b) Def(b)] a,b,d,e,g b := b + 1 d := 2 * d b > 10 d := d + 1 f := a + b g := e + g BB2 BB3 BB3 b,d,e,g b,d,e,g b,d,e,g print (b,d,e,g) BB4 Exit

308 10.3.5. Bieåu thöùc coù saün (Avaible expression)
Moät bieåu thöùc x op y ñöôïc goïi bieåu thöùc coù saün taïi ñieåm p neáu moïi con ñöôøng töø nuùt khôûi ñaàu ñeán p hoaëc sau laàn tính toaùn tröôùc khi ñaït ñeán p khoâng coù taùc vuï gaùn cho x vaø y. ÖÙng duïng cuûa bieåu thöùc coù saün laø ñeå loaïi boû bieåu thöùc con duøng chung. Ta phaûi tìm taát caû bieåu thöùc coù saün taïi ñieåm vaøo vaø ra cuûa moãi khoái cô baûn. Taäp Eval Eval (b) laø taäp caùc bieåu thöùc coù saün ñöôïc thöïc hieän trong b maø vaãn coù saün taïi ñieåm ra cuûa b. Taäp Kill Kill (b) laø taäp caùc bieåu thöùc bò thay ñoåi trong b.

309 10.3.5.3. Söï caân baèng doøng döõ lieäu
AEin (b): taäp caùc bieåu thöùc coù saün taïi ñieåm baét ñaàu cuûa b. AEout (b); taäp bieåu thöùc coù saün chaïm ñeán ñieåm keát thuùc cuûa b. Coâng thöùc: AEin (b) =  AEout (i) i  pred (b) AEout (b) = Eval (b)  [AEin (b) – Kill (b)] Giaûi thuaät: tìm taäp caùc bieåu thöùc coù saün taïi ñieåm vaøo vaø ra cuûa moãi khoái cô baûn. Nhaäp: ñoà thò doøng G vôùi Eval (b) vaø Kill (b) ñöôïc tính toaùn tröôùc cho khoái cô baûn b. Xuaát: AEin (b) cho khoái cô baûn b.

310 Giaûi thuaät: : taäp caùc bieåu thöùc trong ñoà thò doøng ñieàu khieån AEout (Entry) =  AEout (b) = Eval (b)  [U – Kill (b)]  b  N - Entry, Exit change = true while (change)  change = false for each b  N - Entry, Exit  oldout = AEout (b) AEin (b) =  AEout (i) i  pred (b)

311 10.4. Loaïi boû dö thöøa Quaù trình loaïi boû dö thöøa bao goàm loaïi boû nhöõng bieåu thöùc con chung, lan truyeàn nhöõng baûn copy, di chuyeån maõ khoâng ñoåi trong voøng laëp ra ngoaøi voøng laëp. Loaïi boû bieåu thöùc con chung Giaûi thuaät: loaïi boû bieåu thöùc con chung Nhaäp: maõ ba ñòa chæ cuûa ñoà thò doøng ñieàu khieån vôùi caùc AEin vaø AEout cho töøng khoái cô baûn. Xuaát: ñoaïn maõ ba ñòa chæ ñaõ loaïi boû bieåu thöùc con chung. Giaûi thuaät: for moãi khoái b  N for moãi leänh  b coù daïng y = x op y maø x op y laø coù saün taïi ñieåm vaøo cuûa b 

312 Xaùc ñònh neáu x op y coù saün taïi moãi caâu leänh
Xaùc ñònh vieäc tính toaùn x op y maø ñaït ñeán z Taïo moät bieán môùi t Thay theá söï ñònh nghóa w = x op y tìm thaáy ôû böôùc 2 baèng t = x op y; w = t 5. Thay z = x op y baèng z = t

313 Thí duï veà loaïi boû bieåu thöùc con duøng chung
Entry c := a+b d := a*c e := d*d i := 1 BB1 a+b, d*d f := a+b c := c*2 c > d ? BB2 a+b, d*d a+b, d*d BB3 BB4 d := c g := d*d g := a*c a+b, d*d i := i+1 i > 10 ? BB5 Exit

314 Entry BB1 BB2 BB3 BB4 BB5 Exit t1 := a+b c := t1 d := a*c e := d*d
f := t1 c := c*2 c > d ? BB2 d := c g := d*d g := a*c BB3 BB4 i := i+1 i > 10 ? BB5 Exit

315 Lan truyeàn baûn copy Ñònh nghóa söû duïng (use definition) Taäp caùc ñònh nghóa ñaït ñeán vieäc söû duïng cuûa a nhö laø moät bieán ñöôïc goïi laø daây xích söû duïng ñònh nghóa (ud - chain) cho bieán ñoù. Thí duï veà ud – chain Entry z = 1 x = 1 z > y x = 2 z = x-3 y = x+1 Exit

316 10.4.2.2. Daây xích ñònh nghóa söû duïng
Taäp taát caû caùc laàn söû duïng maø ñaït ñeán bôûi moät ñònh nghóa ñöôïc goïi laø daây xích ñònh nghóa söû duïng (du – chain). Thí duï veà du – chain vaø ud – chain Entry z = 1 x = 1 z > y x = 2 z = x-3 y = x+1 Exit

317 10.4.2.3. Bieåu thöùc copy coù saün (Available Copy Expression)
Taäp copy Taäp nhöõng caâu leänh copy u := v trong b maø u vaø v khoâng ñöôïc gaùn sau ñoù trong b, nghóa laø caâu leänh coù saün taïi ñieåm keát thuùc cuûa b. Taäp kill Taäp caùc caâu leänh copy bò thay ñoåi trong b, nghóa laø taäp caâu leänh copy trong khoái cô baûn khaùc maø coù toaùn haïng cuûa noù ñöôïc gaùn cho b. Söï caân baèng doøng döõ lieäu copyin: laø taäp leänh copy coù saün taïi ñieåm vaøo b copyout: laø taäp leänh copy coù saün taïi ñieåm keát thuùc b coâng thöùc: copyin (b) =  copyout (i) i  pred (b) copyout (b) = copy (b)  [copyin (b) – kill (b)]

318 Giaûi thuaät: tìm baûn copy coù saün
Nhaäp: ñoà thò doøng ñieàu khieån G vôùi kill (b) vaø copy (b) ñöôïc tính saün cho moãi khoái cô baûn b. Xuaát: copyin (b) cho moãi khoái cô baûn. Giaûi thuaät: U : Taäp taát caû caùc copy trong ñoà thò doøng ñieàu khieån copyout (Entry) =  copyout (b) = copy (b)  [U - kill (b)]  b  N - Entry, Exit changed = true while (changed)  changed = false for each b  N - Entry, Exit  oldout = copyout (b)

319 copyin (b) =  copyout (i)
i  pred (b) copyout (b) = copy (b)  [copyin (b) – kill (b)] if (copyout (b)  oldout) changed = true Aein (Exit) =  Aeout (i) i  pred (Exit) Lan truyeàn baûn copy Caâu leänh copy laø caâu leänh coù daïng x = y. Söï lan truyeàn baûn copy laø thay theá x baèng y maø khoâng laøm thay ñoåi trò cuûa x hoaëc y.

320 Giaûi thuaät: lan truyeàn baûn copy
Nhaäp: ñoà thò doøng ñieàu khieån G vôùi du – chain. Xuaát: ñoà thò doøng ñieàu khieån coù söû duïng lan truyeàn baûn copy. Giaûi thuaät: for moãi baûn copy s: x := y thöïc hieän caùc böôùc sau: Xaùc ñònh taát caû caùc nôi maø söï ñònh nghóa cuûa x ñöôïc söû duïng. for moãi laàn söû duïng u: a. s phaûi coù moät söï ñònh nghóa cuûa x chaïm ñaït ñeán u vaø b. moïi con ñöôøng töø s ñeán u, khoâng coù taùc vuï gaùn ñeán y.

321 Thí duï veà söï lan truyeàn baûn copy
Entry Entry c := a+b d := c e := d*d c := a+b d := c e := c*c BB1 BB1 d := c f := a+c g := e a := g+d a < c ? f := a+c g := e a := e+c a < c ? BB2 BB2 d:= c,g:= e d:= c,g:= e h := g+1 e := f+2 f := d-g f > a ? h := e+1 e := f+2 f := c-e f > a ? BB3 BB4 BB3 BB4 d := c d:= c,g:= e b := g+a h < f ? b := g+a h < f ? BB5 c := 2 BB5 c := 2 BB6 BB6 Exit Exit

322 10.4.3. Di chuyeån maõ khoâng ñoåi cuûa voøng laëp (loop – invariant code motion)
Moät söï tính toaùn trong voøng laëp ñöôïc goïi laø loop – invariant neáu söï tính toaùn cuûa noù luoân luoân taïo ra cuøng moät giaù trò. Di chuyeån code khoâng ñoåi laø di chuyeån caùc loop – invariant ra beân ngoaøi voøng laëp. Loop – Invariant Moät taùc vuï trong voøng laëp laø loop – invariant neáu moãi toaùn haïng trong taùc vuï laø: haèng soá hoaëc taát caû caùc ñònh nghóa cuûa toaùn haïng ñeàu ôû beân ngoaøi voøng laëp hoaëc chæ duy nhaát coù moät ñònh nghóa trong voøng laëp cho toaùn haïng maø söï ñònh nghóa laø loop – invariant.

323 10.4.3.2. Thöïc hieän di chuyeån code
Söï di chuyeån code phaûi thoûa maõn 3 ñieàu kieän ví duï cho phaùt bieåu s : x = y + z. Khoái cô baûn chöùa s phaûi dominate taát caû caùc loái ra cuûa voøng laëp. Khoâng coù phaùt bieåu naøo khaùc gaùn cho x. Taát caû caùc laàn söû duïng x chæ ñaït ñeán söï ñònh nghóa x trong s. Thí duï (ñieàu kieän 1) i :=1 BB1 if u <v goto BB3 BB2 i := 2 u := u+1 BB3 v := v-1 if v < =20 goto BB5 BB4 j := i BB5

324 Thí duï (ñieàu kieän 2) Thí duï (ñieàu kieän 3) i :=1 BB1 i :=1 BB1
if u <v goto BB3 if u <v goto BB3 BB2 BB2 i := 2 u := u+1 i := 2 u := u+1 BB3 BB3 v := v-1 if v < =20 goto BB5 k := I v := v-1 if v < =20 goto BB5 BB4 BB4 j := i BB5 j :=1 BB5

325 10.5. Toái öu voøng laëp Trong phaàn naøy chuùng ta seõ trình baøy giaûi thuaät toái öu voøng laëp laø strength reduction. Muïc ñích cuûa giaûi thuaät naøy laø thay theá caùc caâu leänh ñaét tieàn baèng caâu leänh reû tieàn hôn. Bieán thay ñoåi (Induction variable) Bieán thay ñoåi trong voøng laëp L laø x neáu moãi laàn thay ñoåi noù taêng hoaëc giaûm moät haèng soá nhaát ñònh. Bieán thay ñoåi cô baûn (Basic Induction Variable – BIV) Bieán v ñöôïc goïi laø BIV trong L neáu noù coù daïng v := v  c vôùi c laø haèng soá Bieán thay ñoåi daãn xuaát (Derived Induction Variable – DIV) Bieán j ñöôïc goïi laø bieán thay ñoåi daãn xuaát neáu noù coù moät trong caùc daïng sau xuaát hieän trong voøng laëp:

326 j := a * i hoaëc j := i * a j := b + i hoaëc j := a * i j := b – i hoaëc j := i – a j := i / a trong ñoù i laø bieán thay ñoåi cô baûn (BIV) Giaûi thuaät 6.1. Tìm bieán thay ñoåi trong voøng laëp L. Nhaäp: voøng laëp L. Xuaát: taát caû caùc BIV vaø DIV trong L. Giaûi thuaät: Tìm taát caû BIV trong L. Tìm caùc DIV. Laëp laïi böôùc (2) cho ñeán khi naøo khoâng tìm thaáy DIV khaùc.

327 10.5.4. Giaûi thuaät strength Reduction
Nhaäp: voøng laëp L vaø taäp hoï caùc bieán thay ñoåi. Xuaát: ñoaïn maõ ñaõ thöïc hieän thay theá caùc caâu leänh phöùc taïp baèng nhöõng caâu leänh ít phöùc taïp hôn töø voøng laëp L. Giaûi thuaät: for moãi bieán BIV i for moãi bieán j trong hoï i  (I, a, b) taïo ra moät bieán môùi sj khôûi ñoäng sj := a * i + b vaø ñaët vaøo preheader cuûa L thay theá caâu leänh gaùn j baèng j := sj sau moãi phaùt bieåu i := i  c trong L

328 cheøn theâm sj := sj  c * a theâm sj vaøo hoï cuûa i


Download ppt "PhD. Hieu Chi Nguyen Fall 2008"

Similar presentations


Ads by Google