最小國際象棋程式背後的恩怨情仇

黃小非發表於2015-10-09

“人只能活一輩子,而且每天的分鐘數也是有限的。在你的一輩子裡應該去做些事情,尤其是那些有意義的事情,”  Olivier Poudade 如是說。他的聲音沿著電話線從薩瓦省一路傳來,顯得清脆有力。目前他在法國阿爾卑斯山度假,正在探望自己的母親。一邊欣賞著塔朗戴斯山脊的美景,這位44歲的法國人一邊向我講述著他生命中重要的事情,時光如梭,歲月如流沙過隙,一去不返,所以時間都應該用在刀刃上。

他說他花了3個月,大約600小時,編寫了一個計算機遊戲程式:BootChess。這是一個國際象棋遊戲程式,但是其大小僅僅是令人難以置信的487位元組。 這是什麼概念呢?要知道,在Wikipedia上關於國際象棋規則介紹的網頁,其大小都有53162位元組,是遊戲程式大小的109倍之多。Oliver在2015年一月釋出了他BootChess程式,這個程式打破了保持32年之久的通用平臺最小象棋程式記錄。(當然是宣告打破記錄,但是外界對這個程式的很多規則還是有爭議的,比如為了縮小程式的空間,像“王車易位”,“吃過路兵”這些經典下法都被犧牲掉了。)

在Poudade看來,打破記錄就是他說的人生中有意義的事情。BBC全球之聲這些主流媒體都因此登載了他的故事。不過(諷刺的是),媒體們關注這個程式更像是一個噱頭:他們饒有興致地把BootChess程式的大小和一兩條推文(tweet)的大小相提並論,這與媒體當年對IBM的深藍的關注點是完全不同的。(對於深藍),媒體則是關注它擊敗人類象棋世界冠軍的壯舉。主流媒體認為,BootChess只是一個初等棋力的玩具程式而已。不過,Poudade並不在意媒體的關注點。他本人的追求,是更接近於純粹智力訓練的東西,以及對優化程式碼和程式優雅性的實踐。並且,從某種意義上來說,他的追求代表了“人類駕馭機器”的傳奇:“正如你們看到的,現在人人都有一部手機,但是現在卻不是人類在駕馭著技術,而是技術在控制著人類。” Poudade這麼說道。

為什麼會有人痴迷於編寫世界上最小的國際象棋程式這種事情?Poudade給出了答案:這麼做是為了發揮他的程式設計天賦,引領志同道合的人們前進,以及教給那些自命不凡的傻小子們如何做人。這些就是他花上百小時在這些小小的黑白棋格、文字和資料上,孜孜不倦的動力。在計算機國際象棋領域,Poudade追求的是一種類似於柏拉圖式的純粹精神式的境界。

他做到了他認為重要的事情,他創造了記錄。不過,就跟人們常說的一樣,記錄是被用來打破的。

BootChess | Photo via Olivier Poudade

在1982年中葉,一個不起眼的四格廣告刊登在了一份計算機愛好者雜誌上。只需要5英鎊(合現在約26.50美元),你就可以得到一個用畫素塊風格實現的計算機象棋程式,而且保證影象“流暢而無閃爍”(在上世紀80年代,計算機的效能遠不能和今日相比,專業顯示卡這種裝置在個人計算機上更是完全不存在,在這樣的硬體條件下,一個遊戲的影象能保證每秒24幀的幀率,從而使得影象不閃爍,是評價一個遊戲影象是否優秀的重要標準——譯者注),並且還保證,在玩家走棋之後,計算機平均只需要6秒就能走出迴應的一步。這個遊戲的名字叫“絕妙1K ZX 81象棋”。如果你忽略掉1K, ZX, 81這些不知道是什麼玩意兒的東西,就留下了兩個關鍵點:“絕妙”和“象棋”。

這個程式的“絕妙”之處在於,你可以在一個廉價的,插卡式的塑料晶片Sinclair ZX81(儘管該晶片的效能有限,但當年它的銷量還是超過了150萬)上玩象棋遊戲了。那個年代,計算機更多的是和科學研究專案掛鉤的,而不是像今天這般在個人消費領域五花八門,應有盡有。有的裝置甚至是直接賣出元器件,然後由買家自行組裝。Peter Jennings為家用電腦開發了首個計算機遊戲程式:Microchess(微型象棋),這個程式在1976年作為Kim-1計算機的配套程式出售。Peter Jennings回憶那時候的計算機程式設計,那基本上就是對個人願景的考驗:“你想做點兒什麼嗎?這種想法就是你最有利的工具了。那麼就去做吧。”

