编译原理 类型检查5.ppt

上传人:少林足球 文档编号:4169219 上传时间:2019-10-25 格式:PPT 页数:166 大小:640.02KB
返回 下载 相关 举报
编译原理 类型检查5.ppt_第1页
第1页 / 共166页
编译原理 类型检查5.ppt_第2页
第2页 / 共166页
编译原理 类型检查5.ppt_第3页
第3页 / 共166页
编译原理 类型检查5.ppt_第4页
第4页 / 共166页
编译原理 类型检查5.ppt_第5页
第5页 / 共166页
点击查看更多>>
资源描述

《编译原理 类型检查5.ppt》由会员分享,可在线阅读,更多相关《编译原理 类型检查5.ppt(166页珍藏版)》请在三一文库上搜索。

1、第五章 类 型 检 查,本章内容 静态检查中最典型的部分 类型检查: 类型系统、类型检查、多态函数、重载 忽略其它的静态检查:控制流检查、唯一性检查、关联名字检查,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 介绍一些和程序运行有联系的概念,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 程序运行时的执行错误分成两类 会被捕获的错误(trapped error),5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 程序运行时的执行错误分成两类 会被捕获的错误(trapped error) 例:非法指令错误,5.1 类型在编程语言中的作用,5.1.1

2、 执行错误和安全语言 程序运行时的执行错误分成两类 会被捕获的错误(trapped error) 例:非法指令错误、非法内存访问,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 程序运行时的执行错误分成两类 会被捕获的错误(trapped error) 例:非法指令错误、非法内存访问、除数为零,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 程序运行时的执行错误分成两类 会被捕获的错误(trapped error) 例:非法指令错误、非法内存访问、除数为零 引起计算立即停止,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 程序运行时的执行错误分成

3、两类 会被捕获的错误(trapped error) 例:非法指令错误、非法内存访问、除数为零 引起计算立即停止 不会被捕获的错误(untrapped error),5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 程序运行时的执行错误分成两类 会被捕获的错误(trapped error) 例:非法指令错误、非法内存访问、除数为零 引起计算立即停止 不会被捕获的错误(untrapped error) 例:下标变量的访问越过了数组的末端,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 程序运行时的执行错误分成两类 会被捕获的错误(trapped error) 例:非法

4、指令错误、非法内存访问、除数为零 引起计算立即停止 不会被捕获的错误(untrapped error) 例:下标变量的访问越过了数组的末端 例:跳到一个错误的地址,该地址开始的内存正好代表一个指令序列,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 程序运行时的执行错误分成两类 会被捕获的错误(trapped error) 例:非法指令错误、非法内存访问、除数为零 引起计算立即停止 不会被捕获的错误(untrapped error) 例:下标变量的访问越过了数组的末端 例:跳到一个错误的地址,该地址开始的内存正好代表一个指令序列 错误可能会有一段时间未引起注意,5.1 类型在编

5、程语言中的作用,5.1.1 执行错误和安全语言 良行为的程序 不同场合对良行为的定义略有区别 例如,没有任何不会被捕获错误的程序,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 良行为的程序 不同场合对良行为的定义略有区别 例如,没有任何不会被捕获错误的程序 安全语言 任何合法程序都是良行为的,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 良行为的程序 不同场合对良行为的定义略有区别 例如,没有任何不会被捕获错误的程序 安全语言 任何合法程序都是良行为的 通常是设计一个类型系统,通过静态的类型检查来拒绝不会被捕获错误,5.1 类型在编程语言中的作用,5.1.1

6、 执行错误和安全语言 良行为的程序 不同场合对良行为的定义略有区别 例如,没有任何不会被捕获错误的程序 安全语言 任何合法程序都是良行为的 通常是设计一个类型系统,通过静态的类型检查来拒绝不会被捕获错误 但是,设计一个类型系统,它正好只拒绝不会被捕获错误是非常困难的,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 禁止错误(forbidden error) 不会被捕获错误集合 + 会被捕获错误的一个子集,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 禁止错误(forbidden error) 不会被捕获错误集合 + 会被捕获错误的一个子集 为语言设计类型系统的

