编译器的不同阶段是什么?

编译器的各个阶段如下 -

  • 词法分析(扫描仪)

它也被称为扫描仪。这是作为编译器和源语言代码之间集成的第一步。它一次读取一个字符的源代码,并将源代码设计成一系列称为令牌的原子单元。

每个标记都定义了一个字符序列,可以将其视为单个逻辑实体。它可以是标识符、关键字、常量、运算符和标点符号,例如 , 和 ;。

构成记号的字符序列称为记号的词位。它还删除了注释和不必要的空格。

  • 语法分析(解析器)

它也被称为解析器。它接收标记作为其从前一阶段(词法分析)生成的输入,并生成称为语法树或解析树的层次结构。

有两种类型的解析器 -

  • 自下而上- 它从叶子生成解析树并向上扫描,即树的根。

  • 自上而下- 它从根级别生成解析树并向下移动到叶子。

  • 语义分析

此阶段进行语法树输入并确定程序的语义准确性。但是,标记是准确且语法正确的;它们可能是精确的,而不是语义上的。因此,语义分析器确定语句构造的语义(意义)。

  • 中间代码生成

此阶段将语法和语义正确的形式作为输入,并生成与源代码相同的中间符号。

中间代码必须具有以下两个基本属性 -

  • 它必须易于创建。

  • 它可以简单地翻译成目标代码。

  • 代码优化

这是一个可选阶段。它将源程序的中间表示转换为有效的代码。

  • 代码生成

这是编译过程的最后一步。它将优化的中间代码转换为机器/汇编代码。它为程序中的变量分配内存位置。

更好的代码生成只能通过有效利用寄存器来执行。

  • 示例- 像 A = B + C 这样的语句可以转换为汇编代码,如下所示 -

  • 符号表

它是一种数据结构,包括每个标识符的数据、标识符属性的字段。数据结构使我们能够快速找到每个标识符的数据,并快速保存或检索该记录的信息。

  • 错误处理

编译器的主要任务是执行错误检测和报告。当在源代码中发现错误时,将调用此错误处理程序。每个阶段在发现错误后都会遇到错误,阶段应该以某种方式管理该错误,以便编译可以继续。