Poudade 本人追求的,是更接近於純粹智力訓練的東西,以及對優化程式碼和程式優雅性的實踐。

《科學美國人》上的一篇文章啟發了Jennings即刻著手進行開發,這篇文章的主題正是介紹計算機象棋博弈的(不過該文章的觀點認為這些計算機下棋的水平不怎麼高)。實際上,計算機象棋博弈的思想最早來源於克勞德.夏農(譯註:Claude Shannon,資訊學的鼻祖之一)。圖靈(譯註:Alan Turing,名氣太大了,不介紹了)在1951年首次發表了一個真正可以進行完整象棋博弈的程式。到了1970年末和1980年初,為了讓遊戲程式能夠執行在家庭用電腦上,第一代遊戲程式設計師仍然需要做很多變通的方案,並且要求程式足夠乾淨和簡潔,才能最終把程式塞進當時技術允許的各種限制之內,從而實現他們的遊戲願景。

這些遊戲中就包含了象棋博弈程式,這也是為什麼“1K ZX 81 象棋”能如此絕妙的動因。有一個英國程式設計師,叫做David Horne,他來自於英國東薩塞克斯鎮的一個叫做Crowborough的地方。他單槍匹馬地把一個象棋博弈程式塞進了Sinclair ZX81晶片所限制的1kb的儲存空間裡。在那個年代,大多數電腦博弈程式的棋力都很弱智,但是Horne的程式卻與眾不同,以至於在日後被評為是“人類寫出過最好的程式”(參見kuro5thin.org的帖子)以及“史上最牛的遊戲程式”(根據Retrogaming Times Monthly專欄)。Horne給ZX81帶來了象棋遊戲功能,而且只用了672位元組就做到了。Horne,這位過去的程式設計冠軍,他的記錄對於Oliver Poudade來說既是嘲弄又是鞭策,不過我們在這篇文章裡就不詳細介紹Horne了。

Olivier Poudade

Horne後來專門解釋過,他是如何把那麼多功能塞到那麼有限的空間裡的(很符合Horne的風格,他做的解釋也不超過1000個字)。30多年之後的2014年10月,Poudade的女兒(Poudade是個單親父親,獨自撫養女兒)開始下象棋。這件事情讓Poudade開始思考:如果在當今,用一臺PC機,或者其他什麼亂七八糟的東西,然後僅僅用不到1K的資訊,就能實現流暢的象棋博弈的遊戲,這難道不是件很厲害的事情嗎!如果真的能做到這樣,那會有怎樣的影響啊!Horne已經在1982年的時候用一個極小的象棋程式證明了自己,不過在2014年,再追求在這麼小的空間裡做一個象棋程式是有點兒找虐了。畢竟,目前就連一部手機上象棋遊戲的效能都能把當年1K ZX 81象棋遊戲甩出好幾光年那麼遠。許峰雄(譯註:華人電腦科學家/工程師,生於臺灣,卡內基梅隆大學計算機博士。IBM 深藍電腦的主要設計者)設計出的超級電腦在1997年擊敗了人類象棋特級大師卡斯帕羅夫,他在2007年時表示:“人類在下棋方面是贏不了計算機的,一點兒機會都沒有。” Peter Jennings也說過:“iPhone也能擊敗人類象棋大師,這一點毫無疑問。”

“現在的情況是:每人手上都有一部手機,但是人類卻無法駕馭技術,相反,是技術在控制人類。”

Poudade對再造一個深藍那樣的超級電腦棋手沒多大興趣,當然他也不會再去做一個普通的象棋應用程式,畢竟市面上這樣的應用已經非常多了。他還算挺喜歡下象棋(儘管他承認水平不怎麼樣),但他對人機博弈的輸贏卻不是那麼上心。“我跟電腦總下總輸,那真是一點兒意思都沒有”,他說:“除非你真的很用心地下,那有時候還能贏兩局,這還算蠻有趣的。”

他一直在尋找一個真正有意義的專案,一個能值得讓他花時間去研究的專案。“我這個人喜歡挑戰,這也是我從事這個專案的初衷。”他說,“這個專案能幫我卸壓,逃避來自日常的各種負擔。”

就這樣,他“逃避”到他的專案裡,開始研究別人寫好的最精簡的象棋程式碼。一開始,他的研究困難重重。“我看過Horne的程式碼,然後發現(要把它變得更小)幾乎是不可能的,因為根本就沒有其他捷徑可走了。”他說,”因為David Horne已經把事情做得沒什麼餘地了。”30多年過去了,Horne的程式碼還是無可挑剔。

