Intérpretes y compiladores de BASIC para Debian

Descripción del contenido de la página

Apuntes sobre la búsqueda de un intérprete pluriplataforma de BASIC para Debian.

Etiquetas:

Entre 2012-09 y 2012-10 dediqué un tiempo a buscar un intérprete de BASIC que fuera multiplataforma y funcionara en Debian armel. Prefería un intérprete a un compilador, pero no descartaba elegir un compilador si tenía características interesantes. Por el mismo motivo probé alguna versión de BASIC que no era pluriplataforma. Mi objetivo con el lenguaje elegido era desarrollar algún proyecto pequeño, mayormente conversiones de programas antiguos.

Esta página contiene las notas, posteriormente remozadas y completadas, que tomé de cada sistema durante la instalación, la lectura de la documentación o las pruebas de programación. No es una comparativa precisa porque las reseñas no son paralelas.

Aún no he probado otras implementaciones del lenguaje, que están en lista de espera, como RapidQ (abandonado pero aun así interesante), SmallBASIC y ScriptBasic. No obstante, dada la conclusión de la búsqueda, probablemente pase un tiempo antes que les eche un vistazo.

Brandy (versión 1.20pre5, de 2007-12)

Toparme con Brandy fue una sorpresa agradable: Es una implementación muy completa y lograda del BASIC V de Acorn, que apareció por primera vez con la computadora Archimedes y el sistema operativo RISC OS. Esta versión del lenguaje es una evolución del BASIC de la computadora BBC Micro de los años 1980, también de Acorn.

Brandy no tiene una presencia clara en Internet; afortunadamente es un paquete provisto por Debian. Un lugar para empezar a buscar información es la página del autor de Brandy (en 2005).

Me gusta

La documentación es excelente: completa, detallada y bien organizada. Desgraciadamente está en ficheros de texto; en HTML sería más fácil de consultar.

Comando OSCLI para invocar comandos del intérprete anfitrión y obtener el resultado en una matriz de cadena.

Permite exportar a un fichero el programa escrito con el editor interno, y opcionalmente indentarlo y quitarle los números de línea. También permite llamar a un editor externo para editarlo, con las mismas opciones.

No me gusta

La sintaxis de BBC BASIC me parece menos legible que otras.

Las variables son sensibles a mayúsculas. Las llamadas por Brandy «palabras clave» (como son IF y WHILE, por ejemplo), deben escribirse en mayúsculas, pero no así los llamados «comandos» (como LOAD y LIST), que son reconocidos de cualquier forma.

No permite salir anticipadamente de un procedimiento.

La sintaxis de definición de funciones es particularmente extraña: no tiene indicador de final y para devolver el valor usa asignaciones «en el aire».

El sonido y parte de los comandos gráficos solo funcionan en la versión de Brandy para RISC OS.

La librería gráfica pluriplataforma utilizada, Jlib, obliga a usar un solo modo de pantalla; el elegido es de 800x600 pixeles y 256 colores.

No tiene etiquetas. Esto obliga a usar números de línea para hacer un RESTORE selectivo. Esto es un inconveniente porque los números de línea pueden omitirse cuando se escribe el programa en un editor externo.

bwBASIC (versión 0.50, de 2009-06)

Probé las versiones 0.20 (1997-10), disponible como paquete ya compilado en Debian armel, y 0.50 (2009-06), disponible en Internet en código fuente.

Debido a que está disponible en Debian, ya conocía anteriormente bwBASIC y lo había probado en alguna ocasión.

Compilación

Para ejecutar configure, antes de la compilación de la versión 0.50, hay que darle a este fichero permiso de ejecución con chmod u+x configure y cambiar su formato de fin de línea de DOS a Unix. Yo lo hice con el editor Vim y el comando :set fileformat=unix.

Por lo demás el programa se compiló a la primera sin pegas con los comandos habituales: ./configure, make y (como administrador) make install. La instalación se hace, como es habitual en estos casos, en /usr/local/bin/.

Documentación

Una página de manual (en la versión 2.20) o un fichero de texto equivalente (en la versión 2.50) describen la versión 2.10 del intérprete. Todas las palabras clave están descritas con detalle, pero no así algunos aspectos generales del lenguaje, como el alcance de las variables, o la sintaxis de las etiquetas (para la que hay que ver uno de los programas de prueba incluidos).

