Página 1 de 42

Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 12:04 am
por Boriel
Hola,

Ante todo presentarme. Me llamo Jose, aunque uso el pseudo Boriel (cosas del Rol). Suelo leer mucho este foro (y el grupo de news). Pero suelo escribir poco (cosas de la timidez y la falta de tiempo). :oops:

El caso es que he hecho una herramienta para crear compiladores (si alguien conoce LEX y YACC -fLEX y Bison en Linux), pues algo así. Y para probarlo, se me ha ocurrido hacer un analizador sintáctico al que se le meta un código fuente de BASIC de ZX Spectrum y escupa el ASM ya generado.

El caso es que de ZX Spectrum BASIC ya no me acuerdo mucho (estoy tirando del emulador, para ver algunas cosas). De momento estoy definiendo lo básico (nunca mejor dicho :P ). Sólo quería poner el aviso aquí, por si a alguien le interesa (el link anterior es de la herramienta para hacer el compilador de ZX, no del compilador en sí, estoy en eso ahora) y de paso saber si puedo pedir ayuda (o donde buscar info) sobre cómo compilar ciertas instrucciones o qué encuentran más útil / inútil del lenguaje.

También comentar que, dado mi escaso tiempo (estoy haciendo doctorado en la universidad, y trabajando, así que...) casi no puedo hacer nada. El generador de compiladores me ha llevado 6 meses (en los que apenas he dedicado un par de horas a la semana). Así que esto es a largo plazo.

Saludos,
Jose
http://www.boriel.com

PD: También comentar que he encontrado un bug en el intérprete de BASIC del ZX. En matemáticas, el operador de potencia (^) es asociativo por la derecha, o sea que 2^1^3 se evalúa como 2^(1^3) = 1. En cambio en el ZX se evalúa de izquierda a derecha, por lo que 2^1^3 = (2^1)^3 = 8. Supongo que habrá que tenerlo en cuenta, para compatibilidad (también es verdad que dada la limitada memoria, es lógico que se evalúe así).

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 12:22 am
por radastan
Desde mi punto de vista te doy las gracias, si llegas a completarla será una herramienta de grandísima utilidad para la escena.

Eso si, te ruego una cosilla: que el compilador simplemente pueda recibir el fichero BAS y escupa el .ASM o el binario por comandos, sin necesidad de GUI (así se podría usar en programas como BASIN como una opción externa).

Respecto a la forma de compilar... muy simple, sustituir directamente cada instrucción por una llamada a la rutina de la ROM, con eso evitas la interpretación del BASIC y ya ganas una BARBARIDAD en velocidad de ejecución. Te recomiendo que te documentes con alguna de las ROMS desensambladas que hay por Internet.

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 1:15 am
por Boriel
Bueno, ante todo gracias por la información y por los ánimos.
En principio sería una herramienta de línea de comandos, y funcionaría en Python (Windows, Linux). Aunque nada impediría pasarlo a C.

Por cierto, ¿Qué es el BASIN? ¿Y dónde puedo encontrar esa información de las ROMS?
Me respondo a mí mismo sobre BASIN: Acabo de encontrar algo sobre BASIN, aunque he visto en linux uno equivalente llamado ZMakeBas.

Había pensado en principio, hacer eso que dices. Es decir, interpretar yo las órdenes y llamar a la ROM. Pero pienso que eso sería lento. ¿Seguro que acelera? Por ej. Llamar a CIRCLE sería lento. Lo mismo para BEEP.

Mi idea era hacerlo para las instrucciones de punto flotante (operaciones aritméticas, trigonométricas, etc). Pero poder poner también (por ej. en líneas REM) que algunas variables fueran bytes o enteros de 16 bits. Esto podría acelerar las cosa muchísimo.

