编译原理 第11章(清华大学)
编译原理(清华大学-第2版)课后习题答案
![编译原理(清华大学-第2版)课后习题答案](https://img.taocdn.com/s3/m/66e9811df8c75fbfc67db2ec.png)
第三章N=>D=> {0,1,2,3,4,5,6,7,8,9}N=>ND=>NDDL={a |a(0|1|3..|9)n且 n>=1}(0|1|3..|9)n且 n>=1{ab,}a nb n n>=1第6题.(1) <表达式> => <项> => <因子> => i(2) <表达式> => <项> => <因子> => (<表达式>) => (<项>)=> (<因子>)=>(i)(3) <表达式> => <项> => <项>*<因子> => <因子>*<因子> =i*i(4) <表达式> => <表达式> + <项> => <项>+<项> => <项>*<因子>+<项>=> <因子>*<因子>+<项> => <因子>*<因子>+<因子> = i*i+i (5) <表达式> => <表达式>+<项>=><项>+<项> => <因子>+<项>=i+<项> => i+<因子> => i+(<表达式>) => i+(<表达式>+<项>)=> i+(<因子>+<因子>)=> i+(i+i)(6) <表达式> => <表达式>+<项> => <项>+<项> => <因子>+<项> => i+<项> => i+<项>*<因子> => i+<因子>*<因子> = i+i*i第7题第9题语法树ss s* s s+aa a推导: S=>SS*=>SS+S*=>aa+a*11. 推导:E=>E+T=>E+T*F语法树:E+T*T F短语: T*F E+T*F直接短语: T*F句柄: T*F12.<E><E> <T> <POP><T> <F> <MOP>短语:<T><F><MOP> <E><T><F><MOP><POP>直接短语:<T><F><MOP>句柄: <T><F><MOP>13.(1)最左推导:S => ABS => aBS =>aSBBS => aBBS=> abBS => abbS => abbAa => abbaa 最右推导:S => ABS => ABAa => ABaa => ASBBaa=> ASBbaa => ASbbaa => Abbaa => a1b1b2a2a3 (2) 文法:S → ABSS → AaS →εA → aB → b(3) 短语:a1 , b1 , b2, a2 , , bb , aa , abbaa,直接短语: a1 , b1 , b2, a2 , ,句柄:a114 (1)S → ABA → aAb | εB → aBb | ε(2)S → 1S0S → AA → 0A1 |ε第四章1. 1. 构造下列正规式相应的DFA(1)1(0|1)*101NFA(2) 1(1010*|1(010)*1)*0NFA(3)NFA(4)NFA2.解:构造DFA 矩阵表示a,bb其中0 表示初态,*表示终态用0,1,2,3,4,5分别代替{X} {Z} {X,Z} {Y} {X,Y} {X,Y,Z} 得DFA状态图为:3.解:构造DFA矩阵表示构造DFA的矩阵表示其中表示初态,*表示终态替换后的矩阵4.(1)解构造状态转换矩阵:{2,3} {0,1}{2,3}a={0,3}{2},{3},{0,1}{0,1}a={1,1} {0,1}b={2,2}(2)解:首先把M的状态分为两组:终态组{0},和非终态组{1,2,3,4,5} 此时G=( {0},{1,2,3,4,5} ) {1,2,3,4,5}a={1,3,0,5}{1,2,3,4,5}b={4,3,2,5}由于{4}a={0} {1,2,3,5}a={1,3,5}因此应将{1,2,3,4,5}划分为{4},{1,2,3,5}G=({0}{4}{1,2,3,5}){1,2,3,5}a={1,3,5}{1,2,3,5}b={4,3,2}因为{1,5}b={4} {23}b={2,3}所以应将{1,2,3,5}划分为{1,5}{2,3}G=({0}{1,5}{2,3}{4}){1,5}a={1,5} {1,5}b={4} 所以{1,5} 不用再划分{2,3}a={1,3} {2,3}b={3,2}因为 {2}a={1} {3}a={3} 所以{2,3}应划分为{2}{3}所以化简后为G=( {0},{2},{3},{4},{1,5})7.去除多余产生式后,构造NFA如下确定化,构造DFA 矩阵G={(0,1,3,4,6),(2,5)} {0,1,3,4,6}a={1,3}{0,1,3,4,6}b={2,3,4,5,6}所以将{0,1,3,4,6}划分为 {0,4,6}{1,3} G={(0,4,6),(1,3),(2,5)}{0,4,6}b={3,6,4} 所以 划分为{0},{4,6} G={(0),(4,6),(1,3),(2,5)}不能再划分,分别用 0,4,1,2代表各状态,构造DFA 状态转换图如下;b8.代入得S = 0(1S|1)| 1(0S|0) = 01(S|ε) | 10(S|ε) = (01|10)(S|ε)= (01|10)S | (01|10)= (01|10)*(01|10)构造NFA由NFA可得正规式为(01|10)*(01|10)=(01|10)+9.状态转换函数不是全函数,增加死状态8,G={(1,2,3,4,5,8),(6,7)}(1,2,3,4,5,8)a=(3,4,8) (3,4)应分出(1,2,3,4,5,8)b=(2,6,7,8)(1,2,3,4,5,8)c=(3,8)(1,2,3,4,5,8)d=(3,8)所以应将(1,2,3,4,5,8)分为(1,2,5,8), (3,4)G={(1,2,5,8),(3,4),(6,7)}(1,2,5,8)a=(3,4,8) 8应分出(1,2,5,8)b=(2,8)(1,2,5,8)c=(8)(1,2,5,8)d=(8)G={(1,2,5),(8),(3,4),(6,7)}(1,2,5)a=(3,4,8) 5应分出G={(1,2), (3,4),5, (6,7) ,(8) }去掉死状态8,最终结果为 (1,2) (3,4) 5,(6,7) 以1,3,5,6代替,最简DFA为b正规式:b*a(da|c)*bb*第五章1.S->a | ^ |( T )T -> T , S | S(a,(a,a))S => ( T ) => ( T , S ) => ( S , S ) => ( a , S) => ( a, ( T )) =>(a , ( T , S ) ) => (a , ( S , S )) => (a , ( a , a ) ) S=>(T) => (T,S) => (S,S) => ( ( T ) , S ) => ( ( T , S ) , S ) => ( ( T , S , S ) , S ) => ( ( S , S , S ) , S )=> ( ( ( T ) , S , S ) , S ) => ( ( ( T , S ) , S , S ) , S ) =>( ( ( S , S ) , S , S ) , S ) => ( ( ( a , S ) , S , S ) , S ) => ( ( ( a , a ) , S , S ) , S ) => ( ( ( a , a ) , ^ , S ) , S ) => ( ( ( a , a ) , ^ , ( T ) ) , S )=> ( ( ( a , a ) , ^ , ( S ) ) , S ) => ( ( ( a , a ) , ^ , ( a ) ) , S ) => ( ( ( a , a ) , ^ , ( a ) ) , a )S->a | ^ |( T )T -> T , ST -> S消除直接左递归:S->a | ^ |( T )T -> S T’T’ -> , S T’ | ξSELECT ( S->a) = {a}SELECT ( S->^) = {^}SELECT ( S->( T ) ) = { ( }SELECT ( T -> S T’) = { a , ^ , ( }SELECT ( T’ -> , S T’ ) = { , }SELECT ( T’ ->ξ) = FOLLOW ( T’ ) = FOLLOW ( T ) = { )}构造预测分析表分析符号串( a , a )#分析栈剩余输入串所用产生式#S ( a , a) # S -> ( T )# ) T ( ( a , a) # ( 匹配# ) T a , a ) # T -> S T’# ) T’ S a , a ) # S -> a# ) T’ a a , a ) # a 匹配# ) T’,a) # T’ -> , S T’# ) T’ S , , a ) # , 匹配# ) T’ S a ) # S->a# ) T’ a a ) # a匹配# ) T’) # T’ ->ξ# ) ) # )匹配# # 接受2.E->TE’E’->+E E’->ξT->FT’T’->T T’->ξF->PF’F’->*F’F’->ξP->(E) P->a P->b P->∧SELECT(E->TE’)=FIRST(TE’)=FIRST(T)= {(,a,b,^)SELECT(E’->+E)={+}SELECT(E’->ε)=FOLLOW(E’)= {#,)}SELECT(T->FT’)=FIRST(F)= {(,a,b,^}SELECT(T’ —>T)=FIRST(T)= {(,a,b,^)SELECT(T’->ε)=FOLLOW(T’)= {+,#,)}SELECT(F ->P F’)=FIRST(F)= {(,a,b,^}SELECT(F’->*F’)={*}SELECT(F’->ε)=FOLLOW(F’)= {(,a,b,^,+,#,)}3. S->MH S->a H->Lso H->ξK->dML K->ξL->eHf M->K M->bLM FIRST ( S ) =FIRST(MH)= FIRST ( M ) ∪FIRST ( H ) ∪{ξ} ∪{a}= {a, d , b , e ,ξ} FIRST( H ) = FIRST ( L ) ∪{ξ}= { e , ξ}FIRST( K ) = { d , ξ}FIRST( M ) = FIRST ( K ) ∪{ b } = { d , b ,ξ}FOLLOW ( S ) = { # , o }FOLLOW ( H ) = FOLLOW ( S ) ∪{ f } = { f , # , o }FOLLOW ( K ) = FOLLOW ( M ) = { e , # , o }FOLLOW ( L ) ={ FIRST ( S ) –{ξ} } ∪{o} ∪FOLLOW ( K )∪{ FIRST ( M ) –{ξ} } ∪FOLLOW ( M )= {a, d , b , e , # , o }FOLLOW ( M ) ={ FIRST ( H ) –{ξ} } ∪FOLLOW ( S )∪{ FIRST ( L ) –{ξ} } = { e , # , o }SELECT ( S-> M H) = ( FIRST ( M H) –{ξ} ) ∪FOLLOW ( S )= ( FIRST( M ) ∪FIRST ( H ) –{ξ} ) ∪FOLLOW ( S )= { d , b , e , # , o }SELECT ( S-> a ) = { a }SELECT ( H->L S o ) = FIRST(L S o) = { e }SELECT ( H ->ξ) = FOLLOW ( H ) = { f , # , o }SELECT ( K-> d M L ) = { d }SELECT ( K->ξ) = FOLLOW ( K ) = { e , # , o }SELECT ( L-> e H f ) = { e }SELECT ( M->K ) = ( FIRST( K ) –{ξ} ) ∪FOLLOW ( M ) = {d,e , # , o }SELECT ( M -> b L M )= { b }4 . 文法含有左公因式,变为S->C $ { b, a }C-> b A { b }C-> a B { a }A -> b A A { b }A-> a A’ { a }A’-> ξ{ $ , a, b }A’-> C { a , b }B->a B B { a }B -> b B’ { b }B’->ξ{ $ , a , b }B’-> C { a, b }5. <程序> --- S <语句表>――A <语句>――B <无条件语句>――C <条件语句>――D <如果语句>――E<如果子句> --FS->begin A end S->begin A end { begin }A-> B A-> B A’ { a , if }A-> A ; B A’-> ; B A’ { ; }A’->ξ{ end }B-> C B-> C { a } B-> D B-> D { if }C-> a C-> a { a }D-> E D-> E D’ { if }D-> E else B D’-> else B { else }D’->ξ{; , end } E-> FC E-> FC { if }F-> if b then F-> if b then { if }非终结符是否为空S-否A-否A’-是B-否C-否D-否D’-是E-否F-否FIRST(S) = { begin }FIRST(A) = FIRST(B) ∪FIRST(A’) ∪{ξ} = {a , if , ; , ξ} FIRST(A’) ={ ; , ξ}FIRST(B) = FIRST(C) ∪FIRST(D) ={ a , if }FIRST(C) = {a}FIRST(D) = FIRST(E)= { if }FIRSR(D’) = {else , ξ}FIRST(E) = FIRST(F) = { if }FIRST(F) = { if }FOLLOW(S) = {# }FOLLOW(A) = {end}FOLLOW(A’) = { end }FOLLOW(B) = {; , end }FOLLOW (C) = {; , end , else }FOLLOW(D) = {; , end }FOLLOW( D’ ) = { ; , end }FOLLOW(E) = { else , ; end }FOLLOW(F) = { a }S A A’ B C D D’ E F if then else begin end a b ;6. 1.(1) S -> A | B(2) A -> aA|a(3)B -> bB |b提取(2),(3)左公因子(1) S -> A | B(2) A -> aA’(3) A’-> A|ξ(4) B -> bB’(5) B’-> B |ξ2.(1) S->AB(2) A->Ba|ξ(3) B->Db|D(4) D-> d|ξ提取(3)左公因子(1) S->AB(2) A->Ba|ξ(3) B->DB’(4) B’->b|ξ(5) D-> d|ξ3.(1) S->aAaB | bAbB(2) A-> S| db(3) B->bB|a4(1)S->i|(E)(2)E->E+S|E-S|S提取(2)左公因子(1)S->i|(E)(2)E->SE’(3)E’->+SE’|-SE’ |ξ5(1)S->SaA | bB(2)A->aB|c(3)B->Bb|d消除(1)(3)直接左递归(1)S->bBS’(2)S’->aAS’|ξ(3)A->aB | c(4) B -> dB’(5)B’->bB’|ξ6.(1) M->MaH | H(2) H->b(M) | (M) |b消除(1)直接左递归,提取(2)左公因子(1)M-> HM’(2)M’-> aHM’ |ξ(3)H->bH’ | ( M )(4)H’->(M) |ξ7. (1)1)A->baB2)A->ξ3)B->Abb4)B->a将1)、2)式代入3)式1)A->baB2)A->ξ3)B->baBbb4)B->bb5)B->a提取3)、4)式左公因子1)A->baB2)A->ξ3)B->bB’4)B’->aBbb | b5)B->a(3)1)S->Aa2)S->b3)A->SB4)B->ab将3)式代入1)式1)S->SBa2)S->b3)A->SB4)B->ab消除1)式直接左递归1)S->bS’2)S’->BaS’ |ξ3)S->b4)A->SB5)B->ab删除多余产生式4)1)S->bS’2)S’->BaS’ |ξ3)S->b4)B->ab(5)1)S->Ab2)S->Ba3)A->aA4)A->a提取3)4)左公因子1)S->Ab2)S->Ba3)A->aA’4)A’-> A |ξ5)B->a将3)代入1)5)代入21)S->aA’b2)S->aa3)A->aA’4)A’-> A |ξ5)B->a提取1)2)左公因子1)S-> aS’2)S’->A’b | a3)A->aA’4)A’-> A |ξ5)B->a删除多余产生式5)1)S-> aS’2)S’->A’b | a3)A->aA’4)A’-> A |ξA A’S’S将3)代入4)1)S-> aS’2)S’->A’b | a3)A->aA ’4)A’-> aA’ |ξ将4)代入2)1)S-> aS’2)S’->aA’b3)S’->a4)S’->b5)A->aA ’6)A’-> aA’ |ξ对2)3)提取左公因子1)S->aS’2)S’->aS’’3)S’’->A’b|ξ4)S’->b5)A->aA ’6)A’-> aA’ |ξ删除多余产生式5)1)S->aS’3)S’’->A’b|ξ4)S’->b5)A’-> aA’ |ξ第六章1S → a | ∧ | ( T )T → T , S | S解:(1) 增加辅助产生式 S’→#S#求 FIRSTVT集FIRSTVT(S’)= {#}FIRSTVT(S)= {a ∧ ( }= { a ∧ ( }FIRSTVT (T) = {,} ∪ FIRSTVT( S ) = { , a ∧ ( }求 LASTVT集LASTVT(S’)= { # }LASTVT(S)= { a ∧ )}LASTVT (T) = { , a ∧ )}(2)算符优先关系表因为任意两终结符之间至多只有一种优先关系成立,所以是算符优先文法(3)a ∧( ) , #F 1 1 1 1 1 1g 1 1 1 1 1 1f 2 2 1 3 2 1g 2 2 2 1 2 1f 3 3 1 3 3 1g 4 4 4 1 2 1f 3 3 1 3 3 1g 4 4 4 1 2 1(4)#<·( a,a)# 移进#( <· a ,a)# 移进# (a ·> , a)# 规约#(T <·, a)# 移进#(T,<· a )# 移进#(T,a ·> ) # 规约#(T,T ·> ) # 规约#(T =·) # 移进#(T) ·> #规约#T =·#接受4.扩展后的文法S’→#S# S→S;G S→G G→G(T) G→H H→a H→(S)T→T+S T→S(1)FIRSTVT(S)={;}∪FIRSTVT(G) = {; , a , ( }FIRSTVT(G)={ ( }∪FIRSTVT(H) = {a , ( }FIRSTCT(H)={a , ( }FIRSTVT(T) = {+} ∪FIRSTVT(S) = {+ , ; , a , ( }LASTVT(S) = {;} ∪LASTVT(G) = { ; , a , )}LASTVT(G) = { )} ∪LASTVT(H) = { a , )}LASTVT(H) = {a, )}LASTVT(T) = {+ } ∪LASTVT(S) = {+ , ; , a , ) }因为任意两终结符之间至多只有一种优先关系成立,所以是算符优先文法(2)句型a(T+S);H;(S)的短语有:a(T+S);H;(S) a(T+S);H a(T+S) a T+S (S) H直接短语有: a T+S H (S)句柄: a素短语:a T+S (S)最左素短语:a(3)分析a;(a+a)不能用最右推导推导出上面的两个句子。
编译原理 课件第十一章
![编译原理 课件第十一章](https://img.taocdn.com/s3/m/17f5caeb81c758f5f61f6727.png)
11.2 局部优化:基本块内的优化 局部优化:
基本块:是指程序中一顺序执行的语句序列, 基本块:是指程序中一顺序执行的语句序列,其中只有一个 入口语句和一个出口语句。 入口语句和一个出口语句。 入口语句: 入口语句: 1. 程序的第一个语句;或者, . 程序的第一个语句;或者, 2. 条件转移语句或无条件转移语句的转移目标语句;或者 . 条件转移语句或无条件转移语句的转移目标语句; 3. 紧跟在条件转移语句后面的语句。 . 紧跟在条件转移语句后面的语句。
main() { int x, y, z; x = (1+20)*( -x); ( ) y = x*x+(x/y); y = z = (x/y)/(x*x); }
tmp1 = 1 + 20 ; tmp2 = -x ; x = tmp1 * tmp2 ; tmp3 = x * x ; tmp4 = x / y ; y = tmp3 + tmp4 ; tmp5 = x / y ; tmp6 = x * x ; z = tmp5 / tmp6 ; y = z ;
11.1 11.2 11.3 11.4
什么是代码优化 局部优化 控制流程分析和循环 数据流分析举例
11.1 优化技术简介
何谓代码优化: 宗旨: 获得较好性能的代码 宗旨: 等价 意图,结果, 意图,结果,权衡 目标代码优化 阶段: source front I.R code target code generator code 用户 中间代码优化
第十一章 代码优化
为了让编译程序能够生成效率高的目标代码, 为了让编译程序能够生成效率高的目标代码, 应对中间代码进行优化 注意:优化≠ 注意:优化≠最佳化 要求:相对合理性。 要求:相对合理性。应考虑空间和时间上的 取舍,及二者的平衡。 取舍,及二者的平衡。 本章将介绍基于结构信息的优化 基于结构信息的优化。 本章将介绍基于结构信息的优化。 假定 优化对象是四元式序列的中间代码
编译原理 11章
![编译原理 11章](https://img.taocdn.com/s3/m/23df726aa45177232f60a2f2.png)
11.2 优化举例
6:循环中不变式的外提 • Tl=2*j外提 • 由于这里的循环中不 变式的外提是在非线 性块上的优化,所以 是全局优化。 • 经这两步优化后,便 得到图11.4中所示的 中间程序。
① i:=1; ② T1:=2*j; ③ T2:=T1;
④ T2:=100+T2; ⑤ R1:=B[T2]; ⑥ A[T5]:=R1+15.708; ⑦ i:=i+1; ⑧ if i≤100 then goto ② ≤
11.2 优化举例
3:常量合并
① i:=1;
② T1:=2*j; ③ T2:=100i+T1; ④ T3:=5*3.1416; ⑤ R1:=B[T2]; ⑥ T4:=2*j; ⑦ T5:=100*i+T4; ⑧ A[T5]:=R1+T3; ⑨ i:=i+1; ⑩ if i≤100 then goto ② ≤
n4 n3
图11.6 环路图
11.5 借助 借助DAG进行优化 进行优化
2: 无环有向图描述四元式
• 可用无环有向图来描述四元式。 例如,与四元式(op B C A)对应的DAG如图11.7所示。 利用DAG来进行优化的主要思想是: 将一基本块中的每一个四元式依次表示成对应的一个DAG, 该基本块就对应一较大的DAG(即其中各个四元式的DAG的合成)。 再按原来构造DAG结点的顺序重写四元式序列,便可得到“合并 了已知量”、“删除了无用赋值”、“删除了多余运算”的等价 的基本块——优化了的基本块。
11.1 基本块及其求法
• 1:基本块 基本块: 一个入口(第一语句) 一个出口(最后一语句) 入口语句集: 程序的第一个语句号; goto语句的下一条语句号; goto语句转到的语句号。 基本块划分: 入口语句集排序后每一入口语句到下一入口语句号 的前一语句。 最后一基本块为最后入口语句号到最后语句。
编译原理课后习题答案+清华大学出版社第二版
![编译原理课后习题答案+清华大学出版社第二版](https://img.taocdn.com/s3/m/a88cbf7ffab069dc51220162.png)
用以引用非局部(包围它的过程)变量时,寻找该变量的地址。 DL: 动态链,指向调用该过程前正在运行过程的数据段基地址,用以过程执行结束释放
数据空间时,恢复调用该过程前运行栈的状态。 RA: 返回地址,记录调用该过程时目标程序的断点,即调用过程指令的下一条指令的地
编译程序大致有哪几种开发技术?
答案:
(1)自编译:用某一高级语言书写其本身的编译程序。 (2)交叉编译:A 机器上的编译程序能产生 B 机器上的目标代码。 (3)自展:首先确定一个非常简单的核心语言 L0,用机器语言或汇编语言书写出它的编
译程序 T0,再把语言 L0 扩充到 L1,此时 L0⊂ L1 ,并用 L0 编写 L1 的编译程序 T1,再把语 言 L1 扩充为 L2,有 L1 ⊂ L2 ,并用 L1 编写 L2 的编译程序 T2,……,如此逐步扩展下 去, 好似滚雪球一样,直到我们所要求的编译程序。 (4)移植:将 A 机器上的某高级语言的编译程序搬到 B 机器上运行。
(main).
答案: 程序执行到赋值语句 b∶=10 时运行栈的布局示意图为:
1
《编译原理》课后习题答案第二章
第 3题 写出题 2 中当程序编译到 r 的过程体时的名字表 table 的内 容。
name
kind
level/val
adr
size
答案:
题 2 中当程序编译到 r 的过程体时的名字表 table 的内容为:
盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第一章
合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
编译原理第三版课后答案清华大学
![编译原理第三版课后答案清华大学](https://img.taocdn.com/s3/m/34c0723303768e9951e79b89680203d8cf2f6a5c.png)
编译原理第三版课后答案清华大学出版社
一、单项选择题
1.每一个解释器必须完成运行程序所需的基本功能是什么?
A.翻译代码
B.执行代码
C.优化代码
D.分析代码
答案:B.执行代码
2.下列哪个不是一种程序设计语言?
A.C
B. Lisp
C. Java
D.汇编语言
答案:D.汇编语言
3.哪一种语言可以编译成多种机器语言?
A.动态语言
B.汇编语言
C.静态语言
D.高级语言
答案:D.高级语言
4.什么类型的编译器可以将源代码转换为机器可以识别的字节码?
A.汇编器
B.解释器
C.直译器
D.编译器
答案:D.编译器
二、填空题
5.编译器用于将高级语言(________)翻译成机器语言(________)。
答案:源代码,目标代码
6.编译器通过不同的(________)实现程序翻译的过程。
编译原理蒋宗礼课件第11章
![编译原理蒋宗礼课件第11章](https://img.taocdn.com/s3/m/3370f8430640be1e650e52ea551810a6f524c8e2.png)
关键任务
进行类型检查、确定符号引 用的含义,以及生成中间代 码等。
工具
语义分析是编译过程中相当 复杂的一部分,通常需要使 用自定义的算法和工具进行 实现。
中间代码生成
1 什么是中间代码生成?
在编译过程的中间阶段,将源代码转化为计算机独立的中间表示形式。
2 优点
中间代码的生成可以简化编译器的设计和实现,并提供了优化和代码生成的灵活性。
编译原理蒋宗礼课件第11章
在本章中,我们将深入探讨编译原理的各个方面,包括词法分析、语法分析、 语义分析等等。
编译原理概述
什么是编译原理?
编译原理是计算机科学中的重要领域,研究如 何将高级语言编写的程序转化为计算机能够理 解和执行的机器码。
编译原理的应用
编译原理在各个领域都有广泛的应用,包括编 译器设计、程序语言设计以及软件工程等。
通过使用上下文无关文法 (Context-Free Grammar),语法 分析器可以验证源代码是否符合 语言的语法规则。
工具
常用的语法分析工具包括ANTLR、 Bison等,它们能够根据预先定义 好的文法生成语法分析器。
语义分析
什么是语义分析?
语义分析是编译过程中的第 三步,通过对语法树进行遍 历和分析,对源代码进行意 义的理解和检查。
为不同的Token类型,如标识符、关键字、
运算符等。
3
什么是词法分析?
词法分析是编译过程中的第一步,将源 代码转化为单词序列(Token Sequence)。
工具
常用的词法分析工具包括Flex等,它们能 够根据预先定义好的规则生成词法分析 器。
语法分析
什么是语法分析?
关键概念
语法分析是编译过程中的第二步, 将词法分析得到的Token序列转化 为语法树(Parse Tree)。
编译原理课后第十一章答案
![编译原理课后第十一章答案](https://img.taocdn.com/s3/m/5607a7f19e3143323968937b.png)
对假设(2) B:=3 D:=A+C E:=A*C F:=D+E K:=B*5 L:=K+F
计算机咨询网()陪着您
10
《编译原理》课后习题答案第十一章
第7题 分别对图 11.25 和 11.26 的流图: (1) 求出流图中各结点 n 的必经结点集 D(n)。 (2) 求出流图中的回边。 (3) 求出流图中的循环。
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
i:=m-1 j:=n t1:=4*n v:=a[t1] i:=i+1 t2:=4*i t3:=a[t2] if t3< v goto (5) j:=j-1 t5:=4*j t5:=a[t4] if t5> v goto (9) if i >=编译原理》课后习题答案第十一章
第 5 题: 如下程序流图(图 11.24)中,B3 中的 i∶=2 是循环不变量,可以将其提到前置结点吗? 你还能举出一些例子说明循环不变量外移的条件吗?
图 11.24 答案: 不能。因为 B3 不是循环出口 B4 的必经结点。 循环不变量外移的条件外有: (a)(I)s 所在的结点是 L 的所有出口结点的必经结点 (II)A 在 L 中其他地方未再定值 (III)L 中所有 A 的引用点只有 s 中 A 的定值才能到达 (b)A 在离开 L 之后不再是活跃的,并且条件(a)的(II)和(III)成立。所谓 A 在离开 L 后不再是活跃的是指,A 在 L 的任何出口结点的后继结点的入口处不是活跃的(从此点后 不被引用) (3)按步骤(1)所找出的不变运算的顺序,依次把符合(2)的条件(a)或(b)的 不变运算 s 外提到 L 的前置结点中。如果 s 的运算对象(B 或 C)是在 L 中定值的,则只有 当这些定值四元式都已外提到前置结点中时,才可把 s 也外提到前置结点。
编译原理 清华大学出版社
![编译原理 清华大学出版社](https://img.taocdn.com/s3/m/7dba05250722192e4536f6b5.png)
Hale Waihona Puke 3、语义分析(1)语义
定义语言的单词符号和语法单位的意义.一个语言的 语义是指这样的一组规则,使用它可以定义一个程序的 意义.这些规则称为语义规则.
离开语义,语言只不过是一堆符号的集合.
语义分析阶段的主要任务
审查源程序有无语义错误,为代码生成阶段收集类型信 息.
18
3、语义分析(2)
例如: 类型审查、数组下标检查、强制类型转换等
2. 任何常数(整常数、实常数)是表达式。
3. 若表达式1和表达式2都是表达式,那么 ·表达式1+表达式2 ·表达式1*表达式2 ·(表达式1)
都是表达式。
16
程序结构(2)
语句的表示: 1. 标识符:=表达式 是语句。 2. while (表达式) do 语句 和
if (表达式) then 语句 else 语句 都是语句。
整数:10 界符:。
逗号:, 冒号::
分号:; 赋值号::= 加号:+ 乘号:*
机内码为:id1:=id2+id3*10
13
2、语法分析
❖ 任务:单词符号串 → 各类语法单位 在词法分析的基础上将单词序列分解成各类语法短语.通常 用语法树表示这种语法短语.
❖ 依据:语言的语法规则 ❖ 描述语法规则的工具:上下文无关文法、确定的下推自动机
任课教师:湛 燕 Email: zhanyan@
数学与计算机学院
1
教材与参考书
编译原理(第二版). 张素琴,吕映芝,蒋维杜,戴桂兰编 著,清华大学出版社,2005.2.
名称 编译原理 编译原理 编译原理
作者 何炎祥 陈火旺等 蒋立源
出版社 华中理工大学 国防工业出版社 西北工业大学
编译原理课后习题答案(清华大学_张素琴)复习例题
![编译原理课后习题答案(清华大学_张素琴)复习例题](https://img.taocdn.com/s3/m/d2abff0cf12d2af90242e65d.png)
编译原理复习例题(有些内容没有覆盖,比如优化、SLR(1)、LR(1)、LALR(1)等。
但要求至少要按照作业题的范围复习。
)一选择题1.编译的各阶段工作都涉及。
[A]词法分析[B]表格管理 [C]语法分析 [D]语义分析2.型文法也称为正规文法。
[A] 0 [B] 1 [C] 2 [D] 33.文法不是LL(1)的。
[A]递归 [B]右递归 [C]2型 [D]含有公共左因子的4.文法E→E+E|E*E|i的句子i*i+i*i有棵不同的语法树。
[A] 1 [B] 3 [C] 5 [D] 75.文法 S→aaS|abc 定义的语言是。
[A]{a2k bc|k>0} [B]{a k bc|k>0}[C]{a2k-1bc|k>0} [D]{a k a k bc|k>0}6.若B为非终结符,则 A→α.Bβ为。
[A]移进项目 [B]归约项目 [C]接受项目 [D]待约项目7.同心集合并可能会产生新的冲突。
[A]二义 [B]移进/移进 [C]移进/归约 [D]归约/归约8.代码优化时所依据的是。
[A]语法规则 [B]词法规则[C]等价变换规则 [D]语义规则9.表达式a-(-b)*c的逆波兰表示(@为单目减)为。
[A]a-b@c* [B]ab@c*- [C]ab@- [D]ab@c-*10.过程的DISPLAY表是用于存取过程的。
[A]非局部变量[B]嵌套层次 [C]返回地址 [D]入口地址二填空题1.词法分析阶段的任务式从左到右扫描字符流,从而逐个识别一个个的单词。
2.对于文法G[E]:E→T|E+T T→F|T*F F→P^F|P P→(E)|i,句型T+T*F+i的句柄是。
3.最右推导的逆过程称为规范归约,也称为最左归约。
4.符号表的每一项是由名字栏和两个栏目组成。
在目标代码生成阶段,符号表是的依据。
三判断题(认为正确的填“T”,错的填“F”)【】1.同心集的合并有可能产生“归约/归约”冲突。
精品 课后习题及参考答案-《编译原理》课后习题答案-清华大学-第二版
![精品 课后习题及参考答案-《编译原理》课后习题答案-清华大学-第二版](https://img.taocdn.com/s3/m/7ddada40da38376bae1fae43.png)
对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、 代码生成)报告的。
总而言之,是边翻译边执行。
像C, Pascal之类的语言,属于编译型的高级语言。它们的特点是计算机事先对高级语言 进行全盘翻译,将其全部变为机器代码,再统一执行,即先翻译,后执行。从速度上看,编译型 的高级语言比解释型的高级语言更快。
第
第1题
PL/O语言允许过程嵌套定义和递归调用,试问它的编译程序如何解决运行时的存储管 理。
错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源程 序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误进行 适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和査找等一系列表格工作。表格的作用是记录源程序的各 类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中 间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出 的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序 具有的表格管理功能。
编译原理第十一章汇总
![编译原理第十一章汇总](https://img.taocdn.com/s3/m/080001297cd184254b35353b.png)
11.3 一个简单的代码生成器 在一个基本块范围实现代码生成器,它依次把每条中间代 码变换成目标代码,并且在一个基本块范围内考虑如何充 分利用寄存器的问题。即,一方面在基本块中,当生成计 算某变量值的目标代码时,尽可能地让该变量的值保留在 寄存器中,直到该寄存器必须用来存放别的变量或者已到 达基本块的出口为止;另一方面,后续的目标代码尽可能 地引用变量在寄存器中的值,而不访问主存。
2019年2月23日10时12分
例11.1 考察基本块 T:=A-B U:=A-C V:=T+U W:=V+U 假设W 是基本块出口的活跃变量,只有R0和 R1是可用的 寄存器。
2019年2月23日10时12分
中间代码 T: =A-B U: =A-C
V: = T+U
W: =V+U
目标代码 LD R0, A SUB R0, B LD R1, A SUB R1, C ADD R1, R0 ADD R1,R0
op Ri, M
op Ri, *Rj
执行代价为 2
执行代价为 2
op Ri, *M
执行代价为 3
2019年2月23日10时12分
11.5 DAG的目标代码 为了生成更有效的目标代码, 要考虑的另一个问题是, 对基本块中中间代码序列。 例11.4 考察下面基本块的中间代码序列G T1:=A+B T2:=C+D T3:=E-T2 T4:=T1-T3 假设R0和R1是两个可使用的寄存器。T4是基本块出口之 后的活跃变量。
2019年2月23日10时12分
G的 目标代码:
(b) 在随后的寄存器指派阶段,挑出变量将要驻留的具体 寄存器。 2019年2月23日10时12分
(5)计算顺序选择
编译原理课后习题答案_清华大学_第二版_khdaw
![编译原理课后习题答案_清华大学_第二版_khdaw](https://img.taocdn.com/s3/m/afced400bed5b9f3f90f1cd1.png)
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表
中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式
的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
的位置和功能以及所完成的操作说明如下:
INT 0 A
在过程目标程序的入口处,开辟 A 个单元的数据段。A 为局部变量的个数+3。
OPR 0 0
在过程目标程序的出口处,释放数据段(退栈),恢复调用该过程前正在运行的过程的
数据段基址寄存器 B 和栈顶寄存器 T 的值,并将返回地址送到指令地址寄存器 P 中,以使
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚,
就回答八部分。
第 3 题
何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系?
答案:
翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程
好似滚雪球一样,直到我们所要求的编译程序。
.
(4)移植:将 A 机器上的某高级语言的编译程序搬到 B 机器上运行。
第6题
计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
答案:
计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。
序的总体结构图。
答案:
一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语
义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和
编译原理课后习题答案-清华大学-第二版
![编译原理课后习题答案-清华大学-第二版](https://img.taocdn.com/s3/m/d94edaffc8d376eeaeaa3178.png)
《编译原理》课后习题答案第二章
第 2 章 PL/0 编译程序的实现
第1题
PL/0 语言允许过程嵌套定义和递归调用,试问它的编译程序如何解决运行时的存储管 理。
答案: PL/0 语言允许过程嵌套定义和递归调用,它的编译程序在运行时采用了栈式动态存储
管理。(数组 CODE 存放的只读目标程序,它在运行时不改变。)运行时的数据区 S 是由 解释程序定义的一维整型数组,解释执行时对数据空间 S 的管理遵循后进先出规则,当每 个过程(包括主程序)被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放。 应用动态链和静态链的方式分别解决递归调用和非局部变量的引用问题。
(2) 扩充 repeat 语句的语法图为:
EBNF 的语法描述为: 〈 重复语句〉::= repeat〈语句〉{;〈语句〉}until〈条件〉
《编译原理》课后习题答案第三章
第 3 章 文法和语言
第1题
文法 G=({A,B,S},{a,b,c},P,S)其中 P 为: S→Ac|aB A→ab B→bc 写出 L(G[S])的全部元素。
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。 第3题
何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 答案:
翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程 序和汇编程序等。
编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编 写的目标程序的翻译程序。
地址,用以过程执行结束后返回调用过程时的下一条指令继续执行。 在每个过程被调用时在栈顶分配 3 个联系单元,用以存放 SL,DL, RA。
第5题
PL/0 编译程序所产生的目标代码是一种假想栈式计算机的汇编语言,请说明该汇编语 言中下列指令各自的功能和所完成的操作。 (1) INT 0 A (2) OPR 0 0 (3) CAL L A
编译原理陈火旺版10-11章.
![编译原理陈火旺版10-11章.](https://img.taocdn.com/s3/m/44cc28ce58fb770bf68a5568.png)
对于给定的一个程序,可以将其划分为一系列的基本 块,分别在块内进行局部优化(基本块内的优化)。
以下先给出划分基本块的算法。
1. 求出程序中可做基本块入口的语句,它们是: (1)程序的第一个语句;
(2)能由条件转移语句或无条件转移语句转移到的语句; (3)紧跟在条件转移语句后面的语句。
T0:=3.14
8B
T1:=6.28
*
T3:=6.28 T2:=R+r T4:= T2 A:=6.28*T2 T5:=A
B A 6 T5
*
5 +
T2 T4
7 -
T6
T6:=R-r
B:=A*T6 已完成了如下优化:
1 T0
2
T1 T3
3
4
合并已知量;
3.14 6.28 R
r
删除无用代码;(B:=A)
删除公共子表达式。
经前述各种优化处理后,最终的中间代码如下:
B1
i:=m-1; j:=n ; T1:=4*n; v:=a[T1];
T2:=4*i; T4:=4*j;
B2
T2:=T2+4;T3:=a[T2]; if T3<v goto B2
B3
T4:=T4+4;T5:=a[T4]; if T5>v goto B3
B4 if T2>=T4 goto B6
第十一章 目标代码生成
目标代码生成器的位置:
源 程序
编译前端
中间 代码
代码优化
中间 代码
代码生成器
目标 程序
符号表
目标代码的形式: 1、已定位的可立即执行的机器语言代码; 2、可浮动的机器语言代码,需装配连接再执行; 3、汇编语言目标代码,需汇编再执行。
编译原理课后习题答案解析+清华大学出版社第二版
![编译原理课后习题答案解析+清华大学出版社第二版](https://img.taocdn.com/s3/m/b6771ab12af90242a995e513.png)
计算机执行用高级语言编写的程序有哪些途径它们之间的主要区别是什么
答案:计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
言进行全盘翻译,将其变为机器代码,而是每读入一条高级语句,就用解释器将其翻译为一 条机器代码,予以执行,然后再读入下一条高级语句,翻译为机器代码,再执行,如此反 复。
第2题
若 PL/0 编译程序运行时的存储分配策略采用栈式动态分配,并用动态链和静态链的方式分 别解决递归调用和非局部变量的引用问题,试写出下列程序执行到赋值语句 b∶ =10 时运行 栈的布局示意图。 var x,y; procedure p; var a; procedure q; var b; begin (q) b∶ =10; end (q); procedure s; var c,d; procedure r; var e,f; begin (r) call q; end (r); begin (s) call r; end (s); begin (p) call s;
(2) 数组下标越界 (3) 使用的函数没有定义 (4) 在数中出现非数字字符
答案: (1) 语法分析 (2) 语义分析 (3) 语法分析 (4) 词法分析
第5题
编译程序大致有哪几种开发技术
答案:
(1) 自编译:用某一高级语言书写其本身的编译程序。 (2) 交叉编译:A 机器上的编译程序能产生 B 机器上的目标代码。 (3) 自展:首先确定一个非常简单的核心语言 L0,用机器语言或汇编语言书写出它的
第6题
给出对 PL/0 语言作如下功能扩充时的语法图和 EBNF 的语法描述。 (1) 扩充条件语句的功能使其为: if〈条件〉then〈语句〉[else〈语句〉] (2) 扩充 repeat 语句为: repeat〈语句〉{;〈语句〉}until〈条件〉
编译原理清华第十一章代码优化
![编译原理清华第十一章代码优化](https://img.taocdn.com/s3/m/6dd2a5a831b765ce04081491.png)
3. 删除无用赋值 有些变量的赋值从未被引用,称为无用赋值,应删除。 无用赋值分三种情况: – 变量被赋值,但在程序中从未被引用(在局部范围内难判定) – 变量赋值后未被引用又重新赋值,则前面赋值是无用的 – 变量的赋值只被计算变量自己引用,其他变量都不引用它
之间的语句序列组成的。
3.凡未被纳入某一基本块的语句,是不会被执行到的语句, 可以把它们删除。
例:
((11)) rreeaadd XX (2) read Y ((33)) RR::==XX mmoodd YY (4) if R=0 goto (8) (5) X:=Y ((65)) YX::==RY (7) goto (3) (8) write Y (98) hwarlite Y
第11章 代码优化
学习目标: 掌握:基本块的划分、基本块的DAG优化 理解:什么是局部优化、循环优化、全局优化 了解:循环优化技术
11.1 优化技术简介 11.2 局部优化 11.3 循环优化简介
11.1 优化技术简介
什么是优化: 所谓优化是对代码进行等价变换,使得变换后的代码的效率 更高(节省运行时间、存储空间或两者兼而有之) 优化可在编译的不同阶段进行,最主要的优化有 – 中间代码优化(不依赖具体计算机) – 目标代码优化(依赖于具体计算机)
(3) R:=X mod Y (4) if R=0 goto (8)
(5) X:=Y (6) Y:=R (7) goto (3)
(8) write Y (9) halt
11.3.2 循环优化
1. 代码外提 把循环不变运算,即其结果独立于循环执行次数的表达式, 提到循环的前面,使之只在循环外计算一次,这种优化称为 代码外提。 循环不变运算:运算量为常量或在循环外定值,每次循环时 其值不变的运算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)
read (C) (2) A:= 0 (3) B:= 1 (4) L1: A:=A + B (5) if B>= C goto L2 (6) B:=B+1 (7) goto L1 (8) L2: write (A) (9) halt
划分成四个基本块 B1,B2,B3,B4 B1 (1) (2) (3) 基本块内实行的优化:合并已知量 删除多余运算 B2 (4) 删除无用赋值 (5) B3 (6) (7) B4 (8) (9)
优化技术简介—代数简化
b = 5 + a + 10 ; _tmp0 = 5 ; _tmp1 = _tmp0 + a ; _tmp2 = _tmp1 + 10 ; b = _tmp2 ; _tmp0 = 15 ; _tmp1 = a + _tmp0 ;
优化技术简介—降低运算强度
a) i*2 = 2*i = i+i = i<<2 b) i/2 = (int)(i*0.5) c) 0-1 = -1 d) f*2 = 2.0 * f = f + f e) f/2.0 = f*0.5
基本块:是指程序中一顺序执行的语句序列,其中只有一个入 口语句和一个出口语句。 入口语句: 1.程序的第一个语句;或者, 2.条件转移语句或无条件转移语句的转移目标语句;或者 3.紧跟在条件转移语句后面的语句。
划分基本块的算法: 1.求出四元式程序之中各个基本块的入口语句。 2.对每一入口语句,构造其所属的基本块。它是由该语句到 下一入口语句(不包括下一入口语句),或到一转移语句 (包括该转移语句),或到一停语句(包括该停语句)之 间的语句序列组成的。 3.凡未被纳入某一基本块的语句,都是程序中控制流程无法 到达的语句,因而也是不会被执行到的语句,我们可以把 它们删除。
第11章
代码优化
11.1 11.2 11.3 11.4
什么是代码优化 局部优化 控制流程分析和循环 数据流分析举例
宗旨: 获得较好性能的代码 等价 意图,结果,权衡 阶段: source front I.R code target code end generator code 用户 中间代码优化 目标代码优化
优化技术简介—复写传播 tmp2 = tmp1 ; tmp3 = tmp1 * tmp1 ; tmp3 = tmp2 * tmp1; tmp5 = tmp3 * tmp1 ; tmp4 = tmp3 ; c = tmp5 + tmp3 ; tmp5 = tmp3 * tmp2 ; c = tmp5 + tmp4 ;
何谓代码优化:
int arr[10000]; void Binky() { int i; for (i=0; i < 10000; i++) arr[i] = 1; }
int arr[10000]; void Winky() { register int *p; for (p = arr; p < arr + 10000; p++) *p = 1; }
2 型: A:=B op C(op, B, C,A)
DAG 结点 n1 A n1 B n2 A op n1 n1 B n3 n3 A op n2 n1 n2 n1 B C
仅含 0,1,2 型四元式的基本块的 DAG 构造算法: 首先,DAG 为空。 对基本块的每一四元式,依次执行: 1.如果 NODE(B)无定义,则构造一标记为 B 的叶结点并 定义 NODE(B)为这个结点; 如果当前四元式是 0 型,则记 NODE(B)的值为 n,转 4。 如果当前四元式是 1 型,则转 2(1)。 如果当前四元式是 2 型,则: (I) 如果 NODE(1)无定义,则构造一标记为 C 的叶结点并 定义 NODE(1) 为这个结点; (II) 转 2 (2)
基本块的DAG表示及其应用
DAG Directed Acyclic Graph 无环路有向图 基本块的DAG是在结点上带有标记的DAG 叶结点 独特的标识符(名字,常数)标记 内部结点 运算符号标记 各个结点 附加标识符标记
用 DAG 进行基本块的优化 四元式 0 型:A:=B(:=,B,—,A) 1 型: A:=op B(op,B, —,A)
优化技术简介—常数合并
a = 10 * 5 + 6 - b; _tmp0 = 10 ; _tmp1 = 5 ; _tmp2 = _tmp0 * _tmp1 ;
_tmp3 = 6 ; _tmp4 = _tmp2 +
_tmp3 ; _tmp5 = _tmp4 – b; a = _tmp5 ;
_tmp0 = 56 ;
优化技术简介—常数传播 _tmp4 = 0 ; f0 = _tmp4 ; _tmp5 = 1 ; f1 = _tmp5 ; _tmp6 = 2 ; i = _tmp6 ; f0 = 0 ; f1 = 1 ; i = 2 ;
优化技术简介—代数简化 x+0 = x 0+x = x x*1 = x 1*x = x 0/x = 0 x-0 = x b && true = b b && false = false b || true = true b || false = b
main() { int x, y, z; x = (1+20)* -x; y = x*x+ห้องสมุดไป่ตู้x/y); y = z = (x/y)/(x*x); }
tmp1 = 1 + 20 ; tmp2 = -x ; x = tmp1 * tmp2 ; tmp3 = x * x ; tmp4 = x / y ; y = tmp3 + tmp4 ; tmp5 = x / y ; tmp6 = x * x ; z = tmp5 / tmp6 ; y = z ;
2.(1)如果 NODE(B)是标记为常数的叶结点 ,则转 2(3), 否则转 3(1)。 (2)如果 NODE(B)和 NODE(C)都是标记为常数的叶结 点,则转 2(4),否则转 3(2)。 (3)执行 op B(即合并已知量),令得到的新常数为 P。如果 NODE(B)是处理当前四元式时新构造出来的结点,则 删除它。如果 NODE(P)无定义,则构造一用 P 做标记的叶结 点 n。置 NODE(P)=n,转 4。 (4)执行 B op C(即合并已知量),令得到的新常数为 P。如果 NODE(B)或 NODE(C)是处理当前四元式时新构造出 来的结点,则删除它。如果 NODE(P)无定义,则构造一用 P 做标记的叶结点 n。置 NODE(P)=n,转 4。
4.如果 NODE(A)无定义,则把 A 附加在结点 n 上并令 NODE(A)=n;否则先把 A 从 NODE(A)结点上附加标识符集中 删除(注意,如果 NODE(A)是叶结点,则其标记 A 不删 除),把 A 附加到新结点 n 上并令 NODE(A)=n。转处理下一 四元式。 而后,我们可由 DAG 重新生成原基本块的一个优化的代码序 列。
n2
n4
(1)P:=0 (2)I:=1 (4)T2:=addr(A)-4
(7)T5:=addr(B)-4 (3)T1:=4*I (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)
• • • •
(1)P:=0 (2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (3)T1:=4*I (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1
• • • • • •
(1) T0:=3.14 (2) T1:=2*T0 (3) T2:=R+r (4) A:=T1*T2 (5) B:=A (6) T3:=2*T0 (7) T4:=R+r (8) T5:=T3*T4 (9) T6:=R-r (10)B:=T5*T6
n1
To
3.14 (a)
n1
T0 (b)
n2
T1
3.(1)检查 DAG 中是否已有一结点,其唯一后继为 NODE(B),且标记为 op(即找公共子表达式)。如果没有, 则构造该结点 n,否则就把已有的结点作为它的结点并设该结 点为 n,转 4。 (2)检查中 DAG 中是否已有一结点,其左后继为 NODE(B),其右后继为 NODE(C),且标记为 op(即找公共子 表达式)。如果没有,则构造该结点 n,否则就把已有的结点 作为它的结点并设该结点为 n,转 4。
(1)P:=0 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (3)T1:=4 (5)T3:=T2[T1] (8)T6:=T5[T1] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1<=80 goto(5)
11.2 局部优化:基本块内的优化
(1)P:=0 (2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4
(3)T1:=4
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[ ] T1 (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1
(3’)T1:=T1+4 (12)if T1 <=80 goto(5)
(1)P:=0
(2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (3)T1:=4*I (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)