第七章编译程序 7.1编译程序考虑的因素 编译程序设计时,除了需用到前介绍的分析技术和制导 翻译技术外,还要考虑如何从源程序数据空间映射到具体物 理存储空间,也就是运行时的数据表示。在运行时如何组织 或存放数据、在源程序中同名标识符是怎样描述不同的对象 运行时的程序控制权是如何转移和参数是如何传递的以及如 何生成质量较高的目标代码都是编译程序设计者需考虑的问 题
第七章 编译程序 7.1 编译程序考虑的因素 编译程序设计时,除了需用到前介绍的分析技术和制导 翻译技术外,还要考虑如何从源程序数据空间映射到具体物 理存储空间,也就是运行时的数据表示。在运行时如何组织 或存放数据、在源程序中同名标识符是怎样描述不同的对象、 运行时的程序控制权是如何转移和参数是如何传递的以及如 何生成质量较高的目标代码都是编译程序设计者需考虑的问 题
7.1.1数据类型 类型的合法性检查是判断数据的类型是否与上下文的要 求相一致,例如 Pascal的运算符“+'不能作用在字符型数据 上,而C语言的‘+'却能作用在字符型数据上。在数据类型 上定乂的各种运算通常包括赋值和一系列类型转换规则,这 些规则保证了作用在数据对象上的某个运算符顺便通过由编 译程序的类型的合法性检査,并实现其合法的算和赋值。因 此,给出定义: 定义71数据类型是对该类型数据(变量或常量)的取值是 否合法以及对该类型据的运算是否合法的一种说明
7.1.1 数据类型 类型的合法性检查是判断数据的类型是否与上下文的要 求相一致,例如Pascal的运算符‘+’不能作用在字符型数据 上,而C语言的‘+’却能作用在字符型数据上。在数据类型 上定义的各种运算通常包括赋值和一系列类型转换规则,这 些规则保证了作用在数据对象上的某个运算符顺便通过由编 译程序的类型的合法性检查,并实现其合法的算和赋值。因 此,给出定义: 定义7.1 数据类型是对该类型数据(变量或常量)的取值是 否合法以及对该类型据的运算是否合法的一种说明
实现和完成数据类型的合法性检查,它包括以下任务: (1)检查运算符作用在运算对象上的合法性,这一合法性保 证了该运算能产生正确的运算结果 (2)根据程序设计语言运算符的类型转换规则,将一种类型 数据转换成另一种数据类型。 (3)能够使用相应的目标机器指令实现这种在上述类型上定 义的运算
实现和完成数据类型的合法性检查,它包括以下任务: (1) 检查运算符作用在运算对象上的合法性,这一合法性保 证了该运算能产生正确的运算结果。 (2) 根据程序设计语言运算符的类型转换规则,将一种类型 数据转换成另一种数据类型。 (3) 能够使用相应的目标机器指令实现这种在上述类型上定 义的运算
例:设有 Pasca程序段 var a, b: integer; x real begin read(a) b:=10 x =a mod b a:=a-×10 end
例:设有Pascal程序段 var a,b:integer; x:real; begin read(a); b:=10; x:=a mod b; a:=a-x*10 end;
对于读语句read(a)和赋值语句b:=10都满足简单的类型 检査。在赋值语句x:≡ a mod b中虽然 a mod b的结果是整型 的,但仍能满足将 a mod b的结果赋给实型变量ⅹ。这是因为 在 Pasca中定义了将整型转换成实型的转换规则,因而编译 程序需生成将 a mod b的结果转换成实型的指令代码。而对 于语句a:=a-x*10,虽然通过 Pascal定义的类型规则可以将a 转换成实型,求出ax*10的结果类型为实型,但 Pascal不允 许将实型赋给整型,则出错
对于读语句read(a)和赋值语句b:=10都满足简单的类型 检查。在赋值语句x:=a mod b中虽然a mod b的结果是整型 的,但仍能满足将a mod b的结果赋给实型变量x。这是因为 在Pascal中定义了将整型转换成实型的转换规则,因而编译 程序需生成将a mod b的结果转换成实型的指令代码。而对 于语句a:=a-x*10,虽然通过Pascal定义的类型规则可以将a 转换成实型,求出a-x*10的结果类型为实型,但Pascal不允 许将实型赋给整型,则出错