好的,对于那些从未遇到过这个词的人来说, quine 是一个“自我复制”的计算机程序。更具体地说,一个 - 在执行时 - 产生一个自己的源代码的副本作为它的唯一输出。
当然,quines可以用许多编程语言开发(但不是全部);但有些语言显然比其他语言更适合制作quines(为了清楚地理解有些主观听起来“更适合”,看看Haskell example vs. C example in the Wiki page - 我在下面提供了更客观的定义。)
我的问题是,从编程语言的角度来看,什么语言特征(理论设计或语法糖)使语言更适合/有助于编写quine ?
我对“更合适”的定义是“quines更容易编写”和“更短/更易读/更少混淆”。但欢迎您添加更多至少有些客观的标准。
请注意,此问题明确排除了退化情况,例如设计为包含“print_a_quine”原语的语言。
答案 0 :(得分:3)
Io Programming Language等语言允许将代码视为数据。在树行走系统中,这通常允许语言实现者将抽象语法树公开为一等公民。在Io的情况下,这就是它的作用。作为面向对象,AST围绕Message对象建模,并创建一个特殊的sentinel来表示当前正在执行的消息;这个哨兵被称为thisMessage
。 thisMessage
是一个完整的消息,与任何其他消息一样,并响应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(如维基百科页面所示)。