编译编译器 - 多少次?

时间:2010-03-11 09:17:59

标签: language-agnostic compiler-construction compilation

如果你编译一个新版本的编译器,你应该迭代地重新编译它多少次?

首先:使用旧版本[0]编译新版本的编译器[1]。

第二:使用新编译的[1]编译新版本[2],以应用新的优化并修复二进制错误,而不是旧的[0]编译器中的错误。

现在第三?再次编译,使用[2]删除由于错误编译错误[0]导致[1]中的错误导致的任何潜在错误...?

...但如果你是偏执狂,也许[0]引入[1]的错误导致[2]也有些错误......?

超越[2]是否有意义?

3 个答案:

答案 0 :(得分:6)

当汇编n的结果与汇编n - 1的结果相同时,我会停止;那时你已达到稳定状态。

答案 1 :(得分:3)

引导OCaml的说明邀请您继续until you have reached a fixpoint如果您愿意。假设新编译器只修复了错误并且没有引入新的错误,那么您可能需要多次引导以使自引导编译器错误消失。

你也可以在没有你试图修复的错误的情况下到达一个修复点,因为引导程序编译器中存在的bug会在引导版本中延续它(一种非自愿的Ken Thompson)。这在OCaml的历史中至少发生过一次。当他们注意到这一点时,开发人员手动修复汇编代码,以获得正确的编译器,将正确的源代码转换为正确的编译器。

答案 2 :(得分:1)

通常,您应该在没有标准库的情况下编译一次,并获得编译器的部分工作版本。随后您需要使用标准库支持重新编译:这使您可以获得更多功能(如printf检查和libgcc内容)。

我不知道后续的重新编译,但感谢信息:)