第一章 导论
一、什么是编译程序
介绍程序设计语言编译程序构造的基本原理和基本实现技术。
翻译程序(Translator)
把某一种语言程序(称为源语言程序)等价地转换成另─种语言程序(称为目标语言程序)的程序。
编译程序(Compiler)
把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序。
诊断编译程序(Diagnostic Compiler)
优化编译程序(Optimizing Compiler)
交叉编译程序(Cross Compiler)
可变目标编译程序(Retargetable Compiler)
解释程序(Interpreter)
把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序
二、为什么要学习编译原理
学习目的
从计算机科学与技术中学什么?
◆理解计算系统
◆设计计算系统
◆训练计算思维(Computational Thinking)
计算思维
计算思维是什么[J.Wing,2006]
计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为,它包括了一系列广泛的计算机科学的思维方法。
计算思维和阅读、写作和算术一样,是21世纪每个人的基本技能,而不仅仅属于计算机科学家。
计算思维在生物、物理、化学、经济学、统计学等其他学科中的影响已经显现。
包括一系列广泛的计算机科学的思维方法抽象
◆自动化
◆问题分解
◆递归
◆权衡
◆保护、冗余、容错、纠错和恢复
◆利用启发式推理来寻求解答
◆在不确定情况下的规划、学习和调度等
关于编译理论与技术
编译理论与技术
计算机科学与技术中理论和实践相结合的最好典范
体现了很多典型的计算思维方法
ACM图灵奖
授予在计算机技术领域作出突出贡献的科学家
程序设计语言、编译相关的获奖者是最多的
抽象(Abstraction)
忽略一个主题中与当前问题(或目标)无关的那些方面,以便更充分地注意与当前问题(或目标)有关的方面
从众多的事物中抽取出共同的、本质性的特征,舍弃其非本质的特征
是—种从个体把握一般、从现象把握本质的认知过程和思维方法
图灵机
—条无限长的纸带一个读写头
一个状态寄存器
一套控制读写头工作的规则
邱奇-图灵论题(The Church-Turing thesis)
所有计算或算法都可以由一台图灵机来执行
可计算=图灵可计算
编译原理中的"抽象"
有限自动机
形式文法等
自动化(Automation)
将抽象思维的结果在计算机上实现,是一个将计算思维成果物化的过程,也是将理论成果应用于技术的实践
自动化的思维方法不仅体现在编译程序本身的工作机制上,更体现在了编译程序的生成工具的研究和设计上
编译原理中的"自动化:
有限自动机
预测分析程序
算符优先分析
LR分析等
分解(Decomposition)
将大规模的复杂问题分解成若干个较小规模的、更简单的问题加以解决
对问题本身进行明确描述,并对问题解法作出全局性决策
把问题分解成相对独立的子问题
再以同样的方式对每个子问题进—步分解,直到获得对问题的明确的解答
编译原理中的"问题分解":
编译程序引入中间语言
编译分成多个阶段
分析过程分成多遍
递归(Recursion)
问题的解决依赖于类似问题的解决,只不过后者的复杂程度或规模较原来的问题更小
—旦将问题的复杂程度和规模化简到足够小时,问题的解法其实非常简单
编译原理中的"递归":
递归下降分析
基于树遍历的属性计算
语法制导翻译等
权衡(折衷,Tradeoff )
理论可实现vs.实际可实现
理论研究重在探寻问题求解的方法,对于理论成果的研究运用又需要在能力和运用中作出权衡
编译原理中的"权衡":
用上下文无关文法来描述和处理高级程序设计语言
优化措施的选择等
学习编译原理的意义
学习编译程序构造原理,技术
◆提高对计算机系统总体认识
◆感悟计算思维
◆更好地理解“计算”
更好地理解高级语言
运用编译原理和方法构造实用工具
◆用“计算”的眼光看世界
◆用计算解决实际问题
三、编译过程
编译程序是怎样把高级语言(如C++)翻译成低级语言(如机器指令)的?
The compiler can translate a program from source language to target language.
编译程序能够把一个程序从源语言翻译成目标语言。
把英文翻译为中文 编译程序工作的五个阶段
◆识别出句子中的一个个单词 词法分析
◆分析句子的语法结构 语法分析
◆根据句子的含义进行初步翻译 中间代码产生
◆对译文进行修饰 优化
◆写出最后的译文 目标代码产生
词法分析
任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出单词符号
依循的原则:构词规则
描述工具:有限自动机
语法分析
任务:在词法分析的基础上,根据语法规则把单词符号串分解成各类语法单位(语法范畴)
依循的原则:语法规则
描述工具:上下文无关文法
中间代码产生
任务:对各类语法单位按语言的语义进行初步翻译
依循的原则:语义规则
描述工具:属性文法
中间代码︰三元式,四元式,树,...
优化
任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码
依循的原则:程序的等价变换规则
(400次加法,200次乘法)
(301次加法)
目标代码生成
任务:把中间代码变换成特定机器上的目标代码
依赖于硬件系统结构和机器指令的含义
目标代码三种形式:
◆汇编指令代码:需要进行汇编
◆绝对指令代码:可直接运行
◆可重新定位指令代码:需要链接
四、编译程序的结构
一、编译程序总框
出错处理
出错处理程序
发现源程序中的错误,把有关错误信息报告给用户
语法错误
源程序中不符合语法(或词法)规则的错误
非法字符、括号不匹配、缺少;、...
语义错误
源程序中不符合语义规则的错误
说明错误、作用域错误、类型不一致、...
二、遍(pass)
所谓"遍",就是对源程序或源程序的中间表示从头到尾扫描一次
阶段与遍是不同的概念
◆—遍可以由若干段组成
◆一个阶段也可以分若干遍来完成
三、编译前端与后端
编译前端
与源语言有关,如词法分析,语法分析,语义分析与中间代码产生,与机器无关的优化
编译后端
与目标机有关,与目标机有关的优化,目标代码产生
带来的好处
程序逻辑结构清晰
优化更充分,有利于移植
计算思维
分解、权衡
五、编译程序的生成
以机器语言和汇编语言为工具
优点:可以针对具体的机器,充分发挥计算机的系统功能;生成的程序效率高
缺点:程序雅读、难写、易出错、难维护、生产效率低
高级语言书写
利用已有的某种语言的编译程序实现另一语言的编译程序
移植方法
把一种机器上的编译程序移植到另一种机器上
自编译方式
编译程序自动产生
编译程序-编译程序,编译程序产生器,编译程序书写系统
LEX:词法分析程序产生器
YACC:语法分析程序产生器