核心战争

2022-02-14 23:39:11

Jump to navigation Jump to search Core War是由D.G.Jones和a.K.Dewdney于1984年开发的一款编程游戏,其中包含两个或多个作战程序(称为";勇士";)争夺虚拟计算机的控制权。这些作战程序是用一种叫做Redcode的抽象汇编语言编写的。

在游戏开始时,每个作战程序都被随机加载到内存中,然后每个程序依次执行一条指令。游戏的目标是使对立程序的进程终止(如果它们执行无效的指令,就会发生这种情况),让获胜的程序完全掌握机器。

最早发布的红码版本只定义了八条指令。ICWS-86标准将数字增加到10,而ICWS-88标准将数字增加到11。目前使用的1994年标准草案有16条说明。然而,Redcode支持多种不同的寻址模式和指令修饰符(从1994年的标准草案开始),这些修饰符将实际可能的操作数增加到7168。Redcode标准未定义底层指令表示,并且不提供程序访问它的方法。算术运算可以在每条指令中包含的两个地址字段上进行,但指令代码本身支持的唯一操作是复制和比较是否相等。

每个红码指令只占用一个内存插槽,执行周期正好为一个周期。然而,一个进程执行指令的速度取决于队列中其他进程的数量,因为处理时间是平均分配的。

内存以一条指令为单位寻址。内存空间(或内核)大小有限,但只使用相对寻址,也就是说,地址0总是指当前执行的指令,地址1指它后面的指令,依此类推。最大地址值设置为比内存位置数少一个,并在必要时环绕。因此,地址和内存位置之间存在一对一的对应关系,但红码程序不可能确定任何绝对地址。没有遇到无效或跳转指令的进程将继续无休止地执行连续的指令,最终返回到它开始的指令。

红码模拟器不是一个单一的指令指针,而是为每个程序提供一个进程队列,其中包含模拟器循环使用的数量可变的指令指针。每个程序只从一个进程开始,但可以使用SPL指令将新进程添加到队列中。一个进程在执行DAT指令或执行零除时死亡。当一个程序没有剩余的进程时,它被认为是死的。

Redcode和MARS架构不提供输入或输出功能。模拟器是一个封闭系统,唯一的输入是内存和进程队列的初始值,唯一的输出是战斗的结果,即哪些程序有幸存的进程。当然,在模拟运行时,模拟器仍然允许外部检查和修改内存。

红码有很多版本。A.K.杜德尼[1]所描述的最早版本在许多方面与国际核心战争协会(International Core War Society)后来制定的标准不同,可以被视为一种不同的语言,尽管相关。如今最常用的红码形式基于1994年提交给ICWS的一份标准草案,该草案从未被正式接受,因为当时ICWS实际上已经失效。然而,红码的开发仍在以非正式的方式进行,主要是通过rec.games等在线论坛。corewar[2]新闻组。

战士通常被分为许多大的类别,尽管实际的战士通常会结合其中两种或两种以上的行为。三种常见的策略(复制器、扫描仪和轰炸机)也被称为纸、剪刀和石头,因为它们在著名的游乐场游戏中彼此的表现接近同名者。[3]

复制器对自身进行重复复制并并行执行,最终用其代码的副本填充整个内核。复制者很难被杀死,但通常很难杀死对手。因此,复制因子往往会取得很多联系,尤其是与其他复制因子相比。

丝绸是一种特殊类型的快速复制体,以Juha Pohjalainen的《丝绸战士》命名。大多数现代复制子都是这种类型的。Silk Replicator使用并行执行,用一条指令复制整个代码,并在复制完成之前开始执行。[5]

扫描器是用来打败复制者的。扫描器不会盲目攻击,但会在发起目标攻击之前尝试定位敌人。这使得它能更有效地对付复制者等难以杀死的对手,但也使它容易受到诱饵的攻击。扫描仪通常用SPL 0指令轰炸内存。这会导致敌人创建大量进程,这些进程什么也不做,只会创建更多进程,从而降低有用进程的速度。当敌人变得如此缓慢以至于无法做任何有用的事情时,DAT指令会轰炸内存。扫描器通常也比其他类型的战士更复杂,因此更大、更脆弱。[6]

