【问题标题】:Compiling the compiler - how many times?编译编译器 - 多少次?
【发布时间】:2011-01-26 07:03:41
【问题描述】:

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

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

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

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

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

超越 [2] 是否有意义?

【问题讨论】:

    标签: language-agnostic compiler-construction compilation


    【解决方案1】:

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

    【讨论】:

    • 如果在第三个版本上没有发生这种情况,则可能存在错误。新编译器应该在自己的源代码上产生相同的输出,不管它是用什么版本编译的。
    • @Rafal:同意。 @SF:是的,比较需要处理这类事情;这不是一个不常见的要求。
    【解决方案2】:

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

    您也可能会在未修复您尝试修复的错误的情况下达到修复点,因为引导编译器中存在的错误会使其在引导版本中永久存在(一种非自愿的Ken Thompson)。这在 OCaml 的历史上至少发生过一次。当他们注意到这一点时,开发人员手动修复了汇编代码,以获得正确的编译器,将正确的源代码翻译成正确的编译器。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-12
        • 1970-01-01
        • 2013-07-10
        • 2019-12-23
        • 2012-06-26
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多