[Link corregido]

Hoy traigo un pequeño intérprete de Redcode (si, el lenguaje del Corewars). Tiene sus limitaciónes (digamos que sigue las primeras versiones del lenguaje), por ejemplo, no tiene p-space ni modificadores (instrucción.Modificador) a excepcion de STS, que muestra un carácter por pantalla, y LDS que obtiene un carácter de STDIN (instrucciones que no se usan en el juego ), para más referencias [ Redcode_-_Esolang ].

Obviamente la idea al programar esto fue intentar comprender un poco más como funcionan los intérpretes y compiladores.

Centrandose en el programa en sí, (se puede descargar aquí [redcode01.tar.gz]), lo único que hay que hacer es make para compilarlo, y

===============================================================================

./redcode

===============================================================================

para intérpretar un código.Además decir que ignora las líneas con un '#' al principio, para permitir que el intérprete se lance con un #!.

Hay más formas de usarlo, se pueden ver con

===============================================================================

kenkeiras@viaxante:~/%%%%%$ ./redcode Uso: ./redcode [--help |--compile | --decompile | --load-compiled] [--verbose] [--mem-length=] --help: Muestra esto - Shows this --compile: Compila el bytecode y lo muestra por STDOUT - Compiles the bytecode and shows it throught STDOUT --decompile: Decompila el bytecode - Decompiles the bytecode --load-compiled: Ejecuta un bytecode - Executes a bytecode --verbose: Muestra información para el debugging - Shows debugging info --mem-length: Ajusta la longitud de la memoria - Set's the mem length

===============================================================================

Creo que es bastante auto explicativo.

La parte de compilar y cargar directamente despues está para evitar el procesamiento extra del parser (esto para Redcode no tiene mucho sentido, pero para otros lenguajes podria tenerlo,y recordemos que la idea era aprender =) ).

Por último, algunos programas utilizados para probarlo...

ps: Perdón desde ya por el surfing de punteros :S.

El hola mundo (no puede faltar :D) [http://pastebin.com/cbtGkj5F]:

===============================================================================

; Redcode Hello World, John Metcalf

write   sts.a  hello,     0 sts.b  }write,    0 djn    write,     #7

hello   dat    72,        101 ; He dat    108,       108 ; ll dat    111,       44  ; o, dat    32,        87  ;  W dat    111,       114 ; or dat    108,       100 ; ld dat    33,        10  ; !\n

===============================================================================

Adaptado para usar SPL (varios procesos)[http://pastebin.com/rqrugthE]:

===============================================================================

; Redcode multiprocess Hello World ; Original by John Metcalf ; Modified by kenkeiras (Added parallel functions)

spl fork write   sts.a  hello, 0 djn    -1, #7

hello   dat    72,        101 ; He dat    108,       108 ; ll dat    111,       44  ; o, dat    32,        87  ;  W dat    111,       114 ; or dat    108,       100 ; ld dat    33,        10  ; !\n

fork    sts.b  }write, 0 djn    -1, #7

===============================================================================

Un imp (simple pero eficaz para probar los extremos de la memoria):

===============================================================================

mov    0, 1

===============================================================================

Y uno que se copia seguido hacia atras[http://pastebin.com/x8qNf15b]:

===============================================================================

;name Backrunner ;author Kenkeiras

SUB #7,inst    ;Para reajustar el puntero de instruccion SUB #6,pos     ; " MOV >inst,>pos SEQ inst,check JMP -2

JMP -14 ;Al proximo paso

pos   DAT #-9 inst  DAT #0 ;Los valores que quedaran despues de copiarse a si mismos check DAT #2

===============================================================================

Hasta otra.

[Referencias] http://impomatic.blogspot.com/ Redcode_-_Esolang