自列印算法

自列印算法是指在程式運行中,不讀取任何額外的信息,僅使用程式代碼中攜帶的功能和信息,將程式代碼本身列印輸出。

自列印算法簡介

自列印算法是指在程式運行中,不讀取任何額外的信息,僅使用程式代碼中攜帶的功能和信息,將程式代碼本身列印輸出。
一個完整的自列印程式至少保含兩部分:信息的描述和執行體。這兩者互相表達。在描述部分,用字元串來存儲執行部分的代碼。而執行體的代碼則列印這個描述字元串。通常為了完整輸出程式代碼,要在執行體內為描述字元串再拼接一些修飾性的內容,這些內容被看作是執行體的一部分。而代碼的列印也要列印為兩部分,才能將描述文本列印為一個新的描述文本和一個新的執行體。
這個過程根據不同的程式語言,可以通過一些技巧進行簡化,例如《高效程式的奧秘》一書中,演示了這樣一個C語言版的自列印程式:
main(a)
{
 printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);
}
這段程式巧妙的利用了printf的格式化解析,將程式代碼編寫的簡潔而清晰。
如果自列印算法只能列印自身代碼,那么它只是一個玩具而已,實際上只要耐心操作字元串,我們可以在自列印中攜帶其它代碼。我們看如下的Python代碼:
s = '''def PrintSelf(Input):
print "s = " + chr(047) + chr(047) + chr(047) + Input + chr(047) + chr(047) + chr(047) + "\\n\\n" + Input + "\\n\\n" + PrintSelf(s)'''
def PrintSelf(Input):
print "s = " + chr(047) + chr(047) + chr(047) + Input + chr(047) + chr(047) + chr(047) + "\n\n" + Input + "\n\n" + "PrintSelf(s)"
PrintSelf(s)
這也是一個自列印程式,它的格式寫的很鬆散,這就方便了我們在裡面添加新代碼:
s = ''' f=open("c:/txt.txt")
def PrintSelf(Input):
print "s = " + chr(047) + chr(047) + chr(047) + Input + chr(047) + chr(047) + chr(047) + "\\n\\n" + Input + "\\n\\n" + print "Hello World" + PrintSelf(s)'''
f=open("c:/txt.txt")
def PrintSelf(Input):
print "s = " + chr(047) + chr(047) + chr(047) + Input + chr(047) + chr(047) + chr(047) + "\n\n" + Input + "\n\n" + "PrintSelf(s)"
PrintSelf(s)
執行這個程式,我們就可以在列印時打開一個檔案對象,如果按著這個思路,我們還可以在文本裡面寫入程式代碼本身;使用exec函式,還可以使程式反覆執行。
當然,各種語言的字元串操作能力和邏輯結構的限制不同,實現自列印的方式也會有區別,其代碼的風味也各有不同。本次比賽的參賽者使用了多種語言,包括C++、Java、C#、Python等等,很遺憾我們沒有看到以字元串操作能力聞名的Perl語言作品,想來應該也是獨具一格的。大多數參賽者都正確的實現了自列印算法,但是其中的代碼長度大相逕庭,這其中除了技巧運用的差異,還有語言本身的限制。
本次比賽的優勝者施凡先生提供了若干種語言版本,其中的Python版本當之無愧的稱為本次比賽的最佳作品:
Print (lambda s:s.replace(chr(042),chr(047))%s)('print (lambda s:s.replace(chr(042), chr(047))%%s)("%s")')
這段代碼緊湊精巧,充分體現了自列印算法的精妙之處。對lambda的運用也恰到好處。Python的作者Guido van Rossum準備取消lambda,如果他有機會讀到施凡先生的代碼,不知是否會改變主意。

優點

自列印算法很有趣味性,它體現了高超的微觀技巧;但是另一方面,自列印也有其形而上的哲學味道。它在數學高度上演示了如何構造一個可以自複製、自表達的系統。事實上,自列印程式中的描述文本,正對應了細胞生物的染色體,自列印算法,可以看作是細胞生命的一個數學抽象。前面我們看到,在自列印程式中實際上可以攜帶其它信息,這說明這個模型可以完成“繁殖”之外的功能。自列印算法顛覆了“神創造生命”的神權至上理論。生化領域的科學家們一路從尿素、胺基酸胰島素走來,艱難而執著的向構造細胞生命邁進,而自列印算法為這條看來遙遙無盡的通天之路添加了數學的路標。

相關條目

數據結構

相關詞條

相關搜尋

熱門詞條

聯絡我們