第一章 绪论

1. 什么是编译

1.1 语言和编译

机器语言:计算机可以直接识别的语言,由0和1组成。例如:C706 0000 0002

缺点:不容易理解;不易编写;易错

汇编语言:引入了助记符。例如:MOV X, 2

优点:比较形象直观

缺点:依赖于特定的机器,不同的机器助记符不同,导致程序员必须记住相应机器的助记符;

编写效率低,一条简单的语句,也需要好几条指令

高级语言:类似于数学定义式或自然语言的简介形式。例如:x = 2

优点:接近人类的表达习惯;不依赖特定机器;编写效率高

最终,汇编语言和高级语言都要翻译成机器可以识别的机器语言

汇编语言 -> 机器语言 (汇编)

高级语言 -> 汇编语言/机器语言(编译)

编译:将高级语言(源语言)翻译成汇编语言或机器语言(目标语言)的过程

1.2 编译器的位置

编译器的位置

预处理器:把存储在不同文件中的源程序聚合在一起;把被称为宏的缩写语句转换成原始语句

可重定位:在内存中存放的起始位置L不是固定的,绝对地址 = 起始位置 + 相对地址

加载器:修改可重定位地址,将修改后的指令和数据放到内存中适当的位置

链接器:将多个可重定位的机器代码文件(包括库文件)连接到一起;解决外部内存地址的问题(一个文件可能会引用另一个文件中的数据对象或过程,这些数据对象或过程相对于这个文件来说就是外部内存地址)

2. 编译系统的结构

编译系统的结构

3. 词法分析

主要任务:从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。将识别出的单词转换成同一的机内表达 —— 词法单元(token)形式

token:<种别码,属性值>

单词类型

种别

种别码

1

关键字

program、if、else、then、...

一词一码

2

标识符

变量名、数组名、记录名、过程名、...

多词一码

3

常量

整型、浮点型、字符型、布尔型、...

一型一码

4

运算符

算术(+ - * / ++ --)

关系(> < == != >= <=)

逻辑(& | ~)

一词一码

一型一码

5

界限符

; ( ) = { } ...

一词一码

例子:

4. 语法分析

语法分析器从词法分析器输出的token序列中识别出各类短语,并构造语法分析树

语法分析树描述了句子的语法结构

语法分析树

5. 语义分析

主要任务:

  1. 收集标识符的属性信息

    • 种属(Kind)

      • 简单标量、复合变量(数组、记录、...)、过程、...

    • 类型(Type)

      • 整型、实型、字符型、布尔型、指针型、...

    • 存储位置、长度

    • 作用域

    • 参数和返回值信息

      • 参数个数、参数类型、参数传递方式、返回值类型、...

  2. 语义检查

    • 变量或过程未经声明就使用

    • 变量或过程名重复声明

    • 运算分量类型不匹配

    • 操作符操作数之间的类型不匹配

      • 数组下标不是整数

      • 非数组变量使用数组访问操作符

      • 非过程名使用过程调用操作符

      • 过程调用的参数类型或数目不匹配

      • 函数返回类型有误

6. 中间代码生成

6.1 常用的中间表示形式

  • 三地址码

    • 三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数

  • 语法结构树/语法树

6.2 常用的三地址指令

常用的三地址指令

6.3 三地址指令的表示

  • 四元式

    • (op, y, z, x)

  • 三元式

  • 间接三元式

6.4 三地址指令的四元式表示

三地址指令的四元式表示

6.5 中间代码生成的例子

7. 目标代码生成器

目标代码生成以源程序的中间表示形式作为输入,并把它映射到目标语言

目标代码生成的一个重要的任务是为程序使用的变量合理分配寄存器

8. 代码优化

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

Last updated

Was this helpful?