计算机编译chapt2
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以通过数据类型显式定义数据的精度
第三节 用户定义类型
许多语言允许程序员规定基 本数据对象的聚合,乃至聚合 的聚合
1. 笛卡尔积
N个集合A1,A2,…,An的笛卡尔积表示为 A1 A2 … An,它是一个集合,其元素 为(a1,a2,…,an), ai Ai 任意正多边形可表示为 integer *real
判定或可具有缺省初值 也可以说明一个对象的变体是冻结的 单独对判定或赋值是不允许的
PEACH:ITEM; ORANGE:ITEM(FALSE); COCA_COLA:ITEM; COCA_COAL:=ORANGE; (合法) COCA_COAL:=(PRICE=>1.99,AVAILABLE=>TRUE, AMOUNT=>1500,WHER=>FOOD);
⑥DT到相应值的特定子集的绑定策ቤተ መጻሕፍቲ ባይዱ:
.编译时绑定 (静态数组) .对象建立时绑定 (执行到分程序时, 动态数组) .对象处理时绑定(对APL,子集范围可变)
3. 序列
①序列由任意多个数据项组成,这些数 据项称为该序列的成分,且类型相同 ②串是序列 ③顺序文件的思想也是来自序列的概 念,只能顺序读写
2. 记录 ①说明形式
type COORDINATE is record X:INTEGER range 0..100; Y:CHARACTER; end record;
②Ada的判全或是安全的
type DEPT is (HOUSEWARE,SPORTS, DRUGS,FOOD,LIQUOR); type MONTH is range 1..12; type ITEM (AVAILABLE:BOOLEAN: =TRUE) is record PRICE:REAL; case AVAILABLE of when TRUE=>AMOUNT:INTEGER; WHERE:DEPT; when FALSE=>MONTH_EXPECTED:MONTH end case; end record;
其中, 界的值不一定静态给出
function SUM(X:INT-VECTOR) return INTEGER; RESULT: INTEGER:=0; begin for I in X‟FIRST..X‟LAST loop RESULT:= RESULT+X(I); end loop; return RESULT; end SUM;
二. 组合类型
1. 数组 ①约束数组类型 下标界是静态确定的
type MONTH is (JAN,FEB,MAR,APR,MAY,JUN, JUL,AUG,SEP,OCT,NOV,DEC); type YEARLY_PAY is array(MONTH) of INTEGER; type SUMMER_PAY is array(MONTH range JUL..SEP) of INTEGER;
»PASCAL文件仅能顺序处理
»PUT和GET操作
三. 指针
»指针可引用匿名数据对象
NEW,堆
»空指针的使用 »指针的操作:赋值,比较 »PASCAL指针只能指向匿名数据对象
指针例子
type tree_ref= binary_tree_node; binary_tree_node=record info:char; left,right:tree_ref end; pointer= node; node=record data:integer; next:pointer end;
2. 记录构造
①构造符RECORD用以定义笛卡尔积
②记录可以整体访问,也可用圆点“.”
作为选择符访问单个的域
③PASCAL的变体记录
type dept=(house,sports,drugs,food,liquor); month=1..12; item=record price:real; case available:boolean of true:(amount:integer; where:dept); false:(month_expected:month) end;
③Ada数组类型由分量的类型,下标个数 和下标类型来刻画
④界的确定可在数据对象成为实体时,或 参数传递时完成
SPRING_MONTH:SOME_PERIOD_PAY(APR..JUN); Z:INT_VECTOR(-100..100); W:INT_VECTOR(20..40); Y:BOOL_MAXTRIX(0..N,0..M);
二. 聚合构造 1. 数组构造
»构造符ARRAY允许程序员定义有限映
象 array[t1] of [t2] »PASCAL把下标类型不同的数组看成不 同的类型 type a1=array[1..50] of integer; a2=array[1..70] of integer;
»“符合数组”的概念(见下页)
第二章
数据类型
数据类型实质上是对存储器中 所存储的数据进行的抽象。它包 含了一组值的集合和一组操作。
第一节 引言
1. 数据类型的作用 »实现了数据抽象 »使程序员从机器的具体特征中解脱 出来 »提高了编程效率 2. 数据类型的分类 »内部类型 »自定义类型
第二节 内部类型
一. 内部类型的特点
.反映基本硬件特性
6. 幂集
类型T的元素所有子集的集合,称为
幂集,记为Powerset(T),T称为基类型。
应用:每次的操作对象仅仅是某个集合的
子集。
7. 小结 通过PASCAL的类型定义和变量说明, 给出用户定义类型显式命名的优点:
①可读性 (选择名字) ②可修改性 (不修改变量说明) ③可分性 (重复使用) ④一致性检查 (参考第8节)
5.24 true 29 liquor
price
324.99 false
available
amount
available
month_expected
8
where
④使用变体记录不安全 ■可以对变体赋值 ■可以改变标识符域 ■标识符域的标识符可省缺
3. 集合构造
»SET构造符是幂集构造受限制的形式
»基类型只能是有序类型
②非约束数组类型 Ada支持动态数组
type SOME_PERIOD_PAY ia array(MONTH range< >) of INTEGER; type INT_VERTOR ia array(INTEGER range < >) of INTEGER; type BOOL_MAXTRIX is array(INTEGER range < >, INTEGER range < >) of BOOLEAN;
可用不同大小的数组作为实参来调用该函数 A:=SUM(Z)+SUM(W);
⑤可以在过程的局部说明中说明一个数 组,它的界依赖于一个参数
TEMPORARY:INT_VECTOR(X‟FIRST..X‟LAST);
⑥切片:用以选取一维数组若干个相继分 量
LINE:STRING(1..80); LINE(1..11):=(„D‟,‟e‟,‟a‟,‟r‟,‟‟,‟f‟,‟r‟,‟i‟,‟e‟,‟n‟,‟d‟);
2. 有限映像
①定义:从定义域类型DT的值的 有限集合,到值域类型RT的值的 有限集合的函数称为有限映像。
var a:array[1..50] of char; 表示:整数1至50到字符集的有限映像
②值域对象通过下标选取。
③下标越界会出错,动态检查
④下标可用来选取值域的多个元素
⑤SNOBOL4的ARRAY构造符并 不要求值域集的所有元素是同一 类型的
如:定点加
.在语言级,标识共用某些操作的数据
对象的抽象表示
如:整型共用+、-、*、/
二. 内部类型的优越性 1. 基本表示的不可见性 基本位串对程序员是不可见的。 25+9=34 基本表示00011001+00001001 结果00100010 从而具有优点:不同的程序设计风格, 可写性,可读性,可修改性。
维数相同,成分类型相同 »PASCAL可定义多维数组 type row=array[-5..10] of integer; var my_matrax:array[3..30] of row; 或
var my_matrix:array[3..30,-5..10] of integer;
procedure sort(var a:array[low..high:integer] of ctype); var i:integer; more:boolean; begin {sort} more:=true; while more do begin more:=false; for i:=low to high-1 do begin if a[i]>a[i+1] then begin move_right(i); more:=true end end end end {sort};
一. 非结构类型
1. 内部类型 integer,real,boolean,char 2. 有序类型 每一元素都有唯一的前驱和后继 如:整型,布尔型,字符型 3. 定义新的有序类型的方法 »枚举型 其值不能直接读/写 »子界型 动态检查范围
例:
type day=(sunday,monday,tuseday,wednesday, thursday,friday,saturday); work_day=monday..friday; var class_day:work_day; class_day:=succ(class_day);
2.编译时能检查变量使用的正确性
进行静态类型检查,如非法运算,形实参类 型匹配
3. 编译时可以确定无二义的操作 超载(多态)的概念:运算符的意义 依赖于操作数的类型。如“+”可 以表示整数加或实数加 编译时,可拒绝混合运算,或提供类 型转换指令 合理地使用超载,可以提高语言的 可读性和可用性 4. 精度控制
4. 递归 若数据类型T包含属于同一类型T的成 分,那么类型T称为递归类型。
①允许在类型定义中使用被定义类型的名 字 ②指针是建立递归数据对象的重要手段
5.判定或
判定或是一个选择对象结构的构造机制, 规定在两个不同选择对象之间作出适当 的选择。每一选择对象结构称为变体。 例如:PASCAL的变体记录; C的联合。
3. 用户自定义类型
type type type type TWO_DIGIT is range 0..99; FLOAT_1 is digits 10 range 0.0..3.0; FIT_PT is delta 0.01 range 0.00..100.01; BOOLLEAN is (FALSE,TRUE);
匿名类型
var a: record x:integer; y:array[1..10] of char end; 显式命名 type complex=record radius:real; angle:real end; var c1,c2,c3:complex;
第四节 PASCAL类型结构
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;
price
type vegetable=(bean,cabbage,carrot,celery,lettuce, onion,mushroom,zucchizi); var my_salad,leftover:set of vegetable;
4. 文件构造
»PASCAL文件是任意类型的诸元素的
序列
type pattern=record …end; tape=file of pattern; var t1,t2:tape;
四. 小结.(P37图2-4)
Pascal类型
非结构类型
指针类型 (递归)
结构类型
内部类型 子界类型 整型 实型 字符型 枚举类型 布尔型
记录类型 数组 集合 (迪卡尔积) 变体记录 (判定或)
文件
第五节 Ada类型结构
一. 标量类型 1. 分类 实型 数字类型 标量类型: 整型 离散类型 枚举类型 2. 标量类型的值的集合是有序的,允 许关系运算
第三节 用户定义类型
许多语言允许程序员规定基 本数据对象的聚合,乃至聚合 的聚合
1. 笛卡尔积
N个集合A1,A2,…,An的笛卡尔积表示为 A1 A2 … An,它是一个集合,其元素 为(a1,a2,…,an), ai Ai 任意正多边形可表示为 integer *real
判定或可具有缺省初值 也可以说明一个对象的变体是冻结的 单独对判定或赋值是不允许的
PEACH:ITEM; ORANGE:ITEM(FALSE); COCA_COLA:ITEM; COCA_COAL:=ORANGE; (合法) COCA_COAL:=(PRICE=>1.99,AVAILABLE=>TRUE, AMOUNT=>1500,WHER=>FOOD);
⑥DT到相应值的特定子集的绑定策ቤተ መጻሕፍቲ ባይዱ:
.编译时绑定 (静态数组) .对象建立时绑定 (执行到分程序时, 动态数组) .对象处理时绑定(对APL,子集范围可变)
3. 序列
①序列由任意多个数据项组成,这些数 据项称为该序列的成分,且类型相同 ②串是序列 ③顺序文件的思想也是来自序列的概 念,只能顺序读写
2. 记录 ①说明形式
type COORDINATE is record X:INTEGER range 0..100; Y:CHARACTER; end record;
②Ada的判全或是安全的
type DEPT is (HOUSEWARE,SPORTS, DRUGS,FOOD,LIQUOR); type MONTH is range 1..12; type ITEM (AVAILABLE:BOOLEAN: =TRUE) is record PRICE:REAL; case AVAILABLE of when TRUE=>AMOUNT:INTEGER; WHERE:DEPT; when FALSE=>MONTH_EXPECTED:MONTH end case; end record;
其中, 界的值不一定静态给出
function SUM(X:INT-VECTOR) return INTEGER; RESULT: INTEGER:=0; begin for I in X‟FIRST..X‟LAST loop RESULT:= RESULT+X(I); end loop; return RESULT; end SUM;
二. 组合类型
1. 数组 ①约束数组类型 下标界是静态确定的
type MONTH is (JAN,FEB,MAR,APR,MAY,JUN, JUL,AUG,SEP,OCT,NOV,DEC); type YEARLY_PAY is array(MONTH) of INTEGER; type SUMMER_PAY is array(MONTH range JUL..SEP) of INTEGER;
»PASCAL文件仅能顺序处理
»PUT和GET操作
三. 指针
»指针可引用匿名数据对象
NEW,堆
»空指针的使用 »指针的操作:赋值,比较 »PASCAL指针只能指向匿名数据对象
指针例子
type tree_ref= binary_tree_node; binary_tree_node=record info:char; left,right:tree_ref end; pointer= node; node=record data:integer; next:pointer end;
2. 记录构造
①构造符RECORD用以定义笛卡尔积
②记录可以整体访问,也可用圆点“.”
作为选择符访问单个的域
③PASCAL的变体记录
type dept=(house,sports,drugs,food,liquor); month=1..12; item=record price:real; case available:boolean of true:(amount:integer; where:dept); false:(month_expected:month) end;
③Ada数组类型由分量的类型,下标个数 和下标类型来刻画
④界的确定可在数据对象成为实体时,或 参数传递时完成
SPRING_MONTH:SOME_PERIOD_PAY(APR..JUN); Z:INT_VECTOR(-100..100); W:INT_VECTOR(20..40); Y:BOOL_MAXTRIX(0..N,0..M);
二. 聚合构造 1. 数组构造
»构造符ARRAY允许程序员定义有限映
象 array[t1] of [t2] »PASCAL把下标类型不同的数组看成不 同的类型 type a1=array[1..50] of integer; a2=array[1..70] of integer;
»“符合数组”的概念(见下页)
第二章
数据类型
数据类型实质上是对存储器中 所存储的数据进行的抽象。它包 含了一组值的集合和一组操作。
第一节 引言
1. 数据类型的作用 »实现了数据抽象 »使程序员从机器的具体特征中解脱 出来 »提高了编程效率 2. 数据类型的分类 »内部类型 »自定义类型
第二节 内部类型
一. 内部类型的特点
.反映基本硬件特性
6. 幂集
类型T的元素所有子集的集合,称为
幂集,记为Powerset(T),T称为基类型。
应用:每次的操作对象仅仅是某个集合的
子集。
7. 小结 通过PASCAL的类型定义和变量说明, 给出用户定义类型显式命名的优点:
①可读性 (选择名字) ②可修改性 (不修改变量说明) ③可分性 (重复使用) ④一致性检查 (参考第8节)
5.24 true 29 liquor
price
324.99 false
available
amount
available
month_expected
8
where
④使用变体记录不安全 ■可以对变体赋值 ■可以改变标识符域 ■标识符域的标识符可省缺
3. 集合构造
»SET构造符是幂集构造受限制的形式
»基类型只能是有序类型
②非约束数组类型 Ada支持动态数组
type SOME_PERIOD_PAY ia array(MONTH range< >) of INTEGER; type INT_VERTOR ia array(INTEGER range < >) of INTEGER; type BOOL_MAXTRIX is array(INTEGER range < >, INTEGER range < >) of BOOLEAN;
可用不同大小的数组作为实参来调用该函数 A:=SUM(Z)+SUM(W);
⑤可以在过程的局部说明中说明一个数 组,它的界依赖于一个参数
TEMPORARY:INT_VECTOR(X‟FIRST..X‟LAST);
⑥切片:用以选取一维数组若干个相继分 量
LINE:STRING(1..80); LINE(1..11):=(„D‟,‟e‟,‟a‟,‟r‟,‟‟,‟f‟,‟r‟,‟i‟,‟e‟,‟n‟,‟d‟);
2. 有限映像
①定义:从定义域类型DT的值的 有限集合,到值域类型RT的值的 有限集合的函数称为有限映像。
var a:array[1..50] of char; 表示:整数1至50到字符集的有限映像
②值域对象通过下标选取。
③下标越界会出错,动态检查
④下标可用来选取值域的多个元素
⑤SNOBOL4的ARRAY构造符并 不要求值域集的所有元素是同一 类型的
如:定点加
.在语言级,标识共用某些操作的数据
对象的抽象表示
如:整型共用+、-、*、/
二. 内部类型的优越性 1. 基本表示的不可见性 基本位串对程序员是不可见的。 25+9=34 基本表示00011001+00001001 结果00100010 从而具有优点:不同的程序设计风格, 可写性,可读性,可修改性。
维数相同,成分类型相同 »PASCAL可定义多维数组 type row=array[-5..10] of integer; var my_matrax:array[3..30] of row; 或
var my_matrix:array[3..30,-5..10] of integer;
procedure sort(var a:array[low..high:integer] of ctype); var i:integer; more:boolean; begin {sort} more:=true; while more do begin more:=false; for i:=low to high-1 do begin if a[i]>a[i+1] then begin move_right(i); more:=true end end end end {sort};
一. 非结构类型
1. 内部类型 integer,real,boolean,char 2. 有序类型 每一元素都有唯一的前驱和后继 如:整型,布尔型,字符型 3. 定义新的有序类型的方法 »枚举型 其值不能直接读/写 »子界型 动态检查范围
例:
type day=(sunday,monday,tuseday,wednesday, thursday,friday,saturday); work_day=monday..friday; var class_day:work_day; class_day:=succ(class_day);
2.编译时能检查变量使用的正确性
进行静态类型检查,如非法运算,形实参类 型匹配
3. 编译时可以确定无二义的操作 超载(多态)的概念:运算符的意义 依赖于操作数的类型。如“+”可 以表示整数加或实数加 编译时,可拒绝混合运算,或提供类 型转换指令 合理地使用超载,可以提高语言的 可读性和可用性 4. 精度控制
4. 递归 若数据类型T包含属于同一类型T的成 分,那么类型T称为递归类型。
①允许在类型定义中使用被定义类型的名 字 ②指针是建立递归数据对象的重要手段
5.判定或
判定或是一个选择对象结构的构造机制, 规定在两个不同选择对象之间作出适当 的选择。每一选择对象结构称为变体。 例如:PASCAL的变体记录; C的联合。
3. 用户自定义类型
type type type type TWO_DIGIT is range 0..99; FLOAT_1 is digits 10 range 0.0..3.0; FIT_PT is delta 0.01 range 0.00..100.01; BOOLLEAN is (FALSE,TRUE);
匿名类型
var a: record x:integer; y:array[1..10] of char end; 显式命名 type complex=record radius:real; angle:real end; var c1,c2,c3:complex;
第四节 PASCAL类型结构
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;
price
type vegetable=(bean,cabbage,carrot,celery,lettuce, onion,mushroom,zucchizi); var my_salad,leftover:set of vegetable;
4. 文件构造
»PASCAL文件是任意类型的诸元素的
序列
type pattern=record …end; tape=file of pattern; var t1,t2:tape;
四. 小结.(P37图2-4)
Pascal类型
非结构类型
指针类型 (递归)
结构类型
内部类型 子界类型 整型 实型 字符型 枚举类型 布尔型
记录类型 数组 集合 (迪卡尔积) 变体记录 (判定或)
文件
第五节 Ada类型结构
一. 标量类型 1. 分类 实型 数字类型 标量类型: 整型 离散类型 枚举类型 2. 标量类型的值的集合是有序的,允 许关系运算