编译原理复习 第一章 概述
文章目录
- Chapter1 概述
- 1.1 什么是编译程序
- 定义
- 语言
- 应用
- 语言处理过程
- 语言转变系统
- 编译程序和解释程序比较
- 1.2 编译过程和编译程序结构
- 词法分析
- 语法分析
- 语义分析
- 中间代码生成
- 代码优化
- 目标代码生成
- 符号表管理
- 出错处理
- 编译程序结构
- 1.3 编译阶段的组合
- 内容
- 分遍(趟, pass)问题
- 高级语言解释系统
- 解释系统
- 编译阶段和运行阶段存储结构
- 解释系统存储结构
- 编译程序设计要求
- 1.4 PL/0 编译程序
- 结构
- 程序实例
- 程序图
- PL/0 语言文法
- 目标代码类pcode
Chapter1 概述
1.1 什么是编译程序
定义
编译程序是现代计算机系统的基本组成部分
功能:
语言
- 低级语言
- 机器语言:计算机指令系统
- 汇编语言:符号化的指令系统
- 高级语言:算法语言,不依赖具体机器,面向问题
应用
分类:
- 软件
- 计算机系统中的程序及其文档
- 系统软件
- 居于计算机系统中最靠近硬件的一层,其他软件一般都通过系统软件发挥作用。他和具体的应用领域无关,如编译系统和操作系统等。
- 语言处理系统
- 把软件语言书写的各种程序处理可在计算机上执行的程序
- 软件语言
- 用于书写软件的语言。它主要包括需求定义语言,功能性语言,设计性语言,程序设计语言以及文档语言
语言处理过程
语言转变系统
源语言 | 实现语言 | 目标语言 |
---|---|---|
C++ | C++编译器 | C |
Java | Java编译器 | Bytecode |
编译程序和解释程序比较
1.2 编译过程和编译程序结构
编译逻辑过程:
词法分析
字符序列 -> 单词序列
扫描、分解源程序,识别单词(记本子、标识符、常数、运算符、界限符),并给予种别(属性)和内部形式(值),构成单词的内部表示。
从左到右读字符流的源程序,识别单词
例子1:
position := initial + rate * 60;
词法分析:
单词类型 | 单词值 |
---|---|
标识符1(id1) | position |
算符(赋值) | := |
标识符2(id2) | initial |
算符(加号) | + |
标识符3(id3) | rate |
算符(乘) | * |
整数 | 60 |
分号 | ; |
例子2:C 源程序片段
int a;
a = a + 2;
词法分析:
单词类型 | 单词值 |
---|---|
保留字 | int |
标识符(变量名) | a |
界符 | ; |
标识符(变量名) | a |
算符(赋值) | a |
标识符(变量名) | a |
算符(加) | + |
整数 | 2 |
界符 | ; |
语法分析
分析器(Analyzer)
功能:层次分析。依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树)
position := initial + rate * 60 ;(";"为语句分隔符)
规则
<赋值语句> ::= <标识符> ":=" <表达式>
<表达式> ::= <表达式> "+" <表达式>
<表达式> ::= <表达式> "*" <表达式>
<表达式> ::= "("<表达式>")"
<表达式> ::= <标识符>
<表达式> ::= <整数>
<表达式> ::= <实数>
语法树模板:
举例:
id1 := id2 + id3 * N
画图:
其他例子:
语义分析
语义审查(静态词义)
- 上下文相关性
- 类型匹配
- 类型转换
例1:
program p();
var rate:real;
procedure initial;
...
position := initial + rate * 60;
/* error */ /* error */ /* warning */
...
例2:
int arr[2], abc;
abc = arr * 10;
...
program p();
var rate:real;
var initial:real;
var position:real;
...
position := initial + rate * 60;
中间代码生成
便于代码优化,
便于从逻辑上分出与语言或机器无关的阶段
源程序的内部(中间)表示
三元式、四元式、P-Code、C-Code、U-Code、bytecode
(* id3 t1 t2)
t2 = id3 * t1
t2 := id3 * t1
举例:
id1 := id2 + id3 * 60
(1) (inttoreal, 60, -, t1) 实数,值为60,无,赋给t1
(2) (*, id3, t1, t2) 乘,运算值id3, 运算值t1,赋值给t2
(3) (+, id2, t2, t3) 加,运算值id2, 运算值t2,赋值给t3
(2) (:=, t3, -, id1) 赋值, 标识符t3, 无, 赋值给id1
代码优化
局部优化:
- 合并已知量 -> 编译时减少常量表达式
- 改变计算顺序 -> 减少指令、减少中间量
- 共享子表达式 -> 删除多余代码
- 降低运算强度 -> 乘方 --> 乘
循环优化:
- 循环不变部分外提
- 下标地址计算优化
- 降低运算强度-> 乘 --> 加
与机器有关的优化:
- 使用特殊指令 -> 如计数转移指令寄存器分配
举例1:
id1 := id2 + id3 * 60
未优化:
(1) (inttoreal, 60, -, t1) 实数,值为60,无,赋给t1
(2) (*, id3, t1, t2) 乘,运算值id3, 运算值t1,赋值给t2
(3) (+, id2, t2, t3) 加,运算值id2, 运算值t2,赋值给t3
(2) (:=, t3, -, id1) 赋值, 标识符t3, 无, 赋值给id1
优化后:
(1) (*, id3, 60.0, t1) 乘,运算值id3, 实数60,赋值给t1
(2) (+, id2, t1, id1) 加,运算值id2, 运算值t1,赋值给id1
举例2:
源代码:
t1 = b * c
t2 = t1 + 0
t3 = b * c
t4 = t2 + t3
a = t4
优化后:
t1 = b * c
t2 = t1 + t1
a = t2
目标代码生成
(* id3 60.0 t1 )
(+ id2 t1 id1)生成代码:
movf id3, R2
mulf ##60.0, R2
movf id2, R1
addf R2, R1
movf R1, id1
符号表管理
记录源程序中使用的名字
收集每个名字的各种属性信息
类型、作用域、分配存储信息
Const1 常量 值:35
Var1 变量 类型:实 层次:2
出错处理
- 检查错误
- 报告出错信息
- 排错
- 恢复编译工作
编译程序结构
Components
- 词法分析程序
- 语法分析程序
- 语义分析程序
- 中间代码生成程序
- 代码优化程序
- 目标代码生成程序
- 符号表管理程序
- 出错处理程序
1.3 编译阶段的组合
内容
- 分析、综合
- 源程序的分析
- 线性分析
- 层次分析
- 语义分析
- 目标程序的综合
- 源程序的分析
- 编译的前端
- -----------------------------------------------以中间代码为界
- 编译的后端
- 遍(趟)从头到尾扫描源程序(各种形式)一遍(pass)
分遍(趟, pass)问题
在编译过程中,扫描源(中间)程序的次数成为该编译程序的"遍"数。决定分遍次数的因素有:
源语言
FORTRAN、Pascal等,只需要单遍扫描
ALGOL60 要两遍扫描
ALGOL68 要三遍扫描
若允许先使用、后说明,则通常需要多遍扫描。
机器,尤其是内外存的大小,内存小,可能需要多遍
优化要求。充分优化需要多遍
总结:多遍的结构清晰,优化好,但重复工作多,输入输出多,编译器本身代码长,且编译速度慢,出错处理较困难。
本书的PL/0编译器就是一个单遍编译器。
高级语言解释系统
- 功能:让计算机执行高级语言
- 与编译程序的不同
- 不生成目标代码
- 能支持交互环境(同增量式编译系统)
- 源程序和初始数据 通过 解释程序 得到 计算结果
解释系统
直接对源程序中的语句进行分析,执行器隐含的操作
编译阶段和运行阶段存储结构
解释系统存储结构
编译程序设计要求
- 目标程序运行速度快
- 目标程序短
- 编译程序快
- 编译空间 -> 小 / 充分利用内存
- 诊断、矫正错误的功能性强
1.4 PL/0 编译程序
结构
源语言 | 实现语言 | 目标语言 |
---|---|---|
PL/0 | C/pascal | 类 pcode |
程序实例
CONST A = 10; // 常量说明部分
VAR B,C; // 变量说明部分
PROCEDURE P; // 过程说明部分VAR D;PROCEDURE Q;VAR X;BEGIN |READ(X); |D:=X; | // Q的过程体WHILE X#0 DO |CALL P; |END;BEGIN |WRITE(D); | // P的过程体CALL Q; |END;
BEGIN |CALL P; | // 主程序体
END. |
同PASCAL
作用域规则:内层可引用包围它的外层定义的标识符,上下文约束
过程可嵌套定义,可递归调用
子集:
- 数据类型,只有整型
- 数据结构,只有简变和常数
- 数字最多为14位
- 标识符的有效长度为10
- 语句种类
- 过程最多可嵌套三层
程序图
程序图画图图形:
程序图画图实例:
PL/0 语言文法
EBNF引入的符号(元符号):
符号 | 定义 |
---|---|
< > | 用左右尖括号括起来的语法成分为非终结符 |
∷= (→) | ∷=(→)的左部由右部定义 |
| | 或 |
{ } | 表示花括号内的语法成分可重复任意次或限 |
[] | 表示方括号内的语法成分为任选项 |
() | 表示圆括号内的成分优先 |
用 EBNF 描述<整数>的定义
<整数> ::= [+|-] <数字> {<数字>}
<数字> ::= 0|1|2|3|4|5|6|7|8|9或者更好的写法
<整数> ::= [+|-]<非零数字>{<数字>}|0
<非零数字>::=1|2|3|4|5|6|7|8|9
<数字>::=0|<非零数字>
目标代码类pcode
目标代码类pcdoe是一种假想式计算机的汇编语言
指令格式
f | l | a |
---|
- f:功能吗
- l:层次码(标识符引用层去定义层)
- a:根据不同指令有所区别
编译原理复习 第一章 概述相关推荐
- 【编译原理】第一章 引论
一,语言处理器 1)一个集成的软件开发环境,其中包括很多种类的语言处理器,比如编译器.解释器.汇编器.连接器.加载器.调试器以及程序概要提取工具. 2)编译器:把源程序的每一条语句都编译成机器语言,并 ...
- 【编译原理】-- 第一章(翻译程序、编译程序、汇编程序、解释程序、编译过程概述)
编译系统 高级语言的优点是有代价的,必须有一个"翻译程序",也就是高级语言必须有相应的软件支持系统,"编译程序+相应的支持用户程序"---编译系统. 一般这种编 ...
- 《编译原理》第一章知识点
思维导图
- 数据库系统原理(第一章概述)
一.数据库基本概念 什么是数据:数据(Data)是描述事物的符号记录,是指利用物理符号记录下来的. 可以鉴别的信息. 数据是信息存在的一种形式,只有通过解释或处理的数据才能成为有用的信息. 什么是数据 ...
- 软件工程复习 第一章 概述 软件定义 软件危机 软件三要素
1.1软件 1.1.1软件的概念 软件=程序(可执行部分)+文档(不可执行部分)+数据 程序:按事先设计的功能和性能需求执行的指令序列 数据:是程序能正常操纵信息的数据结构 文档:与程序开发.维护和使 ...
- 数字图像处理:第一章 概述
第一章 概述 数字图象处理是一门关于如何用计算机对图象进行处理的学科,本课程主要讲解基本原理和方法,针对计算机系的学生,强调编程实践和建立图象处理应用系统的方法.推荐的教材与图象编程参考书包括: R. ...
- 操作系统王道考研复习——第一章(计算机系统概述)
操作系统王道考研复习--第一章(计算机系统概述) 计算机系统概述 1.1操作系统的基本概念 1.1.1 操作系统的概念 1.1.2 操作系统的特征 1. 并发 2. 共享 3. 虚拟 4. 异步 1. ...
- 计算机网络第一章(概述)
第一章 概述 1.1因特网概述 1.1.1网络.互联网和因特网 网络(Network),由若干结点(Node) 和连接这些结点的 链路(Link) 组成. 多个网络还可以通过路由器互联起来,这样就构成 ...
- 第二篇第一章概述及第二章生产和储存物品的火灾危险性分类 重点在于表格...
2019/1/4 [录播]2018一消精华班-实务-一级消防工程师-环球网校 http://v.edu24ol.com/?type=lesson&id=178923&gid=16157 ...
最新文章
- Python,OpenCV轮廓属性、轮廓检测及绘制
- Linux Unix C 中的curses库——curses.h
- 数字图像处理实验(2):PROJECT 02-02, Reducing the Number of Gray Levels in an Image
- wxWidgets:编写应用程序的快速指南
- java+jtextfield+取值_[求助]JTextfield 取值问题!
- ABAP Text table implementation
- html5可以用flash,HTML5网页可以直接看视频,不用flash吗,另外WP7为何不支持flash。。。HTML5网页...
- 机器学习之特征工程-特征选择
- 异步执行线程的两种方法
- 小米被指记录用户的 Web 和手机使用数据;传瑞幸咖啡CTO因个人原因辞职;IntelliJ IDEA 新版发布 | 极客头条...
- Android Activity界面切换添加动画特效 (转载修改)
- Android 屏幕防偷窥,Android 8.1将发布:启用TLS加密防偷窥
- 一卡通(M1卡)破解过程记录——获取扇区密钥
- 2.概率论-概率论公理
- 推荐一本Python数据挖掘的好书
- 渗透测试工程师面试题大全(二)
- 什么是Base64算法?——全网最详细讲解
- vivo X Note暗藏黑科技,三麦降噪让开黑更安心
- 用户活跃/用户价值度分析
- Pandas的数据结构之DataFrame
热门文章
- eBay、亚马逊、Lazada、Shopee、速卖通、美客多等跨境电商平台,测评自养号需要满足什么条件?listing如何优化?
- [HEOI2013] 钙铁锌硒维生素
- Linux后SVN拒绝访问,SVN无法提交出现 Can't set file /db/txn_current read-write :拒绝访问...
- Akka默认20s超时修改配置
- 网易云轻舟设计理念与技术选型
- Excel 划分各分数段并统计各分数段的人数
- 使用c语言解析gprmc数据
- php5+ssl,AS3上安装Apache2+MySQL+PHP5+Resin+SSL+GD以及webalizer(补
- 基于vue开发的多条件联动筛选特效(类似京东/淘宝/中国移动)
- 基于java的宠物管理系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)