自產生程式
维基百科,自由的百科全书
自產生程式(Quine),它以哲學家奎恩命名,指的是輸出結果為程式自身源碼的程式
能夠直接讀取自己源碼、讀入使用者輸入或空白的程式一般都不視為自產生程式。
目录 |
[编辑] 起源
這個玩意最早見於Bratley, Paul and Jean Millo: "Computer Recreations; Self-Reproducing Automata", Software -- Practice & Experience, Vol. 2 (1972). pp. 397-400.。而已知最早的這類程式在1960年代於愛丁堡大學出現,由Hamish Dewar以Atlas Autocode編寫‥
來表示程式P的描述或說程式碼。
建立一個程式SELF,SELF由A、B所組成。換言之
。且會先執行A再執行B。
。
二、B開始執行,然後找到它的輸入
︵即M = B︶。
三、B利用
,可以計算出
,並以此計算出
。將
與
組合成一個新的程式的描述
。
四、 輸出
。
%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
[编辑] 原理
我們先定義一個函數q 。 簡單來說,對於一個字串w,q(w)經過程式語言的解釋會變成w。 並且,對於一個程式P而言,以下會使用
來表示程式P的描述或說程式碼。
建立一個程式SELF,SELF由A、B所組成。換言之
。且會先執行A再執行B。
A=“儲存”
B=“對於輸入<M> ,而M為一段程式碼。
一、計算出q(<M>)
二、把計算結果和<M> 結合起來
三、印出所出求出描述。”
而自生實際執行的過程為‥
一、 首先A先執行,會得到
。
二、B開始執行,然後找到它的輸入
︵即M = B︶。
三、B利用
,可以計算出
,並以此計算出
。將
與
組合成一個新的程式的描述
。
四、 輸出
。
[编辑] 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

