【问题标题】:Language features helpful for writing quines (self-printing programs)?有助于编写 quines(自打印程序)的语言功能?
【发布时间】:2010-06-19 22:53:16
【问题描述】:

好的,对于那些从未遇到过这个词的人来说,quine 是一个“自我复制”的计算机程序。更具体地说,它在执行时会生成自己的源代码副本作为其唯一输出。

当然,quines 可以用多种编程语言(但不是全部)开发;但是有些语言显然比其他语言更适合产生 quines(要清楚地理解听起来有些主观的“更适合”,请查看 Haskell example vs. C example in the Wiki page - 我在下面提供了我更客观的定义)。

我的问题是,从编程语言的角度来看,哪些语言特性(理论设计或语法糖)使该语言更适合/有助于编写 quines

我对“更合适”的定义是“quines 更容易编写”和“更短/更易读/更少混淆”。但欢迎您添加更多至少有些客观的标准。

请注意,此问题明确排除了退化情况,例如旨在包含“print_a_quine”原语的语言。

【问题讨论】:

  • 通过查看各种示例,函数式语言似乎具有明显的优势(参见 Haskell、Lisp 或 Scheme 示例)。我不太确定为什么会这样,因此我想听听社区的专业知识

标签: programming-languages language-design quine


【解决方案1】:

我不完全确定,如果你们中的任何人更了解,请纠正我。 我同意其他两个答案,并进一步解释说,quine 是这样的:

Yg

其中 Y 是 Y fixed-point combinator(或任何其他定点组合器),这意味着在 lambda calculus 中:

Y g = g(Y g)

现在,很明显,我们需要代码是数据,而 g 是一个将打印其参数的函数。

所以总结一下,我们需要构造这样一个 quines 函数、打印函数、定点组合器和 call-by-name 评估策略。

满足此条件的最小语言是来自 Iota and Jot 家族的 AFAIK Zot。

【讨论】:

  • quine 是一个可以自己输出的程序。但是 Y 是在 lambda-calculus 中定义的,它不允许检查函数,更不用说输出它们了。您应该查看第二个 Kleene 递归定理(也可以转换为 lambda 演算)。
【解决方案2】:

Io Programming Language 等语言允许将代码视为数据。在树遍历系统中,这通常允许语言实现者将抽象语法树公开为一等公民。在 Io 的情况下,这就是它的作用。作为面向对象的,AST 是围绕 Message 对象建模的,并创建了一个特殊的哨兵来表示当前正在执行的消息;这个哨兵被称为thisMessagethisMessage 与其他任何消息一样是完整的消息,并响应print 消息,将其打印到屏幕上。因此,我能用任何语言制作的最短的 quine 来自 Io,看起来像这样:

thisMessage print

无论如何,我只是忍不住就这个主题与您分享。上述内容确实使编写 quines 变得容易,但不这样做当然不排除轻松创建 quine。

【讨论】:

    【解决方案3】:

    我不确定从实际角度来看这是否是有用的答案,但可计算性理论中有一些有用的理论。特别是固定点和Kleene's recursion theorem 可用于编写quines。显然,该理论可用于在 LISP 中编写 quine(如维基百科页面所示)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多