程序设计-数据类型的设计、实现与语义课件_第1页
程序设计-数据类型的设计、实现与语义课件_第2页
程序设计-数据类型的设计、实现与语义课件_第3页
程序设计-数据类型的设计、实现与语义课件_第4页
程序设计-数据类型的设计、实现与语义课件_第5页
已阅读5页,还剩197页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章数据类型(补充)程序设计语言原理东南大学计算机科学与工程系1第四章数据类型程序设计语言原理东南大学计算机数据类型的设计、实现与语义数据类型概念的早期发展简史数据类型强类型(strongtyping)Ada的数据类型分类体系Ada语言的枚举类型Ada的数值类型Ada的带符号整数类型2数据类型的设计、实现与语义数据类型概念的早期发展简史2数据类型的设计、实现与语义Ada的实数类型Ada的浮点数类型Ada的定点类型Ada的数值类型总结Ada的数组类型指针类型Ada的记录类型3数据类型的设计、实现与语义Ada的实数类型34.1数据类型概念的早期发展简史简单说来,数据类型就是数据对象的分类及该分类上的操作。44.1数据类型概念的早期发展简史简单说来,数据类型就是数据对4.1.1基本指令系统中的类型因素指令系统:数据传送指令

INAL,PORT(字节)

INAX,PORT(字)

算术运算

MUL无符号数乘法指令

IMUL有符号数乘法指令

54.1.1基本指令系统中的类型因素指令系统:54.1.1基本指令系统中的类型因素符号扩展指令

CBW(convertbytetoword)CWD(convertwordtodoubleword)

逻辑运算

ANDORNOTXOR64.1.1基本指令系统中的类型因素符号扩展指令64.1.1基本指令系统中的类型因素

字符串处理

MOVS(movestring)CMPS(comparestring)

控制转移

JMPSHORTOPR

JMPWORDPTROPR74.1.1基本指令系统中的类型因素字符串处理74.1.1基本指令系统中的类型因素数据类型:字节、字、双字、无符号整数、有符号整数、布尔值(值或向量)、字符、字符串评注:抽象程度低,以原子类型为主,分类不严格(缺乏原则、主要基于硬件功能和应用需要)、转换自由(基本在使用者的主观中,缺乏明显的转换标志)84.1.1基本指令系统中的类型因素数据类型:字节、字、双字4.1.2汇编语言中的类型数据定义伪指令DB、DW、DDDATA_BYTEDB10,4,10HDATA_WORDDW100,100H,-5DATA_DWDD3*20,0FFFDHMESSAGEDB‘HELLO’

ARRAYDB100DUP(?)94.1.2汇编语言中的类型数据定义伪指令DB、D4.1.2汇编语言中的类型结构定义伪指令(C语言)personstrucfnamedb'Firstname'lnamedb'lastname'monthdw?daydw?yeardw?personends104.1.2汇编语言中的类型结构定义伪指令(C语言)104.1.2汇编语言中的类型属性(类型)修改操作符TYPEvariable返回类型 LENGTHvariable返回分配给该变量的单元数SIZEvariable返回分配给该变量的字节数,SIZE=LENGTH*TYPEOFFSETvariable返回变量的偏移地址SEGvariable返回变量的段地址值114.1.2汇编语言中的类型114.1.2汇编语言中的类型类型指定操作符MOVAX,WORDPTROPER1+1124.1.2汇编语言中的类型类型指定操作符124.1.2汇编语言中的类型评注:复合(聚集)类型能力有所提高,但其中的数组类型没有明确化;开始支持用户定义类型;地址概念是类型的核心概念,占有等量存储空间的类型就兼容;类型转换显式化,但缺乏语义上的约束;出现属性的雏形。134.1.2汇编语言中的类型评注:134.1.3FORTRAN语言静态、不支持用户定义类型对数值类型支持也十分有限:整数、实数、双精度、复数144.1.3FORTRAN语言静态、不支持用户定义类型144.1.4C语言枚举类型、用户定义类型(数组、结构),支持动态数据结构(动态数组、联合),不具备支持抽象数据类型的能力;灵活,但理论基础不足,有些方面带有明显的汇编语言的痕迹(数组名同时表示数组第一个元素的地址,结构标志符本身不作为类型区分符使用);标准对类型之间的关系没有详细说明(boolean,numeration),转换比较随意(尤其在指针的问题上,

图1);154.1.4C语言枚举类型、用户定义类型(数组、结构),4.1.5Ada类型丰富、全面,支持用户定义类型、抽象数据类型和面向对象概念,具备坚实的理论基础,概念一致、完整,同时提供以上语言中所具有的灵活性

Ada的类型定义机制164.1.5Ada类型丰富、全面,支持用户定义类型、抽象数4.1.5.1Ada的类型定义机制用户定义类型:subtype用户定义类型:newtype;exampleofsubtype:subtypeDay_Numberisintegerrange1..31;subtypeFeb_DayisDay_Numberrange1..28;174.1.5.1Ada的类型定义机制用户定义类型:subt4.1.5.1Ada的类型定义机制(续)subtype类似与pascal的子界类型,仅对相应type的值域加以限制,其它方面没有改变,subtype和相应type及同体系中其它subtypes之间进行混合运算时无需显式转换,即从本质上讲,subtype没有创造新的类型。Exampleofnewtypetypecolouris(Red,Amber,Green); typeLightisnewcolour;184.1.5.1Ada的类型定义机制(续)subtypetypeApplesisnewInteger;typeOrangesisnewInteger;No_Of_Apples:Apples;No_Of_Oranges:Oranges;No_Of_Apples:=No_Of_Oranges;--wrongNo_Of_Apples:=Apples(No_Of_Oranges);--OKInteger(No_Of_Apples)+Integer(No_Of_Oranges);

