新起点
自产生程序
2020-08-03 05:34:41

自产生程序(英语:Quine),它以哲学家奎恩命名,指的是输出结果为程序自身源码的程序。

能够直接读取自己源码、读入用户输入或空白的程序一般都不视为自产生程序。

这种编程思想在计算机刚刚兴起的时候就已经出现了。Paul Bratley发表的文章"Computer Recreations: Self-Reproducing Automata"也对此进行了讨论。而已知最早的这类程序在1960年代于爱丁堡大学出现,由Hamish Dewar以Atlas Autocode(英语:Atlas Autocode)编写:

%BEGIN!THIS IS A SELF-REPRODUCING PROGRAM%ROUTINESPEC RRPRINT SYMBOL(39)RPRINT SYMBOL(39)NEWLINE%CAPTION %END~%CAPTION %ENDOFPROGRAM~%ROUTINE R%PRINTTEXT '%BEGIN!THIS IS A SELF-REPRODUCING PROGRAM%ROUTINESPEC RRPRINT SYMBOL(39)RPRINT SYMBOL(39)NEWLINE%CAPTION %END~%CAPTION %ENDOFPROGRAM~%ROUTINE R%PRINTTEXT '%END%ENDOFPROGRAM

原理

我们先定义一个函数 q {\displaystyle q} ,对于一个字符串 w a {\displaystyle w_{a}} q ( w a ) {\displaystyle q(w_{a})} 经过编程语言的解释会变成 w b {\displaystyle w_{b}}

对于一个程序 P {\displaystyle P} 而言,以下会使用 P {\displaystyle \langle P\rangle } 来表示程序P的描述(即代码)。

创建一个程序SELF,SELF由A、B所组成。换言之 S E L F = A B {\displaystyle \langle SELF\rangle =\langle A\rangle \langle B\rangle } 。且会先运行A再运行B。

A=“儲存                            B                      {\displaystyle \langle B\rangle }  
B=“對於輸入<M> ,而M為一段程式碼。一、計算出q(<M>)二、把計算結果和<M>結合起來三、印出所出求出描述。”

而自生实际运行的过程为:

在Quine的定义里,程序不能有任何形式的输入,否则将被视为“作弊”。例如,一个程序读取该程序自身的源代码然后打印出来,利用这种方法的程序属于作弊的Quine。

一个用Perl编写的无作弊的Quine:

$_=q{print"\$_=q{$_};eval"};eval

Python

Python本身提供repr()或运算``,其作用大致等同于上述之q()。如:

 >>> w='Hello World\nHwllo World' >>> print w Hello World Hwllo World >>> `w` "'Hello World\\nHwllo World'" >>> print w Hello World Hwllo WorldA:  >>> x='y="x="+`x`+"\\n"\nprint y+x'B:  >>> y="x="+`x`+"\n"  >>> print y+x

中文

请抄写“请抄写“”这句话并在引号里重复抄写这句话”这句话并在引号里重复抄写这句话

相关:

网站公告: