DEV Community

Programando en BASIC después de 30 años

Últimamente estoy programando en BASIC para cierta plataforma que no puedo olvidar.

El Sinclair Spectrum 128k de Investrónica de 1985

¿Por qué BASIC? Sinclair Basic es bastante más lento que Microsoft Basic (desarrollado para múltiples microordenadores), y especialmente que Locomotive Basic, desarrollado para el Amstrad CPC. Además, utiliza números de línea con GOSUB/RETURN, algo por lo que no estoy dispuesto a (volver a) pasar.

Sí, hay gente que programa en Sinclair BASIC y después va y lo compila, con herramientas de la época como el Colt Compiler de Hi-Soft.

Otra elección natural sería Z88DK, que permite programar en C para múltiples retro-multi-plataformas.

El caso es que... ZXBasic, mi elección de compilador esta vez, permite programar en algo parecido a Microsoft Visual Basic, bueno, más bien a FreeBasic. El caso es que, al contrario que con Z88DK (que está muy bien para programas multi-retro-plataforma), ZXBasic permite utilizar las características propias del Spectrum, como los ¡8 colores!, el brillo, los comandos gráficos como CIRCLE() o LINE(), o los UDG's (Gráficos definidos por el usuario, o User-Defined Graphics).

ZXBasic icon

El caso es, que al fin y al cabo, Basic ha inspirado Python. Y lo estoy notando, porque... ¡tengo que escribir menos para programar en BASIC! En BASIC moderno, claro.

if ( x > 2 ) {
    printf( "¡Programar en C mola!" );
}
Enter fullscreen mode Exit fullscreen mode
if x > 2
    print( "¡Programar en BASIC también es molón!" )
end if
Enter fullscreen mode Exit fullscreen mode

Si analizamos el código, nos encontramos con que 1) No es necesario poner un punto y coma (';'), al final de cada instrucción; 2) No hay que abrir un bloque de código con '{', sino que la propia línea if x > ... es el propio comienzo del código. En Python es similar, excepto que hay que añadir dos puntos (':'); 3) El final de un bloque de código se indica con end if, de forma similar a otros lenguajes de programación como Pascal. Esta forma de indicar los bloques de código automáticamente elimina ambigûedades (lo suele derivar en polémicas), como por ejemplo dónde colocar la llave de apertura en C.

Como nota al pie, desgraciadamente Python no soporta un end de ningún tipo para marcar el final de un bloque de código, para mi disgusto personal, confiando solo en la indentación.

No todo son ventajas, claro. Por ejemplo, una condición compuesta para if...

if x > 2 _
and x < 10
    print("2 < X < 10:", x)
end if
Enter fullscreen mode Exit fullscreen mode

Diferentes dialectos de BASIC soportan diferentes caracteres para indicar el final de la línea de código. En este caso, se utiliza el subrayado, como '_'. Quizás esto no es muy estético, pero desde luego compensa el tener que colocar un ';' al final de todas las sentencias. Python toma claramente la delantera al definir expresiones multilínea. Si una expresión de cualquier tipo se encuentra entre paréntesis, entonces puede traspasar el límite de la línea de código tantas veces como lo necesite.

for(int i = 0; i < 10; ++i) {
    printf( i, " x 5 = ", i * 5 );
}
Enter fullscreen mode Exit fullscreen mode
for i = 0 to 9
    print( i, " x 5 = ", i * 5 )
next
Enter fullscreen mode Exit fullscreen mode

Sí, el bucle for() de C es potentísimo. Pero, ¿merece la pena tener que escribir siempre tanto? Debería tener una versión mínima más parecida a for... next de BASIC. Aquí Guido Van Rossum (creador de Python), lo tuvo claro.

for i in range(0, 10):
    print(i, "x 5 =", i * 5)
Enter fullscreen mode Exit fullscreen mode

Y aunque existe una palabra clave para indicar comentarios (REM), la abreviatura más común (el apóstrofe) es soportada prácticamente en todos los dialectos.

' Tabla de multiplicar del 5
for i = 0 to 9
    print( i, " x 5 = ", i * 5 )
next
Enter fullscreen mode Exit fullscreen mode

Además, hay que tener en cuenta que este BASIC es mucho más moderno, estructurado, y por tanto soporta procedimientos (subrutinas) y funciones.

function isdigit(byval s as string) as bool
    dim sc as ubyte = code( s( 0 ) )
    return sc >= code( "0" ) and sc <= code( "9" )
end function

sub print_code_array(byval s() as ubyte)
    for i = lbound( s ) to ubound( s )
        print( chr( s( i ) )
    next
end sub
Enter fullscreen mode Exit fullscreen mode

No todo son ventajas. Aunque FreeBASIC soporta estructuras e incluso objetos, ZXBasic no soporta ninguno de las dos. Lo de soportar POO me parece excesivo, pero en cambio soportar estructuras me parece básico. Así, hay que adaptar un tanto la forma de pensar, pues no se pueden empaquetar variables que actúen con un objetivo común.

Es refrescante desempolvar los conocimientos de programación arcanos, pero también aprender a complementarlos con las extensiones de subrutinas y funciones.

Top comments (1)

Collapse
 
kamaranis profile image
Anton Barrera

Hola Baltasar, gracias por tu publicación.

Ha sido algo así como una cápsula del tiempo. Recuerdo haber aprendido BASIC como pude en su época, lo que me convierte en un autodidacta prehistórico. Fotocopias de "libros", manuales tochos ilegibles comprados con ahorros en unos grandes almacenes por encargo, revistas etcétera en una época donde tus padres se preocupaban si te veían escribiendo "arcanos" en una pantalla monocromática mucho tiempo.

Pero después de eso ya apenas pude usar lo que aprendí de BASIC, salvo que como has dicho, mucho de lo aprendido BASIC es fácilmente adaptable a Python. Esto ayuda mucho. Pero si tuviera que volver a programar algo en BASIC seguramente necesite un tiempo de adaptación.

Por cierto no me ha quedado claro cómo programas en BASIC en estos tiempos. Usas directamente 'freeBASIC'? O usas 'zxbasic'?

Estaba pensando en que si saco tiempo voy a desempolvar conocimientos arcanos oxidados. Alguna recomendación para Linux y Windows?

En todo caso, cuando pueda retomar esto publicaré mis impresiones y alguna guía para almas perdidas del conocimiento arcano.

Un saludo