Quizá lo mejor sea empezar haciendo lo que dices, y ver si luego, una vez obtenido un prototipo medianamente funcional, se pueden hacer otras cosas.
Por cierto, un problema que tengo con el z88dk es que en mi máquina de 64bits (Linux) no está portado. :( Por paradójico que parezca, voy a tener que correr el z88dk dentro de un emulador (Virtual Box) con windows 32 bits y probablemente, dentro de él, un emulador de ZX Spectrum. :roll:

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 8:20 am
por na_th_an
Para Linux, puedes bajarte los fuentes de z88dk y compilarlos en tu target, ¿lo has probado?

Sobre BASIC, puedes echarle un vistazo a la documentación del compilador para Spectrum HiSoft BASIC, que por ejemplo implementa el uso de directivas en sentencias REM y funciona muy eficientemente (de 4x a 8x la velocidad del BASIC interpretado, dependiendo de cómo lo hagas).

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 9:15 am
por Manu
Haciendo un poco de Offtopic, esto de los 64bits es una castaña a veces, porque por ejemplo no consigo que me compile el FUSE en "Kubuntu64" :(

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 9:46 am
por radastan
Boriel escribió:Había pensado en principio, hacer eso que dices. Es decir, interpretar yo las órdenes y llamar a la ROM. Pero pienso que eso sería lento. ¿Seguro que acelera? Por ej. Llamar a CIRCLE sería lento. Lo mismo para BEEP.


Efectivamente, circle o beep no se benefician en ese caso mucho... pero el resto de instrucciones si. Date cuenta que sólo por quitar la interpretación del BASIC ya ganas entre 2x y 3x de velocidad según la instrucción (los print e IF ganan muchísimo más, y es lo más usado en un juego).

Empieza por trasladar a ensamblador llamadas a rutinas de la ROM de las mismas instrucciones, luego optimizas las que tu creas que son muy mejorables, y ¡voilá!.

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 1:08 pm
por compiuter
Cuando tengas algo, estaremos encantados de probarlo.

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 2:20 pm
por Rafa
Yo ya lo intenté hace un tiempo, hacer un compilador Basic, y es follón, porque por un lado está el tema de cómo tratar los números (enteros y en coma flotante);
y por otro lado está el tema de los paréntesis y las prioridades en los cálculos.

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 2:26 pm
por mcleod_ideafix
Para eso se inventaron las gramáticas de libre contexto, el lex y el yacc :D
Larga vida a señor Donald Knuth! (inventor de las gramáticas atribuidas, aunque casi todo el mundo le conoce por inventar el lenguaje TeX para procesamiento de textos).

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 2:43 pm
por mcleod_ideafix
Boriel escribió:Mi idea era hacerlo para las instrucciones de punto flotante (operaciones aritméticas, trigonométricas, etc). Pero poder poner también (por ej. en líneas REM) que algunas variables fueran bytes o enteros de 16 bits. Esto podría acelerar las cosa muchísimo.


Entonces échale un vistazo a este interesante artículo sobre algunas particularidades de la coma flotante del BASIC del Spectrum.

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 3:48 pm
por na_th_an
Creo que lo mejor es usar una solución intermedia:

1.- Aritmética entera, IFs, saltos, asignaciones, manejo de memoria, puertos y cadenas: generar código ASM.
2.- Resto de comandos (*) usando la ROM, y aritmética de punto flotante usando el calculador del Spectrum.

(*) Ir mejorando los que en ROM son una patata con el tiempo.

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 4:13 pm
por sromero
A mí me parece un proyecto interesantísimo.

Tener el equivalente BASIC del Z88DK podría animar a mucha gente a hacer más juegos en Spectrum ... y sí, los harían en BASIC, pero bien compiladito, y además con la comodidad de poder programar en un editor de textos de PC, y sin las limitaciones de otros compiladores de Spectrum como MCODER.

Animo con el proyecto, de él pueden salir muchos programas y juegos de todos los que saben BASIC pero no C o ASM.

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 4:17 pm
por Manu
Sin duda es una idea interesante, y una forma de dar algo más de velocidad a los programas escritos originalmente en BASIC sin necesidad de tener conocimientos de CM.

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 5:13 pm
por na_th_an
Ains, nunca leéis mis artículos :lol: Para eso tenemos ya el HiSoft BASIC. Aunque tener algo equivalente para PC ya sería la requete-quete. Me parece un proyecto realmente interesante.

Re: Un compilador de ZX Spectrum BASIC

Publicado: Lun Ene 28, 2008 7:39 pm
por Rafa
OK. Todo el mundo dice "que es un proyecto interesante". A ver: ¿propuestas?
Yo creo que lo realmente complicado son las prioridades en el cálculo y los paréntesis. Lo demás, son chorradas.
Yo estoy dispuesto a implicarme. ¿Alguien más?