【教学课件】第四章类型检查.ppt
《【教学课件】第四章类型检查.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第四章类型检查.ppt(51页珍藏版)》请在三一办公上搜索。
1、第四章 类型检查,类型检查属于语义的范畴,根据程序设计语言的要求,类型检查可以在编译时进行(静态语义),也可以在程序运行时进行(动态语义)。本章仅涉及静态语义。,静态语义检查:,类型检查:算符是否作用于类型不一致的运算对象;作用域检查:确定的名字是否在确定的范围内起作用(包括唯一性检查);控制流检查:控制是否合法地进入和离开(特别是离开)一个结构,如C语言中的break应该出现在while、for、switch等语句中,goto应转向合法的标号等;关联名字检查:相同的名字出现在不同的地方是否相关联,如function checker()is.begin.end checker;,类型检查的复杂
2、性:随着程序设计语言的发展,类型变得越来越丰富,从而使得类型检查越来越复杂。,本章的目的:,将类型检查的相关联问题,从静态语义中抽取出来,进行专门的讨论,重点讨论类型检查的基本原理和一般方法。,类型检查的基本思想:类型系统(立法)类型检查器(执法),41 类型简介,类型的发展是程序设计语言发展的重要因素之一,程序设计语言提供的强类型的保障机制,将程序中的类型错误降到最低,从而提高软件的可靠性。面向对象技术是类型发展的结果,为软件的重用提供了支持,并在提高软件可靠性的基础上提高了软件的可维护性。,参考文献:Luca Cardelli&Peter Wegner,On Understanding T
3、ypes,Data Abstruction,and Polymorphism,Computing Surveys,Vol.17,No.4.Dec.1985.Luca Cardelli,Type Systems,CRC press,Feb.2004,4.1.1 从不分类到类型,不分类:,无论是代码还是数据,均被认为是具有固定大小的bit string,即memory byte or word。代表代码还是数据?是整型数还是字符串?正确使用这些字或字节是程序设计人员的责任。根据字或字节所表示信息的用途和特性进行分类和管理,于是就有了类型的概念。,类型是由一个值的集合与值集合上的操作集合组成的系统(
4、value-set,operator-set)。,例如integer 是一个类型,在特定程序语言中可如下规定:(-32768,32767,+、-、*、/、.)因此,3.5、8.2、7/3、10000000等不是integer。引入类型的目的,是让程序设计语言(编译器)承担起对类型检查的责任。,4.1.2 静态类型与强类型,类型检查一般在编译时进行,但也有一些需要在运行时进行。编译时类型检查:var x:integer;y:boolean;y:=x;可以对赋值句 y:=x;进行静态类型检查:A id:=E if id.typeE.type then A.type:=type_error;else
5、.因为x和y的类型在编译时是确定的。,4.1.2 静态类型与强类型(续1),若程序设计语言中允许动态数组,则下述源程序段是合法的:var x,y:integer;.procedure sort(left,right:integer)is A:arrayleft.right of objects;.end sort;.sort(x,y);x和y是整型值,可以作为数组的下界和上界。x和y的值只能在运行时才能确定,而当xy时,sort(x,y)不能正确运行。,运行时类型检查:,4.1.2 静态类型与强类型(续2),每个表达式的类型均可以通过静态程序分析来确定的程序设计语言被称为是静态类型的。若程序设
6、计语言的所有表达式在任何时刻均是类型一致的,则称该语言是强类型的。,强类型语言提高了对编译器的要求,因为它要求无论是编译阶段还是运行阶段,表达式的运算均要保证类型的一致性;OOPL不是静态类型语言,因为方法的重置(override)是静态不可确定的;为使OOPL保持类型的一致性,它应是强类型的。,4.1.3 多态(Polymorphism),强类型和静态类型提高了程序的可靠性,但是限制了程序设计的灵活性。,多态 允许操作或操作对象取多于一种的类型的机制被称为多态。,一般来讲,操作对象(实参)可以具有多于一种类型的函数被称为多态函数,这类多态属于通用多态;操作可以施加于多于一种类型的操作对象被称
7、为多态类型,这类多态属于特定多态。,例4.1 若x:integer;y:real;则x+y是否合法?例4.2 对一ADT:stack(object);操作push(object)、pop(object)中的参数object可以取什么类型?,多态的分类,通用多态:实例可以有无穷多个,a.参数多态:过程式程序设计语言中最具代表性的通用多态,它很象宏(macro),即参数的类型可以有无穷多个,而对所有的类型参数,均执行同一代码序列。,C语言的源程序中,可以通过#define定义如下:#define enter(x)printf(enter in);printf(x);printf(n)对enter(
8、ForStatement)和enter(Expression)的调用得到不同的结果:enter in ForStatemententer in Expression,通用多态:实例可以有无穷多个(续1),参数多态与宏的区别:宏的参数是变量,而参数多态的参数是类型,即确定的类型(可以认为类型是常量)成为可变的。,例如可以通过类属(generic)机制在Ada源程序中定义generic的stack程序包,使得操作对象object可以取不同类型:定义:generic type object is private;package stack is procedure push(element:in o
9、bject);procedure pop(element:out object);.end stack;声明与引用:package int_stack is new stack(integer);package str_stack is new stack(string);int_stack.push(3);str_stack.push(hello);,通用多态:实例可以有无穷多个(续2),b.包含多态:包含多态是另一种形式的通用多态。子类型、派生类型、子类(派生类)均属于包含多态。不同的是:子类型和派生类型的基类型是程序设计语言提供的,而子类的基类是程序设计者自己定义的。,Ada语言的源程序
10、中可以定义整型数的子类型和派生类型height和weight如下:subtype height is integer range 1.200;-身高subtype weight is integer range 1.200;-体重type height is range 1.200;-身高type weight is range 1.200;-体重 integer上的所有运算均适用于height和weight,但是它们的值集合均是integer的子集1,200。派生类型被认为是新的类型,并且不在同一类型中的变量不能一起运算。,特定多态:有限个不同的、且不关联的类型,b.强制(coercion)
11、:强制是根据应用需求对类型进行内部转换,以减少重载的类型。例如:表达式3+4、3.0+4、3+4.0和3.0+4.0中+可以是:1.4种重载类型,对应四种形式的运算;2.1种重载类型,所有形式的运算均强制为real+real;3.两种重载类型:int+int和real+real。int+real和real+int均强制为real+real。,a.重载(overload):相同的操作符施加于不同的操作对象,根据上下文确定操作的具体类型,即采用哪段代码序列实现此操作。例如:表达式x+y中的+可以是数的加、字符串的联接和集合的并。,几乎多态的语言,多态既保持了强类型,又增加了程序设计语言的灵活性和功
12、能。但是,传统的程序设计语言如Pascal、Ada83、C等,并不是真正的多态语言,因为它们仅支持部分的多态,即将多态看作为exception而不是rule。,4.1.4 面向对象程序设计语言(OOPL),Object-Oriented=data abstractions+object types+type inheritance,从类型发展的观点看,OOPL应该是强类型的、多态的、且对象类型化的。它与过程式程序设计语言的最大区别在于,OOPL引入了类与类的继承。,OOPL是程序设计语言的一个重要发展,它的最重要特征之一就是将对象类型化,即将构造新的类型的权利交给了程序设计语言的使用者。换句话
13、说,传统的PL为我们提供了类型(仅提供了简单类型),而OOPL为我们提供了构造(定义)类型的方法。,Ada83支持data abstractions,基于对象的程序设计语言,源程序重要组成:package;package组成:规格说明(specification)与体(body)。,package stack is-规格说明 procedure push(x:in object);procedure pop(x:out object);.end stack;,package body stack is-体 procedure push(x:in object)is.end push;.end
14、stack;,使用:with stack;use stack;.push(x);或者with stack;.stack.push(x);,Ada83程序包不是类型,Ada的记录类型:const max_students=200;-学生人数最大值const max_teachers=20;-教师人数最大值type name_str is array(1.10)of character;-姓名,type student_type is record-学生记录id_no:student_id_no;name:name_str;end record;,type teacher_type is reco
15、rd-教师记录 id_no:teacher_id_no;name:name_str;end record;,type class is record-班级记录students:array(1.max_students)of student_type;teachers:array(1.max_teachers)of teacher_type;end record;,Ada83程序包不是类型(续),问题:是否可以象声明记录类型的变量那样声明package的实例?,但是不可以为package声明对象,例如:stack1,stack2:stack;-?stack1.push(x);-?,因为packa
16、ge不是类型!,可以为记录类型声明对象并使用它们,例如:C0014,S00:class;S00.studentsi.name:=张三;C0014.teachersj.name:=李四;,面向对象机制的两种实现方法,过程式程序设计语言实现类型化与继承机制的两条途径:记录类型中扩充操作扩充抽象数据类型(ADT或程序包)为类型,1.ADT类型化Ada95 的标签类型,a.类的定义,package class_account is privateend class_account;,b.对象的声明与引用Mike:account;deposit(Mike,50.00);,type account is
17、tagged private;subtype Money is float;procedure deposit(the:in out account;amount:in Money);function balance(the:in account)return Money;,type account is tagged recordbalance_of:Money:=0.00;end record;,1.ADT类型化(续1),with class_account;use class_account;package class_interest_account isprivate end cla
18、ss_interest_account;,d.继承机制下对象的声明与引用corinna:interest_account;deposit(corinna,500.00);calc_interest(corinna);,type interest_account is new account with private;procedure calc_interest(the:in out interest_account);.,type interest_account is new account with record accumulated_interest:Money:=0.00;end
19、record;.,c.类的继承(派生类),2.C+结构的扩充,C+通过对C的struct进行扩充,使得结构中既含有操作对象,又含有操作。,a.struct及其上的操作typedef struct int year,month,day;date_struct;void add_year(date_struct,b.C+对struct的扩展:操作作为struct的成员typedef struct int year,month,day;/数据成员void add_year(int n);/函数成员:增加年份void add_month(int n);/函数成员:增加月份void add_day(in
20、t n);/函数成员:增加天数const void out_date(char*x);/函数成员:显示日期 date_type;,3.C+的class,class date_class private:int year,month,day;/数据成员 public:void add_year(int n);/函数成员:增加年份 void add_month(int n);/函数成员:增加月份 void add_day(int n);/函数成员:增加天数 const void out_date(char*x);/函数成员:显示日期 date_class()year=2001;month=1;da
21、y=1;date_class();,问题:由struct扩充的类中如何实现信息隐藏和继承?struct 中的内容隐藏后,给初始化带来困难。,4.Ada95中类与继承的实现方法,1.类的基本实现方法记录(record)扩充与程序包(package)扩充的结合以package为类的基本框架,引入一个带标签的recordrecord中声明操作对象,package中声明施加于对象的操作2.继承的基本实现方法在基类标签record基础上声明一个派生类的标签record派生类继承基类的所有操作对象(record)和所有的操作(在package中)分别在派生类的record和package中增加操作对象和操
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 第四 类型 检查

链接地址:https://www.31ppt.com/p-5665216.html