一次性扫描器是一种非常简单的扫描器,它只扫描核心,直到找到第一个目标,然后永久切换到攻击策略,通常是核心清除。罗伊·范·里恩(Roy van Rijn)的《米尔米登》(Myrmidon[7])就是一个单枪匹马的例子。

轰炸机盲目复制";炸弹";每隔一段时间在核心,希望击中敌人。炸弹通常是DAT指令,但也可以使用其他指令,甚至多指令炸弹。轰炸机可以体积小、速度快,而且比扫描对手更有优势,因为炸弹也可以方便地分散注意力。轰炸机通常与imp螺旋机结合,以获得对抗复制机的额外弹性。

吸血鬼试图让它的对手#39;s进程跳转到一段自己的代码中,称为";坑";。吸血鬼可以基于轰炸机或扫描仪。吸血鬼的一个主要弱点是,他们很容易受到间接攻击,因为他们必须将指向代码的指针分散到整个核心。他们的攻击速度也很慢,因为过程需要额外一轮才能到达矿坑。保尔森的《我的鞋面》就是吸血鬼的一个例子。

Imp是以A.K.杜德尼(A.K.Dewdney)出版的第一本《勇士》(warrior,Imp[9])命名的。A.K.杜德尼(A.K.Dewdney)是一个微不足道的单指令移动勇士,不断地在其指令指针之前复制其唯一的指令。小鬼很难被杀死,但在进攻上几乎毫无用处。它们的用途在于,它们很容易大量繁殖,即使其他战士被杀,它们也可能存活下来。

imp环(或imp螺旋)由围绕堆芯等间距分布的imp组成,并交替执行。环/螺旋的每个臂上的IMP将其指令复制到下一个臂上,然后立即再次执行。环和螺旋比简单的小鬼更难杀死,它们甚至有(很小)机会杀死没有受到保护的战士。imp环或螺旋中的臂数必须与核心的大小相对最佳。

快速扫描器试图通过快速展开的扫描环尽早抓住对手。快速扫描是一种早期的游戏策略,总是需要一些其他策略作为备份。向战士添加快速扫描组件可以提高其在对抗其他快速扫描者等长战士时的得分。然而,展开扫描只能针对有限数量的位置,不太可能抓住一个小对手。

核心清除按顺序覆盖核心中的每条指令,有时甚至包括其自身。核心清除作为独立战士并不常见,但通常被轰炸机和扫描器用作最终策略。

有了对核心战争策略的理解,程序员可以创造一个战士来实现特定的目标。革命思想时不时出现;然而,大多数时候,程序员的程序都是基于已经发布的勇士。使用OptiMax或core step optimizer工具等优化器,可以创建更有效的勇士。

战士也可以通过遗传算法或遗传编程生成。集成这种进化技术的程序称为进化程序。核心战争社区引入了几个进化者,他们倾向于为较小的核心环境生成战士。最新成功的进化者是μGP[10],它产生了一些最成功的纳米和微型战士。然而,进化策略仍然需要在更大的核心环境中证明其有效性。[11]

核心战争的灵感来自一个名为“爬行者”的自我复制程序和一个名为“收割者”的后续程序,该程序销毁了爬行者的副本。[12] 爬行动物是由BBN的鲍勃·托马斯创作的。[13] 杜德尼不知道匍匐植物和收割者的起源,并将其称为源自达尔文以及肖赫和胡普的蠕虫实验的谣言。然而,1984年《科学美国人》关于核心战争的文章[12]引用了1961年贝尔实验室的维克多·A·维索茨基、罗伯特·莫里斯和道格拉斯·麦克罗伊玩的达尔文游戏。单词";核心和#34;这个名字来自磁芯存储器,一种过时的随机存取存储器技术。

