编译原理学习笔记——第一讲 引论
1. 什么是编译程序?
1.1 Compiler(编译程序)
- 定义:把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序
- 编译程序的进一步分类:
诊断编译程序(Diagnostic Compiler)
优化编译程序(Optimizing Compiler)
交叉编译程序(Cross Compiler)
可变目标编译程序(Retargetable Compiler) - 运行编译程序的机器:宿主机
运行目标语言程序的机器:目标机
1.2 Interpreter(解释程序)
- 定义:把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序
2. 为何学习编译原理?
2.1 Computational Thinking(计算思维)
- 计算思维:是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为,它包括了一系列广泛的计算机科学的思维方法。
- 包括一系列广泛的计算机科学的思维方法:抽象、自动化、问题分解、递归、权衡、保护、冗余、容错、纠错和恢复、利用启发式推理来寻求解答、在不确定情况下的规划、学习和调度。
2.1.1 Abstraction(抽象)
- 图灵机就是一个抽象的机器。
- 图灵机有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。
- 有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。
- 在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。
- 邱奇-图灵论题(The Church-Turing thesis):所有计算或算法都可以由一台图灵机来执行。
- 编译原理中的"抽象":
有限自动机;
形式文法。
2.1.2 Automation(自动化)
- 将抽象思维的结果在计算机上实现,是一个将计算思维成果物化的过程,也是将理论成果应用于技术的实践。
- 自动化的思维方法不仅体现在编译程序本身的工作机制上,更体现在了编译程序的生成工具的研究和设计上。
- 编译原理中的"自动化“:
有限自动机;
预测分析程序;
算符优先分析;
LR分析。
2.1.3 Decomposition(分解)
- 将大规模的复杂问题分解成若干个较小规模的、更简单的问题加以解决。
- 编译原理中的"问题分解":
为什么编译程序引入中间语言?
为什么编译分成多个阶段?
为什么分析过程分成多遍?
2.1.4 Recursion(递归)
- 问题的解决依赖于类似问题的解决,只不过后者的复杂程度或规模较原来的问题更小。
- 一旦将问题的复杂程度和规模化简到足够小时,问题的解法其实非常简单。
- 编译原理中的"递归":
递归下降分析;
基于树遍历的属性计算;
语法制导翻译。
2.1.5 Tradeoff(权衡,折衷)
- 理论研究重在探寻问题求解的方法,对于理论成果的研究运用又需要在能力和运用中作出权衡。
- 编译原理中的"权衡":
用上下文无关文法来描述和处理高级程序设计语言;
优化措施的选择。
2.2 学习编译原理的意义
- 学习编译程序构造原理,技术:
提高对计算机系统总体认识、感悟计算思维、更好地理解“计算” - 更好地理解高级语言
- 运用编译原理和方法构造实用工具:
用“计算”的眼光看世界、用计算解决实际问题
2.3 编译原理和方法的应用
- Html/XML分析
- 语言处理工具(错误拼写检测、自动翻译、搜索引擎)
- 在计算机技术中也应用了语言的翻译或变换
1.用户接口:Shell命令解释器, …
2.查询语言:SQL,XQuery, …
3.网络协议:HTTP, SOAP, …
3. 编译过程
- 编译程序是怎样把高级语言(如C++)翻译成低级语言(如机器指令)的?
- 编译程序工作的五个阶段:
词法分析、语法分析、中间代码产生、优化、目标代码产生。
3.1 词法分析
- 任务: 输入源程序,对构成源程序的字符串进行扫描和分解,识别出单词符号
- 依循的原则:构词规则
- 描述工具:有限自动机
3.2 语法分析
- 任务:在词法分析的基础上,根据语法规则把单词符号串分解成各类语法单位(语法范畴)
- 依循的原则:语法规则
- 描述工具:上下文无关文法
3.3 中间代码产生
- 任务:对各类语法单位按语言的语义进行初步翻译
- 依循的原则:语义规则
- 描述工具:属性文法
- 中间代码:三元式,四元式,树,…
Z:=X + 0.618 * Y 翻译成四元式为
3.4 优化
- 任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码
- 依循的原则:程序的等价变换规则
3.5 目标代码产生
- 任务: 把中间代码变换成特定机器上的目标代码
- 依赖于硬件系统结构和机器指令的含义
- 目标代码三种形式:
汇编指令代码: 需要进行汇编
绝对指令代码: 可直接运行
可重新定位指令代码: 需要连接(重定位)
例: b=a+2
4. 编译程序的结构
4.1 编译程序总框
- 语法错误:
源程序中不符合语法(或词法)规则的错误
非法字符、括号不匹配、缺少 ;、… - 语义错误:
源程序中不符合语义规则的错误
说明错误、作用域错误、类型不一致、…
4.2 遍(pass)
- 所谓"遍", 就是对源程序或源程序的中间表示从头到尾扫描一次。
- 一遍可以由若干段组成
- 一个阶段也可以分若干遍来完成
4.4 编译前端与后端
- 编译前端:
与源语言有关,如词法分析,语法分析,语义分析与
中间代码产生,与机器无关的优化 - 编译后端:
与目标机有关,与目标机有关的优化,目标代码产生 - 带来的好处:
程序逻辑结构清晰
优化更充分,有利于移植
5. 编译程序的生成
以汇编语言和机器语言为工具:
- 优点: 可以针对具体的机器,充分发挥计算机的系统
功能;生成的程序效率高 - 缺点: 程序难读、难写、易出错、难维护、生产的效
率低
高级语言书写
- 程序易读、易理解、容易维护、生产的效率高
- 利用已有的某种语言的编译程序实现另一语言的编译程序
- 把一种机器上的编译程序移植到另一种机器上