Un compilador de ZX Spectrum BASIC

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Avatar de Usuario
Rafa
Jack The Nipper
Mensajes: 181
Registrado: Lun May 07, 2007 11:59 am

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Rafa » Vie Feb 01, 2008 1:34 pm

Ahí, ahí, ¡¡¡ MÁS MADERA !!!

Mi proyecto es posible salvando ciertas dificultades (los paréntesis sobre todo, evaluar ciertas expresiones)

Qué le vamos a hacer.
RANDOMIZE USR 0

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Vie Feb 01, 2008 1:39 pm

Hacer un compilador es sencillo, lo difícil es la optimización del código generado. El evaluador de expresiones (con todos los paréntesis que quieras) se hace en la gramática atribuida, no es mucho más complicado que la gramática de un IF.

Avatar de Usuario
Rafa
Jack The Nipper
Mensajes: 181
Registrado: Lun May 07, 2007 11:59 am

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Rafa » Vie Feb 01, 2008 2:12 pm

¿Algún buen artículo sobre gramática atribuida?
RANDOMIZE USR 0


Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Vie Feb 01, 2008 3:57 pm

Rafa aquí tienes algo más simple, por si quieres echarle un vistazo:
http://arantxa.ii.uam.es/~alfonsec/docs/compila5.htm
Además, se ve la propagación de tipos de entero a real, tal como la implemento yo, por cierto.

Por otra parte, lo que tú buscas, creo yo, no es un compilador, sino un intérprete como el de la ROM, pero más eficiente. Eso está bien para según que cosas, pero no es lo que persigo yo (y creo que algunos otros). Los lenguajes compilados no permiten el dinamismo del BASIC del ZX. Por eso, hacer un intérprete, aunque fuera más rápido, no haría que fuera mucho mejor. El de la ROM tampoco es tan malo, y menos en 16K.

Avatar de Usuario
sromero
Nonamed
Mensajes: 1221
Registrado: Mar Abr 17, 2007 12:35 pm
Ubicación: Valencia
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por sromero » Vie Feb 01, 2008 4:14 pm

na_th_an escribió:1.- Los elementos propios de lenguaje interpretado los eliminaría por completo o los dejaría tirando de ROM cuando fuera posible. Por ejemplo, RESTORE/READ/DATA no tienen sentido en un programa compilado (ya que si quieres datos ya los tienes en memoria y los puedes leer con PEEK y poner con POKE). VAL y VAL$ son casi inútiles en juegos (a lo que yo orientaría un compilador así). De hecho creo que HiSoft basic ofrece un soporte muy limitado de VAL y no es compatible con VAL$ (no estoy seguro).


Hombre, es que mi idea era que el compilador de ZX Spectrum BASIC propuesto en el hilo era un "compilador" de propósito general que fuera 100% compatible con el BASIC del Spectrum, añadiendo extensiones propias.

Eso sí, si vamos a orientarlo a juegos, es decir, si nuestra idea no es compilar programas BASIC ya existentes sino crear un compilador para hacer NUEVOS programas, ya siguiendo las reglas que establezca este compilador, entonces sí.

La verdad es que, si lo piensas, tal vez una primera parte de este proyecto debería ser precisamente esa: un subconjunto del basic pensado exclusivamente para programar juegos o aplicaciones, eliminando las instrucciones absurdas.

Más adelante ya se podría INCLUIR en él, si se viera necesario, las instrucciones que se han quedado por el camino.

2.- Los bloques básicos de programación (instrucción selectiva, iterativa, etc...) los resolvería en ASM puro. No es complicado generar código para un bucle FOR o para un bloque IF.


Inicialmente, yo ni siquiera me pondría a buscar en cada una de las situaciones que se le planteen al compilador en el código si hay registros libres para usar o no, haría el PUSH y el POP de un registro fijo antes y después de cada iteración del "bucle", y lo que hay dentro, me olvido de analizarlo para ver si me puedo ahorrar ese push y ese pop usando algún registro que no esté modificado....

3.- Las sentencias y funciones sencillas (PEEK, POKE, BORDER... ) las dividiría en dos grandes grupos: las más inmediatas que requieran poco código (por ejemplo un border) las pondría inline. Las otras (más complejas) las codificaría en una pequeña biblioteca de funciones que llamaría desde el código con CALL.


101% de acuerdo.

Total, un call y su ret son unos ciclos de reloj totalmente despreciables al lado de la diferencia entre esto y el BASIC interpretado del Spectrum ...

Pero si me preguntáis a mí, yo haría un rediseño del Sinclair BASIC eliminando números de linea y expandiendo con las cosas que le faltan.


La verdad es que la idea mola: sustituir los números de línea por etiquetas, como en ASM.

Código: Seleccionar todo

         LET nave = [0, 1, 1, 1 (etc) ]
         REM Mi programa
         PRINT "Hola, soy un bucle infinito"
         LET N = 0
bucle: PRINT "Ehhhhhhh"
         retorno = GOSUB dibujar_sprite(100, 200, nave)
         LET N=N+1 
         GOTO bucle

dibujar_sprite(x,y,z):
        blah blah blah
        return 1



donde:

* Sin numeros de línea el programa se hace mas legible. Sólo se usan etiquetas donde hacen falta.
* Sigue siendo BASIC = Fácil para quien ya sabía zxbasic.
* Daria igual LET N=0 que N=0 ... esa línea sólo se usa en tiempo de compilación, declarando una variable en el espacio de variables y añadiendolo a la lista de objetos a linkar.
* Se podría usar operadores tipo += ... y cualquier nuevo operador que se quiera
* Las llamadas a gosub podrían llevar parametros y devolver un valor
* Todo se pasaría por valor, excepto las "etiquetas" (como nave en ese gosub), que se pasaría por referencia.
* Las biblioteca de funciones externas permitiría hacer de todo: gráficos, sonido, etc, y se podría ampliar sin necesidad de tocar el compilador. Es más, ni siquiera debería estar compilada, sino que debería ser un fichero de códigos fuente tal cual lo incluirías en un programa ASM.
* Todo lo demás, parecido al BASIC de toda la vida.

Sobre las bibliotecas de funciones externas, yo las crearía con un sistema de dependencias.

Es decir, supón que creas una biblioteca de funciones de graficos llamada gfx.asm. Supon que tiene 3 funciones: una para dibujar sprites, una para poner el borde, y una para borrar la pantalla y que ademas pone el color del borde igual que el del borrado. Las crearia en el asm asi:

Código: Seleccionar todo

# Funcion para blah de blah de blah (descripcion)
# LINKER-DEPENDS: None
DrawSprite:
      pops para recoger los parametros
      ld blah, valor
      lbha
      mas codigo asm
      ret

# Funcion para borrar la pantalla y poner el borde...
# LINKER-DEPENDS: gfx.asm:Border <----------- Notese esto
ClearScreen:
      pops para recoger los parametros
      ld blah, colorfondo
      lbha
      mas codigo asm
      CALL BORDER <------- notese esto
      ret

# Funcion para poner el borde
# LINKER-DEPENDS: gfx.asm:None
Border:
      pops para recoger los parametros
      ld blah, colorfondo
      lbha
      mas codigo asm
      ret


(Mira las 2 lineas marcadas con "Notese esto")

De esta forma, si en tu programa basic tú haces: BORDER 10, sólo se incluiría en el programa final el codigo fuente de Border... pero si haces ClearScreen(), entonces ademas de ClearScreen, gracias a las dependencias definidas, se añadiria ClearScreen, y Border (por el LINKER-DEPENDS: gfx.asm:Border).

Así:

- Cuando usamos una función, no tenemos que incluir toda la libreria entera como pasaba en C. El linker sabe qué funciones incluir, y no meterá las que no hagan falta (en el ejemplo de arriba, DrawSprite no se metería en el codigo final, porque no es llamada y ninguna funcion depende de ella).
- Cuando programamos funciones de la libreria, podemos usar cualquiera de las funciones previas sin tener que repetir codigo, solo añadiendo la linea de dependencia. Asi, podemos llamar a BORDER en lugar de pegar dentro de clearscreen el codigo de border y repetir codigo, haciendolo más pequeño (por no decir que si luego aparece un bug en nuestra implementacion de border, sólo habría que cambiar la funcion border y no ponerse a buscar todos los sitios donde hemos incluido su codigo).

Dejo de desvariar XD

Estoy con na_th_an: coger el basic estándar, eliminar todo lo que no sirva para crear un programa NUEVO, desde CERO (olvidarse de compilar programas ya hechos), eliminar lineas y cosas absurdas, y dejar un lenguaje lo más parecido posible a basic, pero potente.

saludos.
Última edición por sromero el Vie Feb 01, 2008 4:26 pm, editado 1 vez en total.
NoP / Compiler

Avatar de Usuario
sromero
Nonamed
Mensajes: 1221
Registrado: Mar Abr 17, 2007 12:35 pm
Ubicación: Valencia
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por sromero » Vie Feb 01, 2008 4:22 pm

Rafa escribió:En definitiva estáis hablando de crear un lenguaje nuevo que nunca correrá en un Spectrum normal.


Yo y na_th_an, sí. El autor del proyecto en sí, no lo sé.

¿Se necesita un while para programar en Basic (del Spectrum o no)?


