1

1、编译器概述

编辑器从逻辑上可以分为若干个阶段,每个阶段将源程序从一种表示变换成另一种表示。

以Pascal语言的 position := initial + rate * 60 为例子介绍编译的各个阶段

clipboard.png

1.1 词法分析

词法分析 又叫线性分析 或者 线性扫描

逐个读取源程序的字符,把他们组成词法记号(token)流,并且把词法单元填入符号表。

在这个阶段会删除掉分隔记号的空格

clipboard.png

1.2 语法分析

语法分析又叫 层次分析

将词法记号流按照语法结构进行层次分组,形成语法短语,语法短语常用分析树表示

clipboard.png

1.2.1 层次结构遵循的规则

  • 任何一个标识符都是表达式
  • 任何一个数都是表达式
  • 如果e**1和e2都是表达式,那么
    e1 + e2

    e1 * e2

    (e1)

也都是表达式

1.3 语义分析

进行语义分析,生成语法树

作用:

(1)进行语义检查(其中包括类型检查)、保证各部分能有意义的集合在一起

(2)搜集类型信息

clipboard.png

1.4 中间代码生成

经过语法分析和语义分析之后,某些编译器生成源程序的显式中间表示。

具备两个性质: 易于产生、易于翻译成目标程序

功能:

(1)需决定运算完成的次序。(疑问每个语句之多一个算符)

(2)必须产生临时变量名。(保留每个语句的计算结果)

(3)必须处理控制流结构和过程调用

中间表示的常用形式: 三地址代码。

clipboard.png

1.4.1 三地址代码

三地址代码 由 三地址语句序列组成,最多三个操作数

1.5 代码优化

试图改进代码,产生执行较快的机器代码

clipboard.png

1.6 代码生成

生成可重定位的机器代码或者汇编码

功能:
(1)为源程序所用的每个变量选择存储单元 (寄存器分配)

(2) 将中间代码生成等价的机器指令序列

1.7符号表管理

符号表 :为每一个标识符保存一个记录的数据结构,记录的域是标识符的属性(标识符的存储分配、类型和作用域信息)

1.8 错误诊断与报告

每个阶段都有可能发现源程序的错误,在发现错误之后,该阶段必须处理此错误,使得编译可以继续进行,以便进一步发现源程序的其他错误。

词法分析阶段 :诊断当前被扫描的字符串不能形成语言的词法记号。

语法分析阶段:诊断记号流违反的语法规则。

语义分析阶段:找到对所含操作无意义的结构。

1.9、编译的总过程

clipboard.png

2、阶段分组(前端和后端)

在实际编译器中,若干阶段可以组合在一起,各阶段之间的中间表示也无需显示构成

通常将所有阶段分为前端和后端:

前端:只依赖于源程序,由几乎独立于目标机器的阶段或者阶段的一部分组成。

   包括:词法分析、语法分析、符号表建立、语义分析、中间代码生成、部分代码优化、与这些阶段同时完成的错误处理。

后端:依赖于目标机器,一般独立于源程序,而与中间代码有关。

   包括:代码优化、代码生成、伴随这些阶段的符号表操作和错误处理

3、遍

编译的几个阶段常用 一遍扫描来实现,一遍扫描包括读一个输入文件和写一个输出文件

把几个阶段组成一遍,并且这些阶段的活动可以在该遍中交错进行。例如:可以把语法分析看成主导,当它需要记号时,调用词法分析器去下一个记号。如果已经看出一个语法结构,语法分析器则激活中间代码生成器,以完成语义分析和生成中间代码。

4、翻译器、编译器、解释器

翻译器:能够将 一种语言(源语言)变换成另一种语言(目标语言)的软件。

编译器:编译器是一种翻译器,将高级语言变换成一种低级语言的软件。特点在于 目标语言比源语言低级

解释器:也需要对源程序进行词法、语法和语义分析,中间代码生成。但是不生成目标代码,而是直接执行源程序所指定的运算


二丽
280 声望8 粉丝