数据成分及其加工2.ppt_第1页
数据成分及其加工2.ppt_第2页
数据成分及其加工2.ppt_第3页
数据成分及其加工2.ppt_第4页
数据成分及其加工2.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

赋值是一基本操作,常见的格式: 被赋方为地址,赋值方为数值。简记为: A := E (或 A = E) E一般是表达式,其计算结果的特征在不同的语言中是不同的。如 在Pascal中,对应于值的类型为简单类型,也允许是指针类型,但不允许是复合类型。(有的语言允许是复合类型) E的复杂程度依赖于语言的规定。 对于复合类型是否允许有运算符,在大多数语言不允许,但有的也有引进的,如数组值加常量。,4.5 数据的获取赋值,E的形式通常有: 具有结果类型为简单类型(如integer, real, char 等)的表达式; 具有结果类型为字符串类型的表达式; 具有结果类型为指针类型的变量,常量; 具有类型为数组的常量(用作赋初值); 具有类型为记录的常量(用作赋初值)。,4.5 数据的获取赋值,A一般应是变量,其语义上看应从量的地址(位置)角度理解。 除一般常用的名形式外,还可以引入语义适当的拟变量形式。如: A :=. Ai := Ai.field := if S then A else B := Address-A :=,4.5 数据的获取赋值,赋值语句从语义角度看,在ALGOL68中规定,被赋方和赋值方之间仅相差一层 “地址值”关系。被赋方的多样性依赖于实现系统和实际适用度,是实现的程度问题。 形如 x := x+1 其语义为 value(x)+1=address(x) 为了表示名的多侧面、多属性、多特征可以引入相应的特征函数予以指明, 如value(x), size(x),type(x), environment(x),address(x)等。,4.5 数据的获取赋值,多重赋值 左端1 := 左端2 := :=表达式 是若干个欲赋相同值的赋值语句的缩写。 应该保证左端和右端(结果)的类型应当是赋值相容的。 如 VAR A: real; B: integer; C: 0100; B :=5; 允许。 (2) C :=B; 不能赋值,4.5 数据的获取赋值,(3) B:=C 可以赋值(语言中应规定0100是integer的子类型)。 (4) A:=B; 一般系统会自动转换,允许赋值。 (5) B:=A; 如果系统自动进行转换,则允许进行赋值,否则需要使用转换函数integer(A),4.5 数据的获取赋值,对赋值语句两端出现记录类型或数组类型时,则语言中应有详细规定,如: VAR XYZ: RECORD F1: int :=10 F2: real :=0.0 END; ABC: array16 of integer; (1)XYZ :=(3, 4.0); 有的语言允许,赋完全的值 (2) XYZ :=(7,); 有的语言允许,赋部分的值 (3) ABC :=1 ;有的语言允许,为所有元素赋以值1 (4)ABC :=1,2,3,4,5,6有的语言允许,对数组元素逐个进行赋值,4.5 数据的获取赋值,隐性赋值 := 需要处理的语义问题: (1)表达式的计算结果应当为整数,如果不能保证应进行隐式或显式的类型转换; (2)下标位置允许的整数值的上下限应在相应的数组说明中指明。 (3)在编译时刻难以判断是否越界,故需要在运行时刻方可判定。,4.5 数据的获取赋值,在表达式中出现的函数调用 可能出现“副作用”,即可能存在同一个赋值语句中的同名量的值不相同,所以在串行流程中必须规定计算次序。 计算次序如下 : 求位置 求位置 求位置 (计算下标) (计算下标) (计算下标) 左端1 := 左端2 := := 右端; 赋值 赋值 赋值,4.5 数据的获取赋值,例子 I, J : integer; A, B : array1100 of integer; Function f(x:integer):integer; begin I:=I+1; J:=J+2; f:=x+1 end,4.5 数据的获取赋值,例: I:=3; J:=0; AI:=Bf(J)+I:=I+f(J)+I*J (1)求AI的位置,I=3; (2)求Bf(J)+I的位置, J=0, f(0)=0+1=1, 同时有,I=3+1=4, J=0+2=2(副作用), 即f(J)+I =5, Bf(J)+I =B5, (3)表达式的值为:4+f(2)+(4+1)*(2+2)=27, 在求f(2)时I=4+1=5, J=2+2=4(副作用) (4)将27赋给B5 (5)将27赋给A3,4.5 数据的获取赋值,AI:=BI + f(J):=I+f(J)+I*J 结果=?,I:=3; J:=0; AI:=BI + f(J):=I+f(J)+I*J (1)求AI的位置,I=3; (2)求BI + f(J)的位置, J=0, f(0)=0+1=1, 即I + f(J) =3+1=4, BI + f(J) =B4, 同时有,I=3+1=4, J=0+2=2(副作用), (3)表达式的值为:4+f(2)+(4+1)*(2+2)=27, 在求f(2)时I=4+1=5, J=2+2=4(副作用) (4)将27赋给B4 (5)将27赋给A3,在有些语言中不但引进了指针类型,还引进了在指针变量上允许进行“地址加减”等运算。甚至还引进了对应于“间接地址串”的逻辑表示“ref层次结构”。引进“求地址运算”和“赋值式的左方和右方的ref相差1”的规则. x y z w 如 W:=3; z:=,4.5 数据的获取赋值,3,有的语言中,赋值语句也返回值(作为表达式处理),该返回值包含被赋值拷贝的数据对象,Pascal中,赋值的规格说明为: Assignment (:=) : integer1integer2void 设置 integer1的值为integer2的值的复本,并不返回显式结果。,C中,赋值的规格说明为: Assignment (=) : integer1integer2integer3 设置 integer1的值为integer2的值的复本,同时创建并返回包含integer2的新值的复本的新数据对象integer3,4.5 数据的获取赋值,考虑赋值X:=X 右边的X称右端值,用于引用包含在命名数据对象中的值,r-值 左边的X用于指向包含新值的数据对象的位置,称为左值,l-值,赋值操作定义为: 1) 计算第一个操作数表达式的左值 2) 计算第二个操作数表达式的右值 3) 将右值赋给左值对象 4) 返回右值作为操作的结果 例如,有A=7.2, B=0.4. 赋值操作: A:=B; 见下图所示:,4.5 数据的获取赋值,赋值的两个不同视角,4.5 数据的获取赋值,相等和等价,考虑Zork语言中赋值: A2+3 有两种解释: 计值表达式2+3,将其等价值5赋给A; 将操作2+3赋给A。 如有静态类型检查,A的类型决定赋值的语义。但对动态类型语言,两种语义均是可能的,这种情形在Prolog中,is表示赋等价的值, =表示赋模式,相等性由被赋值变量的当前值决定。 X is 2+3,则X=5为真 X=2+3,则X=5为假, 因为操作“2+3”和整数5是不同的,,4.5 数据的获取赋值,表达式(包括函数调用)是加工处理数据的主要手段。表达式的实现过程如下: (1)从表达式中分析出运算分量和运算符以及决定运算符的执行序列; (2)从运算分量获取值,根据相应的运算符的要求进行匹配和计算; (3)当所有的执行序列完成后,求得的结果应留在某个位置(如累加器)内; (4)如果它为赋值语句的右端,则将此值赋给赋值语句左端的变量;,4.6 数据的加工表达式,(5)若其对应的语法位置为下标表达式之类的“隐式赋值”时,则此值如何处理将由实现系统决定。 所有运算分量应是同一执行环境中的量。 环境:程序中能存取到的变元空间。 表达式的最小元素应为常量、变量和函数调用。由于函数调用可能引起副作用和递归调用,因此会出现相当复杂的情况. 表达式中出现的运算符:算术、逻辑、关系、字符串等。可分为单目、双目和三目运算。,4.6 数据的加工表达式,表达式中出现的运算符一般均定义其优先级,不同的程序设计语言的运算符的优先级未必相同。 运算分量的运算符之间必须匹配,处理过程可能通过重载决定。如果不匹配,或以出错论处或进行相应的转换后再进行运算。 串行执行的顺序为:括号最先;运算符优先级次之;从左到右再次之。,4.6 数据的加工表达式,在一定的需求和条件下,表达式也可能采用并行计算顺序,表达式的并行运算是粒度较小的。 如 W:=f(x)+g(y)+z 如果f(x),g(y)之间是数据无关的,则可以完全并行;如果f(x),g(y)之间存在某些数据是相关,则在并行执行过程中需要建立同步机制,并需要指明同步处理之后的执行机制。,4.6 数据的加工表达式,例:f1(x1,x2,xn)=x1+x2+xn f2(x1,x2,xn)=x12+x22+xn2 如果需要计算 y=f2(f1(a,b,c), f2(a,b,c,d)(P98图4.3) 串行的执行序列:temp1:= f1(a,b,c); temp2:= f2(a,b,c,d); y:=f2(temp1,temp2); 并行的执行序列: Cobegin temp1:= f1(a,b,c), temp2:= f2(a,b,c,d) coend; y:=f2(temp1,temp2); “;”为串行执行运行控制符,而“,”为并行执行运行控制符;cobegin和 coend为并行程序段的括号。,4.6 数据的加工表达式,4.7.1强类型 量的类型是刻划其内在性质的一个方面,一般不变,量的类型通过量的说明进行刻划。 如, x : real; y: array110 of real; 通过对源程序的扫描分析可完全获得此种类型的性质,这种类型称为静态类型。 z: array1x of real; x:union (real,integer,charstring(4); 而有的类型性质不能从源程序的扫描中完全获得,常在运行时刻才能获得完全信息。这种类型称为动态类型。,4.7 类型的检测和转换,类型检查指检查程序中每个操作是否均接收了数目和类型都正确的参数。它可在运行时完成,即动态类型检查;或编译时检查,即静态类型检查。,在动态类型和静态类型之间存在着“动态性质静态处理”的拟静态类型(半动态类型)。 如可调数组类型则具有“其数组元素个数有上下界,其存储分配可按照其最大元素来分配”和特征。 可满足多种方面的要求:用户具有使用类似于动态特征的灵活性;实现者采用了静态特征和简便性,实现方便又提高了可靠性。,4.7 类型的检测和转换,强类型 程序中出现的任何数据的类型特征都可以在编译时刻确定,故而对于量的类型检查和匹配检测均在编译时刻完成。 一个语言称为强类型语言当且仅当其所有量的类型特征都能在编译时刻确定或者所有表达式中的类型特征都能在编译时刻确定。,4.7 类型的检测和转换,如 A:array1x of real; /*动态数组/ W:integer; 表达式为 A3:=AW+3.5; /*下标变量,可以 编译生成目标*/ A的类型是动态的,但A3和AW的位置是可以计算的,是否越界则可通过运行子程序来决定。 强类型语言要求每一个量在程序中应当有唯一的类型,即,所有量的名和类型的连接(binding)在编译时刻完成。,4.7 类型的检测和转换,4.7.2类型的检测 对量的类型特征进行检测的目的在于:量的类型特征信息一般应通过说明部分获取。量的说明性出现将生成有语义的词牌。而其量的应用性出现则需要检测该量的类型是否符合语法位置的要求。,4.7 类型的检测和转换,静态类型检查需要的信息通常由程序员在声明中及在其他语言结构中提供: 每个操作参数的数量、顺序、类型及结果类型 每个变量关联的命名数据对象的类型 每个常量数据对象的类型 编译器在翻译的早期阶段收集声明中的类型信息,以后将用于类型检查,4.7 类型的检测和转换,静态检查将针对程序中的所有操作进行,所有可能的执行路径均被检查。因此,关于类型错误的进一步测试是不需要的,因而不需类型标签和运行时类型检查,静态检查涉及语言的多个方面:声明、数据控制结构、分别编译等,在多数语言中,对某些语言结构的静态检查在某种情况下是不可能的。解决方案:采用动态类型检查或不检查,4.7 类型的检测和转换,动态类型的优点:程序员不需考虑类型问题,具有较高灵活性。,动态类型检查的缺点: 程序难于调试,不能完全消去所有参数类型错误。程序测试不可能检测所有的路径 需要在执行过程中保持类型信息,需存储空间 动态检查需以软件实现,有时间花销,4.7 类型的检测和转换,例: A: array 110 of real; A1:=Ai+3.0;,4.7 类型的检测和转换,例:x:integer:=1000; B: array 1x of integer; Bi:=Aj+1.0;,表达式中A1和Ai的检测可以由编译时刻决定其类型。 表达式中Bi和Aj也可在编译时刻获取其类型信息,完成相应的检测。但下标越界时则依赖上下界值。,类型的动态特征有时可以实现静态理解,从而进行静态处理。,4.7 类型的检测和转换,例 X: union(real, integer,char(4) 当 x:=x+1.1 (x理解为real) x:=x+1 (x理解为integer) x:=x(2,2) con (x理解为char(4), x(2,2)表示子串),这种理解依赖于上下文,例 x,y: union(real,integer,char(4) 当x:=y时,x,y的类型无法确定,但仍可能认为是位置相同而进行赋值。,需要进行类型检测的位置主要是表达式语法位置(包括常量、变量在内)。 例如,赋值式的两端、运算分量、下标变量、域变量、标识变量、指针值的标识对象。,4.7 类型的检测和转换,4.7.3 类型的转换 由于量出现的语法位置的语义限制和匹配需求等,需要对量进行转换,即为对量的类型进行转换。,4.7 类型的检测和转换,如果在类型检查中,参数的实际类型和操作期望的类型间出现不匹配,则有两种处理方案: 指出出错 进行类型转换,类型转换的基调为: conversion-op : type1type2 将一个对象变为另一类型的对象,4.7 类型的检测和转换,转换的位置有: 赋值式(向左看齐) 下标位置(向离散类型看齐) 运算分量(整型向实型看齐),大多数语言以两种方式提供类型转换: 1) 显式转换。作为固有函数,程序员可显式地调用。如:将实数变成整数,Pascal中的round,C中的(int) x 2) 隐式转换。由语言预先规定转换方法。自动在类型失配时调用。如:整数和实数间相加,总是先将整数转变为实数。,4.7 类型的检测和转换,例如,x+0.5 当x 的类型为integer,则自然转成real,再加。 Y:=x+0.5 当y为real, x+0.5的值直接可赋;当y为integer,则一般要求采用显式转换。但也可规定“舍入”赋值,或“截断”赋值,即采用隐式转换。,4.7 类型的检测和转换,隐式转换和显式转换各有利弊。一般语言中采用两者结合的方式。少数情况由系统自动实现转换,而多数情况由程序员使用系统提供的转换函数进行转换。,类型的继承和扩展是面向对象程序设计语言中的重要设施。 Ada95中的带标记类型(tagged types)和类型的扩展(type extensions)支持了面向对象的程序设计,基于指派操作(dispatching operation)来达到带有扩展的继承和运行时的多态机制。 记录类型或私有类型中有tagged保留字的称为带标记类型。从带标记类型可以导出(衍生)以增加新的分量。衍生类型还可以带标记。在基类上扩展。其形式为: 记录扩展部分:= with 记录定义,4.8 类型的继承和扩展,例1: type point is tagged record x,y: real:=0.0; end record; %point为带标记的记录类型% type painted-point is new point with record paint: color:=white; end record; %分量x,y被继承,并扩展了paint%,4.8 类型的继承和扩展,类型的参数化用于类型的抽象以及说明一簇类型。其参数值的确定时刻是不同的,可以是静态和动态两种。 类型参数化的两个要素: (1)不完全的类型说明; (2)不完全因素的确定机制。 类型的参数化在不同的语言中有不同的机制和表示。,4.9 类型的参数化,4.9.1 Pascal 语言中数组参数化 例如,type AR1=array1x of real; 上界x的值应在外层分程序中确定。(P103) 这种动态数组的实现代价较高。在Pascal中不

温馨提示

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

评论

0/150

提交评论