fbpx
维基百科

自產生程式

自產生程式(英語: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()。如:

 >>> 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 

參見

參考文獻

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

外部連結

自產生程式, 英語, quine, 它以美國哲學家奎恩, willard, orman, quine, 命名, 指的是輸出結果為程式自身源碼的程式, 能夠直接讀取自己源碼, 讀入使用者輸入或空白的程式一般都不視為, 目录, 起源, 原理, 例子, perl, python, 參見, 參考文獻, 外部連結起源, 编辑这种编程思想在计算机刚刚兴起的时候就已经出现了, paul, bratley发表的文章, computer, recreations, self, reproducing, automata, 也对此进行. 自產生程式 英語 Quine 它以美國哲學家奎恩 Willard Van Orman Quine 命名 指的是輸出結果為程式自身源碼的程式 能夠直接讀取自己源碼 讀入使用者輸入或空白的程式一般都不視為自產生程式 目录 1 起源 2 原理 3 例子 3 1 Perl 3 2 Python 4 參見 5 參考文獻 6 外部連結起源 编辑这种编程思想在计算机刚刚兴起的时候就已经出现了 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原理 编辑我們先定義一個函數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 對於輸入 lt M gt 而M為一段程式碼 一 計算出q lt M gt 二 把計算結果和 lt M gt 結合起來 三 印出所出求出描述 而自生實際執行的過程為 一 首先A先執行 會得到 B displaystyle langle B rangle 二 B開始執行 然後被輸入 B displaystyle langle B rangle 即M B displaystyle M B 三 B利用 B displaystyle langle B rangle 可以計算出q B displaystyle q langle B rangle 並以此計算出 A displaystyle langle A rangle 將 A displaystyle langle A rangle 與 B displaystyle langle B rangle 組合成一個新的程式的描述 S E L F displaystyle langle SELF rangle 四 輸出 S E L F displaystyle langle SELF rangle 例子 编辑在Quine的定义里 程序不能有任何形式的输入 否则将被视为 作弊 例如 一个程序读取该程序自身的源代码然后打印出来 利用这种方法的程序属于作弊的Quine Perl 编辑 一个用Perl编写的无作弊的Quine q print q eval eval Python 编辑 Python本身提供repr 或運算 其作用大致等同於上述之q 如 gt gt gt w Hello World n Hwllo World gt gt gt print w Hello World Hwllo World gt gt gt w Hello World nHwllo World gt gt gt print w Hello World Hwllo World A gt gt gt x y x x n n print y x B gt gt gt y x x n gt gt gt print y x參見 编辑塔珀自指公式參考文獻 编辑 Bratley Paul Millo Jean Computer Recreations Self Reproducing Automata Software Practice and Experience 1972 2 397 400 doi 10 1002 spe 4380020411 外部連結 编辑The Quine Page 页面存档备份 存于互联网档案馆 wikisource Quines 永久失效連結 JavaWorld TW 自產生程式 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title 自產生程式 amp oldid 68692119, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。