Intérprete de Redcode
[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=
===============================================================================
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