No se necesita teniendo IF, pero ... ¿a que hace el código más limpio? ¿A que nadie te obliga a usarlo? ¿a que sí que sería útil a otras personas que están acostumbrados a usarlo? ¿Qué problema hay que un compilador nuevo AÑADA esta clausula?

¿Qué importa si un número es float?


Pregúntaselo a cualquiera que quiera programar una aplicación que trabaje con números y necesite precisión ... Ya verás si le importa o no...

¿El uso de IF/ELSE os resuelve un problema?


Sí, un problema de limpieza de código.

¿Por qué no os gusta la programación lineal? (Y no digáis porque es obsoleta, es la respuesta típica.)


Todavía no he visto en el hilo ningún comentario acerca de la programación lineal. Que yo sepa, nadie ha hablado aquí de OOP, todo lo que hemos hablado es programación estructurada, funcional, y lineal.

Si queréis crear un lenguaje NUEVO, hay otros foros. Yo me quedo con mi Speccy.

Si yo visito este foro es porque me gusta mi Speccy TAL COMO ES.


¿Qué tiene que ver lo que estamos hablando, con que nos guste el Speccy?

Es más... ¿qué tiene que ver lo que te guste o te deje de gustar a tí, con que sigamos hablando en el hilo de lo que nos apetezca hablar?

Si te gusta tu Speccy tal y como es ... ¿por qué estás en un hilo que habla de hacer un compilador de BASIC cruzado desde un PC? ¿Por qué no estás con el Hisoft BASIC o el MCODER programando directamente en el Spectrum?

(No sé si me explico).

Un saludo :)
NoP / Compiler

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Vie Feb 01, 2008 4:41 pm

Me encantan todas las ideas que tienes, Santi. El tema de las etiquetas es muy cómodo. El dialecto de BASIC de Microsoft (una de las pocas cosas buenas que han hecho) funciona exactamente así, sin perder la compatibilidad con los números de linea (no exige orden en los mismos y los considera como etiquetas), y además añade funciones y SUBs (procedimientos que no devuelven nada), con una sintaxis muy parecida a PASCAL, que permite incluso pasar las variables por referencia o por copia. Es un BASIC muy potente. Si te interesa, puedes echarle un ojo a freeBASIC, que no es más que un compilador libre, open source y portable (está escrito en freeBASIC, que es portable :lol:) que genera un código MUY eficiente y toma como paradigma de sintaxis el de Microsoft (en http://www.freebasic.net tienes versiones para MSDOS, Windows y Linux).

Nosotros no necesitamos tanto. Pero incluir las buenas cosas (estructuración, ámbito de variables, lógica a nivel de bits, etcétera) sólo supone un compilador más complejo, no un binario más complejo. Quiero decir, meter estructuras como WHILE:WEND, DO:LOOP, IF/ELSEIF/ELSE/ENDIF, etcétera NO va a generar un binario que ocupe más o que sea más lento, sólo precisará de una gramática más potente y de un generador de código más complejo, lo cual no impacta para nada al resultado que es lo que se ejecutará en el Speccy.

El BASIC es muy amable para hacer juegos. Si conseguimos construir un compilador de un dialecto de BASIC que junte lo bueno del estándar (que, hoy por hoy, es el de Microsoft, qué se le va a hacer) con lo bueno del Sinclair BASIC (que tiene MUCHAS cosas buenas), tendremos una herramienta super potente que seguro que más de uno acogerá con los brazos abiertos. Hay que tener en cuenta que hay MUCHA gente que conoce el dialecto de BASIC de Microsoft (Locomotive BASIC de CPC está basado en él, el MSX BASIC es casi igual que las primeras versiones de Microsoft con números de linea, Visual Basic (hasta el 6 y .NET) también lo usa, los macros de MS Office y OpenOffice emplean la misma sintaxis, etcétera), así que no creo que sea mala idea incluir todas esas adiciones.

Avatar de Usuario
sromero
Nonamed
Mensajes: 1221
Registrado: Mar Abr 17, 2007 12:35 pm
Ubicación: Valencia
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por sromero » Vie Feb 01, 2008 4:55 pm

Todavía me acuerdo de mis tardecillas con el QBASIC de MSDOS/Windows, y toqueteando el gorilla.bas y el nibbles.bas que venían con él ... :-)
NoP / Compiler

Avatar de Usuario
radastan
Phantomas
Mensajes: 2199
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por radastan » Vie Feb 01, 2008 7:27 pm

sromero escribió:Todavía me acuerdo de mis tardecillas con el QBASIC de MSDOS/Windows, y toqueteando el gorilla.bas y el nibbles.bas que venían con él ... :-)


