【问题标题】:Compiler/Bootstrapping - Slower by recompiling off old bootstrapped compilers?编译器/引导程序 - 通过重新编译旧的引导编译器来变慢?
【发布时间】:2011-07-05 23:51:30
【问题描述】:

我一直在重读http://cm.bell-labs.com/who/ken/trust.html,但我似乎无法通过垂直标签掌握第二阶段的概念。我对你们的问题是:现在是否在包含 \v 转义字符的情况下检查了两次字符?因为我看到它的方式是安装了这个新编译器,当使用 \v ,它将遍历图 3 中的代码,然后在 return('\v') 语句中,将调用图 4 中的代码,该代码返回垂直制表符的真实 ASCII 表示。尽管它可以更好地表示当前编译器,但这不会减慢编译时间吗?如果您需要我重新表述我的问题,请告诉我。干杯!

【问题讨论】:

    标签: security compiler-construction bootstrapping iteration


    【解决方案1】:

    代码不会被遍历两次。在初始状态下,图 3 无法编译,因为\v 没有定义的含义。 (只需将其视为定义在编译器内部的花哨变量。)

    编译图 4 的代码后,您已声明 \v 代表 11。生成的编译器可以将\v 映射到一个值,因此您可以定义\v 来代表\v。

    带有实变量的非编译器示例如下所示:

    x = 11;
    /* ... */
    x = x;
    

    一旦您定义了x 的含义,您就可以使用它,甚至可以将其值分配给它自己。与解析器的主要区别在于,\v 的定义不是在同一个文件中的不同位置放置两个声明,而是分布在两个不同版本的编译器中,第二个由新编译器编译(因为旧的编译器不包括这个定义)。

    【讨论】:

    • 啊,我现在明白了。我认为它只需要在新编译器中继续引用图 3 代码,但它基本上只是将字节码中的 \v 替换为 11。因此,当您继续使用新编译器重新编译该源代码时,您只会得到相同的字节代码。抽象让我感到困惑。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2015-06-19
    • 2012-10-06
    相关资源
    最近更新 更多