【教学课件】第五章类型检查.ppt

上传人:牧羊曲112 文档编号:5662804 上传时间:2023-08-07 格式:PPT 页数:167 大小:459KB
返回 下载 相关 举报
【教学课件】第五章类型检查.ppt_第1页
第1页 / 共167页
【教学课件】第五章类型检查.ppt_第2页
第2页 / 共167页
【教学课件】第五章类型检查.ppt_第3页
第3页 / 共167页
【教学课件】第五章类型检查.ppt_第4页
第4页 / 共167页
【教学课件】第五章类型检查.ppt_第5页
第5页 / 共167页
点击查看更多>>
资源描述

《【教学课件】第五章类型检查.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第五章类型检查.ppt(167页珍藏版)》请在三一办公上搜索。

1、第五章 类 型 检 查,本章内容静态检查中最典型的部分 类型检查:类型系统、类型检查、多态函数、重载。忽略其它的静态检查:控制流检查、唯一性检查、关联名字检查。,5.1 类型在程序设计语言中的作用,5.1.1 引言变量的类型变量在程序执行期间的取值范围,5.1 类型在程序设计语言中的作用,5.1.1 引言变量的类型变量在程序执行期间的取值范围类型化语言变量都被给定类型的语言例如,类型Boolean的变量x在程序每次运行时的值只能是布尔值,not(x)总有意义。,5.1 类型在程序设计语言中的作用,5.1.1 引言变量的类型变量在程序执行期间的取值范围类型化语言变量都被给定类型的语言未类型化的语

2、言不限制变量值范围的语言,5.1 类型在程序设计语言中的作用,5.1.1 引言变量的类型变量在程序执行期间的取值范围类型化语言变量都被给定类型的语言未类型化的语言不限制变量值范围的语言一个运算可以作用到任意的运算对象,其结果可能是一个有意义的值、一个错误、一个异常或一个未做说明的结果。,5.1 类型在程序设计语言中的作用,5.1.1 引言变量的类型变量在程序执行期间的取值范围类型化语言变量都被给定类型的语言未类型化的语言不限制变量值范围的语言类型系统 由一组定型规则(typing rule)构成,这组规则用来给各种语言构造指派类型,5.1 类型在程序设计语言中的作用,类型系统的根本目的是防止程

3、序运行时出现执行错误,5.1 类型在程序设计语言中的作用,类型系统的根本目的是防止程序运行时出现执行错误类型可靠的语言粗略地说,所有程序运行时都没有执行错误出现,5.1 类型在程序设计语言中的作用,类型系统的根本目的是防止程序运行时出现执行错误类型可靠的语言粗略地说,所有程序运行时都没有执行错误出现类型系统的形式化类型表达式、定型断言、定型规则、类型检查算法,5.1 类型在程序设计语言中的作用,类型系统的根本目的是防止程序运行时出现执行错误类型可靠的语言粗略地说,所有程序运行时都没有执行错误出现类型系统的形式化类型表达式、定型断言、定型规则、类型检查算法显式类型化的语言类型是语法的一部分,5.

4、1 类型在程序设计语言中的作用,类型系统的根本目的是防止程序运行时出现执行错误类型可靠的语言粗略地说,所有程序运行时都没有执行错误出现类型系统的形式化类型表达式、定型断言、定型规则、类型检查算法显式类型化的语言类型是语法的一部分隐式类型化的语言,5.1 类型在程序设计语言中的作用,执行错误和安全语言执行错误会被捕获的错误(trapped error),5.1 类型在程序设计语言中的作用,执行错误和安全语言执行错误会被捕获的错误(trapped error)例:非法指令错误,5.1 类型在程序设计语言中的作用,执行错误和安全语言执行错误会被捕获的错误(trapped error)例:非法指令错误

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

6、错误会被捕获的错误(trapped error)例:非法指令错误、非法内存访问、除数为零引起计算立即停止不会被捕获的错误(untrapped error)例:下标变量的访问越过数组末端的数据,5.1 类型在程序设计语言中的作用,执行错误和安全语言执行错误会被捕获的错误(trapped error)例:非法指令错误、非法内存访问、除数为零引起计算立即停止不会被捕获的错误(untrapped error)例:下标变量的访问越过数组末端的数据例:跳到一个错误的地址,该地址开始的内存正好代表一个指令序列,5.1 类型在程序设计语言中的作用,执行错误和安全语言执行错误会被捕获的错误(trapped er

7、ror)例:非法指令错误、非法内存访问、除数为零引起计算立即停止不会被捕获的错误(untrapped error)例:下标变量的访问越过数组末端的数据例:跳到一个错误的地址,该地址开始的内存正好代表一个指令序列 错误可能会有一段时间未引起注意,5.1 类型在程序设计语言中的作用,安全语言任何程序不出现不会被捕获错误,5.1 类型在程序设计语言中的作用,安全语言任何程序不出现不会被捕获错误禁止错误(forbidden error)不会被捕获错误集合+会被捕获错误的一个子集。,5.1 类型在程序设计语言中的作用,安全语言任何程序不出现不会被捕获错误禁止错误(forbidden error)不会被捕