7、目标是在排除禁止错误,5.1 类型在编程语言中的作用,5.1.1 执行错误和安全语言 禁止错误(forbidden error) 不会被捕获错误集合 + 会被捕获错误的一个子集 为语言设计类型系统的目标是在排除禁止错误 良行为程序和安全语言也可基于禁止错误来定义,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 类型化的语言 变量的类型 变量在程序执行期间的取值范围,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 类型化的语言 变量的类型 类型化的语言 变量都被给定类型的语言 并且表达式、语句等语法构造的类型都是可以静态确定的 例如,类型boolean的变量x

8、在程序每次运行时的值只能是布尔值,not (x)总有意义,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 类型化的语言 变量的类型 类型化的语言 未类型化的语言 不限制变量值范围的语言: 一个运算可以作用到任意的运算对象,其结果可能是一个有意义的值、一个错误、一个异常或一个语言未加定义的结果 例如:LISP语言,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 类型化的语言 变量的类型 类型化的语言 未类型化的语言 显式类型化语言 类型是语法的一部分,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 类型化的语言 变量的类型 类型化的语言 未类

9、型化的语言 显式类型化语言 隐式类型化的语言 不存在隐式类型化的主流语言,但可能存在忽略类型信息的程序片段,例如不需要程序员声明函数的参数类型,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 类型系统 语言的组成部分,由一组定型规则(typing rule)构成,这组规则用来给各种语言构造指派类型,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 类型系统 语言的组成部分,由一组定型规则(typing rule)构成,这组规则用来给各种语言构造指派类型 设计类型系统的根本目的是用静态检查的方式来保证合法程序运行时的良行为,5.1 类型在编程语言中的作用,5.1

10、.2 类型化语言和类型系统 类型系统 语言的组成部分,由一组定型规则(typing rule)构成,这组规则用来给各种语言构造指派类型 设计类型系统的根本目的是用静态检查的方式来保证合法程序运行时的良行为 类型系统的形式化 类型表达式、定型断言、定型规则,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 类型系统 语言的组成部分,由一组定型规则(typing rule)构成,这组规则用来给各种语言构造指派类型 设计类型系统的根本目的是用静态检查的方式来保证合法程序运行时的良行为 类型系统的形式化 类型表达式、定型断言、定型规则 类型检查算法 通常是静态地完成类型检查,5.1 类

11、型在编程语言中的作用,5.1.2 类型化语言和类型系统 良类型的程序 没有类型错误的程序,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 良类型的程序 没有类型错误的程序 合法程序 良类型程序(若语言定义中无其它方式表示的约束),5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 良类型的程序 没有类型错误的程序 合法程序 良类型程序(若语言定义中无其它方式表示的约束) 类型可靠(type sound)的语言 所有良类型程序(合法程序)都是良行为的 类型可靠的语言一定是安全的语言,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 语法的和静态的概

12、念 动态的概念 类型化语言 安全语言 良类型程序 良行为的程序,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 未类型化语言 可以通过彻底的运行时详细检查来排除所有的禁止错误 如LISP语言,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 未类型化语言 可以通过彻底的运行时详细检查来排除所有的禁止错误 如LISP语言 类型化语言 类型检查也可以放在运行时完成,但影响效率 一般都是静态检查,类型系统被用来支持静态检查 静态检查语言通常也需要一些运行时的检查 数组访问越界检查,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 实际使用的一些语言并

13、不安全 禁止错误集合没有囊括所有不会被捕获的错误 Pascal语言 无标志的变体记录类型 函数型参数,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 实际使用的一些语言并不安全 禁止错误集合没有囊括所有不会被捕获的错误 Pascal语言 用C语言的共用体(union)来举例 union U int u1; int u2; u; int p; u.u1 = 10; p = u.u2; p = 0;,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 实际使用的一些语言并不安全 C语言 还有很多不安全的并且被广泛使用的特征,如: 指针算术运算、类型强制、参数个数可变

