Modern Core Wars

来源:互联网 发布:php推广积分系统源码 编辑:程序博客网 时间:2024/05/19 23:17
 
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会混合使用多种策略。