miércoles, 11 de agosto de 2010

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 <Código fuente>

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=<mem length>] <file>
--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

2 comentarios:

  1. jajaja estas loco. En cuarto tenemos compiladores mira que eres impaciente. Currarse un compilador....XD

    ResponderEliminar
  2. Uno, que no puede esperar tanto para la parte buena de la carrera :)

    ps: Tampoco es tanta cosa, redcode es bastante simple ;)

    ResponderEliminar