14、,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 实际使用的一些语言并不安全 C语言 还有很多不安全的并且被广泛使用的特征,如: 指针算术运算、类型强制、参数个数可变 在语言设计的历史上,安全性考虑不足是因为强调代码的执行效率,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 实际使用的一些语言并不安全 C语言 还有很多不安全的并且被广泛使用的特征,如: 指针算术运算、类型强制、参数个数可变 在语言设计的历史上,安全性考虑不足是因为强调代码的执行效率 在现代语言设计上,安全性的位置越来越重要,5.1 类型在编程语言中的作用,5.1.2 类型化语言和类型系统 实

15、际使用的一些语言并不安全 C语言 还有很多不安全的并且被广泛使用的特征,如: 指针算术运算、类型强制、参数个数可变 在语言设计的历史上,安全性考虑不足是因为强调代码的执行效率 在现代语言设计上,安全性的位置越来越重要 C的一些问题已经在C+中得以缓和 更多一些问题在Java中已得到解决,5.1 类型在编程语言中的作用,5.1.3 类型化语言的优点 从工程的观点看,类型化语言有下面一些优点 开发的实惠 较早发现错误 类型信息还具有文档作用,5.1 类型在编程语言中的作用,5.1.3 类型化语言的优点 从工程的观点看,类型化语言有下面一些优点 开发的实惠 较早发现错误 类型信息还具有文档作用 编译

16、的实惠 程序模块可以相互独立地编译,5.1 类型在编程语言中的作用,5.1.3 类型化语言的优点 从工程的观点看,类型化语言有下面一些优点 开发的实惠 较早发现错误 类型信息还具有文档作用 编译的实惠 程序模块可以相互独立地编译 运行的实惠 可得到更有效的空间安排和访问方式,5.2 描述类型系统的语言,类型系统主要用来说明编程语言的定型规则,它独立于类型检查算法,5.2 描述类型系统的语言,类型系统主要用来说明编程语言的定型规则,它独立于类型检查算法 定义一个类型系统,一种重要的设计目标是存在有效的类型检查算法,5.2 描述类型系统的语言,类型系统主要用来说明编程语言的定型规则,它独立于类型检

17、查算法 定义一个类型系统,一种重要的设计目标是存在有效的类型检查算法 类型系统的基本概念可用于各类语言,包括函数式语言、命令式语言和并行语言等,5.2 描述类型系统的语言,类型系统主要用来说明编程语言的定型规则,它独立于类型检查算法 定义一个类型系统,一种重要的设计目标是存在有效的类型检查算法 类型系统的基本概念可用于各类语言,包括函数式语言、命令式语言和并行语言等 本节讨论用形式方法来描述类型系统,5.2 描述类型系统的语言,类型系统主要用来说明编程语言的定型规则,它独立于类型检查算法 定义一个类型系统,一种重要的设计目标是存在有效的类型检查算法 类型系统的基本概念可用于各类语言,包括函数式

18、语言、命令式语言和并行语言等 本节讨论用形式方法来描述类型系统 然后讨论实例语言时:先定义语法,再给出类型系统的形式描述,最后写出类型检查的翻译方案,5.2 描述类型系统的语言,类型系统的形式化 类型系统是一种逻辑系统 有关自然数的逻辑系统 - 自然数表达式(需要定义它的语法) a+b, 3 - 良形公式 (逻辑断言,需要定义它的语法) a+b=3, (d=3)(c10) - 推理规则,5.2 描述类型系统的语言,类型系统的形式化 类型系统是一种逻辑系统 有关自然数的逻辑系统 类型系统 - 自然数表达式 类型表达式 a+b, 3 int int - 良形公式 a+b=3, (d=3)(c10)

