《数据成分及其加工》PPT课件.ppt

上传人:w****2 文档编号:16567344 上传时间:2020-10-13 格式:PPT 页数:45 大小:409.84KB
返回 下载 相关 举报
《数据成分及其加工》PPT课件.ppt_第1页
第1页 / 共45页
《数据成分及其加工》PPT课件.ppt_第2页
第2页 / 共45页
《数据成分及其加工》PPT课件.ppt_第3页
第3页 / 共45页
点击查看更多>>
资源描述
赋值是一基本操作,常见的格式: 被赋方为地址,赋值方为数值 。简记为: 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: 0.100; (1) B :=5; 允许。 (2) C :=B; 不能赋值 4.5 数据的获取 赋值 (3) B:=C 可以赋值(语言中应规定 0.100是 integer的子类型)。 (4) A:=B; 一般系统会自动转换,允许赋值。 (5) B:=A; 如果系统自动进行转换,则允许进 行赋值,否则需要使用转换函数 integer(A) 4.5 数据的获取 赋值 对赋值语句两端出现记录类型或数组类型 时,则语言中应有详细规定 ,如: VAR XYZ: RECORD F1: int :=10 F2: real :=0.0 END; ABC: array1.6 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 : array1.100 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:= y:= x:= 4.5 数据的获取 赋值 3 有的语言中,赋值语句也返回值(作为表达式 处理),该返回值包含被赋值拷贝的数据对象 Pascal中,赋值的规格说明为: Assignment (:=) : integer1 integer2void 设置 integer1的值为 integer2的值的复本,并 不返回显式结果。 C中,赋值的规格说明为: Assignment (=) : integer1 integer2integer3 设置 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)=x1 2+x22+xn 2 如果需要计算 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: array1.10 of real; 通过对源程序的扫描分析可完全获得此种类型的性 质,这种类型称为静态类型 。 z: array1.x of real; x:union (real,integer,charstring(4); 而有的类型性质不能从源程序的扫描中完全获得, 常 在运行时刻才能获得完全信息。这种类型称为 动态类型。 4.7 类型的检测和转换 类型检查指检查程序中每个操作是否均接 收了数目和类型都正确的参数。它可在运 行时完成,即动态类型检查;或编译时检 查,即静态类型检查。 在动态类型和静态类型之间存在着“动态性 质静态处理”的 拟静态类型 ( 半动态类 型 )。 如可调数组类型则具有“其数组元素个数有 上下界,其存储分配可按照其最大元素来 分配”和特征。 可满足多种方面的要求 :用户具有使用类似 于动态特征的灵活性;实现者采用了静态 特征和简便性,实现方便又提高了可靠性。 4.7 类型的检测和转换 强类型 程序中出现的任何数据的类型特征都可以在 编译时刻确定,故而对于量的类型检查和 匹配检测均在编译时刻完成。 一个语言称为 强类型语言 当且仅当 其所有量 的类型特征都能在编译时刻确定或者所有 表达式中的类型特征都能在编译时刻确定。 4.7 类型的检测和转换 如 A:array1.x 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 1.10 of real; A1:=Ai+3.0; 4.7 类型的检测和转换 例: x:integer:=1000; B: array 1.x 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=array1.x of real; 上界 x的值应在外层分程序中确定。 (P103) 这种动态数组的实现代价较高。在 Pascal中不允许 采用。但在形式参数中采用了 可调数组 的设施。 type AR2=arrayx:A.B, y:C.D of real 其中 A,B,C,D为正整数, x的值在 A,B中, y的值在 C,D中。 x,y的值在运行时才能确定,但其最小 值和最大值却可在编译时确定。 4.9 类型的参数化 可改写为: type AR2=arrayx:integer range A.B, y: integer range C.D of real 可以 将上下界部分看作约束部分(判别式) , 成为参数化的一种设施。这种 可调数组的 上下界值的确定时间为相应的调用时刻。 4.9 类型的参数化 4.9.2 Ada语言类型中的约束部分 (自学 ) 4.9.3 类属子句 类属机制作为类型参数化的一种,在 C+中称类 属子句为 模板。 例如, (P106) Generic(type item; size: int) 称为类属子。 item和 size称为类属参数,它们的作用和形式有 些像参数,用实在参数替换时必须满足其属性, 即 item是类型, size是整数。这种替换是编译之 前完成的。故应属于静态的。 类属子句的作用范围为其下面的模块,整个例子 称为类属模块。 4.9 类型的参数化 数据的刻划要素与分类 数据类型的等价 赋值 表达式 类型的检测和转换 类型的继承的扩展 类型的参数化。 第 4章 总结 1.举例说明 按名等价、按定义等价、按结构等价 之间的区别。 2.写出下列赋值语句的计算顺序: i, j : integer; A,B,C : array1.100 of integer; function(x:integer):integer; Begin i:=i+5; j:=j+1; f:=x+2; end 有下列语句: i:=6; j:=4; Ai:=Bf(j)+i+f(i):=f(i)+f(j) 第四章 作业
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!