《软件技术基础》之《编译原理概述》
绪论
程序设计语言
程序设计语言是为了满足人机通信、人机交流而产生的。
程序设计语言的发展有3个阶段:机器语言、汇编语言、高级语言。
汇编程序
汇编程序是翻译汇编语言的程序,输入的是用汇编语言书写的源程序,输出的是用机器语言表示的目标程序。
编译程序
编译程序是翻译高级语言的程序,输入的是用高级语言书写的源程序,输出的是用机器语言表示的目标程序。
高级语言的特点
- 直观、自然、易于理解
- 易读、易写、易于交流、出版和存档
- 一般独立于机器,易于移植
与编译有关的三种语言、三种程序
- 源语言、编译语言、目标语言
- 源程序、编译程序、目标程序
它们之间的关系:
强制性语言
按照语言的发展进程,语言一共有4代:
- 第一代语言:机器语言,依赖于机器指令系统
- 第二代语言:汇编语言,机器语言的符号化
- 第三代语言:通常的高级语言,也叫命令式语言、过程式语言
- 第四代语言:说明性语言,告诉机器做什么
冯·诺依曼体系
冯·诺依曼体系结构:一个存储器、一个控制器、一个处理器
冯·诺依曼体系特点:
- 数据或指令以二进制形式存储;
- 存储程序按顺序执行;
- 存储器的内容可以被修改。
命令式语言相关概念
变量:
- 存储单元及它的名称由变量的概念替代;
- 变量可以代表一个或一组单元,可以修改。
赋值:
- 计算的结果必须存储。
重复:
- 因语句顺序执行,指令存储在有限的存储器内,完成复杂计算时必须重复执行某些指令序列。
变量
变量是对一个或若干个存储单元的抽象。
赋值语句是修改存储单元内容的抽象。
变量的四个属性:
-
作用域:指可以访问该变量的程序范围。
作用域分为两类:
-
生存期:指一个存储区绑定于一个变量的时间区间。
-
值:即变量对应存储区单元的内容。
-
类型:是与变量相关联的值的类以及对这些值进行的操作的说明。
程序单元
程序单元:程序执行过程中的独立调用单元,如子程序、分程序、过程等。
在编译时,单元表示是该单元的源程序;在运行时,单元表示由一个代码段和一个活动记录组成,称为单元实例。
活动记录:执行单元所需要的信息,以及该单元的局部变量所绑定的数据对象的存储区。
编译模型
基本概念
翻译:将一种语言编写的程序转换成完全等效的另一种语言编写的程序的过程。
在计算机中,翻译由一个程序来实现,称为翻译程序(翻译器)。
编译:将高级语言程序翻译为低级语言程序的过程。
宿主语言:编写编译程序的语言称为宿主语言。
源语言、目标语言、宿主语言通常是不同的语言。
宿主机:运行翻译程序的机器。
自驻留:编译程序能生成可供其宿主机执行的机器代码。
交叉编译:编译程序生成的不是宿主机的机器代码,而是别的机器代码。
自编译:宿主语言就是源语言,即编译程序是用源语言写的。
运行方式
运行方式分为两种:
-
编译运行
-
解释执行
编译步骤
- 词法分析:输入字符串,根据词法规则识别出单词符号。
- 语法分析:根据语法规则,将单词符号构成各类语法单位,并进行语法检查。
- 语义分析:根据语义规则,进行初步编译。
- 优化:对中间代码进行等价变换, 使代码更有效。
- 目标代码生成:生成机器语言程序或汇编语言程序。
- 符号表管理:完成符号表的建立、查找、更新。
- 出错处理:发现、指出、限制。
从分析源程序到建立一个可执行的目标程序,处理过程还需要其它工具程序的配合:预处理器、汇编器、连接器、装入器。
编译前端与后端
在现代编译器中,通常将编过程划分为前端和后端两大部分,分别加以实现。前端和后端通过中间代码连接,可极大地提高编译器设计与实现的效率。
前端:主要与源语言相关,包括词法分析、语法分析、语义分析、中间代码生成等。
后端:主要与目标语言相关,包括优化、目标代码生成等。
数据类型
概念
数据类型本质上是对存储器中的所存储的数据进行的抽象,数据类型包含了一组值的集合和一组操作。
语言的某种特定的数据抽象受到两个因素的影响:
- 语言所面向的机器(只提供定点计算或同时提供浮点运算)
- 语言所面向的应用领域
作用
- 实现了数据抽象;
- 使程序员从机器的具体特征中解脱出来;
- 提高了编程效率。
分类
将类型作为数据的抽象表示,可分为三个层次的抽象:
- 内部类型:又叫语言定义类型、基本类型。
由语言定义,根据所面向的机器和应用定义了不同的数据类型。 - 用户定义类型:又叫自定义类型。
自Pascal语言开始,语言提供了由用户定义类型的方法,采用这种方法定义的数据类型称为用户定义类型。 - 抽象数据类型:满足下列特性的用户定义类型称为抽象定义类型。
- 在定义该类型的程序单元中,建立与表示有关的基本操作;
- 对使用该类型的程序单元来说,该类型的表示是隐蔽的。
对抽象数据类型的三点理解:
内部类型与用户定义类型的异同
六种数据类型聚合方式
- 笛卡尔积:记录、结构
- 有限映射:数组
- 序列:字符串、顺序文件
- 递归:二叉树
- 判定或:联合、变体记录
- 幂集:集合
类型检查
类型转换
类型等价
实现模型:数据用描述符和数据对象来表示。