8、获错误集合+会被捕获错误的一个子集。类型化语言的目标是在排除禁止错误,5.1 类型在程序设计语言中的作用,安全语言任何程序不出现不会被捕获错误禁止错误(forbidden error)不会被捕获错误集合+会被捕获错误的一个子集。类型化语言的目标是在排除禁止错误良行为的程序:不出现任何禁止错误有不良行为的程序:出现禁止错误,5.1 类型在程序设计语言中的作用,类型可靠的语言 所有合法的程序都是良行为的,5.1 类型在程序设计语言中的作用,类型可靠的语言 所有合法的程序都是良行为的 又称为强检查的语言,5.1 类型在程序设计语言中的作用,类型可靠的语言 所有合法的程序都是良行为的 又称为强检查的语

9、言 未类型化语言通过彻底的运行时详细检查来排除所有的禁止错误,如LISP语言,5.1 类型在程序设计语言中的作用,类型可靠的语言 所有合法的程序都是良行为的 又称为强检查的语言 未类型化语言通过彻底的运行时详细检查来排除所有的禁止错误,如LISP语言 也可以通过静态检查来拒绝不良行为的程序,5.1 类型在程序设计语言中的作用,类型可靠的语言 所有合法的程序都是良行为的 又称为强检查的语言 未类型化语言通过彻底的运行时详细检查来排除所有的禁止错误,如LISP语言 也可以通过静态检查来拒绝不良行为的程序 类型系统就是用来支持这种静态检查的,5.1 类型在程序设计语言中的作用,类型可靠的语言 所有合

10、法的程序都是良行为的 又称为强检查的语言 未类型化语言通过彻底的运行时详细检查来排除所有的禁止错误,如LISP语言 也可以通过静态检查来拒绝不良行为的程序 类型系统就是用来支持这种静态检查的 这种检查叫做类型检查,5.1 类型在程序设计语言中的作用,类型可靠的语言 所有合法的程序都是良行为的 又称为强检查的语言 未类型化语言通过彻底的运行时详细检查来排除所有的禁止错误,如LISP语言 也可以通过静态检查来拒绝不良行为的程序 类型系统就是用来支持这种静态检查的 这种检查叫做类型检查 这样的类型化语言,又称强类型化的语言,5.1 类型在程序设计语言中的作用,类型可靠的语言良类型的程序:能够通过类型

11、检查的程序 不会出现不会被捕获错误(即是安全的),5.1 类型在程序设计语言中的作用,类型可靠的语言良类型的程序:能够通过类型检查的程序 不会出现不会被捕获错误(即是安全的)不会出现已列入禁止错误的会被捕获错误,5.1 类型在程序设计语言中的作用,类型可靠的语言良类型的程序:能够通过类型检查的程序 不会出现不会被捕获错误(即是安全的)不会出现已列入禁止错误的会被捕获错误 有可能出现其它的会被捕获错误,避免它们是程序员的责任,5.1 类型在程序设计语言中的作用,类型可靠的语言良类型的程序:能够通过类型检查的程序 不会出现不会被捕获错误(即是安全的)不会出现已列入禁止错误的会被捕获错误 有可能出现

12、其它的会被捕获错误,避免它们是程序员的责任静态检查的语言有ML和Pascal等,5.1 类型在程序设计语言中的作用,类型可靠的语言良类型的程序:能够通过类型检查的程序 不会出现不会被捕获错误(即是安全的)不会出现已列入禁止错误的会被捕获错误 有可能出现其它的会被捕获错误,避免它们是程序员的责任静态检查的语言有ML和Pascal等静态检查语言通常也需要一些运行时的测试,5.1 类型在程序设计语言中的作用,一些实际使用的语言是弱类型化语言Pascal语言 无标志的变体记录类型 函数型参数,5.1 类型在程序设计语言中的作用,联合体(union)的类型检查一般不可能在运行前完成,虽然下面这个例子是可