19、 - 推理规则,5.2 描述类型系统的语言,类型系统的形式化 类型系统是一种逻辑系统 有关自然数的逻辑系统 类型系统 - 自然数表达式 类型表达式 a+b, 3 int int - 良形公式 定型断言 a+b=3, (d=3)(c10) x:int | x+3 : int - 推理规则 ( x:int 叫做定型环境 ),5.2 描述类型系统的语言,类型系统的形式化 类型系统是一种逻辑系统 有关自然数的逻辑系统 类型系统 - 自然数表达式 类型表达式 a+b, 3 int int - 良形公式 定型断言 a+b=3, (d=3)(c10) x:int | x+3 : int - 推理规则 定型规

20、则,5.2 描述类型系统的语言,类型系统的形式化 类型表达式 具体语法:出现在编程语言及定型断言中 抽象语法:出现在类型检查的实现中 下一节开始举例 定型断言 本节讨论它的一般形式 定型规则 本节讨论它的一般形式,5.2 描述类型系统的语言,5.2.1 断言 断言的形式 | S S的所有自由变量都声明在中 其中 是一个静态定型环境,如x1:T1, , xn:Tn S的形式随断言形式的不同而不同 断言有三种具体形式,5.2 描述类型系统的语言,环境断言 | 该断言表示是良形的环境 将用推理规则来定义环境的语法(而不是用文法),5.2 描述类型系统的语言,环境断言 | 该断言表示是良形的环境 将用

21、推理规则来定义环境的语法 语法断言 | nat 在环境下,nat是类型表达式 将用推理规则来定义类型表达式的语法(而不是用文法),5.2 描述类型系统的语言,环境断言 | 该断言表示是良形的环境 将用推理规则来定义环境的语法 语法断言 | nat 在环境下,nat是类型表达式 将用推理规则来定义类型表达式的语法 定型断言 | M : T 在环境下, M具有类型T 例: | true : boolean x : nat | x+1 : nat 将用推理规则来确定语法构造实例的类型,5.2 描述类型系统的语言,有效断言 | true : boolean 无效断言 | true : nat,5.2

22、描述类型系统的语言,5.2.2 推理规则 习惯表示法 前提、结论 公理、推理规则,5.2 描述类型系统的语言,5.2.2 推理规则 (规则名) (注释) 推理规则 (注释) 环境规则 (Env ),5.2 描述类型系统的语言,5.2.2 推理规则 (规则名) (注释) 推理规则 (注释) 环境规则 (Env ) 语法规则 (Type Bool),5.2 描述类型系统的语言,5.2.2 推理规则 (规则名) (注释) 推理规则 (注释) 环境规则 (Env ) 语法规则 (Type Bool) 定型规则 (Val +),5.2 描述类型系统的语言,5.2.3 类型检查和类型推断 类型检查 用语法

23、制导的方式,根据上下文有关的定型规则来判定程序构造是否为良类型的程序构造的过程,5.2 描述类型系统的语言,5.2.3 类型检查和类型推断 类型检查 用语法制导的方式,根据上下文有关的定型规则来判定程序构造是否为良类型的程序构造的过程 类型推断 类型信息不完全的情况下的定型判定问题 例如:f (x : t) = E 和 f (x) = E的区别,5.3 简单类型检查器的说明,5.3.1 一个简单的语言 P D ; S D D ; D | id : T T boolean | integer | array num of T | T | T T S id := E | if E then S |

24、 while E do S | S ; S E truth | num | id | E mod E | E E | E | E (E ),5.3 简单类型检查器的说明,例: i : integer; j : integer; j := i mod 2000,5.3 简单类型检查器的说明,5.3.2 类型系统 环境规则 (Env ) (Decl Var) 其中id : T是该简单语言的一个声明语句 略去了基于程序中所有声明语句来构成整个的规则,5.3 简单类型检查器的说明,语法规则 (Type Bool) (Type Int) (Type Void) void用于表示语句类型 表明编程语言和定

