单遍编译器和多遍编译器有什么区别?


单遍编译器

单遍编译器只读取代码一次,然后进行翻译。单遍编译器只对每个编译单元的部分进行一次扫描。它可以将每一部分翻译成最终的机器程序。在单遍编译器中,当处理源代码行时,它会扫描并提取标记。这与多遍编译器形成对比,多遍编译器会分步骤将程序修改为一个或多个中间表示,并在每次连续扫描中转换整个编译单元。

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

多遍编译器

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

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

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

让我们看看单遍编译器和多遍编译器的比较。

单遍编译器多遍编译器
它只读取代码一次并同时进行翻译。
它多次读取代码,每次都将其转换为多种形式。
它们更快。
它们较慢。因为遍数越多,执行时间就越长。
代码优化和代码生成效率较低。
更好的代码优化和代码生成。
它也称为“窄编译器”。它的范围有限。
它也称为“宽编译器”。因为它们可以扫描程序的每一部分。
编译器需要大量的内存。
单遍占用的内存可以被后续遍数重用;因此,编译器只需要较小的内存。
示例 - Pascal 和 C 语言使用单遍编译。
示例 - Modula-2 语言使用多遍编译。

更新于:2021年10月23日

14K+ 浏览量

启动你的职业生涯

通过完成课程获得认证

开始学习
广告