TURBO, un compilador de SuperBASIC

David Denham

Traducción: Afx
junio de 2009

Turbo fue el segundo de los compiladores SuperBASIC publicado por Digital Precision Limited (el primero fue Supercharge). Originalmente, el compilador Turbo es principalmente obra de Simon N. Goodwin, acompañado de un equipo de personas como Freddy Vachha (MD de Digital Precision), Chas Dillon, Dave Newell y Gerry Jackson. Recientemente Turbo ha pasado a ser freeware (lo que significa que se puede copiar y obtener copias de forma gratuita) respaldado por George Gwilt, un experimentado programador de QL cuyo trabajo incluye el desarrollo del ensamblador GWASS y GWASS Lite (Gwasl).

¿Por qué usar un compilador BASIC?

Un compilador SuperBASIC toma un programa BASIC y lo convierte en un programa que puedes ejecutar con EXEC. Normalmente el resultado es que el programa se ejecuta muchísimo más rápido, es un programa varias veces más pequeño, un programa en el que el usuario no tiene porqué ver el código fuente SuperBASIC y un programa mucho más seguro ya que el programador puede beneficiarse de mejores mecanismos para el tratamiento de errores disponible en programas compilados. Los programas compilados, a menudo corrigen bugs derivados de versiones antiguas del BASIC como pueden ser las versiones de la ROM JM y JS, y asegura que el programa se ejecute de una forma consistente en todas las versiones de ROMS donde ciertos comandos podrían no trabajar completamente igual a las versiones más tempranas de la ROM del QL.

Un programa compilado no tiene que ser interpretado cuando se ejecuta, por lo que generalmente se ejecutará más rápido que el programa original. Turbo pretende convertir el programa original en un programa equivalente en código máquina. Hay dos tipos de compiladores, los que compilan a un código intermedio (por ejemplo el compilador Q-Liberator) y aquellos que compilan a código máquina (o lo más cerca posible). Esto creó una gran discusión en los primeros días sobre cuál era el mejor compilador para el usuario de QL, pero la conclusión era que ambos tenían características destacables y que la elección dependía de lo que se pretendiese hacer. Turbo siempre tuvo la ventaja de la velocidad, pero tiende a ser estricto con aspectos de la sintaxis y tiene reglas ligeramente diferentes con respecto al paso de parámetros por referencia a y desde procedimientos y funciones. Por otro lado Q-Liberator siempre fue preferido por aquellos que trataban de compilar programas que hacían uso de "Pointer Environment" (PE, el entorno de ventanas para QDOS).

En estos días, los argumentos tienden a diferenciarse menos. En los rápidos sistemas QL-compatibles de hoy en día, el argumento de la velocidad es menos importante. Turbo es un proyecto libre y todavía mantenido con nueva versiones que aparecen de vez en cuando. Q-Liberator sigue siendo un programa comercial, y aunque no se producen nuevas versiones, sigue siendo hasta la fecha, sorprendentemente compatible con los sistemas modernos.

Siempre he sido un fan de ambos compiladores y pensé que sería el momento de echar una nueva mirada a Turbo ya que ahora es gratuito y ofrece un montón de nuevas facilidades que se han actualizado.

Turbo siempre se ofreció con un pequeño toolkit que contenía extensiones muy útiles al BASIC, algunas de ellas eran específicas para Turbo (otras son de uso general). Estas incluyen por ejemplo un "capturador" de errores para funciones INPUT. Más recientemente, Turbo Toolkit ha sido actualizado por David Gilham y George Gwilt.

Este artículo está basado en las siguientes versiones del compilador Turbo y Turbo Toolkit:

Compilador Turbo (parser) versión 4.20
Turbo Toolkit versión 3.34

¿Dónde puedo conseguir el compilador Turbo?

El compilador Turbo y su Toolkit se puede obtener desde la mayoría de las librerías de dominio público del QL y de varios sitios Web. La fuente principal es el sitio Web del grupo escocés de usuarios QL de John Sadler:

http://www.jms1.supanet.com (aquí)

También del sitio Web de Dilwyn Jones, en:

http://www.dilwyn.me.uk/turbo/index.html

Los manuales de Turbo son de acceso libre y puedes obtener también los fuentes si estás interesado en el diseño del compilador, aunque estos no son necesarios para el uso general de compilador.

Merece la pena obtener los nuevos manuales, incluso si tienes los originales de Digital Precision, ya que gente como Timothy Swenson han puesto gran esfuerzo en la actualización del contenido.

Puede que valga la pena conseguir los "Programas de Asociados", un conjunto programas adicionales que aunque no sean indispensables para el uso de Turbo son muy útiles.

