这个问题参考了对信任信任的反思,图2。
看一下图 2 中的这段代码:
...
c = next( );
if(c != '\\')
return(c);
c = next( );
if (c != '\\')
return('\\');
if (c == 'n')
return('\n');
它说:
这是一段令人惊奇的代码。它以完全可移植的方式“知道”在任何字符集中为新行编译什么字符代码。然后,认知行为允许它重新编译自身,从而使知识永久化。
我想阅读本文的其余部分。 有人可以解释一下上面的代码是如何重新编译的吗? 我不确定我是否理解这段代码与“第一阶段”中的代码有何关系:
(来源:bell-labs.com)
第 2 阶段的示例非常有趣,因为它是具有自我复制程序的额外间接级别。
他的意思是,由于这个编译器代码是用 C 编写的,所以它是完全可移植的,因为它检测到文字的存在 并返回字符代码 因为编译器是用 C 编写并为系统编译的,所以不知道实际的字符代码是什么。
本文继续向您展示了非常有趣的特洛伊木马与编译器。如果您使用相同的技术使编译器将错误插入到任何程序中,然后从源代码中删除移动错误,编译器会将错误编译到所谓的无错误编译器中。
这有点令人困惑,但本质上它是关于多个间接级别。
这段代码的作用是翻译转义字符,这是C编译器工作的一部分。
c = next( );
if(c != '\\')
return(c);
这里,如果
c
不是\\
(字符\
),则意味着它不是转义字符的开头,因此返回自身。
如果是,那么它是转义字符的开始。
c = next( );
if (c == '\\')
return('\\');
if (c == 'n')
return('\n');
您的问题有一个拼写错误,是
if (c == '\\')
,而不是if (c != '\\')
。这段代码继续检查\
后面的字符,很明显,如果是\
,那么整个转义字符就是\\
,所以返回它。 \n
也一样。
该代码的描述来自 Ken Thompson 的论文:(强调)
图 2 是解释字符转义序列的 C 编译器中的代码的理想化。
所以您正在查看 C 编译器的一部分。 C编译器是用C编写的,因此它将用于编译自身(或者更准确地说,是其自身的下一个版本)。因此,声明代码能够“重新编译自身”。