One-Pass Compiler 和 Multi-Pass Compiler 有什么区别?

一次性编译器

一通编译器只读取一次代码,然后翻译它。一次性编译器只通过每个编译单元的部分一次。它可以将每个零件翻译成最终的机器程序。在一次性编译器中,当处理线源时,会对其进行扫描并提取令牌。这与多遍编译器形成对比,多遍编译器在源程序和机器程序之间逐步将程序修改为一个或多个中间表示,并在每个顺序遍中转换整个编译单元。

一次性编译器速度很快,因为所有编译器代码一次加载到内存中。它可以处理源文本,而无需操作系统关闭一个进程并启动另一个进程的开销。one-pass 倾向于对在使用之前必须定义的程序常量、类型、变量和过程施加一些限制。

多遍编译器

多遍编译器可以多次处理程序的源代码。在第一遍中,编译器可以读取源代码、扫描它、提取标记并将结果保存在输出文件中。

在第二遍中,编译器可以读取第一遍产生的输出文件,构建语法树并执行语法分析。此阶段的输出是一个包含语法树的文件。

在第三遍中,编译器可以读取第二遍生成的输出文件,并检查树是否遵循语言规则。语义分析阶段的输出是带注释的树语法。这个过程一直持续到产生目标输出为止。

让我们看看 One-Pass 和 Multi-Pass Compiler 之间的比较。

一次性编译器多遍编译器
It reads the code only once and translates it at a similar time.
它多次读取代码,每次都将其更改为多种形式。
They are faster.
他们“更慢”。由于更多的通过次数意味着更多的执行时间。
Less efficient code optimization and code generation.
更好的代码优化和代码生成。
It is also called a "Narrow compiler." It has limited scope.
它也被称为“宽编译器”。因为他们可以扫描程序的每个部分。
The compiler requires large memory.
一个pass占用的内存可以被后续pass重用;因此,编译器需要小内存。
Example − Pascal & C languages use one-pass compilation.
示例- Modula -2 语言使用多遍编译。