📜  编译器的阶段

📅  最后修改于: 2021-09-28 10:15:27             🧑  作者: Mango

先决条件——编译器设计介绍

我们基本上有两个编译器阶段,即分析阶段和综合阶段。分析阶段从给定的源代码创建一个中间表示。综合阶段从中间表示创建等效的目标程序。

符号表 –它是由编译器使用和维护的数据结构,包含所有标识符的名称及其类型。它可以帮助编译器函数,顺利通过快速查找标识符。

对源程序的分析主要分为三个阶段。他们是:

  1. 线性分析-
    这涉及从左到右读取字符流的扫描阶段。然后将其分组为具有集体含义的各种标记。
  2. 层次分析-
    在此分析阶段,基于集体含义,将标记按层次分类为嵌套组。
  3. 语义分析-
    此阶段用于检查源程序的组件是否有意义。

编译器有两个模块,即前端和后端。前端由词法分析器、语义分析器、语法分析器和中间代码生成器组成。其余部分组装成后端。

  1. 词法分析器 –
    它也被称为扫描仪。它以纯高级语言的预处理器(执行文件包含和宏扩展)的输出作为输入。它从源程序中读取字符并将它们分组为词素(“组合在一起”的字符序列)。每个词位对应一个标记。标记由词法分析器理解的正则表达式定义。它还删除词法错误(例如,错误字符)、注释和空格。
  2. 语法分析器 –它有时被称为解析器。它构建解析树。它一一获取所有标记并使用上下文无关语法来构建解析树。

    为什么是语法?
    编程规则可以完全体现在一些少数作品中。使用这些产生式,我们可以表示程序的实际情况。必须检查输入是否为所需的格式。
    解析树也称为派生树。解析树通常用于检查给定语法中的歧义。有一些与派生树相关的规则。

    • 任何标识符都是一个表达式
    • 任何数字都可以称为表达式
    • 在给定的表达式中执行任何操作将始终产生一个表达式。例如,两个表达式的和也是一个表达式。
    • 解析树可以压缩成语法树

      如果输入不符合语法,则可以在此级别检测语法错误。

    • 语义分析器——它验证解析树是否有意义。它还生成一个经过验证的解析树。它还进行类型检查、标签检查和流量控制检查。
    • 中间代码生成器——它生成中间代码,这是一种可以很容易地被机器执行的形式我们有很多流行的中间代码。示例 – 三个地址代码等。中间代码使用依赖于平台的最后两个阶段转换为机器语言。

      直到中间代码,那里的每个编译器都是一样的,但在那之后,它取决于平台。要构建一个新的编译器,我们不需要从头开始构建它。我们可以从已经存在的编译器中获取中间代码并构建最后两部分。

    • 代码优化器——它转换代码,使其消耗更少的资源并产生更高的速度。被转换的代码的含义不会改变。优化可以分为两种类型:机器相关和机器无关。
    • 目标代码生成器——目标代码生成器的主要目的是编写机器可以理解的代码以及寄存器分配、指令选择等。输出取决于汇编程序的类型。这是编译的最后阶段。优化后的代码被转换为可重定位的机器代码,然后形成链接器和加载器的输入。

所有这六个阶段都与符号表管理器和错误处理程序相关联,如上面的框图所示。