本笔记为观看西安交通大学 冯博琴老师视频记录
课程特点
基础性、科学性、普适性、针对性
学习目的
- 实现编译器
- 专业编译器(为某一种用途所设计的语言,比如税务)
- 计算思维(编译原理很好的反映了计算机特点)
如何学
- 记笔记
- 勤思考:每个部分 解决什么问题
什么叫编译程序
编译程序是系统软件中资格最老的成员之一。
基础:自动机和形式语言(学数学人弄得)
素材:数据结构、离散数学
编译理论的应用:
有穷状态技术、上下文无关文法、语法制导翻译、代码优化技术
翻译程序:(Translator)是一种程序,其输入为一种语言,输出为目标语言。
编译程序:(Compiler)是一种程序,把高级语言的源程序作为接收,编译为面向机器代码,汇编为目标程序代码。
汇编是和机器关联的,面向机器的。
编译过程概述
源程序——词法分析(得:单词符号)——语法分析(得:语法单位)——中间代码生成(得:中间代码)——代码优化(得:中间代码(优化后))——目标代码生成(得:目标代码)
比喻:英语文章——断词(查字典:词性、本身翻译)(对应词法分析)——分析“句子”(对应语法分析)——理解含义、草译(对应中间代码生成)——反复优化翻译(对应代码优化)——交差
词法分析
任务:输入源程序:扫描、分解字符串,识别出一个个单词(定义符(可以查表)、标识符、运算符、分界符、常数)
词法分析依据:构词规则
主要理论基础: 自动机理论
语法分析
三件事情:
1. 每一个过程它的入口是什么
2. 每一个过程结果产生了什么
3. 中间过程是什么
任务:在词法分析基础上,将单词符号串转化为语法单位(语法范畴)(短语、子句、句子、程序段、程序),并确定整个输入串是否构成语法上正确的程序。
依据:语法规则(不同语言不同规则,比如C的for语句怎么写才对)
主要理论基础: 上下文无关文法
中间代码生成
任务:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)
(用另外一种语言写中间代码,看出来你是一个子句、句子、程序段)
依据:语义规则
理论基础:属性文法
程序好:程序短、运行快
代码优化
可读性、鲁棒性等……
时间和空间方面优化
循环为程序优化研究最多的地方(语句少点、强度低点)
任务:对于代码(主要是中间代码)进行加工变换,以期能够产生更高效(省时间和空间)的目标代码。
依据:程序等价变换规则
寄存器的分配:(相当啰嗦)
哪个寄存器可以放,哪个不可以放?
目标代码生成
任务:将中间代码变换成特定机器上的低级语言代码
目标代码形式:绝对指令(所有指令地址写死)、可重定位指令()、汇编指令
依据:硬件体系结构、指令系统
编译程序的结构
编译程序总框
表格与表格处理
编译各个阶段均须维持表格并进行表格管理
建表的技术支持是数据结构
表格的分类、结构、处理方法决定于语言及机器还有优化措施。
编译程序涉及的表格有:
- 符号名表:(常量名、变量名、数组名、过程名、性质、引用、定义)
- 常数表(各种类型常数的值)
- 标号表:(标号的定义和引用情况)
- 入口名表:(过程的入口名和入口位置)
- 过程引用表:(外部过程的名字、引用位置)
- 循环表、等价名表、共用链表、格式表、中间代码表
出错处理
(为用户着想,错误处理好些)
一个好的编译程序应该:
- 全 (最大限度发现错误)
- 准 (准确指出错误的性质和发生地点)
- 局部化 (将错误的影响限制在尽可能小的范围内)
- 若能自动校正错误则更好,但其代价非常高
程序中的错误通常分为:
- 语法错误:(不符合语法(或词法)规则的错误)如,单词拼写错误、括号不匹配……
- 语义错误:不符合语义规则的错误,比如:说明错误、作用域错误、类型不匹配……
遍
遍:是对源程序或源程序 的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
编译程序生成
其他
771多所学校有计算机专业
实验科学、理论科学、计算科学
逻辑思维(数学思维)、实证思维(物理思维:观察、归纳——发现规律)
计算思维核心:一是抽象(形式化)、二是自动