25、型断言的类型表达式并非完全一致,5.3 简单类型检查器的说明,语法规则 (Type Ref) (T void) (Type Array) (T void) (N0) (Type Function) (T1, T2 void) 定型断言中的类型表达式也可以用抽象语法,5.3 简单类型检查器的说明,定型规则表达式 (Exp Truth) (Exp Num) (Exp Id),5.3 简单类型检查器的说明,定型规则表达式 (Exp Mod) (Exp Index) (0 E2 N1) (Exp Deref),5.3 简单类型检查器的说明,定型规则表达式 (Exp FunCall),5.3 简单类型检

26、查器的说明,定型规则语句 (State Assign)( T=boolean or T= integer) (State If) (State While),5.3 简单类型检查器的说明,定型规则语句 (State Seq),5.3 简单类型检查器的说明,5.3.3 类型检查 设计语法制导的类型检查器 设计依据是上节的类型系统 类型环境的信息进入符号表 对类型表达式采用抽象语法 具体:array N of T 抽象:array (N, T) T pointer (T) 考虑到报错的需要,增加了类型type_error,5.3 简单类型检查器的说明,5.3.3 类型检查声明语句 D D; D D

27、 id : T addtype (id.entry, T.type) addtype:把类型信息填入符号表,5.3 简单类型检查器的说明,5.3.3 类型检查声明语句 D D; D D id : T addtype (id.entry, T.type) T boolean T.type = boolean T integer T.type = integer T T1 T.type = pointer(T1.type),5.3 简单类型检查器的说明,5.3.3 类型检查声明语句 D D; D D id : T addtype (id.entry, T.type) T boolean T.typ

28、e = boolean T integer T.type = integer T T1 T.type = pointer(T1.type) T array num of T1 T.type = array(num.val, T1.type),5.3 简单类型检查器的说明,5.3.3 类型检查声明语句 D D; D D id : T addtype (id.entry, T.type) T boolean T.type = boolean T integer T.type = integer T T1 T.type = pointer(T1.type) T array num of T1 T.t

29、ype = array(num.val, T1.type) T T1 T2 T.type = T1.type T2.type ,5.3 简单类型检查器的说明,类型检查表达式 E truth E.type = boolean E num E.type = integer E id E.type = lookup(id.entry),5.3 简单类型检查器的说明,类型检查表达式 E truth E.type = boolean E num E.type = integer E id E.type = lookup(id.entry) E E1 mod E2 E.type = if E1.type

30、= integer and E2. type = integer then integer else type_error ,5.3 简单类型检查器的说明,类型检查表达式 E E1 E2 E.type = if E2. type = integer and E1. type = array(s, t) then t else type_error ,5.3 简单类型检查器的说明,类型检查表达式 E E1 E2 E.type = if E2. type = integer and E1. type = array(s, t) then t else type_error E E1 E.type

31、= if E1.type = pointer(t) then t else type_error ,5.3 简单类型检查器的说明,类型检查表达式 E E1 E2 E.type = if E2. type = integer and E1. type = array(s, t) then t else type_error E E1 E.type = if E1.type = pointer(t) then t else type_error E E1 (E2 ) E. type = if E2 . type = s and E1. type = s t then t else type_err

