Modern Core Wars

 
Core Wars聽起來像是10年輕美國的科幻小說,實際上它是現實中的一個遊戲。Core Wars是計算機程序之間的戰爭遊戲,放下你手中的玩具吧,現在彙編語言是你的武器,編程經驗就是你的祕籍。
Core Wars所使用的彙編語言與衆不同,只有11個不同的 指令(move,jump,data,conditional jump)和4中尋址方式。指令中的所有地址都是相對於當前執行指令的相對地址,程序運行在有限的內存空間裏,不過首位相接,形成一個環,所以程序可以假定內存是無限的。敵人程序的起始地址未知,而目標就是讓敵人程序執行某條非法指令,從而殺死敵人。
最簡單的Core Wars程序之一是下面的程序:
;                                       Imp, by A. K. Dewdney
imp     MOV 0, 1          ; This program copies itself ahead one
            END                 ; instruction and moves through memory.
該程序在內存裏不斷的向前移動自己:地址0的內容就是MOV命令本身,而MOV把它自己的內容寫到了下一個指令的位置,正好這個位置是下次要執行的指令。前面說過,地址是相對於當前執行指令的。
Imp實際上很難殺死敵人,即使它改寫了敵人要執行的指令,敵人也只是變成一個Imp。唯一Imp能殺敵得分的情況是,它改寫了敵人的數據,從而導致敵人自己把自己殺死。
第二種Core War程序叫做“轟炸機(bomber)”,通過向內存各處寫非法指令來殺死敵人(丟“炸彈”)。如果敵人的程序被改寫了,那麼敵人執行它的時候就會死掉。“炸彈”必須小心安放,以免誤傷自己。
對於轟炸機,最好的防禦方式就是不斷的進攻。有一種轟炸機能很好的對付Imp程序,叫做“Imp Stomper”。它利用Imp在內存裏只能向前移動的特性,不斷的轟炸某個特定的位置,最終殺死Imp。
現在的Core Wars增加了更多的指令,最重要的就是允許程序產生多任務的指令了——即生成多線程的執行程序。要殺死敵人,你必須殺死它的所有線程。
現在我介紹當代Core Wars戰士使用的5種主要的策略。第一種是轟炸,前面已經介紹過了。有效的轟炸機必須快速的覆蓋內存的大部分區域,也就是說炸彈之間會有間隙存在。對付不同的敵人要使用不同的間隙大小,所以轟炸機的設計者必須進行折中考慮,然後祝自己好運。
第二種策略是掃描(scanning)。Core Wars裏內存開始的時候全部初始化爲0。掃描者通過查看哪裏的內存值被改變了,來找尋敵人的蹤跡,然後轟炸附近的區域。如果你用值爲0的炸彈進行轟炸,那麼敵人掃描不到內存的更改,對它就沒什麼影響。但是如果你使用非0值的炸彈的話,會使敵人掃描者浪費時間在這些“彈坑”上,而實際上你並不在那裏。所以,值爲非0的炸彈叫做“上了顏色(color)”的炸彈
第三種策略叫做“Imp-spiral”,即上面Imp程序的多指令多線程版本。在Core Wars裏,多線程程序的一個重要特性是,每個線程的執行機會都降爲原來的1/N,N是線程的數量。這意味着多線程並不能加快你的程序的運行速度,反而減慢了每個線程的運行速度。所以,如果對手是Imp Stomper,那麼它比你的每個Imp都運行得快好幾倍。其實多任務的Imp-spiral各個線程之間會相互合作,而且互相“鋪路”。被Imp-spiral擊中的程序通常凶多吉少,除非它比Imp-spiral有更多的線程。
第四種策略叫做“複製者(replicator)”。複製者是指能把自己複製到內存其他位置的程序,他們是“長腿的炸彈”。
第五種策略,也是我見到過最有趣的,叫做“吸血鬼(vampire)”。它使用JMP指令轟炸內存,如果敵人程序被擊中,會被“俘虜”,然後被迫執行無用的代碼。有一種極其“無恥”的吸血鬼,當俘獲敵人某個線程後,不僅讓其癱瘓,還讓它分裂出許多無用線程,降低整個敵人程序的運行效率,使其虛弱無力直到死掉。不過,吸血鬼需要在內存各處留下自己“陷阱”的地址,所以“抗吸血鬼(anti-vampire)”程序可以找尋這些地址,然後轟炸陷阱或改寫成有用的代碼。
真正強大的現代Core Wars會混合使用多種策略。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章