编译原理:绪论

声明:本系列文章,是根据中国大学MOOC网 哈工大的编译原理 这门课学习而成的学习笔记。

什么是编译

编译:将高级语言(源)翻译成汇编语言或机器语言(目标)的过程
在这里插入图片描述

编译器在语言处理系统中的位置

在这里插入图片描述
预处理器:将源程序转换成经过预处理的源程序。
预处理过程:把存储在不同文件中的源程序聚合在一起。把被称为宏的缩写语句转换为原始语句
编译器:将源程序转换为汇编语言程序。
汇编器:将汇编语言程序转换成可重定位的机器代码。
可重定位的机器代码:汇编器生成的机器代码在内存中存放的起始位置不是固定的,代码中的所有地址都是相对起始位置的相对地址。而起始位置+相对地址=绝对地址,因此我们需要加载器来修改可重定位地址。
加载器:修改可重定位地址,将修改后的指令和数据放到内存中适当的位置。
链接器:将多个可重定位的机器代码(包括库文件)连接在一起,解决外部内存地址问题。

编译过程的概述

通常,将编译过程划分成词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段。
代码优化可以分为,机器无关代码优化和机器相关代码优化。
在这里插入图片描述

  • 词法分析概述

词法分析:从左到右逐行扫描源程序的字符,识别出各个单词,确定单词的类型,将识别出的单词转换成统一的机内表示——词法单元(token)的形式。

token:<种别码,属性值>
在这里插入图片描述
在这里插入图片描述

  • 语法分析概述

语法分析器从词法分析器输出的 token 序列中识别出各类短语,并构造语法分析树。语法分析树描述了句子的语法结构。

语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。

程序的结构通常是由递归规则表示的。

例如,我们可以用下面的规则来定义表达式。
1.任何标识符是表达式
2.任何常数(整常数、实常数)是表达式。
3.若表达式1 和 表达式2 都是表达式,那么 表达式*表达式,表达式+表达式,都是表达式。

扩展来说,通过语法规则,我们可以进行语法分析,并画出语法分析树。
在这里插入图片描述
在这里插入图片描述

  • 语义分析概述

语义分析的主要任务

1.收集标识符的属性信息
(1) 种属 (Kind) :简单变量、复合变量(数组、记录、…)、过程、…
(2) 类型 (Type) :整型、实型、字符型、布尔型、指针型、…
(3) 存储位置、长度
(4) 值
(5) 作用域
(6) 参数和返回值信息:参数个数、参数类型、参数传递方式、返回值类型、…

2.语义检查
(1) 变量或过程未经声明就使用
(2) 变量或过程名重复声明
(3) 运算分量类型不匹配
(4) 操作符与操作数之间的类型不匹配
(5) 数组下标不是整数
(6) 对非数组变量使用数组访问操作符
(7) 对非过程名使用过程调用操作符
(8) 过程调用的参数类型或数目不匹配
(9) 函数返回类型有误

符号表:用于存放标识符的属性信息的数据结构。
在这里插入图片描述

  • 中间代码生成及编译器后端概述

常用的中间表示形式

·三地址码 (Three-address Code) :三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数(operand)
·语法结构树/语法树 (Syntax Trees)

三地址指令的表示

·四元式 (Quadruples) (op, y, z, x)
·三元式 (Triples)
·间接三元式 (Indirect triples)

目标代码生成器

·目标代码生成器以源程序的中间 表示形式作为输入,并把它映射到目标语言
·目标代码生成的一个重要任务是为程序中使用的变量合理分配寄存器

代码优化

为改进代码所进行的等价程序变换,使其运行得更快一些、占用空间更少一些,或者二者兼顾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章