sábado, 29 de diciembre de 2007

Core Wars


Las "Core Wars" (ó RedCode) son programas escritos en una variante propia de ensamblador, donde luchan por ocupar la mayor parte de la memoria para así, eliminar al programa oponente. Se habló por primera vez de las CoreWars en un artículo de la revista "Investigación y Ciencia" de 1988, por A.K. Dewdney (en el enlace puedes ver el artículo original en inglés).


( DEWDNEY, A. K. Artículo: JUEGOS DE ORDENADOR, en: Investigación y Ciencia. No. 145, 1988. )


Para nosotros tiene mucho atractivo desde hace tiempo, DuenD y yo hemos pasado algunas horas haciendo programitas y simulando batallas usando el MARS (programa que simula el campo de batalla, si pulsas en el enlace verás varias páginas donde descargarlo).


Es todo un simulador de vida artificial, ya que una vez creado el código y ejecutado, tienes que programarlo lo mejor posible para que sobreviva dentro del campo de batalla haciendo varias operaciones, como reproducirse, saltar entre posiciones, eliminarse, etc ... sin ninguna acción exterior. Ni que decir tiene que también son una especie de "virus" ... en un entorno controlado.

Antes de nada, vamos a ver un poco como es el campo de batalla. Los programas no saben donde termina/empieza la memoria MARS. La posición de memoria "0" no es la primera, es donde está el código del programa, la siguiente será la "1", la "-1" será una posición atrás, etc ... La unidad básica de cada posición de memoria (o sea el contenido) es una instrucción (p.e.: MOV 0 1 ). En el ejemplo, la instrucción consta de una operación (MOV), una dirección de origen (0) y una de destino (1). En el ejemplo, MOV 0 1 copiaría el contenido de la posición de memoria "0", en este caso "MOV 0 1" a la posición "1", o sea, la siguiente posición, resumiendo, esta instrucción se copia a sí misma de una posición a otra en cada ejecución del programa. Y hablando de ejecución, MARS ejecuta sólo una instrucción DE CADA PROGRAMA en cada ciclo. Por ejemplo, si el programa A tiene una sola instrucción y el programa B tiene 3 instrucciones este sería el proceso de ejecución:


Ciclo 1: Instrucción 1 PROGRAMA A

Ciclo 2: Instrucción 1 PROGRAMA B

Ciclo 3: Instrucción 1 PROGRAMA A

Ciclo 4: Instrucción 2 PROGRAMA B

Ciclo 5: Instrucción 1 PROGRAMA A

Ciclo 6: Instrucción 3 PROGRAMA B


Vamos a ver un ejemplo de programa "CoreWar" (por cierto, a los programas se les suele llamar "guerreros"):


Guerrero "Trasgo" ó "Imp" (creo) (el más básico de todos):


MOV 0 1


Así de simple, es el de antes, simplemente se irá copiando en cada posición consecutiva de memoria hasta que logre eliminar al programa contrario.

´


Guerrero "Enano" ó "Dwarf":


ADD #4, 3

MOV 2, @2

JMP -2

DAT #0, #0


Este ya es más complejo, sólo comentar que cuando un número lleva delante el # quiere decir que hace referencia al número en sí, no al contenido de la dirección. En el ejemplo, ADD #4 , 3 implica sumar el número 4 al contenido de la posición de memoria 3, en nuestro caso al ser un DAT #0, #0 (DAT asigna el valor 0 al contenido de la misma posición de memoria), quedaría como DAT #0, #4 ... es un poco complejo al principio pero puedes ver una buena explicación en:




Voy a ver si pico a DuenD y a NOP para jugar de nuevo a las Core y publicaremos nuestros guerreros y nuestros resultados.


Sólo pretendo dar una pequeña guía de iniciación con este artículo, si el tema os parece interesante no dudéis en mandarnos un email o escribir algún comentario para ampliar el tema.