Q_Liberator, el “mejor” compilador para SuperBASIC

Q_Liberator es quizás el compilador más aceptado y común para programas SuperBasic. Fue diseñado y escrito, tal como narran sus creadores, en “muchas largas” tardes entre abril de 1985 y septiembre de 1986. Es un proyecto de dos personas, Adrian Soundy, que fue el principal responsable del diseño e implementación del compilador y Ian Stewart que escribió el sistema runtime y el manual. El compilador en si fue desarrollado en SuperBASIC.

Ya hemos comentado muchas veces que SuperBASIC es un lenguaje elegante y flexible. Fue considerado como un gran avance con respecto a otras implementaciones de BASIC de principios de los años 80 y contiene algunas características que son únicas. Al mismo tiempo actúa como lenguaje para automatización de las tareas del sistema, integrado con el propio QDOS. Pero también es cierto que tiene una serie de limitaciones, tales como:
– Su relativa lentitud.
– No es muy compacto.
– La carga de programas largos toma cierto tiempo para su ejecución.
– No existe la posibilidad de ejecutar dos programas SuperBASIC en multitarea (con SMSQ/E y su SBASIC si existe dicha posibilidad).

Para resolver estos problemas se crearon compiladores como Q_Liberator. El principio de diseño de este compilador es su compatibilidad con SuperBASIC, de tal forma que el programador no tenga que entrar en aspectos muy distintos de los que debe considerar en cualquier programa SuperBASIC ordinario.

Sólo con unas pocas excepciones (bien documentadas), virtualmente cualquier programa SuperBASIC puede ser compilado satisfactoriamente. Normalmente no hay necesidad de cambiar el programa original.

El resultado es que QLiberator produce programas con las siguientes ventajas:
– La carga del programa es muchísimo más rápido.
– Ocupa menos espacio en ficheros y en memoria.
– Se ejecuta más rápido.
– Se pueden ejecutar los programas en multitarea.
– Se protege el código fuente.

Q_Liberator es mucho más que una herramienta para crear programas más rápidos, podemos compilar con él “extensiones” del sistema que ofrecen la posibilidad de ampliar las facilidades que no vienen incorporadas al propio SuperBASIC. Además abre la puerta a explotar funcionalidades que no incorpora el lenguaje. Por ejemplo un manejador de errores puede ser incluido en los programas e interesantes posibilidades de comunicación entre distintos jobs, así como mecanismos simples para el empleo de pipes entre distintos programas.

Q_Liberator también ha sido diseñado de tal forma que sea completamente usable en sistemas sin ningún tipo de expansión. Así podemos compilar nuestros programas en cualquier QL sin expansiones y con simplemente sus unidades microdrive.

A pesar que no hay nuevas versiones desde el año 91, este compilador sigue siendo espectacularmente compatible con los nuevos desarrollos en la plataforma QDOS y SMSQ/E. En dichos sistemas, Q_Liberator será capaz de aprovechar las ampliaciones del sistema, memoria y unidades de almacenamiento más rápidos que podamos adherir a un QL estándar.

Q_Liberator se compone de los siguientes programas principales que se facilitan en el disquete o microdrive del compilador.

QLIB_SYS – Contiene una extensión del sistema para invocar al compilador (no es necesario para la ejecución de programas compilados)
QLIB_BIN – contiene el código de la primera fase del compilador
QLIB_OBJ – contiene el código correspondiente a la segunda fase del compilador
QLIB_RUN – contiene el sistema runtime (puede ser embebido dentro de los programas compilados o puede ser cargado externamente en el sistema)
QLIB_EXT – contiene algunas extensiones del SuperBASIC

En el disco o microdrive del compilador encontramos también otros ficheros de ejemplo, un fichero con la ayuda, un fichero boot, así como diversa información adicional.

¿Qué debemos hacer para compilar un programa SuperBASIC con Q_Liberator?

El proceso es muy simple. Lo primero que debemos hacer es cargar en nuestro sistema una extensión para invocar las distintas fases del compilador. Estas extensiones se encuentra en el fichero QLIB_SYS las cuales podemos cargar empleando el programa boot que nos ofrece el compilador o incluir dicha carga directamente en nuestro boot ordinario con una instrucción similar a esta:

100 LRESPR flp1_QLIB_SYS

Es muy práctico también cargar el runtime de Q_Liberator para no estar añadiendo este a cualquier programa compilado. Para ello incluiremos en nuestro boot una línea semejante a la siguiente:

110 LRESPR flp1_QLIB_RUN

(En mi sistema yo cargo QLIB_SYS y QLIB_RUN antes que cualquier otra extensión y después de TK2_EXT).

