单遍编译器和多遍编译器有什么区别?
单遍编译器
单遍编译器只读取代码一次,然后进行翻译。单遍编译器只对每个编译单元的部分进行一次扫描。它可以将每一部分翻译成最终的机器程序。在单遍编译器中,当处理源代码行时,它会扫描并提取标记。这与多遍编译器形成对比,多遍编译器会分步骤将程序修改为一个或多个中间表示,并在每次连续扫描中转换整个编译单元。
单遍编译器速度很快,因为所有编译器代码都一次性加载到内存中。它可以处理源文本,而无需操作系统关闭一个进程并启动另一个进程的开销。单遍编译器往往对程序常量、类型、变量和过程施加一些限制,这些常量、类型、变量和过程必须在使用前定义。
多遍编译器
多遍编译器可以多次处理程序的源代码。在第一遍中,编译器可以读取源代码,扫描它,提取标记并将结果保存到输出文件中。
在第二遍中,编译器可以读取第一遍生成的输出文件,构建语法树并实现语法分析。此阶段的输出是一个包含语法树的文件。
在第三遍中,编译器可以读取第二遍生成的输出文件,并检查树是否遵循语言规则。语义分析阶段的输出是带注释的语法树。此过程会持续进行,直到生成目标输出。
让我们看看单遍编译器和多遍编译器的比较。
单遍编译器 | 多遍编译器 |
---|---|
它只读取代码一次并同时进行翻译。 | 它多次读取代码,每次都将其转换为多种形式。 |
它们更快。 | 它们较慢。因为遍数越多,执行时间就越长。 |
代码优化和代码生成效率较低。 | 更好的代码优化和代码生成。 |
它也称为“窄编译器”。它的范围有限。 | 它也称为“宽编译器”。因为它们可以扫描程序的每一部分。 |
编译器需要大量的内存。 | 单遍占用的内存可以被后续遍数重用;因此,编译器只需要较小的内存。 |
示例 - Pascal 和 C 语言使用单遍编译。 | 示例 - Modula-2 语言使用多遍编译。 |
广告