[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
jajaja estas loco. En cuarto tenemos compiladores mira que eres impaciente. Currarse un compilador....XD
ResponderEliminarUno, que no puede esperar tanto para la parte buena de la carrera :)
ResponderEliminarps: Tampoco es tanta cosa, redcode es bastante simple ;)