编译原理学习第一步-概论
第一章编译程序概论
1. 什么是编译程序
基本概念
编译程序是现代计算机系统的基本组成部分
- 翻译程序
把一种语言(源语言)书写的程序翻译为另一种语言(目标语言)的等价的程序 - 编译程序
高级语言到低级语言的翻译程序.
程序设计语言及其翻译
翻译程序
高级语言程序处理的两种方法
编译途径
- 方法1:
- 方法2:
解释途径
直接解释执行
与编译的主要区别是:解释程序不产生目标代码
编译程序在软件中的地位
属于系统软件类
- 计算机软件概念
- 软件: 计算机系统中的程序及其文档
- 系统软件: 处于计算机系统中最靠近硬件的一层,其他软件一般都通过系统软件发挥作用.他和具体的应用领域无关,如编译系统和操作系统等
- 语言处理系统: 把软件语言书写的各种程序处理成可以在计算机上执行的程序
- 软件语言: 用于书写软件的语言,他主要包括需求定义语言,功能性语言,设计性语言,程序设计语言以及文档语言
语言处理过程
2. 编译程序概述
编译逻辑过程
词法分析
扫描源程序的ASCII码序列,拼出每一个单词,并把每一个单词的ASCII码序列替换为所谓的机内表示TOKEN形式,这时还检查词法错误.但是此时的分析阶段不依靠语法关系
简单的说,就是从左到右读字符流的源程序,识别单词
例如:
| 单词类型 | 单词值 |
|---|---|
| 标识符1(id1) | a |
| 算符(赋值) | = |
| 标识符2(id2) | b |
| 算符(加) | + |
| 标识符3(id3) | c |
| 算符(乘) | * |
| 整数 | 60 |
| 分号 | ; |
| 例如 |
int a;
a=a+2;
| 单词类型 | 单词值 |
|---|---|
| 保留字 | int |
| 标识符(变量名) | a |
| 界符 | ; |
| 标识符(变量名) | a |
| 算符(赋值) | = |
| 标识符(变量名) | a |
| 算符(加) | + |
| 整数 | 2 |
| 界符 | ; |
语法分析
-
功能
-
层次分析
依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树)
扫描对象可能是源程序的ASCII码序列,也可能是词法分析后的TOKEN序列.主要任务是检查源程序的形式语法错误,每当发现错误时将输出错误信息
-
-
规则(::=代表等价于)
<赋值语句>::=<标识符> "=" <表达式>
<表达式>::=<表达式> "+"<表达式>
<表达式>::=<表达式>"*"<表达式>
<表达式>::="("<表达式>")"
<表达式>::=<标识符>
<表达式>::=<整数>
<表达式>::=<实数>
例如:
\[id1=id2+id3*N \]
语义分析
- 语义审查(静态语义)
- 上下文相关性
- 类型匹配
- 类型转换
中间代码生成
扫描对象通常是语法分析后的结果,这部分把源程序的TOKEN序列转换为更接近目标代码的中间代码三元式或者四元式的序列
- 源程序的内部中间(表示)
- 后缀式,三元式,四元式,树
例如:
后缀式:\(ab+c*\) 表示\((a+b)*c\)
三元式:(*,c,t1)
四元式:(*,c,t1,t2)
中间代码生成例子:
\(a=b+c*60\)
- (int_to_real,60,-,t1)
- (*,c,t1,t2)
- (+,b,t2,t3)
- (=,t3,-,a)
代码优化
按代码级别,可以分为源代码优化,中间代码优化和目标代码优化三种
其中:中间代码优化扫描对象是中间代码,任务是把优化前的中间代码转为可产生高质量目标代码的中间代码
优化工作包括表达式优化,公共子表达式优化,不便表达式外提和消减运输强度等
代码优化例:
目标代码生成
扫描对象是中间代码,任务是从中间代码产生目标代码,这一部分的工作与目标机紧密相关,其他部分的工作几乎和目标机无关.
例如:
(*,c,60,t1)
(+,b,t1,c)
MOV AX,c
MOV BX,60
MUL BX
MOV CX,b
ADD CX,AX
MOV a,CX
编译辅助工作
表格管理
较大的编译程序用到很多表格,甚至可达几十种表.不少编译程序都设立一些专门子程序(成为表格管理程序),他们专门负责管理表格.
- 记录源程序中的使用的名字
- 收集每个名字的各种属性信息,包括:类型,作用域,分配存储信息
例如:
| 名称 | 类型 | 值 |
|---|---|---|
| Const1 | 常量 | 35 |
| Var1 | 变量 | 实 |
出错处理
出错处理包括词法错误,语法错误,静态语义错误,动态语义错误等;
出错处理模块的作用是:检查错误,报告出错信息,排错,恢复编译工作
编译程序的结构
3. 编译技术的发展和应用
实现方式
- 手工
- 机器语言
- 汇编
- 系统程序设计语言
- 自动构造工具: lex yacc gccs
- 分类: 命令行, 集成环境
程序设计语言范型
-
命令式
程序特点: 语句1 语句2 语句3与冯若曼机的体系结构一般
-
应用式(函数式)
- 程序特点
function n(...function2(function1(data)))-
程序执行:
执行一个个函数施用在数据上的变换最终得到结果
-
编译:
语法分析容易,
语义处理复杂
-
基于规则的语言
-
程序特点:
使能条件1->动作1 使能条件2->动作2 使能条件3->动作3
-
-
面向对象语言
-
特点
抽象数据类型,继承机制
编译:动态绑定
-
执行环境
- 批处理环境
- 将源程序作为整体处理
- 排除程序错误不能依靠用户的外部帮助
- 交互环境
- 解释
- 增量式编译
- 嵌入式系统环境
- 交叉编译
- 分布并行环境
- 并行编译
- 程序创建和测试环境
- 独立编译
- 编译和调试同时设计考虑
编译技术的应用
- 数据库系统查询
- 脚本语言
- 置标语言(HTML,XML,SHTML)
- 嵌入式系统
研究领域
- 并行编译技术
- 交叉编译技术
- 嵌入式系统
- 硬件描述语言及其编译技术

浙公网安备 33010602011771号