13、静态判断类型错误的。union U int u1;int u2;u;int p;u.u1=10;p=u.u2;p=0;,5.1 类型在程序设计语言中的作用,一些实际使用的语言是弱类型化语言Pascal语言 无标志的变体记录类型 函数型参数,5.1 类型在程序设计语言中的作用,一些实际使用的语言是弱类型化语言Pascal语言 无标志的变体记录类型 函数型参数C语言有很多不安全的并且被广泛使用的特征,如:指针算术运算 类型强制 参数个数可变,5.1 类型在程序设计语言中的作用,在语言设计的历史上,安全性考虑不足是出于效率上的原因,5.1 类型在程序设计语言中的作用,在语言设计的历史上,安全性考虑不

14、足是出于效率上的原因在语言设计中的,安全性的位置越来越重要 C的一些问题已经在C+中得以缓和 更多一些问题在Java中已得到解决 ML是一个类型化的安全语言,5.1 类型在程序设计语言中的作用,类型化语言的优点从工程的观点看,类型化语言有下面一些优点 开发的实惠较早发现错误类型信息还具有文档作用,5.1 类型在程序设计语言中的作用,类型化语言的优点从工程的观点看,类型化语言有下面一些优点 开发的实惠较早发现错误类型信息还具有文档作用 编译的实惠程序模块可以相互独立地编译,5.1 类型在程序设计语言中的作用,类型化语言的优点从工程的观点看,类型化语言有下面一些优点 开发的实惠较早发现错误类型信息

15、还具有文档作用 编译的实惠程序模块可以相互独立地编译 运行的实惠可得到更有效的空间安排和访问方式,5.2 描述类型系统的语言,类型系统主要用来说明程序设计语言的定型规则,它独立于类型检查算法。,5.2 描述类型系统的语言,类型系统主要用来说明程序设计语言的定型规则,它独立于类型检查算法。定义一个类型系统,通常的设计目标是允许有效的类型检查算法。,5.2 描述类型系统的语言,类型系统主要用来说明程序设计语言的定型规则,它独立于类型检查算法。定义一个类型系统,通常的设计目标是允许有效的类型检查算法。类型系统的基本概念可用于各类语言,包括函数式语言、命令式语言和并行语言等。,5.2 描述类型系统的语

16、言,类型系统主要用来说明程序设计语言的定型规则,它独立于类型检查算法。定义一个类型系统,通常的设计目标是允许有效的类型检查算法。类型系统的基本概念可用于各类语言,包括函数式语言、命令式语言和并行语言等。本节讨论用形式化的方法来描述类型系统,5.2 描述类型系统的语言,定型断言断言的形式|SS的所有自由变量都声明在中其中是一个静态定型环境,如x1:T1,xn:TnS的形式随断言形式的不同而不同断言有三种具体形式,5.2 描述类型系统的语言,环境断言:用于定义环境|是合式的环境,5.2 描述类型系统的语言,环境断言:用于定义环境|是合式的环境语法断言:用于规定类型表达式的语法|Nat在环境下,Na

17、t是一个类型表达式,5.2 描述类型系统的语言,环境断言:用于定义环境|是合式的环境语法断言:用于规定类型表达式的语法|Nat在环境下,Nat是一个类型表达式定型断言|M:TM在中具有类型T 例:|true:Boolx:Nat|x+1:Nat,5.2 描述类型系统的语言,有效断言|true:Bool无效断言|true:Nat,5.2 描述类型系统的语言,定型规则1|S1,.,n|Sn|S前提、结论、公理,5.2 描述类型系统的语言,定型规则1|S1,.,n|Sn|S前提、结论、公理(规则名)(注释)定型规则(注释),5.2 描述类型系统的语言,定型规则1|S1,.,n|Sn|S前提、结论、公理

18、(规则名)(注释)定型规则(注释)环境规则:(Env)|,5.2 描述类型系统的语言,定型规则1|S1,.,n|Sn|S前提、结论、公理(规则名)(注释)定型规则(注释)环境规则:(Env)|语法规则:(Type Bool)|Bool,5.2 描述类型系统的语言,定型规则1|S1,.,n|Sn|S前提、结论、公理(规则名)(注释)定型规则(注释)环境规则:(Env)|语法规则:(Type Bool)|Bool定型规则(Val+)|M:Nat,|N:Nat|M+N:Nat,5.2 描述类型系统的语言,类型检查和类型推断类型检查用语法制导的方式,根据上下文有关的定型规则来判定程序构造是否为良类型的

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