32、or ,5.3 简单类型检查器的说明,类型检查语句 S id := E if (id.type = E.type ,5.3 简单类型检查器的说明,类型检查语句 S id := E if (id.type = E.type S if E then S1 S. type = if E. type = boolean then S1. type else type_error ,5.3 简单类型检查器的说明,类型检查语句 S while E do S1 S.type = if E.type = boolean then S1. type else type_error ,5.3 简单类型检查器的说明

33、,类型检查语句 S while E do S1 S.type = if E.type = boolean then S1. type else type_error S S1; S2 S. type = if S1. type = void and S2. type = void then void else type_error ,5.3 简单类型检查器的说明,类型检查程序 P D; S P. type = if S. type = void then void else type_error ,5.3 简单类型检查器的说明,5.3.4 类型转换 E E1 op E2 E.type = if

34、 E1.type = integer and E2.type = integer then integer else if E1.type = integer and E2.type = real then real else if E1.type = real and E2.type = integer then real else if E1.type = real and E2.type = real then real else type_error ,5.4 多 态 函 数,5.4.1 为什么要使用多态函数 例:用Pascal语言写不出求表长度的通用程序 type link = ce

35、ll ; cell = record info : integer; next : link end;,5.4 多 态 函 数,function length(lptr : link) : integer; var len : integer; begin len := 0; while lptr nil do begin len := len + 1; lptr := lptr. next end; length := len end;,5.4 多 态 函 数,用ML语言很容易写出求表长度的程序而不必管表元的类型。 fun length (lptr) = if null (lptr) the

36、n 0 else length (tl (lptr) + 1;,5.4 多 态 函 数,用ML语言很容易写出求表长度的程序而不必管表元的类型。 fun length (lptr) = if null (lptr) then 0 else length (tl (lptr) + 1; length ( “sun”, “mon”, “tue” ) length ( 10, 9, 8 ) 都等于3,5.4 多 态 函 数,多态函数 允许变元有不同的类型,5.4 多 态 函 数,多态函数 允许变元有不同的类型 体中的语句可以在变元类型不同的情况下执行(区别于重载的特征),5.4 多 态 函 数,多态函

37、数 允许变元有不同的类型 体中的语句可以在变元类型不同的情况下执行(区别于重载的特征) 多态算符 用于以不同类型的变元执行的代码段,5.4 多 态 函 数,多态函数 允许变元有不同的类型 体中的语句可以在变元类型不同的情况下执行(区别于重载的特征) 多态算符 用于以不同类型的变元执行的代码段 例如:数组索引,5.4 多 态 函 数,多态函数 允许变元有不同的类型 体中的语句可以在变元类型不同的情况下执行(区别于重载的特征) 多态算符 用于以不同类型的变元执行的代码段 例如:数组索引、函数作用,5.4 多 态 函 数,多态函数 允许变元有不同的类型 体中的语句可以在变元类型不同的情况下执行(区别

38、于重载的特征) 多态算符 用于以不同类型的变元执行的代码段 例如:数组索引、函数作用、通过指针间接访问,5.4 多 态 函 数,多态函数 允许变元有不同的类型 体中的语句可以在变元类型不同的情况下执行(区别于重载的特征) 多态算符 用于以不同类型的变元执行的代码段 例如:数组索引、函数作用、通过指针间接访问 C语言手册中关于指针&的论述是: 如果运算对象的类型是,那么结果类型是指向的指针”,5.4 多 态 函 数,5.4.2 类型变量 length的类型可以写成.list() integer 允许使用类型变量,还便于讨论未知类型 在不要求标识符的声明先于使用的语言中,通过类型变量的使用去确定程

39、序变量的类型,5.4 多 态 函 数,例: function deref (p); begin return p end;,5.4 多 态 函 数,例: function deref (p); - 对p的类型一无所知: begin return p end;,5.4 多 态 函 数,例: function deref (p); - 对p的类型一无所知: begin return p - = pointer( ) end;,5.4 多 态 函 数,例: function deref (p); - 对p的类型一无所知: begin return p - = pointer( ) end; dere

40、f的类型是. pointer( ) ,5.4 多 态 函 数,5.4.3 一个含多态函数的语言 P D; E 引入类型变量、笛卡 D D; D | id : Q 儿积类型、多态函数 Q type-variable. Q | T T T T | T T | unary-constructor ( T ) | basic-type | type-variable | ( T ) E E (E ) | E, E | id,5.4 多 态 函 数,5.4.3 一个含多态函数的语言 P D; E 引入类型变量、笛卡 D D; D | id : Q 儿积类型、多态函数 Q type-variable. Q

41、 | T T T T | T T 这是一个抽象语言, | unary-constructor ( T ) 忽略了函数定义的 | basic-type 函数体 | type-variable | ( T ) E E (E ) | E, E | id,5.4 多 态 函 数,5.4.3 一个含多态函数的语言 P D; E D D; D | id : Q Q type-variable. Q | T T T T | T T | unary-constructor ( T ) 一个程序: | basic-type deref : . pointer( ) ; | type-variable q : p

42、ointer (pointer (integer); | ( T ) deref (deref (q) E E (E ) | E, E | id,5.4 多 态 函 数,类型系统中增加的推理规则 环境规则 (Env Var) 语法规则 (Type Var) (Type Product),5.4 多 态 函 数,类型系统中增加的推理规则 语法规则 (Type Parenthesis) (Type Forall) (Type Fresh),5.4 多 态 函 数,类型系统中增加的推理规则 定型规则 (Exp Pair) (Exp FunCall) (S是T1和T3的最一般的合一代换),5.4 多

43、态 函 数,5.4.4 代换、实例和合一 代换: 类型表达式中的类型变量用其所代表的类型表达式去替换,5.4 多 态 函 数,5.4.4 代换、实例和合一 代换: 类型表达式中的类型变量用其所代表的类型表达式去替换 function subst (t : type_expression ) : type_expression; begin if t是基本类型 then return t else if t是类型变量then return S(t) else if t 是t1 t2 then return subst(t1) subst(t2) end,5.4 多 态 函 数,实例 把subst

44、函数用于t后所得的类型表达式是t的一个实例,用S (t)表示。 例子(s t 表示s是t 的实例) pointer( integer ) pointer( ) pointer( real ) pointer( ) integer integer pointer( ) ,5.4 多 态 函 数,下面左边的类型表达式不是右边的实例 integer real 代换不能用于基本类型 integer real 的代换不一致 integer 的所有出现都应该代换,5.4 多 态 函 数,合一 如果存在某个代换S使得S(t1) = S(t2),那么这两个表达式t1和t2能够合一 最一般的合一代换 S(t1)

45、 = S(t2); 对任何其它满足S(t1) = S(t2)的代换S,代换S(t1)是S(t1)的实例,5.4 多 态 函 数,5.4.5 多态函数的类型检查 多态函数和普通函数在类型检查上的区别 (1)同一多态函数的不同出现无须变元有相同类型,5.4 多 态 函 数,(2)必须把类型相同的概念推广到类型合一,5.4 多 态 函 数,(2)必须把类型相同的概念推广到类型合一 (3)要记录类型表达式合一的结果,5.4 多 态 函 数,检查多态函数的翻译方案 EE1 (E2 ) p = mkleaf (newtypevar); unify (E1. type, mknode ( , E2.type

46、, p) ); E. type = p E E1, E2 E. type = mknode ( , E1.type , E2.type) E id E. type = fresh (lookup(id.entry),5.4 多 态 函 数,5.4 多 态 函 数,确定表长度的ML函数 fun length (lptr) = if null (lptr) then 0 else length (tl (lptr) + 1;,5.4 多 态 函 数,length : ; lptr : ; if : . boolean ; null : . list () boolean ; tl : . list

47、 () list () ; 0 : integer ; 1 : integer ; + : integer integer integer ; match : . ; match ( length (lptr), if (null (lptr), 0, length (tl(lptr) +1) ),5.4 多 态 函 数,5.4 多 态 函 数,5.4 多 态 函 数,5.4 多 态 函 数,fun length (lptr) = if null (lptr) then 0 else length (tl (lptr) + 1; length函数的类型是 . list() integer,5.5 类型表达式的等价,当允许对类型表达式命名后: 类型表达式是否相同就有了不同的解释 出现了结构等价和名字等价两个不同的概念 type link = cell; var next : link; last : link; p : cell; q, r : cell;,5.5 类型表达式的等价,5.5.1 类型表达式的结构等价 两个类型表达式完全相同(当无类型名时) type link = cell; var next : link; last : link; p : cell; q,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1