编译器设计 - 编译器阶段

  • 简述

    编译过程是一系列不同阶段的序列。每个阶段都从其前一个阶段获取输入,具有自己的源程序表示,并将其输出提供给编译器的下一个阶段。让我们了解编译器的各个阶段。
    编译器阶段

    词法分析

    扫描仪的第一阶段用作文本扫描仪。此阶段将源代码扫描为字符流并将其转换为有意义的词位。词法分析器以标记的形式将这些词位表示为:
    
    <token-name, attribute-value>
    

    语法分析

    下一阶段称为语法分析或parsing. 它将词法分析产生的记号作为输入,生成解析树(或语法树)。在这个阶段,根据源代码语法检查标记排列,即解析器检查由标记生成的表达式在语法上是否正确。

    语义分析

    语义分析检查构造的解析树是否遵循语言规则。例如,值的分配是在兼容的数据类型之间,以及将字符串添加到整数。此外,语义分析器会跟踪标识符、它们的类型和表达方式;标识符是否在使用前声明等等。语义分析器产生一个带注释的语法树作为输出。

    中间代码生成

    在语义分析之后,编译器为目标机器生成源代码的中间代码。它代表一些抽象机器的程序。它介于高级语言和机器语言之间。该中间代码的生成方式应使其更容易被翻译成目标机器代码。

    代码优化

    下一阶段对中间代码进行代码优化。优化可以假设为删除不必要的代码行,并安排语句序列以加快程序执行而不浪费资源(CPU、内存)。

    代码生成

    在这个阶段,代码生成器采用中间代码的优化表示并将其映射到目标机器语言。代码生成器将中间代码翻译成(通常)可重新定位的机器代码序列。机器代码的指令序列像中间代码一样执行任务。

    符号表

    它是一个贯穿编译器所有阶段的数据结构。所有标识符的名称及其类型都存储在这里。符号表使编译器更容易快速搜索标识符记录并检索它。符号表也用于范围管理。