1984年3月,D·G·琼斯和A·K·杜德尼在《核心战争指南》中发表了对红码语言的首次描述。[1] 1984年5月,杜德尼在《科学美国人》杂志上发表文章,向公众介绍了这款游戏。杜德尼在";电脑娱乐";1985年3月[14]和1987年1月的专栏文章。[15]

国际核心战争协会(ICWS)成立于1985年,比杜德尼39岁晚了一年;这是一篇原创文章。ICWS在1986年和1988年发布了红码语言的新标准,并在1994年提出了一个从未正式设定为新标准的更新。[16] 尽管如此,1994年的草案还是被普遍采纳和扩展,并形成了今天红字事实标准的基础。ICWS由马克·克拉克森(1985-1987)、威廉·R·巴克利(1987-1992)和乔恩·纽曼(1992-1992)执导;目前ICWS已经失效。[17]

0000:添加。AB#4,$30001:MOV。F$2,@2 0002:JMP。B$-2,$0 0003:DAT。F#0,#0

组装ICWS-94型红色代码

Redcode是核心战争中使用的编程语言。它由一个名为内存阵列红码模拟器(Memory Array Redcode Simulator,简称MARS)的虚拟机执行。红码的设计松散地基于20世纪80年代早期的实际CISC汇编语言,但包含一些在实际计算机系统中通常找不到的特性。

Redcode和MARS环境都旨在提供一个简单而抽象的平台,而不需要实际计算机和处理器的复杂性。虽然Redcode与普通的CISC汇编语言类似,但相对于",它相当简单;雷亚尔";汇编,并且没有绝对内存寻址

最初的8条指令描述如下,后来的版本添加了NOP、乘法和更复杂的比较。[18]

操作码助记符参数操作-------------------------0 DAT B初始化位置到值B。1 MOV A B将A移动到位置B。2添加A B将操作数A添加到位置B的内容中,并将结果存储在位置B。3 SUB A B将操作数A从位置B的内容中减去,并将结果存储在位置B。4JMP B跳转到位置B。5 JMZ A B如果操作数A为0,跳转到位置B;否则继续下一个指令。6 DJZ A B将位置A的内容减少1。如果位置A现在保持0,跳到位置B;否则继续下一个指令。7 CMP A B比较操作数A和操作数B。如果它们不相等,跳过下一条指令;否则执行下一条指令。

ICWS';94标准草案增加了更多寻址模式,主要用于处理A字段间接寻址,总共提供了8种寻址模式:

#-立即$-直接(可省略$)-A-field indirect@-B-field indirect{-A-field indirect with predecrement<;-B-field indirect with predecrement}-A-field indirect with postincrement>;-B-带后增量的间接字段

几位作者多年来一直在开发这款游戏的实现。这款游戏有多个版本,可移植到多个平台。例如,pMARS是一种开源软件,源代码位于SourceForge[20]或基于SDL的SDL pMARS For Windows。[21]最近,一个完全基于网络的模拟器被创建出来https://www.corewar.io/无需下载任何特定于平台的工具。

在SooC锻炉2000到2021年间共下载了35000次PMAS。[22]

^a·b·琼斯,D·G。;杜德尼,A.K.(1984年3月)"核心战争指南"。

^旺沙,明塔乔"艺术入门';88:纸-石-剪刀三部曲"。

^沃克,巴克利;等等,亚历山大;施密特,克里斯蒂安"一种进化的方法产生了人类竞争的Corewar项目#34;(PDF)。

^肖赫,J。;Hupp,J.(1982年3月)"第';蠕虫';程序-早期分布式计算经验";。ACM的通讯。25 (3): 172–180. 内政部:10.1145/358453.358455。S2CID 1639205。

^杜德尼,A.K.(1985年3月)"病毒、蠕虫和其他对计算机内存的威胁的核心战争动物;。科学美国人。

^杜德尼,A.K.(1987年1月)"一个名为MICE的项目在第一届核心战争锦标赛上以微弱优势取胜";。科学美国人。

^达米恩·多利格斯;马克达勒姆(1995年11月8日)"1994年拟议核心战争标准的注释草案"。