Me gusta

Permite usar while y until para modificar los bucles do - loop, aunque con limitaciones: while solo puede usarse con do y until solo puede usarse con loop.

Permite usar directamente comandos del intérprete del sistema operativo anfitrión. Esto es cómodo pero tiene incovenientes. como se explica más abajo.

Tiene notación para números hexadecimales.

No me gusta

El editor de línea es muy rudimentario: no permite mover el cursor ni borrar. Tampoco tiene historial. No investigué si esto se solucionaría con una opción de compilación, para que el programa usara la librería readline.

Necesita call para llamar a una subrutina definida con sub - end sub.

Permite usar directamente comandos del intérprete del sistema operativo anfitrión. Esto es útil pero provoca que locate sea interpretado como el comando de Bash en lugar del propio comando locate de bwBASIC. Sería más seguro usar un comando de BASIC para pasar comandos al sistema anfitrión.

restore no puede usar una etiqueta; debe usar un número de línea. Esto es una limitación muy importante en ciertos casos.

return no permite devolver valores de una función; solo se usa para regresar de una subrutina llamada por gosub. para devolver un valor desde una función debe asignarse al nombre de la función.

exit permite salir de bucles, pero no de procedimientos o funciones. Esto es una limitación importante.

Los nombres de variables, al contrario de lo que ocurre con las palabras clave, distinguen entre mayúsculas y minúsculas.

Parece que la definición de matrices tiene un error: crea un elemento más de los indicados, independientemente de que el índice inicial esté fijado a 0 o 1. Además si se crea una matriz de un elemento cuando el índice inicial es 1, no permite acceder a él.

option base 1
dim a(1)
print a(1):rem error!

Carece de comandos o funciones relacionados con gráficos.

No tiene otra notación de comentarios que rem.

sdlBasic (versión 0.0.200707, de 2007-07)

sdlBasic es una implementación interesante del lenguaje, orientada a la creación de juegos gráficos de dos dimensiones. El lenguaje parece abandonado en los últimos años, pero hay una iniciativa para revitalizarlo

Curiosamente, el paquete de Debian sdlbasic contiene un editor gráfico para el desarrollo de programas en sdl BASIC y la documentación del lenguaje; el intérprete está en el paquete sdlbrt.

Me gusta

Muy completo. Muchos comandos y funciones relacionados con la programación de juegos.

Permite omitir el signo «$» en las variables y funciones de cadena, también en las propias del lenguaje.

Tiene end while como alternativa al más estándar pero más oscuro wend. Análogamente ofrece end for como alternativa a next. En mi opinión ambas formas hacen el código más legible.

Permite comentarios de final de línea sin necesidad de usar el signo «:» para separarlos del último comando de la línea.

No me gusta

No tiene let. En mi opinión let hace el código más claro. Algunos BASIC obligan a usar let; otros lo dejan al gusto del programador.

No permite estructuras if cortas, de una línea, con los comandos exit.

Tiene varias desviaciones peculiares respecto a la sintaxis y funcionamiento habituales en BASIC. Por ejemplo: read() y data().

A pesar de lo que dice la documentación, global no está implementado como sinónimo de common, forma menos habitual.

No permite encadenar varios if en una línea.

Algunas palabras clave funcionan como comandos y como funciones, según el número de parámetros. Por ejemplo, bobz(), spritez() y color(). Esto hace el código menos legible y es incómodo, aunque solo sea porque crea una excepción en el coloreado del código.

La función rnd devuelve un valor entre 1 y el número especificado. Sería más útil que el mínimo fuera cero, para permitir comparaciones más sencillas y rápidas cuando hay que elegir una sola opción entre varias. En mi opinión lo más lógico, útil y legible es devolver un valor entre 0 y el número especificado menos 1, como hace la función RANDOM de BaCon.

Problemas

Me costó mucho encontrar el motivo del siguiente error, que se refiere siempre a la última línea del fichero:

File "consulta_privada.sdlbas" , line 181
Syntax error: Parse error: expected end-of-line, but got ÿ

El signo que muestra corresponde a un octeto de valor 255.

Tras muchas pruebas, descubrí que eliminando la línea option qbasic del inicio del programa el error ya no ocurría. Esto parece un error del intérprete, pues no hay relación entre una cosa y la otra.