¿Cómo instalar Turbo?

Si has descargado los paquetes de Turbo desde los sitios Web que hemos comentado, habrás obtenido los archivos en formato zip. Estos archivos deben ser descomprimidos con la versión QL del programa Unzip. No intentes descomprimirlo la versión Unzip de PC o de otro sistema, lo más probable es que pierdas las cabeceras de los ficheros ejecutables y no funcionen.

Una vez que hayas descomprimido los ficheros obtendrás los siguientes ficheros:

Turbo:

PARSER_TASK   - esta es el 'parser', que lee y comprueba
                el programa original SuperBASIC.
CODEGEN_TASK  - este es el generador de código, que
                produce el programa compilado final.
T_CONFIG_DATA - junto con T_CONFIG_LOAD establece el bloque
                Confing estándar en los programas.
UTILITY_TASK  - permite configurar Turbo Toolkit, etc.
CHANGES_TXT   - un fichero de texto que detalla los cambios
                recientes aplicados a Turbo.

Turbo Toolkit:

TURBO_TK_CODE - el Turbo Toolkit completo,
                para uso general
TURBO_SMS_CODE- una versión de Turbo Toolkit ligeramente
                más pequeña para usuarios de SMSQ/E.
TURBO_REM_CODE- un suboconjunto de Turbo para la inclusión
                en programas compilados.
TURBOBASE_ASM - código fuente en ensamblador del toolkit.

Turbo Manuales:

TURBOTOC_TXT  - Tabla de contenidos del manual.
TURBOS1_TXT   - manual de Turbo en cuatro secciones.
a TURBOS4_TXT
UTILITY_TXT   - manual de las utilidades
T_CONFIG_TXT  - manual de T_CONFIG_DATA y T_CONFIG_LOAD
TASCOM_TXT    - manual para Task Commander, una utilidad
                que ayuda a convertir un porgrama compilado
                en una extensión del BASIC (es decir, un
                fichero que puede ser cargado con
                LRESPR en lugar de EXEC)
TURBODEM_TXT  - describe el contenido de los ficheros de
                demostración de Turbo Toolkit suministrado
                en el paquete de "Programas Asociados" 

Adicionalmente, estos documentos de referencia también están disponibles,
pero realmente no los necesitas al principio

TURBOREF_TXT - fichero de referencias. Listado de mensajes de error y comandos del Turbo Toolkit en orden alfabético LINKLOAD_TXT - ejemplos de cómo usar LINK_LOAD INTFILE_TXT - explicaciones de Simon Goodwin sobre la generación de código intermedio producido por el "parser" para el generador de código. TURBOREP_TXT - un artículo de Simon Goodwin acerca del diseño de Turbo. Programas asociados: TASCOM - Task Commander transforma un ejecutable en un comando SuperBASIC. DATASPACE_TASK- un programa que cambia el área de datos de una tarea. LIBRARY_MANAGER-un programa que extra rutinas TURBO_TK_DEMOS- un conjunto de programas de demotración con procedimientos y funciones útiles. MAKE_MODULES - una utilidad para partir un programa SuperBASIC en módulos más pequeños.

Descomprime todos los ficheros que piensas que vas a necesitar y ponlos todos juntos en un disquete o en un directorio de tu disco duro. Si intentas usar Turbo Toolkit deberás cargarlo primero mediante RESPR o LRESPR.

LRESPR FLP1_TURBO_TK_CODE

Existen tres versiones diferentes de Turbo Toolkit. Turbo_TK_Code es la apuesta más segura en el sentido de que funcionará bien en todos los sistemas. Turbo_SMS_Code sólo funcionará en sistemas SMSQ/E, y tiene la ventaja que es ligeramente más pequeño (si estás usando SMSQ/E Turbo_SMS_Code es la versión que debes usar, ya que se añade soporte a algunas características avanzadas de SMSQ/E). La tercera versión, Turbo_REM_code, es más reciente y adaptada a las nuevas versiones de Turbo, donde puedes incrustar el toolkit dentro de un programa compilado, en lugar de tener que cargarlo previamente con LRESPR. Para ver cómo "incluir" o "adjuntar" esta facilidad tendrás que mirar en el fichero CHANGES_TXT el uso de la directiva REMark %%:

REMark %%<filename>,a,b

El nombre de fichero a incluir está indicado por <filename> y puede llevar dos parámetros, a y b:

a es el desplazamiento al código de inicialización en el fichero, o 0 (cero) si no hay rutina de inicialización.

b es el desplazamiento a la tabla de inicialización.

