Guerra de núcleos: dois programas entram, um sai

Nosso velho amigo A. K. Dewdney apresentou pela primeira vez ao mundo o Guerra de Núcleo em um série de artigos da Scientific American com início em 1984. (As digitalizações de página inteira dos artigos, incluindo as ilustrações, estão também disponíveis.)

O Core War foi inspirado em uma história que ouvi há alguns anos sobre um programador malicioso de um grande laboratório de pesquisa corporativa que chamarei de X. O programador escreveu um programa em linguagem assembly chamado Creeper que se duplicava toda vez que era executado. Ele também podia se espalhar de um computador para outro na rede da corporação X. O programa não tinha outra função além de se perpetuar. Em pouco tempo, havia tantas cópias do Creeper que programas e dados mais úteis estavam sendo excluídos. A infestação crescente só foi controlada quando alguém pensou em combater fogo com fogo. Um segundo programa de autoduplicação chamado Reaper foi escrito. Seu objetivo era destruir cópias do Creeper até que não encontrasse mais nenhuma e, em seguida, destruir a si mesmo. O Reaper fez seu trabalho, e logo as coisas voltaram ao normal no laboratório X.

(A história do Creeper e do Reaper parece se basear em uma combinação de dois programas reais. Um programa era o um jogo de computador chamado Darwin, inventado por M. Douglas McIlroy, da AT&T Bell Laboratories. O outro era chamado Worm e foi escrito por John F. Shoch, do Xerox Palo Alto Research Center. Ambos os programas têm alguns anos, o que dá tempo suficiente para que os rumores floresçam).

O Core War, surpreendentemente, ainda existe. O hub atual parece estar em corewar.co.uk. Lá, o senhor pode baixar simuladores para vários sistemas operacionais. Veja como funciona uma batalha do Core War:

O Core War tem quatro componentes principais: uma matriz de memória de 8.000 endereços, a linguagem de montagem Redcode, um programa executivo chamado MARS (acrônimo de Memory Array Redcode Simulator) e o conjunto de programas de batalha em disputa. Dois programas de batalha são inseridos na matriz de memória em posições escolhidas aleatoriamente; nenhum dos programas sabe onde o outro está. O MARS executa os programas em uma versão simples de compartilhamento de tempo, uma técnica para alocar os recursos de um computador entre vários usuários. Os dois programas se revezam: uma única instrução do primeiro programa é executada, depois uma única instrução do segundo e assim por diante.

O que um programa de batalha faz durante os ciclos de execução atribuídos a ele depende inteiramente do programador. O objetivo, é claro, é destruir o outro programa arruinando suas instruções. Uma estratégia defensiva também é possível: um programa pode se comprometer a reparar qualquer dano que tenha recebido ou a sair do caminho quando for atacado. A batalha termina quando o MARS chega a uma instrução em um dos programas que não pode ser executada. O programa com a instrução defeituosa, que presumivelmente é uma vítima da guerra, é declarado perdedor.

Vamos ver isso em ação usando um dos simuladores. O que o senhor está assistindo aqui é um torneio round-robin entre os Imp [yellow], Ratos [blue], Anão [white]e Piper [green] programas.

Core Wars, animado

O vencedor é Piper [green], com 2 vitórias, 0 derrotas e 1 empate.

Esses programas são escritos em um dialeto semelhante ao assembly, conhecido como Redcode. Aqui está o código-fonte do Midget:

;redcode
;name Midget
;author Chip Wendell
;strategy stone (bomber)
;history Third place at the 1986 ICWS tournament
Bomb	dat	#0,	#-980
Spacer	equ	28
Start	mov	Bomb,	@Bomb
sub	#Spacer,Bomb
jmp	Start,	#0
end	Start

O Conjunto de instruções Redcode é deliberadamente simples. Há duas variantes, o ICWS-88 com 10 instruções e 4 modos de endereçamento e o ICWS-94 com 19 instruções e 8 modos de endereçamento.

DAT

dados

DJN

decremento e salto se não for zero

MOV

mover / copiar

SPL

dividir

ADD

adicionar

CMP

comparar

SUB

subtrair

SEQ

pular se for igual

MUL

multiplicar

SNE

pular se não for igual

DIV

dividir

SLT

pular se for menor que

MOD

módulo

LDP

carregar do espaço privado

JMP

pular

STP

salvar em espaço privado

JMZ

pular se for zero

NOP

nenhuma operação

JMN

pular se não for zero

Ele é estruturado de forma que não exista um “aplicativo matador”; três estratégias amplas são possíveis, cada uma com seus próprios pontos fortes e fracos.

  1. Artigo ou Replicator

    Tente encher o núcleo com cópias de seu programa, para que o senhor seja mais difícil de matar.

  2. Rock ou Bomber

    Ataque escrevendo instruções ilegais em todo o núcleo, mas não na memória de seu próprio programa.

  3. Tesoura ou Scanner

    Tente identificar programas inimigos escondidos no núcleo e, em seguida, direcione as gravações para eliminá-los.

É claro que combinações das estratégias acima também são possíveis. Como o senhor pode imaginar, após 25 anos de evolução no campo de batalha, alguns programas modernos do Core War já são bastante barrocos.

Não é particularmente útil, mas é uma programação jogoafinal de contas. É também uma parte fascinante da história da ciência da computação. Se o senhor estiver interessado em participar do venerável esporte do Core War, ele ainda está bem vivo. O 10 principais links para iniciantes em Core War é um ótimo lugar para começar.