Bas (versión 2.2, de 2009)

Compilación

El primer intento de compilación fracasó. Deduje que necesitaba instalar flex, como así fue: Tras un make clean bastó repetir los pasos indicados en las instrucciones.

Sin embargo, de las pruebas ejecutadas por make check falló la número 34, relacionada con option base. Además, por algún motivo los comandos de terminal (como cls o locate) no estaban accesibles; provocaban el siguiente error: Error: Input/Output error (This installation does not support terminal handling).

Documentación

Documentación clara y completa (una extensa página de man, también en formato PDF).

Me gusta

El bucle do - loop puede combinarse con las condiciones while y until; aunque solo con una de ambas.

Dispone de exit sub y exit function para salir de procedimientos y funciones respectivamente.

Provee local para crear variables locales.

El comando option run permite impedir la interrupción de un programa con el teclado.

La estructura select case permite seleccionar rangos.

Comando shell para acceder al intérprete anfitrión.

No me gusta

No es pluriplataforma; solo funciona en GNU/Linux.

Como en el caso de bwBASIC, el editor de línea es muy rudimentario: no permite mover el cursor ni borrar, ni tiene historial. No investigué si una opción de compilación permitiría usar la librería readline.

En la definición de procedimientos se usa la sintaxis de BBC BASIC: proc debe unirse al nombre del procedimiento. Por ejemplo, un procedimiento llamado «tell» se definiría con def proctell y sería llamado con proctell. Lo mismo ocurre con las funciones, cuyo nombre debe comenzar con «fn» tanto en la definición como en la invocación. Esto es incómodo y hace los programas menos legibles. Afortunadamente la sintaxis alternativa ANSI (sub - subend) permite crear procedimientos que pueden ser invocados solo con su nombre.

No tiene etiquetas. Por tanto goto, gosub, restore y otros deben usar números de línea.

El bucle do - loop no puede combinarse con las condiciones while y until simultáneamente.

Para que una función devuelva un valor debe usarse fnreturn en vez de return.

El signo «$» es obligatorio para distinguir el tipo de las subrutinas que devuelven cadenas, así como para las variables y matrices de cadena. También lo usan las funciones que devuelven cadenas. Otros BASIC permiten omitir el signo «$» en todos esos casos.

Yabasic

Versión 2.762, de 2005-09-16

Esta fue la versión que encontré en la sede del autor de Yabasic, y supuse que era la más reciente.

La compilación (con el programa runme) falló sin decir el motivo. Sospeché que sería por la ausencia de flex, pero tras su instalación ocurrió igual:

Running configure ...
Trying to make yabasic ...

FAILURE, could not make yabasic !

La ejecución directa de make y el examen de sus errores descubrió que se echaba en falta el fichero /X11/Intrinsic.h:

In file included from main.c:20:
yabasic.h:80:27: error: X11/Intrinsic.h: No such file or directory

Con una búsqueda en la red confirmé el paquete al que pertenece, libxt-dev, que efectivamente no estaba instalado. Tras su instalación se produjo un error más oscuro para mí:

function.c: In function ‘peek’:
function.c:1537: error: ‘LINES’ undeclared (first use in this function)
function.c:1537: error: (Each undeclared identifier is reported only once
function.c:1537: error: for each function it appears in.)
function.c:1539: error: ‘COLS’ undeclared (first use in this function)

Me rendí. Además, ya había encontrado una versión más reciente:

Versión 2.9.15, de 2010-06

Existe un proyecto para el desarrollo de Yabasic 3, pero aún no había sido publicada una versión estable, solo versiones incompletas y experimentales. La nueva documentación aún estaba en desarrollo también.

No obstante en la página de descarga había una versión más reciente que la que yo tenía. La compilación funcionó bien, pero no así la ejecución: En el modo intérprete el programa aceptaba comandos pero no mostraba resultado; en el modo de compilación, todos los ficheros que probé provocaban errores de sintaxis en líneas correctas, en ciertos comandos.

La instalación de bison no supuso diferencia.

Por tanto los comentarios que siguen no están basados en la práctica con el lenguaje sino solo en la lectura de la documentación disponible.

Me gusta

Documentación completa y detallada en un gran fichero HTML.

