汪道之

有人的地方就有江湖

0%

编译原理第二章

数据类型的分类

内部类型

优点:

  1. 基本表示的不可见性
  2. 编译时能检查变量使用的正确性
  3. 编译时可以确定无二义的操作
  4. 精度控制

用户定义类型

  1. 有限映像:
    定义:从定义域类型DT值的有限集合,到值域类型RT值的有限集合的函数(映射)
    eg:array[1..50] of char 中整数1至50到字符集的有限映像
  2. 序列:
    定义:任意多个数据项组成,数据项称为序列的成分,且类型相同
  3. 判定或:
    定义:可以选择不同成员的构造机制
    eg:PASCAL的变体记录、C的联合
    eg:
    变体记录定义如下:
1
2
3
4
5
6
7
8
9
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;

实现代码如下:

1
2
3
4
5
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;

则空间分配情况如下:

i1
变量名
price 5.24
available true
amount 29
where liquor
i2
变量名
price 324.99
available false
month_expected 8
  1. 幂集
    定义:类型T的元素的所有子集的集合,T为基类型

C语言的数据类型

image-20210414193241257

非结构类型

  1. 内部类型
    整型:int、short、long、unsigned
    浮点型:float、double
    字符型:char(有限字符集的元素)

  2. 用户定义的非结构类型
    枚举:enum

结构类型

  1. 数组

  2. 结构struct

  3. 联合union(C的联合是不安全的)

  4. 文件FILE

  5. 指针

  6. 空类型void

不允许定义空类型变量,可以定义空类型指针变量

类型检查

定义:对数据的操作和对应的类型是否匹配的一致性检查
eg:非法运算、赋值运算、形参实参类型是否匹配

  1. 静态检查和动态检查

静态检查使程序更有效
动态检查是编程更方便,但是影响了可靠性且降低了执行效率

语言分类

无类型语言:没有数据类型
eg:函数式语言(FP)、泛函程序设计语言(FFP)
弱类型语言:类型检查全部或部分在运行时完成
eg:PASCAL
强类型语言:类型检查都在编译时完成
eg:C、ADA

实现模型

在程序中,数据由常量或变量表示
在实现模型中,数据由描述符(描述数据对象的属性)和数据对象(存储区及其内容)表示

  1. 内部类型和用户定义的非结构类型:描述符一般由类型描述和指针组成
    多个变量的描述符形成变量名表
    eg:
1
int numb;

image-20210411152405051

  1. 结构类型
  • 笛卡尔积
    各成分按顺序存储,每个成分占整数个存储单元
    描述符包含:类型名、构造符、若干三元式(选择符名、域类型、指针)(每个域对应一个三元式)
    eg:
1
2
3
4
type t=recode a:real;
b:integer;
end;
var x:t;

image-20210411155756373

  • 有限映像
    为每一成分分配整数个可编址的存储单元
    描述符包括:类型名、构造符、定义域的基类型、下界、上界、成分类型、(每个成分占)单元个数、首地址
    eg:
1
type a=array[1..10] of real;

image-20210411160449254

  • 序列
    可变长串的表示:静态描述符+动态描述符+堆

image-20210411161113371

  • 判定或
    pascal的变体记录:描述符、数据对象、case表、若干变体描述符
1
2
3
4
5
6
type v=record a:integer;
case b:boolean of
true:(c:integer);
false:(d:integer;
e:real)
end;

image-20210411161638987

  • 指针

    表示与内部类型相同只是其值为地址

    指针指向的匿名数据对象分配在堆上

  • 编译时所有的描述符保存在一张表中以便编译时使用,甚至有些描述符要保存到运行阶段(数组),并且存储在描述符中的属性可能随运行而变化。