La línea con REMark %% pude estar en cualquier lugar dentro del programa SuperBASIC. Ésta es una característica avanzada y por ahora no necesitas saber nada más sobre esto.

Turbo_Rem_Code es una versión especial de Turbo Toolkit diseñada para la inclusión en el programa compilado, y utiliza la directiva

REMark %%flp1_turbo_rem_code,6,10

Una vez que has cargado Turbo Toolkit, puedes cargar tu programa SuperBASIC y listar o editar algunas líneas para garantizar que es un programa listo para ser compilado.

Ahora debemos asegurarnos que el valor predeterminado de PROG_USE está apuntando a la unidad de disco o subdirectorio que contiene los programas PARSER_TASK y CODEGEN_TASK. Si se está apuntando a otro lugar, el comando CHARGE que se utiliza para iniciar el compilador no encontrará los programas necesarios. Así, suponiendo que el compilador está en FLP1_ el comando PROG_USE FLP1_ hará que Turbo esté listo para empezar a compilar. Introduce ahora el comando CHARGE y deberás ver la aparición del panel principal de configuración del compilador (ver figura 1).

figura 1 - Panel principal de Turbo Compiler

Si por alguna razón el comando CHARGE no funciona, puedes también iniciar el proceso de compilación con los comandos EXEC_W o EW:

EW PARSER_TASK : EW CODEGEN_TASK

que es lo que hace esencialmente el comando CHARGE.

Este panel frontal te permite establecer una serie de opciones para configurar el proceso de compilación. En la línea superior se muestra una serie de información general y si se han detectado errores o no.

En la tercera línea hacia abajo, en el primer cuadro te permite elegir entre las opciones FREEFORM o STRUCTURED. Esto establece el nivel de comprobación para programas que estén correctamente estructurados o no. Para activar esas opciones usa las teclas del cursor y activa o desactiva la opción con la tecla ESPACIO. El siguiente cuadro de elección selecciona si deseamos utilizar código de 16-bit o no. Si el programa compilado es corto (menos de 64 kilobytes) Turbo intentará usar código de 16 bits para generar un programa más pequeño y más rápido.

La siguiente opción permite establecer si deseamos incluir números de línea en el programa compilado. Esto tiene incidencias en el tamaño del programa compilado, pero por supuesto hace que sea más fácil depurar programas porque los mensajes de error nos indicarán el número de línea donde se produjo dicho error. La siguiente opción te permite elegir las opciones BREVE, FAST y REMs, y por último en esta misma línea en la caja de selección del extremo derecho podremos configurar cuantas ventanas serán copiadas desde el BASIC al programa compilado (con cuantas ventanas abiertas comenzará el programa).

En la cuarta línea especificaremos el nombre del fichero del programa compilado. Hay un valor por defecto o RAM1_TEST_TASK cuando lo ejecutas por primera vez. Puedes cambiar esto si lo deseas usando el Config estándar o el programa MenuConfig para configurar los valores por defecto incluidos en PARSER_TASK. No hay bloques de configuración en CODEGEN_TASK o Turbo Toolkit.

En la quinta línea puedes especificar los objetos de datos (el espacio para datos del programa compilado, que por defecto son 2 kilobytes) en el cuadro de la izquierda (este valor se puede cambiar más adelante por medio de un programa llamado DATASPACE_TASK). En la caja de la parte derecha de esta línea, puedes especificar cuanta memoria se reserva para el buffer del compilador, que tiene influencia en la velocidad de compilación. Los sistemas QL modernos tienen un montón de memoria, así que no hay necesidad de escatimar en este apartado.

En el cuadro de informe (Report) se puede especificar el nombre de un fichero al cual se enviará los detalles de la compilación. Esto ayudará en el análisis de los errores generados. También en el nombre del TASK podemos especificar el nombre de la tarea para el programa compilado, este es el nombre que verás cuando se usa el comando JOBS para ver la lista de programas en ejecución.

en la línea inferior se puede establecer una cadena de opciones para la compilación de programas (ver el manual para más detalle). Por último, en la línea inferior se encuentra las opciones para salir (Quit) del panel.

Una vez establecidas las opciones deseadas debemos desplazarnos al cuadro del centro y pulsar ENTER para comenzar la compilación (cuadro COMPILE). El proceso de compilación comenzará, tomándose algún tiempo dependiendo del tamaño del programa a compilar. Si se producen errores serios, aparecerá un mensaje y el analizador (Parser) parará su ejecución, ya que en otro caso se producirán resultados inesperados en la fase de generación de código.

