我看过很多关于 的帖子一通和 多通编译器,但我似乎不明白这一点。
最佳答案
多 channel 一词的起源来自计算机内存少得多的时代。编译器需要大量内存,而在内存小的机器中,这很难管理。
所以最初的想法是编译器在多次传递中运行。第一遍读取源代码,并完成语法检查等基本任务,可能构建符号表,然后将其结果写入磁盘文件以进行第二遍。每个连续的 N 轮将读取前一轮的结果,并更改程序表示以使其越来越接近机器代码,并写出其结果以供 N+1 轮读取。重复这个过程,直到最后一遍产生最终代码。许多编译器可以通过几次(“多”)通过;有著名的编译器在非常旧的机器上构建了几十个 channel 。
(同样的概念适用于所谓的“两遍汇编器”:第一遍读取汇编器源代码,语法检查,找出应该为标签符号使用的位置值;第二遍使用分配的符号位置的知识生成目标代码在第一遍)。
内存现在变大了,将每个非常大的程序的源代码读入内存,让编译器在单个进程的内存中完成所有工作,并编写目标代码,这非常实用。您仍然可以在链接器的概念中看到一些类似的残余;他们将多个对象模块(“第一遍”)粘合到一个二进制文件中。
如果您在内部查看编译器,它们会分阶段运行。典型的阶段可能是:
* Parse and syntax check
* Build symbol tables
* Perform semantic sanity check
* Determine control flow
* Determine data flow
* Generate some "intermediate" language (representing abstract instructions)
* Optimize the intermediate language
* Generate machine code from the optimized language
特定编译器对阶段所做的工作因编译器而异。这些步骤中的每一个都使程序表示更接近最终的机器代码。 N 遍编译器会将这些步骤中的一个或多个捆绑到一个遍中。
回到现在,我们有很多内存;不需要现代编译器将中间结果写入磁盘文件,因此所有这些阶段都发生在单个进程的内存中。您,编译器用户,看不到它们。因此,您可以将现代编译器称为“一次性”一词的原始含义。由于现在没有人关心,这个短语已经被废弃了。
无论如何,编译器内部通常仍然是多阶段的。 (有些编译器在一个阶段完成所有这些步骤;通常,他们不能做很多优化)。
关于compiler-construction - 一通和多通编译器之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35673818/