Las subrutinas definidas con sub - end sub funcionan indistintamente como procedimientos o funciones. Por ello no tiene definición expresa de funciones (por ejemplo con function - end function).

Hace atajos lógicos al evaluar expresiones que usan and u or: solo evalúa la expresión hasta el punto en que su resultado ya no puede variar. Esto es más rápido y seguro.

Permite crear ejecutables con el intérprete integrado. Aunque las ventajas no son tantas como parece, y los inconvenientes varios, es una capacidad útil en ciertos casos.

No me gusta

El bucle do - loop no puede combinarse con las condiciones while o until; es un bucle sin final que solo termina con un break.

El signo «$» es obligatorio para distinguir el tipo de las subrutinas que devuelven cadenas, así como para las variables y matrices de cadena. También lo usan las funciones que devuelven cadenas. Otros BASIC permiten omitir el signo «$» en todos esos casos.

Blassic (versión 0.10.0, de 2005)

Ya había probado Blassic hacía tiempo, pero esta vez la compilación no tuvo éxito. Se produjo el siguiente error:

blassic.cpp: In member function ‘bool::Options::handle_option_print(int&)’:
blassic.cpp:443: error: ‘strcmp’ was not declared in this scope
make[1]: *** [blassic-blassic.o] Error 1
make: *** [all] Error 2

Me gusta

Permite crear «ventanas», marcos dentro de la ventana principal, a la manera de Locomotive BASIC o Beta BASIC.

Tiene variables del sistema, accesibles con PEEK y POKE, que permiten configurar varios aspectos del intérprete.

Permite leer un programa desde la entrada estándar.

No me gusta

Documentación pobre e incompleta: muchas palabras clave están listadas pero no documentadas, lo que según explica el autor puede significar ¡que no están implementadas!

No tiene procedimientos ni funciones largas; solo funciones cortas con DEF FN.

BaCon (versión 1.0 build 26, de 2012-05)

BaCon me parece un programa excepcional, muy original: Traduce código en BASIC (en su propio dialecto, llamado BaCon) a C y lo compila. Está escrito en varios intérpretes de comandos de Unix, por ejemplo Bash, lo que lo hace muy portable entre sistemas de la familia Unix, como GNU/Linux; ¡y está escrito también en el propio BaCon! Por tanto, con la versión escrita en Bash es posible crear un ejecutable a partir de la versión escrita en BaCon, que funcionará mucho más rápido.

Por cierto, BaCon no tiene nada que ver con otro lenguaje de programación llamado Bacon.

Me gusta

No usa números de línea.

Permite redimensionar las matrices dinámicas, preservando su contenido, con REDIM.

Permite proveer traducciones de los textos del programa compilado.

El comando ALARM permite indicar un procedimiento que ha de ejecutarse a intervalos regulares.

Permite crear librerías de C.

Provee LET, que es opcional. Los programas que usan LET me parecen más legibles.

Permite que la salida del comando PRINT, que puede formatearse, se dirija a una variable de cadena.

Provee RECORD para crear estructuras de datos, registros formados por varias variables agrupadas.

Provee la función REGEXP para usar expresiones regulares.

Provee SEARCH para buscar cadenas en ficheros.

La estructura SELECT permite comparar también con expresiones.

La función EXEC$ permite ejecutar un comando del intérprete anfitrión y obtener su resultado. El comando SYSTEM también se provee.

Permite incluir código en C.

Las funciones definidas por el programador pueden invocarse directamente, es decir, sin necesidad de usar su valor en una expresión o asignación. No así las funciones propias del lenguaje, lo que sería útil en algunos casos, como GETKEY.

Es posible definir un número indeterminado de parámetros en funciones o procedimientos, que serán recibidos en una matriz. Para ello se usa VAR.

Provee LOOKUP para buscar y extraer elementos de una matriz y crear otra nueva con ellos.

Usa solo SELECT en lugar del nombre más habitual SELECT CASE. Esto es más lógico, más corto, y aumenta la uniformidad en los nombres de las estructuras de control.

No me gusta

Las palabras clave deben escribirse en mayúsculas. Sin embargo entre los programas de ejemplo que se pueden descargar hay uno que aventura un posible remedio mediante la macro #define del preprocesador de C. Ampliando la idea escribí Lowercase BaCon.

Las matrices estáticas deben definir sus dimensiones con números o constantes, no con variables.

