2

这个问题参考了关于信任的思考,图 2。

看一下图 2 中的这段代码:

...
c = next( );
if(c != '\\')
    return(c);
c = next( );
if (c != '\\')
    return('\\');
if (c == 'n')
    return('\n');

它说:

这是一段惊人的代码。它以一种完全可移植的方式“知道”为任何字符集中的新行编译了什么字符代码。然后,知道的行为允许它重新编译自己,从而使知识永存。

我想阅读论文的其余部分。有人能解释一下上面的代码是如何重新编译自己的吗?我不确定我是否理解这段代码与“第 1 阶段”中的代码的关系:

阶段1
(来源:bell-labs.com

4

3 回答 3

4

第 2 阶段的示例非常有趣,因为它是自我复制程序的额外间接级别。

他的意思是,由于这个编译器代码是用 C 编写的,因此它是完全可移植的,因为它检测到文字 \n 的存在并返回 \n 的字符代码,而无需知道实际的字符代码是什么,因为编译器是用C并为系统编译。

本文继续向您展示非常有趣的特洛伊木马与编译器。如果您使用相同的技术使编译器将错误插入任何程序,然后从源代码中删除移动错误,编译器会将错误编译到所谓的无错误编译器中。

这有点令人困惑,但本质上它是关于多个间接级别的。

于 2013-08-15T05:04:03.350 回答
2

这段代码所做的是翻译转义字符,这是 C 编译器工作的一部分。

c = next( );
if(c != '\\')
    return(c);

在这里,如果c不是\\(字符\),意味着它不是转义字符的开始,所以返回它自己。

如果是,那么它就是转义字符的开始。

c = next( );
if (c == '\\')
    return('\\');
if (c == 'n')
    return('\n');

在这里,您的问题中有一个错字,它是if (c == '\\'),不是if (c != '\\')。这段代码继续检查 后面的字符\,很明显,如果是\,则整个转义字符是\\,所以返回。对于\n.

于 2013-08-15T05:15:30.430 回答
1

Ken Thompson 的论文中对该代码的描述是:(添加了重点)

图 2 是C 编译器中解释字符转义序列的代码的理想化。

因此,您正在查看 C 编译器的一部分。C 编译器是用 C 编写的,因此它将用于编译自身(或者更准确地说,编译自身的下一个版本)。因此,代码能够“重新编译自身”的声明。

于 2013-08-15T05:09:23.060 回答