Si todo ha ido bien y no se han producido errores, tendrás un bonito programa compilado listo para ejecutar con EXEC. Por supuesto, recuerda que si has generado el programa en un RamDisk, necesitas grabar el programa a disco antes de apagar o reiniciar tu QL, en caso contrario lo perderás. La compilación a un disco RAM puede ser mucho más rápida que compilar a un disco flexible, y es especialmente útil en las compilaciones de prueba.

Hay algunas otras opciones disponibles con el comando CHARGE, que ayudarán a automatizar el proceso de compilación en cierta manera:

CHARGE 'nombrefichero' especifica el nombre de fichero para el programa compilado.

El comando CHARGE \ con la barra invertida a continuación, compilará automáticamente el programa usando la configuración por defecto y saltando el panel principal. Esto es muy útil si quieres compilar rápidamente un programa para uso propio o para pruebas sin molestarte demasiado por los ajustes del compilador.

Para complicarte un poco la vida (más fácil una vez que te acostumbras, especialmente en la elaboración de programas más complejos) existen una serie de directivas para especificar al compilador muchas de las opciones establecidas en el panel principal. Por ejemplo, el comando TURBO_model 1 fuerza al compilador a crear programas como si se hubiera especificado la opción "<64" en el panel frontal. TURBO_objdat '50' asignará 50 KB al espacio de datos en el programa compilado. Si estas desarrollando varios programas complejos, puedes incluir esas directivas en tu programa para estandarizar de forma consistente el proceso de compilación cada vez que cambias algo.

¿Cuánto es compatible el compilador Turbo?

La respuesta no es inmediata. Necesitas leer extensos ficheros de documentación suministrados con el compilador para encontrar exactamente qué se compilará y qué cosas no se compilarán correctamente. Para un uso general, sólo necesitas algunas directrices simples para conseguir que pequeños programas se compilen sin ningún problema.

Para programas más complejos, necesitarías leer los manuales con más detalle, pero te acostumbrarías rápidamente a los cambios. Las principales novedades que fueron para mi más destacables son las facilidades de manejo de errores (Turbo tiene su propio sistema de captura de errores WHEN_ERROR 1 Y WHEN_ERROR 2 a diferencia el del comando WHEN ERRor de SuperBASIC/SBASIC), el uso del paso de parámetros por referencia (para usar parámetros por referencia se debe emplear el comando REFERENCE en la definición de la lista de parámetros), y la necesidad de ser cuidadoso con el uso de strings o cadenas dimensionadas pues en comparación las reglas pueden ser un poco diferentes a las del BASIC ordinario.

Se han hecho varios cambios en el compilador desde la popularización de SMSQ/E. El comportamiento de las ventanas se ha mejorado mucho cuando Pointer Environment (PE) está presente, por ejemplo.

George Gwilt ha desarrollado algunas utilidades para el uso del Compilador Turbo. La más destacable es TurboPTR, una utilidad bien pensada para escribir y compilar programas bajo PE. En cierto modo se puede comparar al toolkit QPTR de Tony Tebby, pero TurboPTR está específicamente orientado al uso de Turbo.

Las utilidades Turbo-config o T-Config te permiten incluir bloques de configuración para el uso de programas compilados.

Los 'Associated Programs' o programas asociados son versiones renovadas incluidas con la versión original de Turbo, actualizadas para trabajar mejor en los sistemas recientes y para aprovechar mejor las facilidades disponibles en los sistemas QL actuales.

Resumiendo

El compilador y el Toolkit han tenido una importante remodelación en los últimos tiempos y merece la pena obtener una copia actualizada. Si tu única experiencia con Turbo ha sido con versiones anteriores correspondientes a la primera década del QL, o simplemente has leído algo de la versión original de Digital Precision deberías descargarte la nueva versión y probarlo. Es un paquete bastante complejo, y por supuesto, la gran cantidad de documentación puede hacer desistir a muchas personas de intentar aprenderlo.

Una serie de nuevos comandos y variaciones a los comandos existentes se han añadido a Turbo Toolkit y al Compilador Turbo en los últimos años, especialmente destinados a facilitar la tarea a los usuarios de SMSQ/E y GD2, en estos casos bien merece la pena la actualización a las últimas versiones.

Hay muchas más cosas que decir sobre Turbo pero no caben en un artículo corto como este. Espero que este breve recorrido te ayude a comenzar con él y te anime a utilizar el Turbo Toolkit y el Compilador Turbo después de todo el trabajo realizado por gente como George Gwilt y David Gilham para poner al día este fantástico compilador.

Artículo original: http://www.dilwyn.me.uk/docs/articles/turbo.zip


Sinclair QL Recursos en Castellano Alojado en / Hosted at:
Sinclair QL Recursos en Castellano
Sinclair QL Spanish Resources