代码之家  ›  专栏  ›  技术社区  ›  SF.

编译编译器-多少次?

  •  6
  • SF.  · 技术社区  · 15 年前

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

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

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

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

    …但是如果你是偏执狂,也许是[0]引入[1]的错误导致了[2]也有点麻烦…?

    超越[2]有意义吗?

    3 回复  |  直到 15 年前
        1
  •  6
  •   T.J. Crowder    15 年前

    当编译的结果 n 与编译结果相同 n - 1 在那一点上,你已经达到了稳定状态。

        2
  •  3
  •   Pascal Cuoq    15 年前

    引导OCAML的说明邀请您继续 until you have reached a fixpoint , 如果你愿意 . 假设新的编译器只修复错误,不引入新的错误,您可能需要多次引导以使自诱导的编译器错误消失。

    你也可以在不修复你试图修复的错误的情况下到达一个固定点,因为在引导编译程序中存在的错误会使它在引导版本(一种非自愿的 Ken Thompson )这在OCAML的历史上至少发生过一次。当他们注意到这一点时,开发人员手工修复了汇编代码,以便获得一个正确的编译器,将正确的源代码翻译成正确的编译器。

        3
  •  1
  •   Dacav    15 年前

    通常,您应该在不使用标准库的情况下编译一次,并获得编译器的部分工作版本。随后,您需要使用标准库支持重新编译:这使您能够获得进一步的功能(如printf检查和libgcc资料)。

    我不知道随后的重新编译,但感谢您提供的信息:)