La concatenación de cadenas hay que hacerla con la función CONCAT$.

Los parámetros de procedimientos y funciones deben indicar su tipo.

No permite prescindir del signo «$» para distinguir el tipo de las variables y funciones.

RESTORE no permite especificar una etiqueta. Restaura el puntero al primer DATA del programa.

La estructura SELECT no permite comparar con rangos. Además, tampoco permite indicar listas de opciones salvo creando varias líneas CASE seguidas (encadenadas con «;»).

No incluye el alias END WHILE para WEND.

No tiene bucle DO - LOOP.

Las matrices estáticas de cadena solo pueden tener una dimensión.

En lugar de ELSE IF usa ELIF, más «oscuro».

No tiene EXIT SUB; no hay manera de salir anticipadamente de un procedimiento. La alternativa es usar una función, que afortunadamente puede invocarse directamente, sin hacer una asignación, y puede tener varios puntos de salida con RETURN, aunque siempre hay que devolver un valor.

RETURN siempre debe devolver un valor cuando se usa dentro de una función.

A pesar de que el manual dice que solo las funciones necesitan paréntesis, parece referise a las palabras clave, pues las invocaciones de procedimientos definidos por el programador necesitan paréntesis.

Las especificaciones de color del comando COLOR (por ejemplo BLACK, RED, etc.) no son constantes predefinidas, por lo que no pueden usarse como parámetros en otros contextos; solo pueden usarse acompañando a COLOR.

X11-Basic (versión 1.19 de 2012-05)

X11-Basic tiene muchas características muy interesantes que lo convierten para mí en una de las mejores opciones de todos los dialectos examinados.

Compilación

El primer intento de compilación no tuvo éxito. Primero porque al parecer había que instalar readline. Después se produjo otro error diferente:

/usr/bin/ld: cannot find -lx11basic
collect2: ld returned 1 exit status
strip: 'xbc': No such file
make: *** [xbc] Error 1

Lo dejé aparcado un tiempo. En cualquier caso el lenguaje, similar al GFA- BASIC de la Atari ST, me gustó menos que otras versiones.

En 2012-10-25 hice un nuevo intento, investigando con mayor detalle la instrucciones del fichero INSTALL.

Creé unos enlaces simbólicos a stddef.h y stdarg.h, que el programa de configuración no encontraba:

ln -s /usr/lib/gcc/arm-linux-gnueabi/4.4/include/stdarg.h /usr/include/stdarg.h
ln -s /usr/include/linux/stddef.h /usr/include/stddef.h

Creé x11basic.a con make x11basic.a. Copié x11basic.a y libx11basic.so a /usr/lib/ y les puse permisos 755.

Con make install (no make installroot como dice la documentación) se instalaron los ejecutables y las páginas de manual.

Sin embargo la ejecución del intérprete xbasic provocaba este error:

./xbasic: error while loading shared libraries: libx11basic.so.1.19:
cannot open shared object file: No such file or directory

Bastó hacer un enlace simbólico:

cd /usr/lib
ln -s libx11basic.so libx11basic.so.1.19

Con ello pudo ejecutarse por fin el intérprete xbasic. Todo lo demás parecía instalado correctamente.

Me gusta

Provee intérprete, compilador a código de octetos, compilador a código máquina y conversor de ANS BASIC a X11-Basic.

Posibilidad de pasar parámetros por referencia con var.

after y every para ejecutar procedimientos a intervalos.

exit if para salir de bucles.

sort para ordenar matrices.

system$ para ejecutar comando del intérprete anfitrión.

Muchos comandos gráficos y matemáticos.

inline$ para incluir datos binarios en el código en forma de ASCII (siete bitios).

prg$ para una usar línea del programa.

Muchas funciones de cadenas de texto, incluyendo conversiones entre cadenas y números codificados en varios octetos.

max y min aceptan un número variable de parámetros.

val? para averiguar el número de caracteres convertibles por val.

arrayfill para rellenar matrices.

dim? para conocer el número de elementos de una matriz (aunque no permite discriminar qué dimensión).

dump y help, para ayuda durante el desarrollo.

No me gusta

Los procedimientos (que se inician con procedure) terminan con return, en lugar de con endprocedure o algo similar, mientras las funciones sí disponen de endfunction.

