检查二个类型是结构等价,只要二个类型结构树或无环 有向图相等即可。检査类型等价也分成静态检查和动态检查 由编译程序能完成的类型检査叫做静态类型检査;由目标程 序运行时所作的类型检查就称为动态类型检査。一般地,如 果要在生成的目标代码中完成类型检査,则目标代中不但要 保存数据的值,而且还保存该数据的类型,则可完工成相应 的动态类型检查。因算法语言的类型检査多数是静态的类型 检査,在这里仅介绍了静态的类型检查
检查二个类型是结构等价,只要二个类型结构树或无环 有向图相等即可。检查类型等价也分成静态检查和动态检查。 由编译程序能完成的类型检查叫做静态类型检查;由目标程 序运行时所作的类型检查就称为动态类型检查。一般地,如 果要在生成的目标代码中完成类型检查,则目标代中不但要 保存数据的值,而且还保存该数据的类型,则可完工成相应 的动态类型检查。因算法语言的类型检查多数是静态的类型 检查,在这里仅介绍了静态的类型检查
7.1.2数据结构 种程序设计语言如允许使用的数组、记录、集合、字 符串、表、栈等形式的数据结构,在编译程序中应为它们提 供相应的翻译。为了能对这些数据结构中的元素的引用,编 译程序必须完成从这些数据的逻辑结构到访问这些数据元素 的物理结构的映射 使用上述数据结构应考虑: (1)映射算法相对简单,根据逻辑结构容易计算出物理地址 (2)从逻辑结构投影到物理结构时,不至于越界或存储溢出。 (3)使用的数据结构承担这种程序设计语言的主要功能 (4)在这些数据结构上定义的运算
7.1.2 数据结构 一种程序设计语言如允许使用的数组、记录、集合、字 符串、表、栈等形式的数据结构,在编译程序中应为它们提 供相应的翻译。为了能对这些数据结构中的元素的引用,编 译程序必须完成从这些数据的逻辑结构到访问这些数据元素 的物理结构的映射。 使用上述数据结构应考虑: (1) 映射算法相对简单,根据逻辑结构容易计算出物理地址。 (2) 从逻辑结构投影到物理结构时,不至于越界或存储溢出。 (3) 使用的数据结构承担这种程序设计语言的主要功能。 (4) 在这些数据结构上定义的运算
例:设有类 Pascal程序段 program example(input, output) type student=record no integer name: array[1.10] of char; score: Integer end weekday=(sun, mon, tue, wed, thu, fri, sat) var st: array[1.50] of student day. weekday, integer begin today: = sun st[ no: =30: st[]. name: =wang fang end
例:设有类Pascal程序段 program example(input,output); type student=record no:integer; name:array[1..10] of char; score:integer end; weekday=(sun,mon,tue,wed,thu,fri,sat); var st:array[1..50] of student; day:weekday; i,j:integer; begin today:= sun; i:=1; st[i].no:=30; st[i].name:=’wang fang’ …… end
从上可以看出,st是一个记录型的数组,它首先通过数 组的映射计算出s坷的地址,然后再通过记录的映射分别计 算出n和 st[name的地址。对于枚举类型的数据 thu fri, sat 述它们的 的数据上的运算。对于字符串s订name考虑是否允许整体 赋值和字符串是否允许连接等运算,运算后的结果到存储器 中。连接后的结果如超出字符串设定的长度,如何强制或报 错。 如要实现一个“栈”的数据类型,就应该考虑是查设置 栈的最大容量,栈上的运算如:push和pop栈元素所允许 的数据类型,如栈元素的类型允许是数组、记录、集合、字 符串,但不能是表或栈。还要考虑如何将栈顶映射的物理存 储空间。如设定静态的定长的栈空间用指针或下标指示当前 虔顶或设定不定长的动态空间当入栈时申请存储空间,出栈 时返回存储空间
从上可以看出,st是一个记录型的数组,它首先通过数 组的映射计算出st[i]的地址,然后再通过记录的映射分别计 算出st[i].no 和 st[i].name的地址。对于枚举类型的数据 sun,mon,tue,wed,thu,fri,sat如何描述它们的值和在枚举类型 的数据上的运算。对于字符串st[i].name应考虑是否允许整体 赋值和字符串是否允许连接等运算,运算后的结果到存储器 中。连接后的结果如超出字符串设定的长度,如何强制或报 错。 如要实现一个“栈”的数据类型,就应该考虑是否设置 栈的最大容量,栈上的运算如:push和pop。栈元素所允许 的数据类型,如栈元素的类型允许是数组、记录、集合、字 符串,但不能是表或栈。还要考虑如何将栈顶映射的物理存 储空间。如设定静态的定长的栈空间用指针或下标指示当前 栈顶或设定不定长的动态空间当入栈时申请存储空间,出栈 时返回存储空间
7.1.3作用域规则 个程序设计语言的作用域规则确定了该程序设计语言 的某个程序的不同程序块中所说明的标识符的可访问性。从 另一个角度来看,在程序中当访问一个标识符通过作用域规 则可确定究竟访问的是哪一个实体中说明的标识符。一般来 说一个程序设计语言的一个标识符或数据项的作用域是在说 明该标识符或数据项的程序块内,如 Pasca中的标识符的作 用域规则,叙述如下: (1)一个标识符的作用域是从该标识符的定义点开始至定义 该标识符的分程序结束为止,包含在这个分程序中的所有内 分程序,并遵循规则2。 (2)当一个标识符x在分程序A中被定义,在A所包含的分程序 B中又重新被定义,则分程序B以及包含在B中的所有分所出 的x不再是A中定义的x,而是B中定义的x
7.1.3 作用域规则 一个程序设计语言的作用域规则确定了该程序设计语言 的某个程序的不同程序块中所说明的标识符的可访问性。从 另一个角度来看,在程序中当访问一个标识符通过作用域规 则可确定究竟访问的是哪一个实体中说明的标识符。一般来 说一个程序设计语言的一个标识符或数据项的作用域是在说 明该标识符或数据项的程序块内,如Pascal中的标识符的作 用域规则,叙述如下: (1) 一个标识符的作用域是从该标识符的定义点开始至定义 该标识符的分程序结束为止,包含在这个分程序中的所有内 分程序,并遵循规则2。 (2) 当一个标识符x在分程序A中被定义,在A所包含的分程序 B中又重新被定义,则分程序B以及包含在B中的所有分所出 的x不再是A中定义的x,而是B中定义的x