2

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

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

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

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

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

4

3 回答 3

3

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

thisMessage print

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

于 2010-06-19T23:00:38.147 回答
3

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

其中 Y 是Y 定点组合器(或任何其他定点组合器),这意味着在lambda 演算中:

Y g = g(Y g)

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

所以总结一下,我们需要构造这样一个 quines 函数、打印函数、定点组合器和按名称调用评估策略。

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

于 2010-06-20T00:32:18.940 回答
2

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

于 2010-06-19T23:01:35.743 回答