Los procedimientos deben ser llamados con gosub o con el prefijo «@»; las funciones deben ser llamadas con el prefijo «@».

Las funciones de una línea, creadas con deffn, son compiladas como macros, no como llamadas. Es decir, su código se inserta completo en la expresión en que son citadas.

La función random devuelve un número entre cero y el parámetro (es más útil que el valor máximo sea el parámetro menos uno).

dim? devuelve el número de elementos de una matriz pero no permite discriminar qué dimensión.

No provee redim.

No permite incluir comillas en una cadena duplicando el carácter, que es el método habitual; solo se puede hacer concatenando el carácter con chr$.

La estructura select parece no estar implementada, a pesar de que está incluida en el manual.

El comando input imprime un signo de interrogación como presto (prompt) si no se indica un texto. No permite usar variables entre paréntesis como texto.

La documentación es extensa (en formatos de texto y PDF) pero tiene muchas erratas, no está al día y algunos pocos textos están en alemán.

La construcción ON GOSUB utiliza nombres de procedimientos sin el prefijo «@», lo que contradice la norma.

Las invocaciones de funciones deben usar siempre paréntesis aunque carezcan de parámetros.

Fallos

Durante las pruebas he encontrado algunos fallos en el lenguaje, que confirmaré y comunicaré al desarrollador:

Los bucles for no funcionan con variables enteras como índice; el bucle no avanza del primer valor. La documentación no menciona esto.

Los comandos data provocan un mensaje de error si el flujo del programa pasa por ellos; también procedure y function.

El intérprete y el compilador no dan error en una función cuyo parámetro es $variable en lugar de variable$, aunque después la función no funciona bien.

El comando restore con una etiqueta provoca el mensaje WARNING: free_parameter, Unbekannter typ $10 an dieser STelle, aunque funciona bien.

El compilador no acepta ficheros cuya extensión sea distinta de bas. Prefiero usar xbas para asignar el tipo de fichero adecuado en Vim y distinguir las fuentes de otros dialectos de BASIC.

El operador not puede usarse para negar una expresión entre paréntesis, pero no si el paréntesis está pegado:

let a=true
print a ! ok
print not a ! ok
print not (a) ! ok
print not(a) ! error "Array NOT() not dimensioned"

El intérprete no dio error con esta errata:
let entity_up %=5

Las funciones crscol y crslin no están implementadas, aunque el manual las incluye.

cls y home sitúan el cursor en la segunda línea. Para situarlo en la primera hay que usar locate.

Mientras que el comando print 1=2 funciona como cabe esperar y devuelve un valor lógico, print ("a"="a") provoca el error «Array () not dimensioned».

Casi todos estos errores y otros han sido ya solucionados por el autor de X11-Basic. La última versión disponible en el momento de actualizar estas líneas es la 1.19-8.

QB64 (versión 0.954)

QB64 es un compilador que crea código intermedio en C++. Primero pensé que tendría el mismo problema que con Free BASIC, pues QB64 está escrito en QB64, por lo que podría hacer falta una instalación previa de QB64 para hacer la compilación..., lo cual no es posible en Pandora porque no hay un ejecutable disponible para procesador ARM. No obstante solo el propio compilador, que integra el entorno de desarrollo, está escrito en QB64; el resto está escrito en C++.

QB64 incluye un programa de instalación en Bash que advierte de los requisitos:

QB64 Setup

Make sure the following packages are installed before continuing:
(SDL packages should be version 1.2 or 1.2.???)
    libsdl-dev
    libsdl-image-dev
    libsdl-mixer-dev
    libsdl-net-dev
    libsdl-ttf-dev (may report as version 2.0)
    timidity (only required if playing MIDI files)

Press any key to continue...

Tras instalar las librerías requeridas, la compilación monopolizó el procesador de mi Pandora hasta el punto de hacer imposible usar cualquier otro programa. Tras hora y media decidí interrumpir el proceso...

La salida de pantalla fue la siguiente:

m$ time ./setup.sh
QB64 Setup

Make sure the following packages are installed before continuing:
(SDL packages should be version 1.2 or 1.2.???)
    libsdl-dev
    libsdl-image-dev
    libsdl-mixer-dev
    libsdl-net-dev
    libsdl-ttf-dev (may report as version 2.0)
    timidity (only required if playing MIDI files)