20、ger;j:=i mod 2000,5.3 简单类型检查器的说明,5.3.2 类型系统环境规则(Env)|(Decl Var)|T,id dom(),id:T|,5.3 简单类型检查器的说明,语法规则(Type Bool)|boolean(Type Int)|integer(Type Void)|void,5.3 简单类型检查器的说明,语法规则(Type Bool)|boolean(Type Int)|integer(Type Void)|void(Type Ref)|T|T,5.3 简单类型检查器的说明,语法规则(Type Bool)|boolean(Type Int)|integer(Ty

21、pe Void)|void(Type Ref)|T|T(Type Array)|T,|N:integer|array N of T,5.3 简单类型检查器的说明,语法规则(Type Bool)|boolean(Type Int)|integer(Type Void)|void(Type Ref)|T|T(Type Array)|T,|N:integer|array N of T(Type Function)|T1,|T2|T1 T2,5.3 简单类型检查器的说明,定型规则表达式(Exp Truth)|truth:boolean(Exp Num)|num:integer,5.3 简单类型检查器的

22、说明,定型规则表达式(Exp Truth)|truth:boolean(Exp Num)|num:integer(Exp Id)1,id:T,2|1,id:T,2|id:T,5.3 简单类型检查器的说明,定型规则表达式(Exp Truth)|truth:boolean(Exp Num)|num:integer(Exp Id)1,id:T,2|1,id:T,2|id:T(Exp Mod)|E1:integer,|E2:integer|E1 mod E2:integer,5.3 简单类型检查器的说明,定型规则表达式(Exp Index)|E1:arrayN of T,|E2:integer|E1E

23、2:T,5.3 简单类型检查器的说明,定型规则表达式(Exp Index)|E1:arrayN of T,|E2:integer|E1E2:T(Exp Deref)|E:T|E:T,5.3 简单类型检查器的说明,定型规则表达式(Exp Index)|E1:arrayN of T,|E2:integer|E1E2:T(Exp Deref)|E:T|E:T(Exp FunCall)|E1:T1 T2,|E2:T1|E1(E2):T2,5.3 简单类型检查器的说明,定型规则语句(State Assign)|id:T,|E:T|id:=E:void,5.3 简单类型检查器的说明,定型规则语句(Stat

24、e Assign)|id:T,|E:T|id:=E:void(State If)|E:boolean,|S:void|if E then S:void,5.3 简单类型检查器的说明,定型规则语句(State Assign)|id:T,|E:T|id:=E:void(State If)|E:boolean,|S:void|if E then S:void(State While)|E:boolean,|S:void|while E do S:void,5.3 简单类型检查器的说明,定型规则语句(State Assign)|id:T,|E:T|id:=E:void(State If)|E:bool

25、ean,|S:void|if E then S:void(State While)|E:boolean,|S:void|while E do S:void(State Seq)|S1:void,|S2:void|S1;S2:void,5.3 简单类型检查器的说明,定型规则程序(Prog)|S:void|D;S:void,5.3 简单类型检查器的说明,类型检查声明语句D D;DD id:T addtype(id.entry,T.type)T boolean T.type:=booleanT integer T.type:=integerT T1 T.type:=pointer(T1.type),

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

27、 T.type:=pointer(T1.type)T array num of T1 T.type:=array(num.val,T1.type)T T1 T2 T.type:=T1.type T2.type,5.3 简单类型检查器的说明,类型检查表达式E truthE.type:=boolean E numE.type:=integerE idE.type:=lookup(id.entry),5.3 简单类型检查器的说明,类型检查表达式E truthE.type:=boolean E numE.type:=integerE idE.type:=lookup(id.entry)E E1 mod

28、 E2E.type:=if E1.type=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:=if E

29、1.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_error,5.3 简单类型检查器的说明,类型检查语句S id:=E S.ty

30、pe:=if id.type=E.typethen void else type_error,5.3 简单类型检查器的说明,类型检查语句S id:=E S.type:=if id.type=E.typethen void else type_error S if E then S1 S.type:=if E.type=booleanthen S1.type else type_error,5.3 简单类型检查器的说明,类型检查语句S while E do S1S.type:=if E.type=boolean then S1.type else type_error,5.3 简单类型检查器的说