--OK4.1.5.1Ada的类型定义机制(续)194.1.5.1Ada的类型定义机制(续)19NewTypeVs.ParentTypeNewtype的作用

Newtype继承parenttype的预定义操作,用户定义的操作(primitivetype)(用户定义的判等操作除外)

20NewTypeVs.ParentTypeNewty4.2数据类型简单来讲,数据类型就是对数据对象的分类,分类方式主要是内涵式(少数是外延式)。内涵是对数据对象内在性质(静态、动态)的描述。externaldomain:问题域中的数据类型区分体系;internaldomain:编译器所能识别的存在于程序中的数据类型分类体系,我们希望该体系能够和externaldomain建立一一对应的关系,同时编译器也能识别这样的关系,参见图2、图3。214.2数据类型简单来讲,数据类型就是对数据对象的分类,分4.2.1数据类型概念的组成(名字,结构,值集,属性集,操作集)

逻辑结构与存储表示逻辑操作与其实现用户定义实现,系统实现224.2.1数据类型概念的组成(名字,结构,值集,属性集,操4.3强类型(strongtyping)强类型概念发展:ST#1(typed):必须为数据对象声明类型。ST#2(typed):每个变量都必须与一类型相联系,而且,该变量只能存储这一类型的对象。ST#3(stronglytyped):ST#4(stronglytyped)234.3强类型(strongtyping)强类型概念发4.3.1强类型—ST#3所有的数据对象(变量,值,形参)均属于特定的类型(一般是有名的)。这些类型可以是预定义的或用户定义的。每个数据对象仅属于一种类型。每个变量仅能存储唯一类型的对象。一个类型可以有多个变体,该类型的数据对象的变体内容可在运行时确定,程序在处理此类数据对象时,必须对变体部分予以确认。在子程序调用过程中,所有实参的类型必须与对应形参的类型相匹配。语言必须对匹配原则做出明确规定。244.3.1强类型—ST#3所有的数据对象(变量,值,形unionu_tag{intival;floatfval;char*sval;}u;联合25unionu_tag{联合25struct{char*name;intflags;intutype;union{intival;floatfval;char*sval;}u;}symtab[NSYM];带联合的结构26struct{带联合的结构264.3.2强类型—ST#4满足ST#3该语言须有系统、完整的类型体系,对类型间的关系及各种语境下使用类型概念的规则做出合理的规定。该类型体系及相关规则能够良好地反映问题域的逻辑结构和相关的约束。尽量在静态情况下完整地确定程序中的类型信息,检查出违反类型体系及相关规则的情况,给出明确的信息;对在动态情况下可能出现的类型错误给予充分的考虑,并予分类,提供预定义错误类型,提供动态检查及异常处理设施。274.3.2强类型—ST#4满足ST#327强类型是一个相对的概念。

有一种说法,认为必须在静态条件下检测出所有的类型错误才算是强类型的。这是一个历史上的看法。现在看来,这样的定义有失简单与片面。现在的通用语言几乎都提供一些动态的数据类型。28强类型是一个相对的概念。284.4Ada的数据类型分类体系elementaryalltypescompositeaccessscalararrayrecord(protectedtask)discreteenumerationintegersignedmodularfloatingfixeddecimalordinaryreal294.4Ada的数据类型分类体系elementarya4.5Ada语言的枚举类型4.5.1枚举类型举例4.5.2属性与操作4.5.3布尔类型304.5Ada语言的枚举类型4.5.1枚举类型举例34.5.1枚举类型举例

typeDayis(Mon,Tue,Wed,Thu,Fri,Sat,Sun);

typeColoris(White,Red,Yellow,Green,Blue,Brown,Black);

typeHexais('A','B','C','D','E','F');

314.5.1枚举类型举例typeDayis(M4.5.2属性与操作1基于标量类型属性的操作2第一个枚举字面值的位置为0,其后为“1”,…T’Val(T’Pos(X))=XT’Succ(X)=T’Val(T’Pos(X)+1)

3关系操作324.5.2属性与操作1基于标量类型属性的操作324.5.3布尔类型定义:typeBooleanis(False,True);typeAnsweris(False,Don't_Know,True);预定义操作枚举类型的所有预定义操作,not,and,xor334.5.3布尔类型定义:334.6Ada的数值类型涉及数值类型的主要问题:对机器实现的依赖(存储,界限,精度)

344.6Ada的数值类型涉及数值类型的主要问题:344.7带符号整数类型4.7.1设计考虑4.7.2例子4.7.3预定义操作354.7带符号整数类型4.7.1设计考虑354.7.1设计考虑设计数据类型时的考虑:范围、精度(forrealtype),硬件提供的数据类型,效率,可移植性.364.7.1设计考虑设计数据类型时的考虑:364.7.2例子typePage_Numisrange1..2_000;subtypeSmall_IntisIntegerrange-10..10;subtypeBuffer_SizeisIntegerrange0..Max;374.7.2例子typePage_Numisrang4.8Ada的实数类型浮点类型和定点类型混合运算384.8Ada的实数类型浮点类型和定点类型384.9浮点类型

typeCoefficientisdigits10range-1.0..1.0;typeRealisdigits8;typeMassisdigits7range0.0..1.0E35;subtypeProbabilityisRealrange0.0..1.0;--asubtypewithasmallerrange394.9浮点类型typeCoefficienti4.10定点类型typeVoltisdelta0.125range0.0..255.0;typeFractionisdeltaSystem.Fine_Deltarange-1.0..1.0;Fraction'Last=1.0-System.Fine_DeltatypeMoneyisdelta0.01digits15;decimalfixedpoint404.10定点类型typeVoltisdelta04.11Ada的数值类型总结基本定义(范围、精度、表示方法),类型转换机制NumericTypeConversion如果整数之间的转换,只需转换类型标记(要检查约束)。实数之间的类型转换的原则是保证精度。实数向整数转换的过程主要是取整的过程。414.11Ada的数值类型总结基本定义(范围、精度、表示方法4.12数组类型数组元素:具有相同的类型数组索引:任意离散类型424.12数组类型数组元素:具有相同的类型424.12.1例子大多数语言中,数组下标局限于整数类型,这种局限缺乏理论上的依据。Ada语言中,数组的下标可以是任意离散类型。我们通过一些例子来看看这种约束的解除带来的便利。434.12.1例子大多数语言中,数组下标局限于整数类型,这种Hours_Worked:array(Day)ofFloat;ForDinWorkdayloopHours_Worked(D):=8.0;Endloop;Hours_Worked(Sat):=0.0;Hours_Worked(Sun):=0.0;44Hours_Worked:array(Day)ofFlWork_Day:constantarray(Day)ofBoolean:=(True,True,True,True,True,False,False);Tomorrow:constantarray(Day):=(Tue,Wed,Thu,Fri,Sat,Sun,Mon);45Work_Day:constantarray(Day)匿名类型Examplesofobjectdeclarationswitharraytypedefinitions(anonymous):Grid:array(1..80,1..100)ofBoolean;Mix:array(ColorrangeRed..Green)ofBoolean;A,B:array(1..80,1..100)ofBoolean;ashorthand0fA:array(1..80,1..100)ofBoolean;B:array(1..80,1..100)ofBoolean;A:=B; --illegalA,B:Grid;A:=B;--legal46匿名类型Examplesofobjectdeclara可见正常情况下匿名类型的变量是无法和程序中的其它变量发生联系的,所以,在Ada语言中变量正常使用的前提是必须为它声明有名类型。Anonymoustypeandnamedtype的使用原则,该原则也适用于其它类型的问题。匿名类型47可见正常情况下匿名类型的变量是无法和程序中的其它变量发生联系4.12.2动态数组

动态数组:

N:integer::=…;Inverse:Matrix(1..N,1..N);--Nneednotbestatic484.12.2动态数组

动态数组:48补充说明

C语言中Array类型(和函数类型)不能作为函数的返回类型。49补充说明

C语言中Array类型(和函数类型)不能作为函数的4.12.3操作array作为整体参加操作Slice&slidingS:String(1..7):=“BARBARB”S(4..7):=S(1..4)504.12.3操作array作为整体参加操作50对multidimensionalarrays采用row-majororder。在与其它语言(如Fortran)混合编程时,可以采用适当的pragma提示编译器改用column-majororder。4.12.4实现51对multidimensionalarrays采用row-C#语言的数组类型:rectangulararrays,jaggedarray.classTest

{

staticvoidMain(){

int[]a1=newint[]{1,2,3};

int[,]a2=newint[,]{{1,2,3},{4,5,6}};

int[,,]a3=newint[10,20,30]; int[][]j2=newint[3][];

j2[0]=newint[]{1,2,3};

j2[1]=newint[]{1,2,3,4,5,6};

j2[2]=newint[]{1,2,3,4,5,6,7,8,9};

}

}52C#语言的数组类型:rectangulararrays,4.13指针类型4.13.1

指针概念、指针空挂与垃圾回收4.13.2C语言的指针类型4.13.3Ada的accesstype4.13.4C#语言的内存管理机制534.13指针类型4.13.1

指针概念、指针空挂与4.13.1

指针概念、指针空挂与垃圾回收

指针也是一种变量,其值是另一个变量的地址。

空挂当某个对象已经不存在,而到达它的路径依然存在时,该路径即被挂空。(本质上是一个生命期的问题)544.13.1

指针概念、指针空挂与垃圾回收指针也是一种4.13.1

指针概念、指针空挂与垃圾回收(2)

垃圾回收当到达某个对象的所有路径均已消失,该对象即无法使用,该对象所占有的空间应该作为垃圾被回收554.13.1

指针概念、指针空挂与垃圾回收(2)垃圾回指针空挂和垃圾回收是两个相对的概念。指针空挂和垃圾回收的后果是不同的。垃圾不及时回收仅仅是消耗系统资源而已,在资源耗尽之前不会造成软件运行的错误,而指针空挂会很快导致软件运行错误。一般来说垃圾回收是操作系统的任务,解决指针空挂是语言的任务。56指针空挂和垃圾回收是两个相对的概念。564.13.2C语言的指针类型C语言本身没有提供避免指针空挂的措施,没有考虑垃圾回收问题。

指针在C语言中使用非常广泛,部分原因是指针有时是表达计算的最佳方法,部分原因是指针通常比其它方法可以生成更加高效、紧凑的代码。574.13.2C语言的指针类型C语言本身没有提供避免C语言中和指针使用有关的编码规范形式:1.条目2.告警级别(error/warning/informational)3.理由4.实例

58C语言中和指针使用有关的编码规范形式:581不要修改指向未释放内存的指针告警级别:Warning。理由:可能会引起内存泄漏。对于堆变量的使用,我们采用以下约定:用于申请内存的那些指针代表该内存块,这些指针不可以被修改,最后这一块内存必须且只能通过这个指针释放;那些由其它指针赋值或取对象地址得到的指针被认为是中间变量式的指针,他们不代表相应的地址,我们也不用他们释放内存。591不要修改指向未释放内存的指针592

禁止使用不代表内存块的指针释放内存告警级别:Error。理由:如果使用不代表内存块的指针释放内存可能引起内存的不完全释放、越界释放、指针空挂、重复释放等问题。

3

从堆中申请的内存应该保存起始地址告警级别:Error。理由:如果不保存会引起内存丢失,因为我们无法释放该内存。例如:p=newX[n]+2;一种改进方法是:q=newX[n];p=q+2;

602

禁止使用不代表内存块的指针释放内存604

尽量不要重复使用一个指针申请内存(虽然每次重复申请前都进行了释放。)告警级别:Informational。理由:为了使每块堆空间有明确的代表指针(custodialpointer)我们建议一般不要使用一个指针重复申请内存(建立链表过程除外)。

5

堆变量作用域结束时要释放相应的内存告警级别:Warning。理由:如果堆变量作用域结束时没有释放相应的内存,可能引起内存泄漏。

614

尽量不要重复使用一个指针申请内存(虽然每次重复申6

禁止将在内层申请的堆变量地址传给外层告警级别:Error。理由:将在内层申请的堆变量地址传给外层可能引起指针空挂。

7memcopy和memmove中,源指针和目标指针的有效类型(effectivetype)要兼容。告警级别:Warning。

8

memcopy和memmove中最好整体操作(第三个参数的值等于源指针指向的对象的大小)告警级别:Informational。理由:向目的地址拷贝(移动)时,一般为整体操作,如果只有拷贝(移动)一部分,需要在文档中注明。

626

禁止将在内层申请的堆变量地址传给外层62

9

禁止内存越界使用告警级别:Error。理由:内存越界使用会引起非法操作异常,目前只能检测静态可识别的内存越界。

10禁止向指针对象传送大小超过其申请范围的对象(一般来说是过大的数组)告警级别:Error。639

禁止内存越界使用63

11

禁止将内层自动变量的地址传给外层指针(包括两种情况,一种是以参数形式传回,另一种是通过return语句传出去)。告警级别:Error。理由:会引起指针空挂,因为内层声明的自动变量在返回外层时自动释放,这样当外层再使用那个地址时就引起指针空挂。

64

11

禁止将内层自动变量的地址传给外层指针(包括两种情况,12

禁止将一自动变量的地址赋给一静态变量告警级别:Error。理由:将一个自动变量的地址赋值给一个静态变量容易引起地址空挂。因为当函数返回时,静态变量还会存在,而自动变量将消逝,这样静态变量所指的变量已经释放,从而引起指针空挂。

13

禁止向指针或数组名赋负整数告警级别:Error。理由:内存不可能为负地址。

14

禁止取数组的地址告警级别:Error。理由:这种操作一般来说没有意义。6512

禁止将一自动变量的地址赋给一静态变量6515

远、近指针相互转换告警级别:Warning。理由:可能会丢失或得到错误的地址信息。

16

取寄存器变量的地址告警级别:Error。理由:寄存器不在内存寻址范围内。

17禁止没有左值的取地址操作告警级别:Error。理由:一元操作&必须有一个左值放在赋值号的左边用来存放地址。

6615

远、近指针相互转换661不要修改指向未释放内存的指针2

禁止使用不代表内存块的指针释放内存3

从堆中申请的内存应该保存起始地址4

尽量不要重复使用一个指针申请内存(虽然每次重复申请前都进行了释放。)5

堆变量作用域结束时要释放相应的内存6

禁止将在内层申请的堆变量地址传给外层7memcopy和memmove中,源指针和目标指针的有效类型(effectivetype)要兼容。8

memcopy和memmove中最好整体操作(第三个参数的值等于源指针指向的对象的大小)9

禁止内存越界使用10禁止向指针对象传送大小超过其申请范围的对象(一般来说是过大的数组)11

禁止将内层自动变量的地址传给外层指针12

禁止将一自动变量的地址赋给一静态变量13

禁止向指针或数组名赋负整数14

禁止取数组的地址15

远、近指针相互转换16

取寄存器变量的地址17禁止没有左值的取地址操作671不要修改指向未释放内存的指针9

禁止内存越界使用674.13.3

Ada的accesstype684.13.3Ada的accesstype684.13.3.1设计目标

灵活性一致性694.13.3.1设计目标灵活性694.13.3.2Categoriesofaccesstypes1accesstype

accesstosubprogram

general

poolspecific

accesstoobject

accesstovariableaccesstovariableaccesstoconstant704.13.3.2Categoriesofaccess4.13.3.3pool-specificaccesstypespool-specificaccesstypesandstoragepool例:typeRef_Int_AisaccessInteger;typeRef_Int_BisaccessInteger;RA:Ref_Int_A:=newInteger'(10);RB:Ref_Int_B:=newInteger'(20);RA.all:=RB.all;RA:=RB;--illegal714.13.3.3pool-specificaccess指向Poolspecificobjects的指针的释放每一个poolspecificaccesstype对应一个pool,该类型的accessvariable都在且仅在该pool中申请空间。当程序运行超过了该类型的作用域时,将该pool中的所有object同时释放。72指向Poolspecificobjects的指针的释放每理论依据Poolspecificaccesstype也实行按名等价,所以,要真正使用poolspecificaccesstype必须首先声明有名的类型说明。Accessvariable的声明必须在相应的poolspecificaccesstype的声明之后,也就是说,这些accessvariable的作用域不可能超出相应的poolspecificaccesstype的作用域。73理论依据Poolspecificaccesstype也当程序运行超出某poolspecificaccesstype的作用域时,也必然超出了该类型的accessvariable的作用域,这时,该pool中的所有objects都不可用,也没有用了,当然可以释放。当程序运行没有超出该作用域时,不释放pool中的动态对象,当然也就不会出现对象释放了但是引用路径(指针)没有释放的情况,即不会出现指针空挂现象。74当程序运行超出某poolspecificaccesst该方式没有对每个动态object进行及时释放,会造成少量的垃圾没有及时回收的情况。但是由于一般一个模块中申请的动态对象不会太多,所以此法不会造成严重问题。事实上,在军方的嵌入式系统中(一般硬件资源都比较紧张),该方法没有遇到明显的资源浪费问题。75该方式没有对每个动态object进行及时释放,会造成少量的垃4.13.3.4generalaccesstypegeneralaccesstypes,whosevaluescandesignatetheelementsofanystoragepool,aswellasaliasedobjectscreatedbydeclarationsratherthanallocators,andaliasedsubcomponentsofotherobjects(前提是必须在该component的说明前加aliased)764.13.3.4generalaccesstype4.13.3.5accessibilityThebasicruleisthatthelifetimeofanaccessedobjectmustbeatleastaslongasthatoftheaccessobject.各模块之间的调用关系形成了一个动态的层次嵌套关系,同一层的变量具有相同的生命期。774.13.3.5accessibilityThebas这样,我们对变量生命期的比较就转换为对变量所在的模块的当次执行所在的层次的比较。于是,我们要求被引用对象所在的层次应该处于引用对象(指针)的外层或者同层。基于这种意义,我们把模块执行中的动态层次关系叫做引用层次(accesslevel).78这样,我们对变量生命期的比较就转换为对变量所在的模块的当次执Ada语言要求在引用类型变量(指针)赋值和引用类型转换的过程中检查源操作数和目标操作数的accesslevel。当accesstype作为形参时必须是匿名类型。Accesslevel信息在引用类型变量赋值时的传递。为了实现静态检查,将规则改为:Thebasicruleisthatthelifetimeofanaccessedobjectmustbeatleastaslongasthatoftheaccesstype.79Ada语言要求在引用类型变量(指针)赋值和引用类型转换的过程例1procedureMainisTypeAIisaccessallInteger;Ref1:AI;begindeclareRef2:AI;I:aliasedInteger;beginRef2:=I'Access;Ref1:=Ref2;end;…declare--someothervariablesbeginRef1.all:=0;end;endmain;

80例1procedureMainis…80例2declaretypeAIisaccessallInteger;I:aliasedInteger;RefI:AI:=I'Access;begin…declaretypeAJisaccessallInteger;J:aliasedInteger;RefJ:AJ:=J'Access;begin…RefI:=AI(RefJ);--illegal…end;…end;81例2declare814.13.3.6间接引用的对象的消亡从以上分析可以看出,间接引用对象的消亡(其所占用空间的释放)由系统实现,这样大大减轻了程序员的负担,而且可以有效避免诸如指针空挂及反复释放同一存储空间等问题。824.13.3.6间接引用的对象的消亡从以上分析可以看出,间4.13.3.7自由指针unckecked_deallocation834.13.3.7自由指针unckecked_deallo4.13.3.8类型转换的基本原则不同的Poolspecifictype之间不允许,generalaccesstype之间:他们所指对象之间静态match;目标类型的life_time必须nogreaterthan源类型。Poolspecifictogeneralaccesstype:yes,vice,no.844.13.3.8类型转换的基本原则不同的Poolspe4.13.4C#语言的内存管理机制C#语言的值类型和引用类型C#supportstwokindsoftypes:valuetypesandreferencetypes.Valuetypesincludesimpletypes(e.g.,char,int,andfloat),enumtypes,andstructtypes.Referencetypesincludeclasstypes,interfacetypes,delegatetypes,andarraytypes.854.13.4C#语言的内存管理机制C#语言的值类型和引用类值类型的变量中直接存放该变量的数据,引用类型的变量中存放对其它对象的引用。两个引用类型的变量可能指向相同的对象,这样对一个引用变量的操作也就影响了另一个引用变量。对于值类型的变量来讲,每一个变量仅仅代表它自己,对一个值变量的操作不会影响到其它的变量。86值类型的变量中直接存放该变量的数据,引用类型的变量中存放对其通俗地讲,多个引用变量可能代表的是同一份拷贝,而每个值变量仅仅代表它自己的拷贝。或者说,对于引用变量才存在别名问题,而值变量并不存在别名问题。87通俗地讲,多个引用变量可能代表的是同一份拷贝,而每个值变量仅usingSystem;classClass1

{

publicintValue=0;

}classTest

{

staticvoidMain(){

intval1=0;

intval2=val1;

val2=123; Class1ref1=newClass1();

Class1ref2=ref1;

ref2.Value=123; 88usingSystem;88Console.WriteLine("Values:{0},{1}",val1,val2);

Console.WriteLine("Refs:{0},{1}",ref1.Value,ref2.Value);

}

}TheoutputoftheprogramisValues:0,123

Refs:123,123

89Console.WriteLine("Values:{0}对于引用类型的对象,在安全模式下不需要程序员自己去释放,而是由系统采用引用计数机制去释放。90对于引用类型的对象,在安全模式下不需要程序员自己去释放,而是4.14recordtype4.14.1Examples4.14.2legalityrules4.14.3RecordRepresentationClauses

914.14recordtype4.14.1Exam1.

数据类型的概念是如何随着程序设计语言的发展而发展的?2.

强类型系统中数据类型设计的理想目标是什么?你所了解的各个程序设计语言离这个目标有多远?3.

理解强类型概念的相对性,你所了解的各个程序设计语言达到了哪个强类型层次?复习题921.数据类型的概念是如何随着程序设计语言的发展而发展的?复4.

介绍你所熟悉的一种程序设计语言的数据类型体系,将其与Ada语言的数据类型体系进行比较。5.

介绍你所熟悉的一种程序设计语言的用户定义数据类型设施和数据类型兼容规则,将其与Ada语言进行比较。6.

名词解释:type,subtype复习题934.介绍你所熟悉的一种程序设计语言的数据类型体系,将其与A7.Ada语言的枚举数据类型是怎样实现抽象语义与具体实现的分离的?它的类型转换规则如何?你认为定义这种转换规则的依据何在?Ada语言的枚举数据类型与C语言的枚举数据类型相比在概念性和灵活性方面如何?复习题94复习题948.Ada语言的各类数值类型的表示能力、操作、兼容及转换规则?9.简要介绍Ada语言的数组类型(下标、数组元素、分类、类型兼容性)。10.某些语言中无标志的变体记录类型有何缺陷?复习题958.Ada语言的各类数值类型的表示能力、操作、兼容及转换规则11.(1)介绍由于存在指针类型而引发的引用挂空和垃圾问题,这两个问题又何本质区别?你所熟悉的语言中,哪些情况会引发这两个问题,怎样解决?(2)C语言的引用类型和指针类型有何区别?引用类型会引发引用空挂和垃圾问题吗?(3)Ada语言是怎样解决这两个问题的?(两种accesstype,generalaccesstype与accessibility,generalaccesstype之间的类型兼容及转换规则,generalaccesstype的数据对象指向pool中的对象)复习题9611.(1)介绍由于存在指针类型而引发的引用挂空和垃圾问题,图1返回97图1返回97附录A:4.2图2返回98附录A:4.2图2返回98附录A:4.2图3返回99附录A:4.2图3返回99Thanksforyourtimeandattention!100Thanksforyourtimeandatten演讲完毕,谢谢观看!演讲完毕,谢谢观看!第四章数据类型(补充)程序设计语言原理东南大学计算机科学与工程系102第四章数据类型程序设计语言原理东南大学计算机数据类型的设计、实现与语义数据类型概念的早期发展简史数据类型强类型(strongtyping)Ada的数据类型分类体系Ada语言的枚举类型Ada的数值类型Ada的带符号整数类型103数据类型的设计、实现与语义数据类型概念的早期发展简史2数据类型的设计、实现与语义Ada的实数类型Ada的浮点数类型Ada的定点类型Ada的数值类型总结Ada的数组类型指针类型Ada的记录类型104数据类型的设计、实现与语义Ada的实数类型34.1数据类型概念的早期发展简史简单说来,数据类型就是数据对象的分类及该分类上的操作。1054.1数据类型概念的早期发展简史简单说来,数据类型就是数据对4.1.1基本指令系统中的类型因素指令系统:数据传送指令

INAL,PORT(字节)

INAX,PORT(字)

算术运算

MUL无符号数乘法指令

IMUL有符号数乘法指令

1064.1.1基本指令系统中的类型因素指令系统:54.1.1基本指令系统中的类型因素符号扩展指令

CBW(convertbytetoword)CWD(convertwordtodoubleword)

逻辑运算

ANDORNOTXOR1074.1.1基本指令系统中的类型因素符号扩展指令64.1.1基本指令系统中的类型因素

字符串处理

MOVS(movestring)CMPS(comparestring)

控制转移

JMPSHORTOPR

JMPWORDPTROPR1084.1.1基本指令系统中的类型因素字符串处理74.1.1基本指令系统中的类型因素数据类型:字节、字、双字、无符号整数、有符号整数、布尔值(值或向量)、字符、字符串评注:抽象程度低,以原子类型为主,分类不严格(缺乏原则、主要基于硬件功能和应用需要)、转换自由(基本在使用者的主观中,缺乏明显的转换标志)1094.1.1基本指令系统中的类型因素数据类型:字节、字、双字4.1.2汇编语言中的类型数据定义伪指令DB、DW、DDDATA_BYTEDB10,4,10HDATA_WORDDW100,100H,-5DATA_DWDD3*20,0FFFDHMESSAGEDB‘HELLO’

ARRAYDB100DUP(?)1104.1.2汇编语言中的类型数据定义伪指令DB、D4.1.2汇编语言中的类型结构定义伪指令(C语言)personstrucfnamedb'Firstname'lnamedb'lastname'monthdw?daydw?yeardw?personends1114.1.2汇编语言中的类型结构定义伪指令(C语言)104.1.2汇编语言中的类型属性(类型)修改操作符TYPEvariable返回类型 LENGTHvariable返回分配给该变量的单元数SIZEvariable返回分配给该变量的字节数,SIZE=LENGTH*TYPEOFFSETvariable返回变量的偏移地址SEGvariable返回变量的段地址值1124.1.2汇编语言中的类型114.1.2汇编语言中的类型类型指定操作符MOVAX,WORDPTROPER1+11134.1.2汇编语言中的类型类型指定操作符124.1.2汇编语言中的类型评注:复合(聚集)类型能力有所提高,但其中的数组类型没有明确化;开始支持用户定义类型;地址概念是类型的核心概念,占有等量存储空间的类型就兼容;类型转换显式化,但缺乏语义上的约束;出现属性的雏形。1144.1.2汇编语言中的类型评注:134.1.3FORTRAN语言静态、不支持用户定义类型对数值类型支持也十分有限:整数、实数、双精度、复数1154.1.3FORTRAN语言静态、不支持用户定义类型144.1.4C语言枚举类型、用户定义类型(数组、结构),支持动态数据结构(动态数组、联合),不具备支持抽象数据类型的能力;灵活,但理论基础不足,有些方面带有明显的汇编语言的痕迹(数组名同时表示数组第一个元素的地址,结构标志符本身不作为类型区分符使用);标准对类型之间的关系没有详细说明(boolean,numeration),转换比较随意(尤其在指针的问题上,

图1);1164.1.4C语言枚举类型、用户定义类型(数组、结构),4.1.5Ada类型丰富、全面,支持用户定义类型、抽象数据类型和面向对象概念,具备坚实的理论基础,概念一致、完整,同时提供以上语言中所具有的灵活性

Ada的类型定义机制1174.1.5Ada类型丰富、全面,支持用户定义类型、抽象数4.1.5.1Ada的类型定义机制用户定义类型:subtype用户定义类型:newtype;exampleofsubtype:subtypeDay_Numberisintegerrange1..31;subtypeFeb_DayisDay_Numberrange1..28;1184.1.5.1Ada的类型定义机制用户定义类型:subt4.1.5.1Ada的类型定义机制(续)subtype类似与pascal的子界类型,仅对相应type的值域加以限制,其它方面没有改变,subtype和相应type及同体系中其它subtypes之间进行混合运算时无需显式转换,即从本质上讲,subtype没有创造新的类型。Exampleofnewtypetypecolouris(Red,Amber,Green); typeLightisnewcolour;1194.1.5.1Ada的类型定义机制(续)subtypetypeApplesisnewInteger;typeOrangesisnewInteger;No_Of_Apples:Apples;No_Of_Oranges:Oranges;No_Of_Apples:=No_Of_Oranges;--wrongNo_Of_Apples:=Apples(No_Of_Oranges);--OKInteger(No_Of_Apples)+Integer(No_Of_Oranges);

--OK4.1.5.1Ada的类型定义机制(续)1204.1.5.1Ada的类型定义机制(续)19NewTypeVs.ParentTypeNewtype的作用

Newtype继承parenttype的预定义操作,用户定义的操作(primitivetype)(用户定义的判等操作除外)

121NewTypeVs.ParentTypeNewty4.2数据类型简单来讲,数据类型就是对数据对象的分类,分类方式主要是内涵式(少数是外延式)。内涵是对数据对象内在性质(静态、动态)的描述。externaldomain:问题域中的数据类型区分体系;internaldomain:编译器所能识别的存在于程序中的数据类型分类体系,我们希望该体系能够和externaldomain建立一一对应的关系,同时编译器也能识别这样的关系,参见图2、图3。1224.2数据类型简单来讲,数据类型就是对数据对象的分类,分4.2.1数据类型概念的组成(名字,结构,值集,属性集,操作集)

逻辑结构与存储表示逻辑操作与其实现用户定义实现,系统实现1234.2.1数据类型概念的组成(名字,结构,值集,属性集,操4.3强类型(strongtyping)强类型概念发展:ST#1(typed):必须为数据对象声明类型。ST#2(typed):每个变量都必须与一类型相联系,而且,该变量只能存储这一类型的对象。ST#3(stronglytyped):ST#4(stronglytyped)1244.3强类型(strongtyping)强类型概念发4.3.1强类型—ST#3所有的数据对象(变量,值,形参)均属于特定的类型(一般是有名的)。这些类型可以是预定义的或用户定义的。每个数据对象仅属于一种类型。每个变量仅能存储唯一类型的对象。一个类型可以有多个变体,该类型的数据对象的变体内容可在运行时确定,程序在处理此类数据对象时,必须对变体部分予以确认。在子程序调用过程中,所有实参的类型必须与对应形参的类型相匹配。语言必须对匹配原则做出明确规定。1254.3.1强类型—ST#3所有的数据对象(变量,值,形unionu_tag{intival;floatfval;char*sval;}u;联合126unionu_tag{联合25struct{char*name;intflags;intutype;union{intival;floatfval;char*sval;}u;}symtab[NSYM];带联合的结构127struct{带联合的结构264.3.2强类型—ST#4满足ST#3该语言须有系统、完整的类型体系,对类型间的关系及各种语境下使用类型概念的规则做出合理的规定。该类型体系及相关规则能够良好地反映问题域的逻辑结构和相关的约束。尽量在静态情况下完整地确定程序中的类型信息,检查出违反类型体系及相关规则的情况,给出明确的信息;对在动态情况下可能出现的类型错误给予充分的考虑,并予分类,提供预定义错误类型,提供动态检查及异常处理设施。1284.3.2强类型—ST#4满足ST#327强类型是一个相对的概念。

有一种说法,认为必须在静态条件下检测出所有的类型错误才算是强类型的。这是一个历史上的看法。现在看来,这样的定义有失简单与片面。现在的通用语言几乎都提供一些动态的数据类型。129强类型是一个相对的概念。284.4Ada的数据类型分类体系elementaryalltypescompositeaccessscalararrayrecord(protectedtask)discreteenumerationintegersignedmodularfloatingfixeddecimalordinaryreal1304.4Ada的数据类型分类体系elementarya4.5Ada语言的枚举类型4.5.1枚举类型举例4.5.2属性与操作4.5.3布尔类型1314.5Ada语言的枚举类型4.5.1枚举类型举例34.5.1枚举类型举例

typeDayis(Mon,Tue,Wed,Thu,Fri,Sat,Sun);

typeColoris(White,Red,Yellow,Green,Blue,Brown,Black);

typeHexais('A','B','C','D','E','F');

1324.5.1枚举类型举例typeDayis(M4.5.2属性与操作1基于标量类型属性的操作2第一个枚举字面值的位置为0,其后为“1”,…T’Val(T’Pos(X))=XT’Succ(X)=T’Val(T’Pos(X)+1)

3关系操作1334.5.2属性与操作1基于标量类型属性的操作324.5.3布尔类型定义:typeBooleanis(False,True);typeAnsweris(False,Don't_Know,True);预定义操作枚举类型的所有预定义操作,not,and,xor1344.5.3布尔类型定义:334.6Ada的数值类型涉及数值类型的主要问题:对机器实现的依赖(存储,界限,精度)

1354.6Ada的数值类型涉及数值类型的主要问题:344.7带符号整数类型4.7.1设计考虑4.7.2例子4.7.3预定义操作1364.7带符号整数类型4.7.1设计考虑354.7.1设计考虑设计数据类型时的考虑:范围、精度(forrealtype),硬件提供的数据类型,效率,可移植性.1374.7.1设计考虑设计数据类型时的考虑:364.7.2例子typePage_Numisrange1..2_000;subtypeSmall_IntisIntegerrange-10..10;subtypeBuffer_SizeisIntegerrange0..Max;1384.7.2例子typePage_Numisrang4.8Ada的实数类型浮点类型和定点类型混合运算1394.8Ada的实数类型浮点类型和定点类型384.9浮点类型

typeCoefficientisdigits10range-1.0..1.0;typeRealisdigits8;typeMassisdigits7range0.0..1.0E35;subtypeProbabilityisRealrange0.0..1.0;--asubtypewithasmallerrange1404.9浮点类型typeCoefficienti4.10定点类型typeVoltisdelta0.125range0.0..255.0;typeFractionisdeltaSystem.Fine_Deltarange-1.0..1.0;Fraction'Last=1.0-System.Fine_DeltatypeMoneyisdelta0.01digits15;decimalfixedpoint1414.10定点类型typeVoltisdelta04.11Ada的数值类型总结基本定义(范围、精度、表示方法),类型转换机制NumericTypeConversion如果整数之间的转换,只需转换类型标记(要检查约束)。实数之间的类型转换的原则是保证精度。实数向整数转换的过程主要是取整的过程。1424.11Ada的数值类型总结基本定义(范围、精度、表示方法4.12数组类型数组元素:具有相同的类型数组索引:任意离散类型1434.12数组类型数组元素:具有相同的类型424.12.1例子大多数语言中,数组下标局限于整数类型,这种局限缺乏理论上的依据。Ada语言中,数组的下标可以是任意离散类型。我们通过一些例子来看看这种约束的解除带来的便利。1444.12.1例子大多数语言中,数组下标局限于整数类型,这种Hours_Worked:array(Day)ofFloat;ForDinWorkdayloopHours_Worked(D):=8.0;Endloop;Hours_Worked(Sat):=0.0;Hours_Worked(Sun):=0.0;145Hours_Worked:array(Day)ofFlWork_Day:constantarray(Day)ofBoolean:=(True,True,True,True,True,False,False);Tomorrow:constantarray(Day):=(Tue,Wed,Thu,Fri,Sat,Sun,Mon);146Work_Day:constantarray(Day)匿名类型Examplesofobjectdeclarationswitharraytypedefinitions(anonymous):Grid:array(1..80,1..100)ofBoolean;Mix:array(ColorrangeRed..Green)ofBoolean;A,B:array(1..80,1..100)ofBoolean;ashorthand0fA:array(1..80,1..100)ofBoolean;B:array(1..80,1..100)ofBoolean;A:=B; --illegalA,B:Grid;A:=B;--legal147匿名类型Examplesofobjectdeclara可见正常情况下匿名类型的变量是无法和程序中的其它变量发生联系的,所以,在Ada语言中变量正常使用的前提是必须为它声明有名类型。Anonymoustypeandnamedtype的使用原则,该原则也适用于其它类型的问题。匿名类型148可见正常情况下匿名类型的变量是无法和程序中的其它变量发生联系4.12.2动态数组

动态数组:

N:integer::=…;Inverse:Matrix(1..N,1..N);--Nneednotbestatic1494.12.2动态数组

动态数组:48补充说明

C语言中Array类型(和函数类型)不能作为函数的返回类型。150补充说明

C语言中Array类型(和函数类型)不能作为函数的4.12.3操作array作为整体参加操作Slice&slidingS:String(1..7):=“BARBARB”S(4..7):=S(1..4)1514.12.3操作array作为整体参加操作50对multidimensionalarrays采用row-majororder。在与其它语言(如Fortran)混合编程时,可以采用适当的pragma提示编译器改用column-majororder。4.12.4实现152对multidimensionalarrays采用row-C#语言的数组类型:rectangulararrays,jaggedarray.classTest

{

staticvoidMain(){

int[]a1=newint[]{1,2,3};

int[,]a2=newint[,]{{1,2,3},{4,5,6}};

int[,,]a3=newint[10,20,30]; int[][]j2=newint[3][];

j2[0]=newint[]{1,2,3};

j2[1]=newint[]{1,2,3,4,5,6};

j2[2]=newint[]{1,2,3,4,5,6,7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论