【问题标题】:Need assistance understanding C code about newlines需要帮助了解有关换行符的 C 代码
【发布时间】:2023-03-09 19:07:01
【问题描述】:

这个问题引用Reflections on Trusting Trust,图2。

看看这个sn-p的代码,来自图2:

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

上面写着:

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

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


(来源:bell-labs.com

【问题讨论】:

  • 它不会自己重新编译,sn-p 中没有任何东西显示这个..
  • 该文档的下一部分通过添加\v 字符的步骤描述了它的工作原理。你读过那部分吗?本质上,第一次添加字符时,需要使用数值;之后,您的编译器将能够自我延续。
  • 你的问题有错别字,第二个if (c != '\\')应该是if (c == '\\')

标签: c compiler-construction


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      如果是,则它是转义字符的开头。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-10
        • 2011-09-12
        • 1970-01-01
        • 2012-03-10
        相关资源
        最近更新 更多