31、明,类型检查语句S while E do S1S.type:=if E.type=boolean then S1.type else type_error S S1;S2S.type:=if S1.type=void andS2.type=void then voidelse type_error,5.3 简单类型检查器的说明,类型检查程序P D;S P.type:=if S.type=void then voidelse type_error,5.3 简单类型检查器的说明,5.3.4 类型转换E E1 op E2E.type:=if E1.type=integer and E2.type=i

32、ntegerthen integerelse if E1.type=integer and E2.type=realthen realelse if E1.type=real and E2.type=integerthen realelse if E1.type=real and E2.type=realthen realelse type_error,5.4 多 态 函 数,5.4.1 为什么要使用多态函数例:用Pascal语言写不出求表长度的通用程序type link=cell;cell=record info:integer;next:link end;,5.4 多 态 函 数,func

33、tion length(lptr:link):integer;var len:integer;beginlen:=0;while lptr nil do begin len:=len+1;lptr:=lptr.nextend;length:=lenend;,5.4 多 态 函 数,用ML语言很容易写出求表长度的程序而不必管表元的类型。fun length(lptr)=if null(lptr)then 0else length(tl(lptr)+1;,5.4 多 态 函 数,用ML语言很容易写出求表长度的程序而不必管表元的类型。fun length(lptr)=if null(lptr)the

34、n 0else length(tl(lptr)+1;length(“sun”,“mon”,“tue”)length(10,9,8)都等于3,5.4 多 态 函 数,多态函数允许变元有不同的类型,5.4 多 态 函 数,多态函数允许变元有不同的类型体中的语句可以在变元类型不同的情况下执行(区别于重载的特征),5.4 多 态 函 数,多态函数允许变元有不同的类型体中的语句可以在变元类型不同的情况下执行(区别于重载的特征)多态算符以不同类型的变元执行的代码段,5.4 多 态 函 数,多态函数允许变元有不同的类型体中的语句可以在变元类型不同的情况下执行(区别于重载的特征)多态算符以不同类型的变元执行的

35、代码段例如:数组索引,5.4 多 态 函 数,多态函数允许变元有不同的类型体中的语句可以在变元类型不同的情况下执行(区别于重载的特征)多态算符以不同类型的变元执行的代码段例如:数组索引、函数作用,5.4 多 态 函 数,多态函数允许变元有不同的类型体中的语句可以在变元类型不同的情况下执行(区别于重载的特征)多态算符以不同类型的变元执行的代码段例如:数组索引、函数作用、通过指针间接访问,5.4 多 态 函 数,多态函数允许变元有不同的类型体中的语句可以在变元类型不同的情况下执行(区别于重载的特征)多态算符以不同类型的变元执行的代码段例如:数组索引、函数作用、通过指针间接访问C语言手册中关于指针&

36、的论述是:如果运算对象的类型是,那么结果类型是指向的指针”。,5.4 多 态 函 数,类型变量length的类型可以写成.list()integer 允许类型变量出现在类型表达式中,还便于我们讨论未知类型在不要求标识符的声明先于使用的语言中,通过类型变量的使用去确定程序变量的类型。,5.4 多 态 函 数,例:type link=cell;procedure mlist(lptr:link;procedure p);begin while lptr nil do beginp(lptr);lptr:=lptr.nextendend;,5.4 多 态 函 数,例:type link=cell;p

37、rocedure mlist(lptr:link;procedure p);begin while lptr nil do beginp(lptr);lptr:=lptr.nextendend;p的类型是link void,5.4 多 态 函 数,例:function deref(p);beginreturn pend;,5.4 多 态 函 数,例:function deref(p);-对p的类型一无所知:beginreturn pend;,5.4 多 态 函 数,例:function deref(p);-对p的类型一无所知:beginreturn p-=pointer()end;,5.4 多

38、 态 函 数,例:function deref(p);-对p的类型一无所知:beginreturn p-=pointer()end;deref的类型是.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;ED D;D|id:QQ type-variabl

39、e.Q|TT T T|T T|unary-constructor(T)|basic-type deref:.pointer();|type-variable q:pointer(pointer(integer);|(T)deref(deref(q)E E(E)|E,E|id,5.4 多 态 函 数,增加的推理规则 环境规则(Env Var)|,dom(),|语法规则(Type Var)1,2|1,2|(Type Product)|T1,|T2|T1 T2(Type Parenthesis)|T|(T)(Type Forall),|T|.T(Type Fresh)|.T,i|,i|i/T,5.4

40、 多 态 函 数,增加的推理规则定型规则(Exp Pair)|E1:T1,|E2:T2|E1,E2:T1 T2(Exp FunCall)|E1:T1 T2,|E2:T3|E1(E2):S(T2)(S是T1和T3的最一般的合一代换),5.4 多 态 函 数,代换、实例和合一代换:类型表达式中的类型变量用其所代表的类型表达式去替换,5.4 多 态 函 数,代换、实例和合一代换:类型表达式中的类型变量用其所代表的类型表达式去替换function subst(t:type_expression):type_expression;beginif t是基本类型 then return telse if t

41、是类型变量then return S(t)else if t 是t1 t2 then return subst(t1)subst(t2)end,5.4 多 态 函 数,实例把subst函数用于t后所得的类型表达式是t的一个实例,用S(t)表示。例子(s t 表示s是t 的实例)pointer(integer)pointer()pointer(real)pointer()integer integer pointer(),5.4 多 态 函 数,下面左边的类型表达式不是右边的实例integerreal 代换不能用于基本类型integer real 的代换不一致integer 的所有出现都应该代换

42、,5.4 多 态 函 数,合一如果存在某个代换S使得S(t1)=S(t2),那么这两个表达式t1和t2能够合一 最一般的合一代换S(t1)=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:=mk

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

44、);0:integer;1:integer;+:integer integer integer;match:.;match(length(lptr),if(null(lptr),0,length(t1(lptr)+1),5.4 多 态 函 数,5.4 多 态 函 数,5.4 多 态 函 数,5.4 多 态 函 数,fun length(lptr)=if null(lptr)then 0else length(tl(lptr)+1;length函数的类型是.list()integer,5.5 类型表达式的等价,当允许对类型表达式命名后:类型表达式是否相同就有了不同的解释出现了结构等价和名字等价两

45、个不同的概念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,r:cell;,5.5 类型表达式的等价,5.5.1 类型表达式的结构等价两个类型表达式完全相同(当无类型名时)类型表达式树一样type link=cell;var next:link;last:link;p:cell;q,r:cell;,5.5 类型表达式的等价,5.5.1 类型表

46、达式的结构等价两个类型表达式完全相同(当无类型名时)类型表达式树一样相同的类型构造器作用于相同的子表达式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,r:cell;,5.5 类型表达式的等价,类型表达式的结构等价测试sequiv(s,t)(无类型名时)if s 和 t 是相

47、同的基本类型thenreturn trueelse if s=array(s1,s2)and t=array(t1,t2)thenreturn sequiv(s1,t1)and sequiv(s2,t2)else if s=s1 s2 and t=t1 t2 thenreturn sequiv(s1,t1)and sequiv(s2,t2)else if s=pointer(s1)and t=pointer(t1)thenreturn sequiv(s1,t1)else if s=s1 s2 and t=t1 t2 thenreturn squiv(s1,t1)and sequiv(s2,t2

48、)else return false,5.5 类型表达式的等价,5.5.2 类型表达式的名字等价把每个类型名看成是一个可区别的类型type link=cell;var next:link;last:link;p:cell;q,r:cell;,5.5 类型表达式的等价,5.5.2 类型表达式的名字等价把每个类型名看成是一个可区别的类型两个类型表达式名字等价当且仅当这两个类型表达式不做名字代换就结构等价 type link=cell;var next:link;last:link;p:cell;q,r:cell;,5.5 类型表达式的等价,Pascal的许多实现用隐含的类型名和每个声明的标识符联系

49、起来 type link=cell;type link=cell;var next:link;np=cell;last:link;nqr=cell;p:cell;var next:link;q,r:cell;last:link;p:np;q:nqr;r:nqr;,5.5 类型表达式的等价,注意:类型名字的引入只是类型表达式的一个语法约定问题,它并不像引入类型构造器或类型变量那样能丰富我们所能表达的类型。,5.5 类型表达式的等价,5.5.3 记录类型(Type Record)(li是有区别的)|T1,|Tn|record(l1:T1,ln:Tn)(Val Record)(li是有区别的)|M1

50、:T1,|Mn:Tn|record(l1=M1,ln=Mn):record(l1:T1,ln:Tn)(Val Record Select)|M:record(l1:T1,ln:Tn)|M.lj:Tj(j 1.n),5.5 类型表达式的等价,5.5.4 类型表示中的环type link=cell;cell=recordinfo:integer;next:linkend;,5.5 类型表达式的等价,5.5.4 类型表示中的环type link=cell;cell=recordinfo:integer;next:linkend;,5.5 类型表达式的等价,C语言对除记录(结构)以外的所有类型使用结构

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号