Un juego creado en 1984 en el que dos programas warriors, luchan por el control de un ordenador virtual.
Los programas se encuentran escritos en un lenguaje similar a ensamblador, redcode y para ganar deben conseguir que el oponente ejecute una instrucción no válida.
Las máquinas virtuales donde corren los warriors se llaman MARS.
Existen multiples implementaciones, como pMars
(https://sourceforge.net/projects/corewar/)
Para compilarlo solo tendríamos que descomprimirlo y hacer:
# Nos movemos al directorio de código $ cd src # Lo compilamos $ make # Para probarlo lo lanzamos con un par de ejemplos $ ./pmars ../warriors/aeka.red ../warriors/aeka.red
Ahora que podemos hacer pruebas vamos a ver dos programas simples para ir tomando contacto con el lenguaje.
;name Imp ;author Walter Hofmann mov 0,1
El primer programa, copia su unica instrucción a la siguiente posición de memoria, que repite el proceso.
mov 0, 1 ; Mueve el byte 0 (el actual) al 1 (el siguiente)
Duro de matar, pero incapaz de eliminar al contrincante.
;name Dwarf ;author A. K. Dewdney dwarf add #4, bomb mov bomb, @bomb jmp dwarf bomb dat #0
Bombardea la memoria con bloques de datos
En cada ciclo
dwarf add #4, bomb ; Incrementa en 4 el valor de “bomb”
Dwarf y bomb son etiquetas, permiten no tener que escribir las direcciones relativas de las instrucciones manualmente.
mov bomb, @bomb ; Copia el bloque de datos “bomb” a la dirección a la que apunta
jmp dwarf ; Vuelve al principio del bucle
dat #0 ; Un bloque de memoria, que estará inicializado a 0
Hay 3 posibles resultados si se enfrenta un imp y un dwarf.
El dwarf cae en una instrucción del imp y lo persigue, quedandose toda la memoria.
El dwarf cae en una instrucción del imp antes de que este la ejecute, imp se queda la memoria.
El dwarf cae pisa el mov que va a ejecutar el imp y lo elimina.
Pero hay bastantes más, la lista completa está en https://esolangs.org/wiki/Redcode#Instructions
Campo | Indirecto | Indirecto con predecremento | Indirecto con postincremento |
---|---|---|---|
A | * | { | } |
B | @ | < | > |