编译原理笔记【第二章 数据类型】

第一节 引言

具体和抽象
具体:二进制串(机器语言)
抽象:符号注记(汇编语言,高级语言等)

1. 什么是数据类型

数据类型本质是对存储器中所存储的数据进行抽象
数据类型包含一组和一组操作

2. 数据类型的作用

实现了数据抽象
从机器的具体特征中解脱出来
提高了编程效率

语言的某种特定的数据抽象受到两个因素的影响:
1.语言所面向的机器(只提供定点运算或同时提供浮点运算)(移植有关)
2.语言所面向的应用领域

3. 数据类型的分类

内部类型
语言自己定义的类型
用户定义类型
顾名思义


第二节 内部类型

1. 内部类型的特点

反应基本硬件特性;
在语言级,同一类型数据的操作使用共同的抽象表示 (如+,-,*,/)

2. 内部类型的优越性

  • (1)基本表示对程序员不可见

    例如25+9=34
    基本表示00011001+00001001=00100010

  • (2)编译时能检查变量使用的正确性

    能够进行静态类型检查
    如:非法运算;形参实参类型匹配

  • (3)编译时可以确定无二义的操作

    运算符重载,编译时,拒绝混合运算,或提供类型转换指令。
    合理的使用重载,可以提高可读性和可用性

  • (4)精度控制

    可以通过数据类型显示定义数据的精度
    float, double


第三节 用户定义类型

  • 语言允许程序员利用数据的聚合机制,定义复杂的数据对象。
  • 语言允许程序员利用数据聚合机制,定义以复杂的数据对象作为基本项的聚合(聚合的聚合)
  • 六种聚合方式

1. 笛卡尔积

  • 定义
    n个集合A1, A2, … , An的笛卡儿积:
    A1×A2×…×An,
    它是一个集合,其元素时有序的n元式
    (a1, a2, … , an)
  • 举例
    例如一个正多边形用一个整数表示边数,用一个实数表示长度
    integer×real

    C语言中的结构就是很好应用

2. 有限映像

  • 定义
    从定义域类型DT值的有限集合,到值域类型RT值的有限集合的函数(映像)称为有限映像
    值域对下给你通过下标变量方式对应
  • 举例

    数组

3. 序列

(1)任意多个数据项组成,数据项称为该序列的成分,且类型相同
(2)串是序列(字符串)
(3)顺序文件的思想也来自序列的概念,只能顺序读写

4. 递归

若数据类型T包含属于同一类型T的成分——递归类型
(1)在类型定义中使用被定义类型的名字
(2)不允许直接递归(C++的静态对象成员除外)
(3)指针是构造递归类型的重要手段

struct mlink { int data; struct mlink *next; …

5. 判定或

可以选择不同成员的构造机制
例如C的联合union

union Data
{
int i;
float f;
char str[20];
} data;
现在,Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。

6. 幂集

类型T的元素所有子集的集合,称为幂集,T称为基类型(并不所有语言都有幂集聚合机制,没有的话可以用链表,数组实现)


第四节 C语言的数据类型

1. 非结构类型

  • (1)内部类型
    整型:int, short, long, unsigned
    实型/浮点型:float, double
    字符型数据的值是有限字符集的元素
  • (2)用户定义的非结构类型
    枚举类型
    enum bool {false, true}

2. 结构类型

  • (1)数组

  • 数组构造实现有限映像
    下标从0开始
    二维数组按行存放
    可以定义多维数组
    对数组名的处理相当于指针

  • (2)结构
    构造符struct支持笛卡儿积

  • (3)联合
    构造符union(联合、共用体)支持判定或
    C的联合是不安全的

3. 指针

指针可用来构造结构数据,支持递归

struct Pointer{
	int data;
	struct Pointer * next;//不支持直接递归即struct Pointer next;
};

4. 空类型void

不允许定义空类型变量
若函数的返回类型为空类型(void),则表示该函数没有返回值
可以定义空类型指针变量

C语言不支持用户定义类型构造机制的幂集

5. 小结(图)

在这里插入图片描述


第五节 类型检查

语言按照数据类型分类:

无类型语言
没有任何数据类型的语言
强类型语言
语言的所有类型检查都在编译时完成(C, ADA)
弱类型语言
类型检查全部或部分要在运行时完成(PASCAL)

对数据的操作和对应的类型是否匹配的一致性检查称为类型检查

静态检查和动态检查:
(1)静态检查使程序更有效(运行前)
(2)动态检查使编程更方便,但影响了可靠性,且降低了执行效率(运行时)


第六节 类型转换

某种类型的值转换为另一种类型的值称为类型转换

语言应该提供类型转换机制
隐式(自动)转换
显示(强制)转换

注意语言的规定的转换规则
隐式转换发生在下述的情况下
混合运算:级别低的类型向级别高的类型值转换
将表达式的值赋给变量:表达式的值向变量类型的值转换
实参向函数形参传值:实参的值向形参的值进行转换
函数返回值:返回值向函数返回类型的值进行转换


第七节 类型等价

T1T2是两个类型
T1的任何值都可以赋给T2的变量,反之亦然
T1实参可对应T2形参,反之亦然
则T1和T2类型等价(相容)


第八节 实现模型

在实现模型中,一个数据用描述符数据对象来表示

描述符:描述数据对象的属性数据
数据对象:存储区及其内容

以下实现模型以PASCAL为例

1. 内部类型

描述符一般由类型描述和一个指针组成,如
整数类型(integer):
在这里插入图片描述
其余类似

2. 用户定义类型

  • 笛卡尔积

    (1)各成分按顺序存储
    每个成分占整数个存储单元
    (2)描述符包含:类型名构造符、若干三元式(选择符名,域类型,指针)
    每个域对应一个三元式
    在这里插入图片描述

  • 有限映像
    (1)为每一成分分配整数个可编址的存储单元
    (2)描述符包括:
    类型名、构造符、定义域的基类型
    下界、上界、成分类型
    (每个成分占)单元个数、首地址

在这里插入图片描述

  • 序列
    可变长串的表示:
    静态描述符+动态描述符+堆
    在这里插入图片描述

  • 判定或
    判定或类型的变量分配的空间应足以容纳需要最大空间的变体的值
    PASCAL的变体记录的表示包括
    描述符、数据对象
    case表、若干变体描述符
    在这里插入图片描述
    在这里插入图片描述

  • 幂集
    对幂集可以通过访问的存储空间(例如机器字)来实现
    若在某个集合S中出现基类型的第i个元素,那么与S相关联的字的第i个位置为"1"
    两个集合的联合通过他们相关联的字的”:操作来实现
    两个集合的交集通过“”操作来实现

3. 层次结构的数据类型

描述符中的类型指向另外的描述符
在编译时将所有描述符保存在一张中,以便编译时使用
有些描述符需要保存到运行阶段,且存储在描述符中的属性可能随运行而变化
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值