Press any key to continue...

Checking for existance of 'g++'
****************************************
g++: no input files
****************************************
The above line should read 'g++: no input files'. If it doesn't yo
u need to install the g++ compiler before continuing.

Press any key to continue...

Creating 'qb64'...
(Notes: Warnings can be ignored. This process could take a minute
or so.)
/tmp/ccrmXz3k.s: Assembler messages:
/tmp/ccrmXz3k.s:138: Error: bad instruction `fldt [fp,#-12]'
/tmp/ccrmXz3k.s:138: Error: bad instruction `fistpll [r3,#0]'
/tmp/ccrmXz3k.s:181: Error: bad instruction `fldt [fp,#-12]'
/tmp/ccrmXz3k.s:181: Error: bad instruction `fistpll [r3,#0]'
/tmp/ccrmXz3k.s:222: Error: selected processor does not support `f
lds [fp,#-8]'
/tmp/ccrmXz3k.s:222: Error: bad instruction `fistpl [r3,#0]'
/tmp/ccrmXz3k.s:263: Error: bad instruction `fldl [fp,#-12]'
/tmp/ccrmXz3k.s:263: Error: bad instruction `fistpl [r3,#0]'
g++: libqbx_lnx.o: No such file or directory
qbx.cpp:710: warning: this decimal constant is unsigned only in IS
O C90
^C

real    96m57.102s
user    0m54.305s
sys     0m1.586s

Los errores de ensamblador no tenían buena pinta en cualquier caso.

QB64, heredero del antiguo QBasic, parece muy potente (no en vano el fichero comprimido que contiene la versión para GNU/Linux pesa casi 10 MiB). Sin embargo a primera vista las fuentes en QB64 parecen menos legibles que en otros dialectos de BASIC, precisamente por la herencia de QBasic.

Un segundo intento en 2012-10-24 tuvo el mismo resultado: La memoria quedó totalmente ocupada por el proceso, así como la mayor parte de la partición de intercambio; cualquier pulsación de tecla o movimiento del puntero se retrasaba un número indeterminado de minutos o simplemente no surtía efecto... Tras doce horas de espera tuve que apagar la máquina cortándole la corriente.

FreeBASIC

Ya había probado FreeBASIC tiempo atrás, para un pequeño proyecto (El bosque encantado [en FreeBASIC], pronto abandonado debido a que el lenguaje se me atragantó).

Probablemente, al menos por lo que conozco, FreeBASIC sea el BASIC libre más potente y versátil. No me gusta que sea solo un compilador, pero eso es parte de su fortaleza.

Animado por la inercia de probar dialectos de BASIC uno tras otro durante días decidí echar un vistazo a la última versión de FreeBASIC, pero únicamente para llevarme un chasco: Free BASIC está escrito en FreeBASIC. Esto ya lo sabía; pero no me había dado cuenta de lo que significaba: para instalar FreeBASIC. hace falta tener una instalación previa de FreeBASIC... Y esto es imposible en Debian armel: No hay una versión de Free BASIC compilada para procesadores ARM.

Conclusión

Probé a fondo y simultáneamente los dos BASIC que más me gustaron, sdlBasic y BaCon, convirtiendo un pequeño programa que escribí en 1985 para ZX Spectrum: Consulta privada.

La sensación fue parecida en ambos casos: estar combatiendo sin descanso contra el propio lenguaje, en varios frentes: sintaxis más o menos arbitraria y específica, documentación y, sobre todo, errores del intérprete o del compilador. Tras varios días de frustrantes pruebas, decidí olvidarme temporalmente de BASIC, y, como placentero desquite, empezar a escribir una versión de Consulta privada en Forth. En Forth no tengo que estar peleándome con el lenguaje; el código fluye casi solo.

No obstante cuando a finales de 2012-10 casualmente logré compilar X11-Basic, me impresionó favorablemente. Decidí probarlo a fondo programando un pequeño juego conversacional, Fifi. El desarrollo fue más fácil y productivo que con sdlBasic o BaCon, con diferencia. Encontré no obstante algunos errores, que comuniqué al autor, quien los fue solucionando. A pesar de algunos fallos e inconvenientes, X11-Basic es el dialecto que más fiable me ha parecido en la práctica, de todos los que he probado.