需要帮助理解有关换行符的 C 代码

问题描述 投票:0回答:3

这个问题参考了对信任信任的反思,图2。

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

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

它说:

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

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

Stage 1
(来源:bell-labs.com

c
3个回答
4
投票

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

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

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

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


2
投票

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

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

这里,如果

c
不是
\\
(字符
\
),则意味着它不是转义字符的开头,因此返回自身。

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

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

您的问题有一个拼写错误,是

if (c == '\\')
,而不是
if (c != '\\')
。这段代码继续检查
\
后面的字符,很明显,如果是
\
,那么整个转义字符就是
\\
,所以返回它。
\n
也一样。


1
投票

该代码的描述来自 Ken Thompson 的论文:(强调)

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

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

© www.soinside.com 2019 - 2024. All rights reserved.