From Gossip@caterpillar

Algorithm Gossip: 自產生程式(quine)

說明

自產生程式(quine)就是要寫一個程式,這個程式的目的就是描述它自己,簡單的說,如果您寫了一個.java,編譯它後產生一個.class檔,然後 您將.java檔案刪除,您的.class檔不需要.java檔,它也可以印出.java檔的內容。

解法

根據計算理論(Computation Theorem)遞迴原理,任何的程式語言都可以簡單的寫出自產生程式。簡單指的是寫出自產生程式並不需要特別的算法,只要利用Turing Machine的擴充多帶Turing Machine的操作原理就可以寫出。

撇開計算理論這看似高深的學科不談們用一般的解釋來說明如何寫自產生程式,程式分做A、B兩個部分,A部分描述B部分的功能,B部分則 負責將A的描述印出來,A似乎必須倚賴建構好的B,但B要有A才能列印,這看似矛盾,但其實不然,做法是將B編碼,放置在不同的字元帶上,幾個字元帶並不 是重點,看程式語言的語法而定,您可能需要多幾個帶,或少幾個帶,編碼好之後,A部分完成,開始進入B部分,B部分不斷在多個字元帶上來回,並挑選出字元 並顯示出來。

實作

直接看實例會容易懂些,以下是以Java程式實作的自產生程式,還考慮了程式縮排與可讀性。

PrintSelf.java

The Quine Page 有各種語言的自產生程式之實現。