Una vez cargada estas extensines debemos configurar las rutas donde se encuentra el compilador y los ficheros de ayuda. Esto lo podemos hacer también con otro pequeño programa en SuperBASIC que viene suministrado con el compilador llamado boot_use. En él se invoca a una extensión para configurar estas rutas, esta instrucción tiene la siguiente forma:

200 QLIB_USE flp1_, flp1_help_

Esto indica que el compilador se encuentra en flp1_ y los ficheros de ayuda están localizados en flp1_help_. Una vez esto, ya tenemos nuestro sistema listo para compilar cualquier programa SuperBASIC

Lo primero que debemos hacer es cargar en memoria el programa SuperBASIC que queramos compilar. Sigamos el ejemplo del manual de Q_Liberator y carguemos el programa de ejemplo con:

LOAD flp1_demo_sort

(demo_sort es un programa de demostración para evaluar el tiempo que se invierte en ordenar un conjunto de números enteros, números en punto flotante y cadenas)

Q_liberator compila los programas en dos fases distintas. La primera fase ejecuta algunas comprobaciones iniciales y produce un fichero de trabajo (work file) para ser usado en la segunda fase.

La segunda fase toma este fichero de trabajo, realiza el resto de chequeo de errores y produce el programa objeto. Este programa objeto ya puede ser ejecutado como cualquier otro programa escrito en código máquina y puede ser ejecutado en multitarea.

Estas dos fases de la compilación pueden ser ejecutadas independientemente una de la otra (útil si no tenemos expansión de memoria) o de forma automática una detrás de otra.

En nuestro ejemplo, para compilar demo_sort basta con teclear

LIBERATE flp1_demo_sort,

Esto tomará el programa SuperBASIC que tenemos en memoria y producirá el programa objeto flp1_demo_sort_obj (es importante no olvidar la ‘,’ al final).

Resultado del proceso de compilación

Este programa objeto ya puede ser ejecutado en multitarea con:

EXEC flp1_demo_sort_obj

En caso de que no tengamos suficiente memoria en nuestro sistema, podemos ejecutar estas dos fases del proceso de compilación de manera separada e interactivamente siguiendo los siguientes pasos.

Una vez tengamos nuestro programa en memoria, teclearemos la siguiente instrucción:

LIBERATE flp1_demo_sort

(Vemos que no hemos puesto la ‘,’ al final).

Esto hace que Q_liberator construya el fichero de trabajo en flp1_. Este fichero se construye con el nombre flp1_demo_sort_wrk para nuestro ejemplo.

Una vez esto podemos liberar la memoria (NEW) para dar espacio libre y ejecutar la segunda fase de la compilación.

La segunda fase la ejecutamos con la instrucción:

LIBERATE

Tras esta instrucción vemos que nos aparece un cuadro de diálogo con las distintas opciones del compilador. Lo esencial es introducir el nombre del fichero de trabajo (pero sin la extensión _wrk) y el nombre del programa objeto. A continuación seleccionar la opción “Compile” y ¡ya está!.

Modo interactivo, opciones de Q_Liberator

En este cuadro de diálogo vemos también que podemos seleccionar distintas opciones del compilador, como por ejemplo la inclusión del runtime dentro del programa objeto, nombre del job, etc.

La diferencia entre los tiempos de ejecución entre el programa interpretado y el compilado es abismal. A continuación, vemos la pantalla final del programa demo_sort, las medidas equivalen al programa interpretado en mi QL con GolCard y empleando series de 100 elementos para las distintas pruebas de ordenación, en la versión compilada ninguno de los test pasó de los 2 segundos. Las diferencias son abismales llegando a ser en algunos casos de 10 a 1.

Demo_sort

En definitiva, si te gusta SuperBASIC y la programación en el QL, Q_Liberatos no te puede faltar.

Anuncios
4 comentarios
  1. MickyDoc dijo:

    Excelente tu post, como siempre. Estoy deseando que Terdina acabe su emulador para mac osx para poder probar todos estos programas y así conseguir material para escribir en el blog. Un saludo

  2. afx dijo:

    El Q-emuLator de Terdina es un fantástico emulador. Yo tengo la versión extendida para Windows y emula a la perfección un QL real, un QL ampliado (Gold Card + memoria extra), hasta un sistema con Aurora + SMSQ/E + alta resolución + 256 colores.

    Cuando salga la versión mac tiene que ser ¡la bomba! … 🙂 …

    MickyDoc, ya sabes que estamos esperando con “impaciencia” tus aportaciones :-).

    Saludos.

  3. a question: are there cross-compilers like Boriel’s zxbasic compiler? or is someone skilled enough in python language (used on the cross compiler itself), and ql basic and assembly enough for helping the development of a ql version of Boriel’s cross compiler?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s