📜  单程、两程和多程编译器

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

我们已经知道编译器设计的所有阶段,现在编译器通过。 Compiler pass是指编译器遍历整个程序。 Compiler pass 有两种类型:Single Pass Compiler 和 Two Pass CompilerMulti Pass Compiler。这些解释如下。

1. 单程编译器:
如果我们结合或组所有已知的单通编译器在单一模块中的编译器设计的阶段。

在上图中,所有 6 个阶段都分组在一个模块中,单通道编译器的一些要点如下:

  1. 单遍/单遍编译器是那种类型的编译器,它只通过每个编译单元的部分一次。
  2. 单遍编译器比多遍编译器更快、更小。
  3. 与多通道编译器相比,单通道编译器的一个缺点是效率较低。
  4. Single pass 编译器是只处理一次输入的编译器,因此直接从词法分析到代码生成器,然后返回进行下一次读取。

注意: Single pass 编译器几乎从来没有做过,早期的Pascal 编译器做了这个作为介绍。

单程编译器的问题:

  1. 由于表达式的上下文有限,我们不能很好地优化。
  2. 由于我们不能备份和处理,所以再次限制或简化语法。
  3. 命令解释器如bash/sh/tcsh可以被认为是 Single pass 编译器,但它们也会在处理后立即执行 entry。

2. 二通编译器或多通编译器:
两遍/多遍编译器是一种编译器,它多次处理程序的源代码或抽象语法树。在多通道编译器中,我们将阶段分为两阶段:

  1. First Pass:是指
    • (一种)。前端
    • (b)。解析部分
    • (C)。平台无关

    第一遍包含的阶段是词法分析器,语法分析器,语义分析器,中间代码生成器作为前端工作,分析部分意味着所有阶段分析高级语言并将它们转换为三个地址代码,第一遍是平台无关的,因为第一遍的输出是三个地址代码,这对每个系统都有用,并且要求更改第二遍的代码优化和代码生成器阶段。

  2. 第二遍:是指
    • (一种)。后端
    • (b)。合成部分
    • (C)。平台相关

    在第二遍中,包含的阶段是代码优化和代码生成器作为后端工作,综合部分是指将输入作为三个地址代码并将它们转换为低级语言/汇编语言,第二遍是平台相关的,因为最后阶段典型的编译器将程序的中间表示转换为依赖于系统的可执行指令集。

使用多通道编译器,我们可以解决这两个基本问题:

  1. 如果我们想为同一台机器设计不同编程语言的编译器。在这种情况下,对于每种编程语言,都需要为它们中的每一个进行前端/第一次传递,并且只有一个后端/第二次传递,如下所示:

  2. 如果我们想为不同的机器/系统设计一个相同编程语言的编译器。在这种情况下,我们为不同的机器/系统制作不同的后端,并且只为相同的编程语言制作一个前端:

    单通道和多通道编译器之间的差异:

    Parameters Single pass multi Pass
    Speed Fast Slow
    Memory More Less
    Time Less More
    Portability No Yes