Hombre! alguien que se atrevió a trastear el QBASIC como yo. Que recuerdos con el gorilla.bas, lo que pasa es que tras varias semanas vi que nadie usaba QBASIC porque no podías generar ficheros EXE con el trabajo resultante. Un gran fallo, porque si hubieran dado la opción de grabar un EXE con el programa empaquetado y autoarrancable la cosa hubiera sido bien distinta. Por eso empecé a aprender C.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
Metalbrain
Freddy Hardest
Mensajes: 590
Registrado: Lun May 07, 2007 8:17 am
Ubicación: Sevilla
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Metalbrain » Vie Feb 01, 2008 8:08 pm

radastan escribió:
sromero escribió:Todavía me acuerdo de mis tardecillas con el QBASIC de MSDOS/Windows, y toqueteando el gorilla.bas y el nibbles.bas que venían con él ... :-)


Hombre! alguien que se atrevió a trastear el QBASIC como yo. Que recuerdos con el gorilla.bas, lo que pasa es que tras varias semanas vi que nadie usaba QBASIC porque no podías generar ficheros EXE con el trabajo resultante. Un gran fallo, porque si hubieran dado la opción de grabar un EXE con el programa empaquetado y autoarrancable la cosa hubiera sido bien distinta. Por eso empecé a aprender C.


Es que lo de generar el .EXE lo dejaban para el QuickBASIC, que era de pago.

Yo también estuve trasteando, aunque no mucho tiempo.
SevenuP se escribe con u minúscula y P mayúscula.

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Vie Feb 01, 2008 9:42 pm

sromero escribió:
Rafa escribió:En definitiva estáis hablando de crear un lenguaje nuevo que nunca correrá en un Spectrum normal.

Yo y na_th_an, sí. El autor del proyecto en sí, no lo sé.

En principio yo pensaba que iba a ser más sencillo hacerlo compatible con el BASIC del ZX al 100%. Pero es complicadísimo, y al final no se gana mucho rendimiento. Es más, en algunos casos sería tan lento como el ZX Basic actual.

En cambio, las mejoras propuestas son sencillas (relativamente) de programar, y permitirían mejorar mucho lo que al BASIC del ZX le falta, y de paso supliría un poco lo que se pierde al ser compilado.
Última edición por Boriel el Sab Feb 02, 2008 12:15 pm, editado 1 vez en total.

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Vie Feb 01, 2008 10:27 pm

Genial. Un compilador de estas características será todo un aporte a la comunidad.

Sobre QBasic/QB, yo llegué a hacer esto (entre muchas otras cosas): http://www.geocities.com/na_th_an_wopr2k/ . Tuvo mucho impacto en la escena QBera allá por 2002, entre otras cosas porque se situó en cabeza de la lista de los mejores juegos de plataformas hechos en QB (según el fanzín más importante de la época, VPlanet), y además porque las tetas asustaron tanto a los americanos que se abrieron mil debates :lol:

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Vie Feb 01, 2008 11:49 pm

na_th_an escribió:Genial. Un compilador de estas características será todo un aporte a la comunidad.

Gracias na_th_an. Haré lo que pueda. En realidad estoy haciendo ahora mismo el doctorado en informática, y, como no, estoy trabajando compiladores y lenguajes (así como paralelismo). Y qué mejor lenguaje para probar que la herramienta que he hecho (por cierto, hay un borrador del fuente en python, pero no incluye el BASIC de zx, aquí) pero no es la última versión, y la documentación está muy incompleta. Espero subirlo todo este fin de semana.

Respecto al prototipo de zx (zx.py), necesitará que la herramienta de la página anterior esté en el mismo directorio (puede que lo empaquete todo en un zip, o incluso cree el ejecutable a partir del .py). En cualquier caso, hasta que no haya algo serio (si es que lo llega a haber, que soy pesimista :? ) no voy a subir el ZX Compiler (o como se vaya a llamar) a la Wiki.

na_th_an escribió:Sobre QBasic/QB, yo llegué a hacer esto (entre muchas otras cosas): http://www.geocities.com/na_th_an_wopr2k/ . Tuvo mucho impacto en la escena QBera allá por 2002, entre otras cosas porque se situó en cabeza de la lista de los mejores juegos de plataformas hechos en QB (según el fanzín más importante de la época, VPlanet), y además porque las tetas asustaron tanto a los americanos que se abrieron mil debates :lol:

:shock: ¡¡¡La *stia!!! :roll:
¿Cómo hiciste los gráficos? Estoy interesado en eso (Igual está un poco fuera de tema esta última pregunta, si es así, la podemos pasar a Fuera de Tiesto, si el moderador la cree conveniente). Respecto a lo de las t*tas, bueno, ya pasó con Dinamic y la cubierta del Game Over (¿fue ese?) en los '80. Si es que hasta en eso fueron pioneros :mrgreen:

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Sab Feb 02, 2008 12:46 am

Los gráficos, pues con el maravilloso Deluxe Paint y muuucha paciencia :)

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados