语言功能有助于编写quines(自我打印程序)?

时间:2010-06-19 22:53:17

标签: programming-languages language-design quine

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

thisMessage print

无论如何,我只是忍不住在这个问题上与你分享。上面肯定会使编写quines变得容易,但是不这样做肯定不会妨碍轻松创建quine。

答案 1 :(得分:3)

我不完全确定,如果你们中的任何一个人都知道的话,请纠正我。 我同意其他两个答案,进一步解释说,这是一个问题:

Y g

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

Y g = g(Y g)

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

总而言之,我们需要构建这样的quines函数,打印函数,定点组合器和逐个名称的评估策略。

满足这一条件的最小语言是来自Iota and Jot家庭的AFAIK Zot。

答案 2 :(得分:2)

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