但是Poudade並沒有放棄,每天他的女兒上床睡覺以後,他總會擠出幾個小時來研究這個專案。他這麼堅持也有其他目的:Red Sector Inc 是一個Poudade所屬的程式設計俱樂部, 他想通過這個特別專案對俱樂部即將到來的“成立30週年紀念日”獻禮,同時也想因此而出出風頭。當然,他做這個專案最大的原因,還是出於對Horne所寫程式碼的尊敬。他寫的程式,從某種意義上來說,也是對Horne的程式能夠如此簡潔高效的一種敬意。

“我借鑑了一些他的技巧。”,Poudade承認道,“我確實這麼做了。” 因為他真的沒法做得更好了。比如,在BootChess裡,並沒有對王的的走位單獨設計一套邏輯,而是直接和後的走位採用同樣的邏輯實現,只是把每一步走位的格數限制到了一格而已。Poudade在他寫過的一篇長文中,讚揚了Horne的成就對建立BootChess的啟發作用,而且他還把這些寫到了程式的NFO檔案裡。因此,建立世界上最小的象棋博弈程式,對於Poudade來說不僅僅是一項競爭,而且也是一種鑑賞,鑑賞前人所運用的美妙的技巧。

該是David Horne的功勞,就全部歸功於他。這是Poudade給自己立下的規矩。所以,對於新生代的挑戰者,當他們拿出體積更小的象棋博弈程式時,Poudade認為,他們並沒有給予前人的工作充分的認可——所以,你們就會明白,為什麼Olivier Poudade不那麼看得上Oscar Toledo Guteierrez的原因了。

在5歲的時候,Oscar Toledo Gutierrez和其他孩子一樣,把自己的父親視為模仿的物件。他的父親是一個計算機程式設計師,名字也叫Oscar。他經常坐在父親的膝頭,看著父親在家用PC上對著鍵盤敲敲打打。“我也想把我的手放在鍵盤上。”他回憶道,他還記得當時的那種衝動,“但是我爸爸不允許我動他的計算機,因為他在寫重要的程式。”

“我喜歡挑戰。這個專案能幫我洩壓,幫助我逃離日常的各種壓力。”

現如今,36歲的Gutierrez真的追隨他父親的腳步,成為了一名程式設計師。他居住在墨西哥的墨西哥州,為他們家自己開的公司——Familia Toledo工作。他的主要工作是編寫作業系統和相關應用,而不是編寫遊戲程式。“編寫遊戲是我的愛好,你可以這麼認為。”, 他說。

Óscar Toledo Gutiérrez | Photo via Chess Programming Wiki

跟Poudade的程式一樣,Gutiereez寫的遊戲程式都很小。他也沒法解釋為什麼,這是一種無法解釋的衝動。“其實寫小程式反而更難。”,他進一步說道,“寫大程式沒什麼難的,小程式卻很不容易。”(就像Pascal曾經寫過的:“我這封信寫得很長,因為我實在沒空把他變得更精簡了。”)他的個人網站列舉出了所有他寫過的小型象棋程式:有用Javascript語言寫的,有用C語言寫的,也有用Pascal寫的。跟Poudade一樣,他的程式碼也都有所取捨。“我可以把所有的走法都做到程式裡去,但是計算機太笨了(沒法充分發揮這些)”,他說。當他聽說BootChess以後,只有一個簡單的反應:“啊,又一個曇花一現的人出現了。” 然後他就去著手研究去了。他把他的象棋程式又寫了一遍,這次是用匯編語言來寫,組合語言是一種非常貼近機器的程式語言,擁有極高的執行效率。他在2015年1月28日晚上9點開始寫程式,第二天下午6點17分,他的程式就寫完啦。然後他又花了半天的時間進行除錯,然後程式就正式完成了:Toledo AtomChess,481位元組,比BootChess小了1.2%。對此,Poudade不是很高興。他並不認為他這就被擊敗了,反而,他覺得他被欺騙了。

“為了寫這個象棋程式,我得每天晚上在我孩子睡覺以後辛勤工作5小時,然後4小時以後又要起床,這樣的日子持續了三個月。所以要不然這個人的智力是愛因斯坦的17倍,要不然他就是在侮辱我這麼長時間的努力。”Poudade說,“你能想象嗎?我這邊花了三個月,另一方面…他只花兩天時間。如果是你你會怎麼想?太離譜了是不?“Poudade認為Guiterrez剽竊了他的程式碼,然後在其基礎上做了些改進,然後就成了他的AtomChess象棋程式。“如果你偷了我的程式碼,然後又不署我的名字,或者說你至少也要說明一下是受我程式碼的啟發吧,如果這都不做,那你不就是個剽竊犯嗎。這是30多年來發生的最糟糕的事情,太糟糕了。”,Poudade非常憤怒。他把他對前任記錄保持者的態度與Guiterrez做了對比:“我根本沒有抄襲David Horne的任何程式碼,但是我還是把我的功勞部分歸功於他;我尊重的是他的思想!”,他說,“這才是正人君子的做法。” Poudade因此公開對Toledo Guiterrez叫板,稱他的程式為“無恥的抄襲”。所以,Poudade在他的BootChess程式裡面加上了如下的註釋:

“致Oscar Toledo以及其他人:你們可以在我們的工作成果(就是這個程式檔案)上進行重構,但是請寫明白這是我們的成果!”

Guiterrez對抄襲的說法當然是強烈反對的。“我可沒有故意去看他的程式碼。”,他為他自己的工作辯解道,他還認為,Poudade純屬是自己找上門來惹事的。“用匯編語言來寫程式這件事情也不是一開始就計劃好的。”,他說。不過,他的朋友們指出,根據BootChess的說明文件(也就是Poudade寫的那個文件),Poudade認為,在他之前沒人能夠真正和David Horne匹敵。他在文件中寫道:“(那些程式)有太多的錯誤和誤導因素”,然後他就馬上舉了兩個Toledo Gutierrez早期編寫的象棋遊戲程式中的例子作為論據。這種寫法的暗示已經非常清楚了,這明顯就是Poudade向Gutierrez拔劍開戰的意思。

跟現實中的象棋不一樣,(這個領域)不一定要分出勝負,很可能永遠都是和棋。

我問Gutierrez,對此他有什麼看法。他想了很長時間,然後措辭謹慎地回答了我

“嗯,我認為這對我來說是不夠尊重的。”,他尷尬地笑了笑,“我看到了這些說法,當然不會覺得高興,所以我得做出更好的東西才能行。”

如果我就這麼說Olivier Poudade和Oscar Toledo Guiterrez互相結樑子了,那也有點誇張。“仇恨”這個詞語對於這件事情還是顯得過重,尤其是對墨西哥人Gutierrez來說,他的冷靜、平和的態度完全談不上“仇恨”。不過,儘管兩個人處於競爭狀態,儘管一方稱另外一方”剽竊程式碼“的說法非常傷人,但是雙方還是保持了最起碼的尊重。“我尊重他所做的工作,因為這個專案耗費了他很多心血。”,Toledo Gutierrez說。“我們還是不要指責這個傢伙了,因為他還是挺厲害的。”,Poudade說,“我尊重他做為程式設計師所做的事情。我也很欣賞他的能力。很多人也都很欣賞他。他建立起屬於自己的天地。他也是最小象棋程式的程式設計高手。”

Poudade說的這些都是事實:Toledo Gutierrez在1986年他8歲的時候就用BASIC語言寫出了他的第一個象棋程式。當時他在小夥伴家裡玩耍,他們想下象棋但是又找不到棋盤。於是他就寫了個程式來下棋。“當時我就已經在我的腦海裡把所有的演算法都設計好了。” 他說。

不過Poudade可不會簡單地表示一下尊重就完事兒。他需要把問題上升到精神層面。“在他的精神層面裡,他想要做一個絕頂聰明的人。”,他說,“就像是一個巫師,一個天才,比如像愛因斯坦那樣。”他一直記得一個14歲的小程式設計師的故事,當年他參加了一個由Poudade主辦的程式設計挑戰賽,結果技驚四座。不過賽後,法國人把這個孩子叫到一邊,卻發現他並沒有真正理解那些演算法的原理。“他學習演算法是按照背詩歌一樣的方式去學的,“ 他說,”我覺得是他的父親給了他太大的壓力,太望子成龍了。這個叫Toledo的傢伙就和那個孩子是一樣的情況。”不過,Poudade又再一次表示,他其實是很尊重Toledo Gutierrez的。

不過,他還是很想重新贏回世界最小象棋程式冠軍的頭銜的。“跟他所做的一樣,我刪除了一些行和頭部程式碼,然後我就又打破記錄了。”,Poudade說。他重新檢查和修改了程式。一開始的BootChess有487位元組。修改後,相比於Toledo Gutierrez的481位元組的程式,現在只有468位元組了。

與現實中的象棋博弈不一樣,這兩個人之間的競爭不一定要分出勝負,至少現在沒有,將來可能也分不出來。程式碼能變得多小?一個象棋程式在為了變小而犧牲了這麼多規則和走法之後,是否還能叫真正的象棋呢?競爭還在繼續,現在輪到Toledo Gutierrez走出下一步了。“程式還能更小,”,他說,“只要我花些時間在上面,就能夠做到。”

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

最小國際象棋程式背後的恩怨情仇

相關文章