自產生程式
起源
这种编程思想在计算机刚刚兴起的时候就已经出现了。Paul Bratley发表的文章"Computer Recreations: Self-Reproducing Automata"也对此进行了讨论。[1]而已知最早的這類程式在1960年代於愛丁堡大學出現,由Hamish Dewar以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。
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 World
A:
>>> x='y="x="+`x`+"\\n"\nprint y+x'
B:
>>> y="x="+`x`+"\n"
>>> print y+x
參見
參考文獻
- Bratley, Paul; Millo, Jean. . Software Practice and Experience. 1972, 2: 397–400. doi:10.1002/spe.4380020411.
外部連結
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.