73中间代码生成 何谓中间代码( Intermediate code) Intermediate representation Intermediate language 源程序的一种内部表示,不依赖目标机的结构,易于机械生成 目标代码的中间表示。 为什麽要此阶段 逻辑结构清楚;利于不同目标机上实现同一种语言; 利于进行与机器无关的优化;这些内部形式也能用于解释。 中间代码的几种形式 逆波兰四元式三元式间接三元式树
. . . 何谓中间代码 ( Intermediate code ) ( Intermediate representation ) ( Intermediate language ) 源程序的一种内部表示,不依赖目标机的结构,易于机械生成 目 标代码的中间表示。 为什麽要此阶段 逻辑结构清楚;利于不同目标机上实现同一种语言; 利于进行与机器无关的优化;这些内部形式也能用于解释。 中间代码的几种形式 逆波兰 四元式 三元式 间接三元式 树 7.3 中间代码生成
中间代码生成 中间代码的形式 中间代码生成
中间代码生成 • 中间代码的形式 • 中间代码生成
7.3.1中间代码de形式 中间代码 ·是源程序的一种内部表示 复杂性介于源语言和目标机语言之间 中间代码的作用: 使编译程序的逻辑结构更加简单明确 利于进行与目标机无关的优化 利于在不同目标机上实现同一种语言 中间代码的形式 逆波兰式、四元式、三元式、间接三元式、抽 象语法树和DAG
7.3.1中间代码de形式 • 中间代码: • 是源程序的一种内部表示 • 复杂性介于源语言和目标机语言之间 • 中间代码的作用: • 使编译程序的逻辑结构更加简单明确 • 利于进行与目标机无关的优化 • 利于在不同目标机上实现同一种语言 • 中间代码的形式: 逆波兰式、四元式、三元式、间接三元式、抽 象语法树和DAG
中间代码的层次 中间代码按照其与高级语言和机器语言的接 近程度,可以分成以下三个层次 高级:最接近高级语言,保留了大部分源语言 的结构 ·中级:介于二者之间,与源语言和机器语言都 有一定差异 ·低级:最接近机器语言,能够反映目标机的系 统结构,因而经常依赖于目标机
中间代码的层次 中间代码按照其与高级语言和机器语言的接 近程度,可以分成以下三个层次: • 高级:最接近高级语言,保留了大部分源语言 的结构。 • 中级:介于二者之间,与源语言和机器语言都 有一定差异。 • 低级:最接近机器语言,能够反映目标机的系 统结构,因而经常依赖于目标机
不同层次的中间代码 源语言中间代码中间代码中间代码 高级语言)(高级) (中级) (低级) t1=a[1j+2] t1=j+2 r1=[p-4] float a[10][20; t2=i*20 r2=[r1+2] a[[+2: t3=t1+t2 r3=[p-8] t4=4*t3 r4=r3*20 t5= addr a r5=r4+r2 t6= t5+ t4 r6=4*r5 t7=*t6 fp-216 f1=[r7+r6]
不同层次的中间代码 源语言 (高级语言) 中间代码 (高级) 中间代码 (中级) 中间代码 (低级) float a[10][20]; a[i][j+2]; t1 = a[i, j+2] t1 = j + 2 t2 = i * 20 t3 = t1 + t2 t4 = 4 * t3 t5 = addr a t6 = t5 + t4 t7 = *t6 r1 = [fp - 4] r2 = [r1 + 2] r3 = [fp - 8] r4 = r3 * 20 r5 = r4 + r2 r6 = 4 * r5 r7 = fp – 216 f1 = [r7 + r6]
v A+B*(C-D)+E/(C-D)N 逆波兰:ABCD-*+ECD-N^/+ 四元式:(1)(-CDT1) (2)(*BT1T2) (3)(+AT2T3) (4)(-CDT4) (5)(^T4NT5) (6)(/ET5T6) (7)(+T3T6T7
逆波兰 : A B C D - * + E C D – N ^ / + 四元式 : (1) ( - C D T1 ) (2) ( * B T1 T2) (3) ( + A T2 T3) (4) ( - C D T4) (5) ( ^ T4 N T5) (6) ( / E T5 T6) (7) ( + T3 T6 T7) 例 : A + B * ( C - D ) + E / ( C - D ) ^N
B: A+B*(C-D)+E/(C-D)N 三元式:(1)(CD (2)(*B(1)) (3)(+A(2) (5)(^(4)N) (6)(/E(5)) (7)(+(3)(6))
三元式: (1) ( - C D ) (2) ( * B (1) ) (3) ( + A (2) ) (4) ( - C D ) (5) ( ^ (4) N ) (6) ( / E (5) ) (7) ( + (3) (6) ) 例 : A + B * ( C - D ) + E / ( C - D ) ^N
B: A+B*(C-D)+E/(C-D)N 间接三元式:间接三元式序列 间接码表 (1)(-CD) (2)(*B(1) (2) (3)(+A(2)) (3) (4)(^(1)N) (1) (5)(/E(4)) (4) (6)(+(3)(5)) (5)
间接三元式 : 间接三元式序列 间接码表 (1) ( - C D ) (1) (2) ( * B (1) ) (2) (3) ( + A (2) ) (3) (4) ( ^ (1) N ) (1) (5) ( / E (4) ) (4) (6) ( + (3) (5) ) (5) (6) 例 : A + B * ( C - D ) + E / ( C - D ) ^N
抽象语法树和DAG图 语法树可以作为一种合适的中间语言形式。在语法树 中去掉那些对翻译不必要的信息,从而获得更有效 的源程序中间表示。这种经变换后的语法树称之为 抽象语法树( Abstract Syntax Tree)。 在抽象语法树中,操作符和关键字都不作为叶结点出 现,而是把它们作为内部结点,即这些叶结点的父 结点 如产生式S→ b then s1 else s2抽象语法树表示 if-then-else S1 S2
抽象语法树和DAG图 语法树可以作为一种合适的中间语言形式。在语法树 中去掉那些对翻译不必要的信息,从而获得更有效 的源程序中间表示。这种经变换后的语法树称之为 抽象语法树(Abstract Syntax Tree)。 在抽象语法树中,操作符和关键字都不作为叶结点出 现,而是把它们作为内部结点,即这些叶结点的父 结点 如产生式S→if B then S1 else S2抽象语法树表示 if-then-else B S1 S2
语法树和抽象语法树 expression
语法树和抽象语法树