编译器阶段

2025 年 5 月 26 日 | 阅读 5 分钟

在本文中,我们将详细讨论 编译器 的概念和编译器的阶段。

你所说的编译器是什么意思?

这是一个将用一种语言编写的代码翻译成另一种语言的程序。 在此翻译过程中,编译器会向其用户报告错误的存在。

Compiler Phases

下面列出了各种类型的编译器

  • 如果编译后的程序可以在与运行编译器的计算机不同的 CPU 和操作系统上运行,则称为交叉编译器。
  • 自托管编译器能够将其源代码编译成高级语言。

引言

编译过程包含各个阶段的顺序。每个阶段都采用一种表示形式的源程序,并以另一种表示形式产生输出。 每个阶段都从其上一阶段获取输入。

在分析过程中,我们将源程序分解成片段并施加语法结构。 它确定操作并以结构化方式记录它们,称为解析树。

在综合过程中,我们通过应用不同的优化技术来优化代码,并最终将其转换为机器码。

符号表:它是一种用于保存中间结果以维护记录的数据结构。

错误处理程序:它用于检测每个错误,向用户报告,制定一些恢复策略并实施它们以处理错误。

编译器有各个阶段

Compiler Phases

词法分析

词法分析器阶段是编译过程的第一阶段。它将源代码作为输入。 它一次读取一个字符的源程序,并将其转换为有意义的词素,这些词素是逻辑内聚的实体,例如标识符等。词法分析器以令牌的形式表示这些词素。 为了识别这些令牌,我们使用正则表达式和状态转换图。

Compiler Phases

词法分析的各种功能是

  • 跟踪行号
  • 删除所有空格或注释。

例如:计算令牌的数量

在以下表达式中

如果 ( x == 2 ) 那么 TRUE 否则 FALSE

所有有效的令牌都是

'if' '(' ')' 'x' '==' '2' 'then' 'TRUE' 'ELSE' 'FALSE'

令牌的数量是 10。

词法分析器会将此表达式拆分为以下令牌

符号表
标识符令牌x
运算符令牌==
常量令牌2
数值文字令牌5

语法分析

Compiler Phases

语法分析是编译过程的第二阶段。它也被称为解析。它将令牌作为输入,并生成解析树作为输出。在语法分析阶段,解析器会检查令牌构成的表达式在语法上是否正确。它确定词法分析提供的标记化源程序的语法结构,并将它们组合起来,以便可以识别某些编程结构。它通过应用一些语法规则来构建解析树。对于这个过程,我们使用上下文无关文法。

上下文无关文法包含 4 个元组

G = { V, T, P, S }

V 包含变量集

T 包含终结符集

P 包含产生式规则

S 是起始符号

为表达式构造一个解析树

Id1+ id2 * id3

上下文无关文法是

E -> E + E

E -> E * E

E -> id

Compiler Phases Compiler Phases

注意:多个解析树会产生歧义语法。

语义分析

语义分析是编译过程的第三阶段。它检查解析树是否遵循语言的规则。 语义分析器跟踪标识符、它们的类型和表达式。 语义分析阶段的输出是带注释的树语法。

Compiler Phases

语义分析的功能

  • 在使用变量之前,它会检查它是否已声明。
  • 它执行类型检查以验证每个运算符是否在其源语言规范中具有操作数。

例如

int x = 15;
float y = 30.5;

int z;
z = x + y;

类型检查

  • x 是一个 int,y 是一个 float。将它们加在一起会产生一个 float (x + y),它不能分配给一个 int z。
  • 它显示错误:类型不匹配:无法将 float 分配给 int。

中间代码生成

在中间代码生成中,编译器将源代码生成为中间代码。中间代码在高级语言和机器语言之间生成。中间代码的生成应以一种可以轻松将其转换为目标机器码的方式进行。

Compiler Phases

例如:三地址码最常用于此目的。

在以下表达式中

E + F * G - H

T1 = E + F

T2 = G - H

T3 = T1 * T2

X = T3

优化的结果是

T1 = E + F

T2 = T1 * G

T3 = T2 - H

X = T3

代码优化

代码优化是一个可选阶段。它用于改进中间代码,以便程序的输出可以运行得更快,并占用更少的空间。它删除了代码中不必要的行,并按顺序排列语句以加快程序执行速度。

Compiler Phases

用于代码优化的不同技术是

  • 窥孔优化
  • 代码表示法
  • 局部和循环优化等

例如

X = A + B * C

T1 = A

T2 = B

T3 = A + B

T4 = T3 * C

X = T4

优化的结果是

T1 = A + B

X = T1 * C

代码生成

代码生成是编译过程的最后阶段。它将优化的中间代码作为输入,并将其映射到目标机器语言。代码生成器将中间代码转换为指定计算机的机器代码。 此生成需要有关目标机器的详细信息,例如程序中使用的每个变量可用的内存位置。

示例

Compiler Phases

关于编译器阶段的常见问题解答

1. 列出各种编译器阶段?

  • 词法分析
  • 语法分析
  • 语义分析
  • 中间代码生成器
  • 代码优化
  • 代码生成

2. 语法分析和语义分析的主要区别是什么?

语法分析语义分析
1. 语法分析检查语法正确性,使用解析树语义分析确保逻辑正确性,例如验证操作是在兼容的数据类型上执行的
2. 例如:确保括号和运算符的正确排列。例如:避免将整数连接到字符串中

3. 列出语法分析器的各种功能?

  • 它有助于检查语法错误。
  • 创建解析树的能力。

4. 计算以下程序中的令牌数量。

令牌的数量是 18。

5. 解释器和编译器有什么区别?

解释器Compiler
它逐行将源代码转换为目标代码。它将源代码转换为整个目标代码。

下一个主题编译器过程