欢迎来到天天文库
浏览记录
ID:57047236
大小:1.34 MB
页数:59页
时间:2020-07-28
《中间代码生成 - 计算机系主页.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第六章中间代码生成赵建华南京大学计算机系本章内容中间代码表示抽象语法树三地址代码:x=yopz静态类型检查类型检查(typechecking)语法分析之后的抽象语法(syntax)检查,比如break的位置,goto的目标….中间代码生成编译器前端的逻辑结构三地址代码(1)每条指令右侧最多有一个运算符一般情况可以写成x=yopz允许的运算分量:名字:源程序中的名字作为三地址代码的地址常量:源程序中出现或生成的常量编译器生成的临时变量三地址代码(2)指令集合(1)运算/赋值指令:x=yopzx=opy复制指令:x=y无条件转移指令:gotoL条件转移指令:ifx
2、gotoLifFalsexgotoL条件转移指令:ifxrelopygotoL三地址代码(3)指令集合(2)过程调用/返回:paramx1//设置参数paramx2…paramxncallp,n//调用子过程p,n为参数个数带下标的复制指令:x=y[i]x[i]=y注意:i表示离开数组位置第i个字节,而不是数组的第i个元素地址/指针赋值指令:x=&yx=*y*x=y例子语句doi=i+1;while(a[i]3、rg2resultop:运算符的内部编码arg1,arg2,result是地址x=y+z+yzx单目运算符不使用arg2param运算不使用arg2和result条件转移/非条件转移将目标标号放在result字段四元式的例子赋值语句:a=b*-c+b*-c三元式表示三元式(triple)oparg1arg2使用三元式的位置来引用三元式的运算结果x[i]=y需要拆分为两个三元式求x[i]的地址,然后再赋值x=yopz需要拆分为(这里?是编号)(?)opyz=x?问题:在优化时经常需要移动/删除/添加三元式,导致三元式的移动。三元式的例子a=b*-c+b*-c间接4、三元式包含了一个指向三元式的指针的列表我们可以对这个列表进行操作,完成优化功能;操作时不需要修改三元式中的参数。静态单赋值(SSA)SSA中的所有赋值都是针对不同名的变量对于同一个变量在不同路径中定值的情况,可以使用φ函数来合并不同的定值if(flag)x=-1;elsex=1;y=x*aif(flag)x1=-1;elsex2=1;x3=φ(x1,x2);y=x3*a类型和声明类型检查(TypeChecking)利用一组规则来检查运算分量的类型和运算符的预期类型是否匹配。类型信息的用途查错、确定名字需要的内存空间、计算数组元素的地址、类型转换、选择正确的运算5、符本节的内容确定名字的类型,变量的存储空间布局(相对地址)类型表达式类型表达式(typeexpression):表示类型的结构基本类型类名类型构造算子作用于类型array[数字,类型表达式]record[字段/类型对的列表](可以用符号表表示)函数类型构造算子:参数类型结果类型笛卡尔积:sXt可以包含取值为类型表达式的变量类型表达式的例子类型例子元素个数为3X4的二维数组数组的元素的记录类型该记录类型中包含两个字段:x和y,其类型分别是float和integer类型表达式array[3,array[4,record[(x,float),(y,float)]6、]类型等价不同的语言有不同的类型等价的定义结构等价或者它们是相同的基本类型或者是相同的构造算子作用于结构等价的类型而得到的。或者一个类型是另一个类型表达式的名字名等价类型名仅仅代表其自身声明文法DTid;D7、εTBC8、record‘{’D‘}’Cint9、floatCε10、[num]C含义:D生成一系列声明;T生成不同的类型;B生成基本类型int/float;C表示分量,生成[num]序列;注意record中包含了各个字段的声明。字段声明和变量声明的文法一致。局部变量的存储布局变量的类型可以确定变量需要的内存即类型的宽度可变大小的数据结构只需要考虑指针函数11、的局部变量总是分配在连续的区间;因此给每个变量分配一个相对于这个区间开始处的相对地址变量的类型信息保存在符号表中;计算T的类型和宽度的SDT综合属性:type,width全局变量t和w用于将类型和宽度信息从B传递到Cε相当于C的继承属性,因为总是通过拷贝来传递,所以在SDT中只赋值一次。也可以把t和w替换为C.t和C.wSDT运行的例子输入:int[2][3]作用域和符号表在具有语句块概念的编程语言中,标识符x在最内层的x声明的作用域中。每个作用域对应于一个符号表;多个符号表形成树状结构。在语义分析时,通过栈来存放当前符号表及其祖先。声明序列的SDT(1)在12、处理一个过程/函数时,局部变量应该放到
3、rg2resultop:运算符的内部编码arg1,arg2,result是地址x=y+z+yzx单目运算符不使用arg2param运算不使用arg2和result条件转移/非条件转移将目标标号放在result字段四元式的例子赋值语句:a=b*-c+b*-c三元式表示三元式(triple)oparg1arg2使用三元式的位置来引用三元式的运算结果x[i]=y需要拆分为两个三元式求x[i]的地址,然后再赋值x=yopz需要拆分为(这里?是编号)(?)opyz=x?问题:在优化时经常需要移动/删除/添加三元式,导致三元式的移动。三元式的例子a=b*-c+b*-c间接
4、三元式包含了一个指向三元式的指针的列表我们可以对这个列表进行操作,完成优化功能;操作时不需要修改三元式中的参数。静态单赋值(SSA)SSA中的所有赋值都是针对不同名的变量对于同一个变量在不同路径中定值的情况,可以使用φ函数来合并不同的定值if(flag)x=-1;elsex=1;y=x*aif(flag)x1=-1;elsex2=1;x3=φ(x1,x2);y=x3*a类型和声明类型检查(TypeChecking)利用一组规则来检查运算分量的类型和运算符的预期类型是否匹配。类型信息的用途查错、确定名字需要的内存空间、计算数组元素的地址、类型转换、选择正确的运算
5、符本节的内容确定名字的类型,变量的存储空间布局(相对地址)类型表达式类型表达式(typeexpression):表示类型的结构基本类型类名类型构造算子作用于类型array[数字,类型表达式]record[字段/类型对的列表](可以用符号表表示)函数类型构造算子:参数类型结果类型笛卡尔积:sXt可以包含取值为类型表达式的变量类型表达式的例子类型例子元素个数为3X4的二维数组数组的元素的记录类型该记录类型中包含两个字段:x和y,其类型分别是float和integer类型表达式array[3,array[4,record[(x,float),(y,float)]
6、]类型等价不同的语言有不同的类型等价的定义结构等价或者它们是相同的基本类型或者是相同的构造算子作用于结构等价的类型而得到的。或者一个类型是另一个类型表达式的名字名等价类型名仅仅代表其自身声明文法DTid;D
7、εTBC
8、record‘{’D‘}’Cint
9、floatCε
10、[num]C含义:D生成一系列声明;T生成不同的类型;B生成基本类型int/float;C表示分量,生成[num]序列;注意record中包含了各个字段的声明。字段声明和变量声明的文法一致。局部变量的存储布局变量的类型可以确定变量需要的内存即类型的宽度可变大小的数据结构只需要考虑指针函数
11、的局部变量总是分配在连续的区间;因此给每个变量分配一个相对于这个区间开始处的相对地址变量的类型信息保存在符号表中;计算T的类型和宽度的SDT综合属性:type,width全局变量t和w用于将类型和宽度信息从B传递到Cε相当于C的继承属性,因为总是通过拷贝来传递,所以在SDT中只赋值一次。也可以把t和w替换为C.t和C.wSDT运行的例子输入:int[2][3]作用域和符号表在具有语句块概念的编程语言中,标识符x在最内层的x声明的作用域中。每个作用域对应于一个符号表;多个符号表形成树状结构。在语义分析时,通过栈来存放当前符号表及其祖先。声明序列的SDT(1)在
12、处理一个过程/函数时,局部变量应该放到
此文档下载收益归作者所有