类型:类型是一个系统,由一组的集合&值集合上的操作组成的系统。
表示为type=(value-set,operator-set)
值只能进行操作集合中允许的操作。
一、简单的类型检查
1.一个简单的程序设计语言
它具有声明部分D和表达式部分E,并且先声明再引用。
2.表达式的类型检查
当声明语句被确定类型后,可执行语句中表达式E的类型可以如此检查
3.语句的类型检查
语句本身没有类型,用void作为语句的类型表达式。其中E作为条件判断应该是布尔类型的。
4.函数的类型检查
函数(->,function)函数也被看做一个类型,是定义域到值域的一个映射。若定义域类型为D,值域类型为R,则函数的类型表达式为D->R。当值域是T时,函数调用是一个表达式,否则函数调用是一个语句。将函数看作一个类型,则有
二、类型表达式的等价
1.结构等价
类型表达式结构等价当且仅当二者完全相等。以下算法用来判断两个类型表达式是否等价,实际上它模拟了两个表达式的语法树的遍历。
2.引入类型名的等价判别
在允许为类型命名的程序设计语言中,类型名被看做是一个基本类型表达式。
若每个类型名,作为一个可区分的类型出现在表达式中,并使得两个类型表达式完全相同,则称他们名字等价。
若将两个类型表达式中的所有名字,替换成用其定义的类型表达式后,两个类型表达式完全相同,则称他们结构等价。
可见名字等价是比较严格的等价。
3.单态的类型检查
(1) 确定一种类型等价方式:结构等价or名字等价
(2) 根据类型信息构造类型表达式。
(3) 判断表达式的类型等价,就是判断它们的类型表达式是否相等
三、多态函数的类型检查
1.多态函数
多态函数中,参数的类型可以是变量,该变量可以有无穷多个值,但所有类型均对应同一代码序列。
从语言结构的使用方式推断其类型,被称为类型推断
2.含多态语言的文法
多态函数与单态函数本质的区别就是形参不但可以是常量还可以是变量。扩充文法得到含有类型变量的类型定义
文法将原来的单态类型扩展为多态类型Q, Q除了包括T产生式的全部外,又引入了受约束的类型变量。同时T产生式中增加了类型变量,即将类型变量引入类型。