编译原理学习笔记1——引论
什么是编译程序
介绍程序设计语言编译程序构造的基本原理和基本实现技术。
- 翻译程序(Translator)
把某一种语言程序(称为源语言程序)等价地转换成另一种语言程序(称为目标语言程序)的程序
- 编译程序(Compiler)
也是一种翻译程序 把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序。- 诊断编译程序(Diagnostic Compiler)
- 优化编译程序(Optimizing Compiler)
- 交叉编译程序(Cross Compiler):一个编译程序产生不同于其宿主机的机器代码。
- 可变目标编译程序(Retargetable
Compiler):不需要重写编译程序中与机器无关的部分,只要改变与目标机器有关的部分,就能针对不同目标机器平台生成不同的代码。
运行编译程序的机器叫宿主机,运行机器语言程序的机器称为目标机,一般宿主机和目标机为同一个机器。
- 解释程序(Interpreter) 把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序。
小结
- 编译:解释完成后再执行
- 解释:边解释边执行
1 为什么学习编译原理
- 理解计算系统
- 设计计算系统
- 训练计算思维(Computational Thinking)
计算思维
- 计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为,它包括一系列广泛的计算机科学的思维方法
- 计算思维和阅读、写作和算术一样,是21世纪每个人的基本技能,而不仅仅属于计算机科学家
- 计算思维在生物、物理、化学、经济学、统计学等其他学科中的影响已经显现
包括一系列广泛的计算机科学的思维方法
- 抽象
- 自动化
- 问题分解
- 递归
- 权衡
- 保护、冗余、容错、纠错和恢复
- 利用启发式推理来寻求解答
- 在不确定情况下的规划、学习和调度
1.1 抽象(Abstraction)
- 忽略一个主题中与当前问题(或目标)无关的那些方面,以便更充分地注意与当前问题(或目标)有关的方面
- 从众多的事物中抽取出共同的、本质性的特征,舍弃其非本质的特征
- 是一种从个体把握一般、从现象把握本质的认知过程和思维方法
1.2 自动化(Automation)
将抽象思维的结果在计算机上实现,是一个将计算思维成果物化的过程,也是将理论成果应用于技术的实践。
1.3 分解(Decomposition)
将大规模的复杂问题分解成若干个较小规模的,更简单的问题加以解决
-
对问题本身进行明确描述,并对问题解法作出全局性决策
-
把问题分解成相对独立的子问题
分解可进行层次化管理
- 编译原理中的问题分解
- 为什么编译程序引入中间语言?
- 为什么 编译分成多个阶段?
- 为什么分析过程分成多遍?
1.4 递归(Recursion)
-
问题的解决依赖于类似问题的解决,只不过后者的复杂程度或规模较原来的问题更小
-
一旦将问题的复杂程度和规模简化到足够小时,问题的解法其实非常简单
1.5 权衡(折中,Tradeoff)
- 理论研究重在探寻问题求解的方法,对于理论成果的研究运用又需要在能力和运用中作出权衡
1.6 编译原理和方法的应用
- Html/XML分析
- 语言处理工具
- 搜索引擎 测试
- 用户接口:Shell命令解释器,
- 查询语言:SQL,XQuery,
- 网络协议:HTTP、SOAP
2 编译过程
2.1词法分析
- 任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出单词符号
- 依循的原则:构词规则
- 描述工具:有限自动机
for i := 1 to 100 do
基本字 标识符 赋值号 整常数 基本字 整常数 基本字
2.2 语法分析
- 任务:在词法分析的基础上,根据语法规则把单词符号串分解成各类语法单位(语法范畴)
- 依循的原则:语法规则
- 描述工具:上下文无关文法
2.3 中间代码产生
- 任务:对各类语法单位按语言的语义进行初步翻译 依循的原则:语义规则
- 描述工具:属性文法
- 中间代码:三元式,四元式、数
2.4 优化
- 任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码
- 依循的原则:程序的等价变换规则
优化后无乘法
2.5 目标代码产生
- 任务:把中间代码变换成特定机器上的目标代码
- 依赖于硬件系统结构和机器指令的含义
- 目标代码三种形式
- 汇编指令代码:需要进行汇编
- 绝对指令代码:可直接运行
- 可重新定位指令代码:需要连接
.obj文件 可重定位的指令代码、相对地址,链接时,相对地址改为绝对地址可得到一个可执行的.exe文件
0001 操作码
01 寄存器操作数
00 操作数标志
00000000 第二操作数(地址)
3 编译程序的结构
出错处理
-
出错处理程序
- 发现源程序中的错误,把有关错误信息报告给用户
-
语法错误:
- 源程序中不符合语法(或词法)规则的错误
- 非法字符、括号不匹配、缺失分号、…
-
语义错误:
- 源程序中不符合语义规则的错误
- 说明错误、作用域错误、类型不一致、…
遍(pass)
-
就是对源程序或源程序的中间表示从头到尾扫描一次
-
阶段与遍是不同的概念
- 一遍可以由若干段组成
- 一个阶段也可以分成若干遍来完成
-
编译前端
- 与源语言有关,如词法分析,语法分析,语义分析与中间代码产生,与机器无关的优化
-
编译后端
- 与目标机有关,与目标机有关的优化,目标代码产生
-
带来的好处
- 程序逻辑结构清晰
- 优化更充分,有利于移植
4 编译程序的生成
以机器语言和汇编语言为工具
- 优点:可以针对具体的机器,充分发挥计算机的系统功能,生成的程序效率高
- 缺点:程序难读,难写,易出错,难维护,生产效率低
高级语言书写
- 利用已有的某种语言的编译程序实现另一语言的编译程序
移植方法
- 把一种机器上的编译程序移植到另一个机器上
自编译方式
- 编译程序——编译程序、编译程序产生器、编译程序书写系统
- LEX:词法分析程序产生器
- YACC:语法分析程序产生器