1、程序设计语言与编译 实质上是对存储器中所存储的数据实质上是对存储器中所存储的数据进行的抽象。它包含了一组进行的抽象。它包含了一组和一组和一组。1 1程序设计语言与编译1 1、将类型作为数据结构的抽象表示、将类型作为数据结构的抽象表示 可以分为三个层次的可以分为三个层次的抽象抽象,即,即 内部类型内部类型、用户定义类型用户定义类型和和抽象数据类型抽象数据类型2 2、数据类型与编译有关的几个问题、数据类型与编译有关的几个问题3 3、类型的实现模型、类型的实现模型2 2程序设计语言与编译1.1.数据类型的作用数据类型的作用实现了数据抽象实现了数据抽象从机器的具体特征中解脱出来从机器的具体特征中解脱出
2、来提高了编程效率提高了编程效率3 3程序设计语言与编译 语言的某种特定的数据抽象受到两个语言的某种特定的数据抽象受到两个因素的影响:因素的影响:语言所面向的语言所面向的机器机器(只提供定点运算或(只提供定点运算或同时提供浮点运算);同时提供浮点运算);语言所面向的应用语言所面向的应用领域领域。4 4程序设计语言与编译2.2.数据类型的分类数据类型的分类内部类型内部类型自定义类型自定义类型5 5程序设计语言与编译 语言根据所面向的机器和应用定义语言根据所面向的机器和应用定义了不同的数据类型,这些类型称为了不同的数据类型,这些类型称为内内部类型部类型(语言定义类型语言定义类型 )。自自Pascal
3、 Pascal 语言开始,语言提供了语言开始,语言提供了由用户定义类型的方法。采用这类方由用户定义类型的方法。采用这类方法由用户自己定义的数据类型称为法由用户自己定义的数据类型称为用用户定义类型户定义类型(自定义类型自定义类型)。6 6程序设计语言与编译 第二节第二节 内部类型内部类型一一.内部类型的特点内部类型的特点反映基本硬件特性反映基本硬件特性在语言级在语言级,是共用某些操作的是共用某些操作的数据对象的抽象表示数据对象的抽象表示7 7程序设计语言与编译 1.1.基本表示的不可见性基本表示的不可见性基本位串对程序员是不可见的。基本位串对程序员是不可见的。优点:优点:导致不同的程序设计风格导
4、致不同的程序设计风格 可写性可写性 可读性可读性 可修改性可修改性例:例:25+9=3425+9=34 基本表示基本表示00011001+0000100100011001+00001001 结果结果00100010001000108 8程序设计语言与编译 进行静态类型检查进行静态类型检查,如非法运算如非法运算,形实参类型匹配形实参类型匹配(某些动态特性不一定能查出,如(某些动态特性不一定能查出,如i/ji/j中中j=0j=0)2.2.编译时能检查变量使用的正确性编译时能检查变量使用的正确性3.3.编译时可以确定无二义的操作编译时可以确定无二义的操作超载超载(多态多态)的概念的概念:运算符的意义
5、依赖于操作数的类运算符的意义依赖于操作数的类型。如型。如“+”+”可以表示整数加或实数加可以表示整数加或实数加编译时编译时,可拒绝混合运算可拒绝混合运算,或提供类型转换指令或提供类型转换指令合理地使用超载合理地使用超载,可以提高语言的可读性和可用性可以提高语言的可读性和可用性9 9程序设计语言与编译 4.4.精度控制精度控制 可以通过数据类型显式定义数据的精度可以通过数据类型显式定义数据的精度精度说明有利于空间优化精度说明有利于空间优化精度说明可作为检查的一种手段精度说明可作为检查的一种手段精度说明有利于程序的修改精度说明有利于程序的修改1010程序设计语言与编译 第三节第三节 用户定义类型用
6、户定义类型 许多语言除了定义内部类型外,还允许程序员定义,规定基本数据对象的聚合,乃至聚合的聚合。How to define?1111程序设计语言与编译 :N N个集合个集合A A1 1,A,A2 2,A,An n的的表示为表示为A A1 1 A A2 2 A An n,它是一个集合,它是一个集合,其元素为其元素为(a(a1 1,a,a2 2,a,an n),),其中其中 a ai i A Ai i在语言中在语言中对应什么对应什么构造?构造?1212程序设计语言与编译 integer real表示为表示为边数边数每边边长每边边长在在COBOL和和PASCAL中中称为称为记录记录;在;在ALGO
7、L中中称为称为结构结构。注意注意:语言把笛卡尔积数据对象看成由若干个域组成,语言把笛卡尔积数据对象看成由若干个域组成,每个域有一个唯一的名字;每个域有一个唯一的名字;通常用域名来选取域,对它进行通常用域名来选取域,对它进行修改;修改;例:对于如前定义的多边形,有两个域例:对于如前定义的多边形,有两个域no-of-edgesno-of-edges和和edge-edge-sizesize,Struct polygonStruct polygonint no-of-edges;int no-of-edges;double edge-size double edge-sizet1;t1;若若t1t1是
8、一个边长为是一个边长为7.537.53的等边三角形的等边三角形(3,3.75)(3,3.75),则可以写为:,则可以写为:t1.no-of-edges=3;t1.no-of-edges=3;t1.edge-size=3.75;t1.edge-size=3.75;1313程序设计语言与编译 :从定义域类型从定义域类型DTDT(domain typedomain type)的值的)的值的有限集合,到值域类型有限集合,到值域类型RTRT(range typerange type)的值)的值的有限集合的函数称为的有限集合的函数称为 。在语言中在语言中对应什么对应什么构造?构造?1414程序设计语言与编
9、译 在高级语言中通常体现为在高级语言中通常体现为;值域对象通过下标选取值域对象通过下标选取 下标越界会出错,动态检查下标越界会出错,动态检查 下标可用来选取值域的多个元素下标可用来选取值域的多个元素(如数组的分割、切片如数组的分割、切片)SNOBOL4 SNOBOL4的的ARRAYARRAY构造符并不要求值域集的所有元素是同构造符并不要求值域集的所有元素是同 一类型的一类型的 例如:例如:Char array50 Char array50 可看成是从可看成是从0 0到到4949的整数到字符的整数到字符集的有限映像集的有限映像1515程序设计语言与编译 DTDT到相应值的特定子集的绑定策略:到相
10、应值的特定子集的绑定策略:.编译时绑定编译时绑定 (静态数组静态数组).对象建立时绑定对象建立时绑定 (执行到分程序时执行到分程序时,动态数组动态数组).对象处理时绑定对象处理时绑定(对对APLAPL,子集范围可变,子集范围可变)1616程序设计语言与编译 :由任意多个数据项组成由任意多个数据项组成,这些数据项这些数据项称为该序列的成分称为该序列的成分,且类型相同(记为且类型相同(记为CTCT)。)。串的一般操作有串的一般操作有4 4种:种:连接连接 首项选取首项选取 尾项选取尾项选取 子串子串例:串是从所周知的序列,例:串是从所周知的序列,其成分类型为字符;顺序文其成分类型为字符;顺序文件的
11、思路也来自序列的概念件的思路也来自序列的概念1717程序设计语言与编译 :若数据类型:若数据类型T T包含属于同一类型包含属于同一类型T T的成份,的成份,那么类型那么类型T T称为称为。:1)1)允许在类型定义中使用被定义类型的名字允许在类型定义中使用被定义类型的名字2)2)指针是建立递归数据对象的重要手段指针是建立递归数据对象的重要手段例:二叉树可通过递归类型例:二叉树可通过递归类型来定义。它的左子树和右子来定义。它的左子树和右子树分别是另一棵二叉树。树分别是另一棵二叉树。1818程序设计语言与编译 :是一个选择对象结构的构造机制是一个选择对象结构的构造机制,规定在两个不同选择对象之间作出
12、适当的选择规定在两个不同选择对象之间作出适当的选择;每一选择对象结构称为变体每一选择对象结构称为变体。例如:例如:PASCAL和和ADA中的变体中的变体记录记录;C和和ALGOL68中的联合。中的联合。1919程序设计语言与编译namenumtypeScore situationchen0000012teacherHardworkingZhang2000112student90,88,99,89 2020程序设计语言与编译Struct char name10;Int num;Char type8;Unionfloat score10;Char situation40;state;person2
13、;2121程序设计语言与编译 :类型:类型T T的元素所有子集的集合,称为的元素所有子集的集合,称为,记为记为PowersetPowerset(T),T(T),T称为基类型。称为基类型。由于具有该类型的变量的值是一个子集,因此它们的基本操作是集合的操作,比如:联合、与、以及测试某个元素是否在一个集合中等。2222程序设计语言与编译 1.1.程序语言允许程序员以上六种机制来定义复程序语言允许程序员以上六种机制来定义复杂的数据对象(新的类型);杂的数据对象(新的类型);2.2.新的类型可以通过非显式的方式说明;新的类型可以通过非显式的方式说明;3.3.也可通过显式的方式说明;也可通过显式的方式说明
14、;4.4.显示定义有如下优点:显示定义有如下优点:可读性可读性 (选择名字)(选择名字)可修改性可修改性 (不修改变量说明)(不修改变量说明)可分性可分性 (重复使用)(重复使用)一致性检查一致性检查例如:例如:struct double:radius;double angle;complex c1,c2,c3;例如:例如:struct complexdouble:radius;double angle;complex c1,c2,c3;2323struct studentstruct student char name48;char name48;int age;int age;程序设计语言
15、与编译 可分性可分性概念用得比较普遍,概念用得比较普遍,C C语语言的言的函数函数就使用了可分性。就使用了可分性。把程序中相同的代码把程序中相同的代码“分离分离”出来,用一个名字来标识,待使出来,用一个名字来标识,待使用这段代码时,通过该名字调用用这段代码时,通过该名字调用该段代码即可。该段代码即可。程序设计语言与编译 2.2.数据类型数据类型1.1.编译时编译时-源程序源程序2.2.运行时运行时-代码段代码段+活动记录活动记录3.3.活动记录活动记录4.4.别名、副作用别名、副作用1.1.值的集合值的集合+操作的集合操作的集合2.2.六种数据类型聚合方式六种数据类型聚合方式笛卡尔积笛卡尔积有
16、限映射有限映射序序 列列递递 归归幂幂 集集判判 定定 或或记录、结构记录、结构数组数组字符串、字符串、顺序文件顺序文件二叉树二叉树联合、变体记录联合、变体记录集合集合2525程序设计语言与编译 第四节第四节 PASCAL语言数据类型结构语言数据类型结构 内部类型内部类型integer,real,boolean,charinteger,real,boolean,char 有序类型有序类型每一元素都有唯一的前驱和后继每一元素都有唯一的前驱和后继如如:整型整型,布尔型布尔型,字符型字符型 定义新的有序类型的方法定义新的有序类型的方法枚举型枚举型 其值不能直接读其值不能直接读/写写子界型子界型 动态
17、检查范围动态检查范围例例:type day=(sunday,monday,tuseday,wednesday,thursday,friday,saturday);/枚举枚举type work_day=monday.friday;/子界子界var class_day:work_day;class_day:=succ(class_day);/后继后继2626程序设计语言与编译 1)1)数组构造数组构造构造符构造符ARRAYARRAY允许程序员定义有限映像;数组允许程序员定义有限映像;数组构造的一般形式为:构造的一般形式为:arrayarrayt1t1 of of t2t2 元素(值域)的类型;元素
18、(值域)的类型;下标(定义域)的类型;下标(定义域)的类型;注意注意:PASCALPASCAL把下标类型不同的数组看成不同的类型把下标类型不同的数组看成不同的类型type type a1=array1.50 of a1=array1.50 of integer;integer;type type a2=array1.70 of a2=array1.70 of integer;integer;?2727程序设计语言与编译 !这样定义的数组类型会这样定义的数组类型会产生严重问题,产生严重问题,使得形使得形式参数定义的数组和实式参数定义的数组和实际参数的数组类型不一际参数的数组类型不一致;致;:引入
19、引入概念概念-维数相同,成分类型相同维数相同,成分类型相同的数组;符合数组可以形、实参数匹配。的数组;符合数组可以形、实参数匹配。例例:procedure sort(var a:arraylow.high:integer of ctype);var i:integer;more:boolean;begin sortend sort2828程序设计语言与编译 2)2)记录构造记录构造构造符构造符用以定义笛卡尔积,一般形式为:用以定义笛卡尔积,一般形式为:Record field_1:type_1;Record field_1:type_1;field_2:type_2;field_2:type_
20、2;field_n:type_nfield_n:type_n;endend记录可以整体访问,也可用圆点记录可以整体访问,也可用圆点“.”.”作为选择符访问作为选择符访问单个的域;单个的域;假设假设t t,p p是前面定义的多边形,是前面定义的多边形,t.no_of_edges:=3;t.no_of_edges:=3;t.edge_size:=7.53;t.edge_size:=7.53;p:=t;p:=t;2929程序设计语言与编译 type dept=(house,sports,drugs,food,liquor);type dept=(house,sports,drugs,food,liq
21、uor);month=1.12;month=1.12;item=record item=record price:real;price:real;case available:boolean of case available:boolean of true:(amount:integer;where:dept);true:(amount:integer;where:dept);false:(month_expected:month)false:(month_expected:month)end;end;变体记录变体记录item标识符域标识符域available,记录的判定成分,记录的判定成分
22、注意注意:PASCALPASCAL允许程序员访问记录结构的所有域,包允许程序员访问记录结构的所有域,包括标识符域。括标识符域。例如,如果例如,如果i1和和i2被说明,则可对它们进行如下操作被说明,则可对它们进行如下操作:var i1,i2:item:i1.price:=5.24;i1.available:=true;i1.amount:=29;i1.where:=liquor;i2.price:=324.99;i2.available:=false;i2.month_expect:=8;3030程序设计语言与编译 priceavailableamountwhere5.24true29liquo
23、ri1priceavailablemonth_expected324.99false8i23131程序设计语言与编译 q改变一个变体记录的标识符,在概念上建立了一个新记录;改变一个变体记录的标识符,在概念上建立了一个新记录;q变体记录在同一块存储区上重叠存放所有变体;变体记录在同一块存储区上重叠存放所有变体;q变体记录允许程序员根据每个变体的类型,以不同的观点变体记录允许程序员根据每个变体的类型,以不同的观点来解释存储在该区域中的位串;来解释存储在该区域中的位串;使用变体记录不安全使用变体记录不安全q可以对变体赋值可以对变体赋值q可以改变变体标识符可以改变变体标识符q标识符域的标识符可省缺标识
24、符域的标识符可省缺record price:real case boolean of true:(amount:integer;where:dept);false:(mouth_expected:month)end3232程序设计语言与编译 3)3)集合构造集合构造PASCALPASCAL语言的语言的SETSET构造符是幂集构造受限制的构造符是幂集构造受限制的形式,基类型只能是有序类型,而不能是实数、形式,基类型只能是有序类型,而不能是实数、集合类型。集合类型。例例:type vegetable=(bean,cabbage,carrot,celery,lettuce,onion,mushroo
25、m,zucchizi);var my_salad,leftover:set of vegetable;3333程序设计语言与编译 4)4)文件构造文件构造 PASCAL PASCAL文件是任意类型的诸元素的序列;文件是任意类型的诸元素的序列;PASCAL PASCAL文件仅能顺序处理;文件仅能顺序处理;只能进行只能进行 PUT PUT 和和 GET GET 操作;操作;例例:type pattern=record end;tape=file of pattern;var t1,t2:tape;Get操作把下一个元素读到缓冲区操作把下一个元素读到缓冲区put操作把缓冲区中的元素附加到文件末尾操作
26、把缓冲区中的元素附加到文件末尾3434程序设计语言与编译 是是PASCALPASCAL的第三类数据类型,是非结构的,的第三类数据类型,是非结构的,可用来构造递归结构;可用来构造递归结构;指针可引用匿名数据对象,这类对象由建指针可引用匿名数据对象,这类对象由建立语句立语句NEWNEW显示分配在堆上;显示分配在堆上;空指针空指针nilnil的使用;的使用;指针的操作指针的操作:赋值赋值,比较比较(相等或不等相等或不等)PASCALPASCAL指针只能指向匿名数据对象,不能指针只能指向匿名数据对象,不能指向在栈上分配的的单元指向在栈上分配的的单元3535程序设计语言与编译type tree_ref=
27、binary_tree_node;binary_tree_node=record info:char;left,right:tree_ref end;pointer=node;node=record data:integer;next:pointer end;指针例子指针例子3636程序设计语言与编译 PascalPascal类型类型非结构类型非结构类型指针类型指针类型(递归递归)结构类型结构类型内部类型内部类型整型整型 实型实型字符型字符型布尔型布尔型枚举类型枚举类型子界类型子界类型记录类型记录类型(迪卡尔积迪卡尔积)变体记录变体记录(判定或判定或)数数组组集合集合文件文件3737程序设计语
28、言与编译 第六节第六节 C语言数据类型结构语言数据类型结构1.1.非结构类型:非结构类型:分为分为和和 非结构内部类型有整型、实型和字符型非结构内部类型有整型、实型和字符型类型类型类型标志符类型标志符数值范围数值范围占用字节数占用字节数基本型int-32768327672短整型Short-32768327672长整型Long-231(231-1)4无符号整型Unsigned 0655352无符号短整型 Unsigned short0655352无符号长整型 Unsigned long0(232-1)43838程序设计语言与编译 实型又称浮点型,其值是实数的一个子集,分为单实型又称浮点型,其值是
29、实数的一个子集,分为单精度和双精度两种类型精度和双精度两种类型字符型数据的值是一个有限字符集的元素;在字符型数据的值是一个有限字符集的元素;在C C语言语言中,中,intint类型与类型与charchar类型在存储中没有本质区别;类型在存储中没有本质区别;-308-308 308308-10-10308308 10103083081515 16168 8DoubleDouble双精度型双精度型-38-38 3838-10-103838 101038387 74 4FloatFloat单精度型单精度型阶的范围阶的范围数值范围数值范围能表示数值能表示数值的有效位的有效位点用字点用字节数节数类型标类
30、型标志符志符类型类型浮点型数据类型的特性浮点型数据类型的特性注意注意:C C语言中没有布尔(语言中没有布尔(bool)bool)类型;类型;0 0表示表示falsefalse,非非0 0表示表示truetrue。3939程序设计语言与编译 用户自定义的非结构类型在用户自定义的非结构类型在C C语言中称为枚举类型(语言中称为枚举类型(enumenum)enum bool false,true;enum bool false,true;或或 typedef enum false,true bool;typedef enum false,true bool;(1 1)定义了一个)定义了一个新类型新类
31、型boolbool(2 2)boolbool数据数据类型的取值为类型的取值为falsefalse和和truetrue(3 3)定义了一个顺)定义了一个顺序:序:falsetruefalsetrue(4 4)可对这个类型)可对这个类型的变量进行赋值和比的变量进行赋值和比较等操作较等操作enum bool false,true;enum bool false,true;bool b;bool b;b=true;b=true;if(b=true)if(b=true)4040程序设计语言与编译 (1 1)实现有限映像实现有限映像 说明的格式说明的格式 常量表达式常量表达式 例如:例如:int inta
32、rr5;int intarr5;char chararr255;char chararr255;bool boolarr3;bool boolarr3;注意注意:C C语言中数组的下标总是从语言中数组的下标总是从0 0开始。开始。4141程序设计语言与编译 可以定义多维数组可以定义多维数组 说明的格式说明的格式 常量表达式常量表达式常量表达式常量表达式 例如:float farr34;char c222;qC C语言的数组按行存放语言的数组按行存放q对数组名的处理相当于指针对数组名的处理相当于指针数组a34的存放次序为:a00 a01 a02 a03 a10 a11 a12 a13 a20 a
33、21 a22 a23 int a10;int*pa;pa=a;4242程序设计语言与编译 (2 2)C C语言中构造符语言中构造符structstruct支持笛卡尔积支持笛卡尔积 说明的格式说明的格式structstruct 成员表列成员表列;成员表列由若干个成员类型说明组成:成员表列由若干个成员类型说明组成:;例如:例如:structstruct student student intint num;num;char name2;char name2;char sex;char sex;intint age;age;float score;float score;char char addr
34、addr30;30;4343程序设计语言与编译 注意注意:C C语言中结构不能整体赋值和输出,只能对其中语言中结构不能整体赋值和输出,只能对其中的各个成员分别进行操作。的各个成员分别进行操作。q在内存中,结构的各成员依次存放;q结构体可以嵌套;例如:例如:structstruct student me,you;student me,you;strcpystrcpy(me.name,(me.name,“johnjohn”););me.sex=me.sex=M M;me.ageme.age=21;=21;me.scoreme.score=80;=80;strcpystrcpy(me.addrme.
35、addr,“UESTCUESTC”););4444程序设计语言与编译 (3 3)C C语言中构造符语言中构造符unionunion(联合)支持判定或(联合)支持判定或联合结构举例:联合结构举例:union data union data intint i i;char c;char c;float f;float f;union data union data a,b,ca,b,c;a.i=2;a.i=2;a.c=a.c=s s;a.f=3.14;a.f=3.14;(1)C C语言中联合中没有标识符域;语言中联合中没有标识符域;(2 2)单元中的值的类型,取决于程序员的使用;)单元中的值的类型
36、,取决于程序员的使用;4545程序设计语言与编译 (4 4)C C语言中文件是一个字符序列;语言中文件是一个字符序列;分为分为ASCIIASCII码文件和二进制文件;码文件和二进制文件;C C语言中文件的预定义格式如下:语言中文件的预定义格式如下:typedeftypedef structstruct intint _ _fdfd;intint _cleft;_cleft;intint _mode;_mode;char char*_next;_next;char char*_ _bufbuf;FILE;FILE;文件名文件名缓冲区中剩下的字符数缓冲区中剩下的字符数文件操作模式文件操作模式下一个
37、字符指针下一个字符指针缓冲区指针缓冲区指针4646程序设计语言与编译 C语言中的是第三种数据类型,是非结构类型;可用来构造结构类型;支持递归;利用指针定义递归结构的例子:struct tree char day;struct tree*lchild;struct tree*rchild;struct tree*my_tree;4747程序设计语言与编译 C语言中有一种特殊的数据类型void,称为;是一种非结构类型;有两个主要用途:用来表示一个无返回值的函数 用来表示不确定类型的指针例:例:void main()void main()intint i i;i i=1;=1;例如:void*p;表
38、示这是一个指针,它的值是一个地址,但不指明p指向的值是什么类型。4848程序设计语言与编译 C C数据类型数据类型非结构型非结构型结构型结构型指针类型指针类型(递归递归)内部类型内部类型枚举类型枚举类型数组类型数组类型(有限映象)(有限映象)联合类型联合类型(判定或)(判定或)结构类型结构类型(笛卡尔积)(笛卡尔积)(文件)(文件)(序列)(序列)整型整型空类型空类型实型实型字符型字符型单精度型单精度型双精度型双精度型4949程序设计语言与编译 第八节第八节 抽象数据类型抽象数据类型1.1.用户定义类型与内部类型的异同用户定义类型与内部类型的异同都建立某种基本表示的抽象内部类型内部类型:对二进
39、制位串的抽象;对二进制位串的抽象;用户定义类型用户定义类型:对内部类型和已定义的用户对内部类型和已定义的用户定义类型的定义类型的数据数据作为基本表示的抽象作为基本表示的抽象每一类型都关联一组操作内部类型隐蔽了基本表示,不能对它的成分进行操作;用户定义类型具有更高级别的抽象,可以对其基本表示的成分进行操作。能不能仿照内部类型,隐藏用户自定义类型的内部信息?5050程序设计语言与编译 2.2.抽象数据类型的定义抽象数据类型的定义满足下述特性的用户定义类型称为:在实现该类型的程序单元中,建立与表示有关的基本操作;对使用该类型的程序单元来说,该类型的表示是隐蔽的。3.在描述实现的程序单元中进行修改1.
40、对象的表示是被保护的,外界不能对它进行直接操作2.隐蔽了表示的细节,通过过程来访问抽象数据对象5151程序设计语言与编译 1.SIMULA 67的类机制2.CLU的抽象数据类型-簇3.Ada的抽象数据类型4.Modula-2的抽象数据类型5252程序设计语言与编译 C+语言中的抽象数据类型称为类(class),类的实例称为对象(object);class private:私有段数据定义;私有段函数定义;protected:保护段数据定义;保护段函数定义;public:公有段数据定义;公有段函数定义;C+语言类定语言类定义的一般形式义的一般形式5.C+语言的抽象数据类型 C+的类满足抽象数据类型
41、的条件(1)和(2)?5353程序设计语言与编译 类的实例是对象,对象继承类中的数据和方法封装、继承、多态C+支持重载和多态C+的继承性通过派生类来实现虚函数、抽象类5454程序设计语言与编译 第九节第九节 类型检查类型检查q对数据对象的类型和使用的操作是否匹配的一致对数据对象的类型和使用的操作是否匹配的一致性检查称为性检查称为;q语言的类型检查分为语言的类型检查分为(static checkingstatic checking)和和(dynamic checkingdynamic checking);静态检查使程序更正确更有效静态检查使程序更正确更有效动态检查使编程方便动态检查使编程方便,但
42、影响了可读性但影响了可读性,且降低了执且降低了执行效率行效率q语言按类型可分为语言按类型可分为、和和 ;在编译时进行的检查在编译时进行的检查在运行时进行的检查在运行时进行的检查语言没有类型定义语言没有类型定义语言的类型检查不能全部在编译时完语言的类型检查不能全部在编译时完成,有些要在运行时才能完成成,有些要在运行时才能完成语言的类型检查全部语言的类型检查全部在编译时完成在编译时完成5555程序设计语言与编译 理由:编译时,不能确定一个过程中的过程参数和子程序参数类型Pascal的子界类型不能静态检查变体记录的标识符可以在运行时改变Pascal没有严格规定类型的一致性规则procedure pr
43、ocedure who_knowswho_knows(i,j:integer;procedurei,j:integer;procedure f);f);varvar k:boolean;k:boolean;begin k:=j begin k:=jDOUBLE PRECISIONREALINTEGERPASCALPASCAL语言:语言:只允许整数到实数,以及子界类型到整数的转换;其他的转换必须显示处理varvar r:real;r:real;i:integer;i:integer;i i:=r;:=r;?应写为应写为varvar r:real;r:real;i:integer;i:intege
44、r;i i:=round(r);:=round(r);5858程序设计语言与编译 ALGOL 68ALGOL 68语言:语言:完全的、形式化的隐式转换规则;它一共给出6种隐式转换规则;AdaAda语言:语言:必须显示转换;5959程序设计语言与编译 隐式转换发生在下述的情况下:隐式转换发生在下述的情况下:混合运算混合运算:级别低的类型向级别高的类型值转换。:级别低的类型向级别高的类型值转换。将表达式的值赋给变量:将表达式的值赋给变量:表达式的值向变量类型的值转换。表达式的值向变量类型的值转换。实参向函数形参传值:实参向函数形参传值:实参的值向形参的值进行转换。实参的值向形参的值进行转换。函数返
45、回值:函数返回值:返回值向函数返回类型的值进行转换。返回值向函数返回类型的值进行转换。注意语言规定的转换规则注意语言规定的转换规则程序设计语言与编译 第十节第十节 类型等价类型等价q若T1和T2是两个类型,qT1的任何值都可以赋予T2类型的变量,反之亦然,qT1类型的实参可以对应类型T2的形参,反之亦然,则称T1和T2是,或;6161程序设计语言与编译 第十节第十节 类型等价类型等价q有两种类型的相容性概念:名字等价:两个变量的类型名相同两个变量的类型名相同6262程序设计语言与编译 不等价不等价第十节第十节 类型等价类型等价q有两种类型的相容性概念:结构等价两个变量的类型具有相同的结构。两个
46、变量的类型具有相同的结构。6363程序设计语言与编译 第十节第十节 类型等价类型等价q两种相容性实现时的比较 名字等价的实现比较简单 结构等价的实现需要的模式匹配过程可能十分复杂6464程序设计语言与编译 第十一节第十一节 实现模型实现模型q在实现模型中,数据用描述符和数据对象来表示;描述符用来描述数据对象的所有属性q只考虑原理性的实现,不考虑效率q以PASCAL语言为例 描述符:描述数据对象的所有属性数据 数据对象(存储区及其值)6565程序设计语言与编译 1.1.内部类型和用户定义的非结构类型的实现模型内部类型和用户定义的非结构类型的实现模型q描述符一般由“类型”和一个指针组成intege
47、r描述符描述符数据对象数据对象整数变量的表示整数变量的表示real描述符描述符实型变量的表示实型变量的表示数据对象数据对象q子界的描述符必须包括子界的界值q布尔型和字符型可以压缩存储6666程序设计语言与编译 2.2.结构类型的实现模型结构类型的实现模型q笛卡尔积笛卡尔积各成分顺序排列(数据)描述符包含:、若干三元式。每个域对应一个三元式(,)每个成分占整数个可编址的存储单元(字编址或字节编址)6767程序设计语言与编译 type t=record a:realtype t=record a:real;b:integerb:integer;endend;浮点值浮点值定点值定点值类型名类型名构造
48、符构造符选择符选择符选择符选择符类型类型类型类型引用引用引用引用t trecordrecorda arealrealb bintegerinteger域域1 1域域2 26868程序设计语言与编译 q有限映像有限映像为每一成分分配整数个可编址的存储单元描述符包括:、内情向量;6969程序设计语言与编译地址公式的计算地址公式的计算u若定义域类型是子界若定义域类型是子界m.n,每个元素占,每个元素占k个存储单元,那么,按照个存储单元,那么,按照 k*(i-m)计算计算ai从从首地址首地址b到所分配的存储之间的位移。到所分配的存储之间的位移。ai的地址可以写成的地址可以写成 b+k*(i-m)=b-
49、k*m+k*i=b+k*i 其中,其中,b=b-k*m 是编译时能计算出的是编译时能计算出的程序设计语言与编译 例:例:type a=array1.10 of real;type a=array1.10 of real;类型名类型名构造符构造符基类型基类型成分类型成分类型下界下界单元个数单元个数上界上界引用引用a aarrayarrayintegerinteger1 1realreal1 1下标类型下标类型1010浮点值浮点值浮点值浮点值浮点值浮点值7171程序设计语言与编译 q序列序列PASCAL中的串长度静态可定;静态分配;其他语言中(如SNOBOL 4和ALGOL 68中),可变长串的表
50、示:+stringstring5 5A AL LP PH HA Anilnil类型类型指向动指向动态描述态描述符符长度长度指向堆指向堆7272程序设计语言与编译 q判定或判定或对类型的变量所分配的空间应足以容纳需要最大空间的变体的值Pascal的变体记录的表示包括:、例:例:type v=record a:integer;type v=record a:integer;case b:boolean of case b:boolean of true:(c:integer);true:(c:integer);false:(d:integer;false:(d:integer;e:real)e:r