自產生程式 - 维基百科,自由的百科全书

自產生程式(英語:Quine),指的是輸出結果為程式自身源碼的程式。其英文名称以美國哲學家奎恩Willard Van Orman Quine)命名,

能夠直接讀取自己源碼、讀入使用者輸入或空白的程式一般都不視為自產生程式。

起源

[编辑]

这种编程思想在计算机刚刚兴起的时候就已出现。Paul Bratley发表的文章《Computer Recreations: Self-Reproducing Automata》也对此进行了讨论。[1]而已知最早的這類程式在1960年代於愛丁堡大學出現,由Hamish Dewar以Atlas Autocode英语Atlas Autocode編寫:

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

原理

[编辑]

我們先定義一個函數,對於一個字串經過程式語言的解釋會變成

對於一個程式而言,以下會使用來表示程式P的描述(即程式碼)。

建立一個程式SELF,SELF由A、B所組成。換言之。且會先執行A再執行B。

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

而自生實際執行的過程為:

一、首先A先執行,會得到
二、B開始執行,然後被輸入(即)。
三、B利用 ,可以計算出,並以此計算出。將組合成一個新的程式的描述
四、輸出

示例

[编辑]

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

Perl

[编辑]

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

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

Python

[编辑]

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

# repr() function  >>> w='Hello World\nHwllo World'  >>> print (w)  Hello World  Hwllo World  >>> repr(w)  "'Hello World\\nHwllo World'"  # Quine (line 11, 13, 14)  A:   >>> x='y="x="+repr(x)+"\\n"\nprint (y+x)' B:   >>> y="x="+repr(x)+"\n"   >>> print (y+x)   x='y="x="+repr(x)+"\\n"\nprint (y+x)'   y="x="+repr(x)+"\n"   print (y+x) 

參見

[编辑]

參考文獻

[编辑]
  1. ^ Bratley, Paul; Millo, Jean. Computer Recreations: Self-Reproducing Automata. Software Practice and Experience. 1972, 2: 397–400. doi:10.1002/spe.4380020411. 

外部連結

[编辑]