DEV Community

qb64: un "retro" GW-BASIC, para ordenadores modernos

QB64 es un entorno completo de programación que resulta ser un clon de aquel QBasic/QuickBasic de los años de MS-DOS.

Si sabes de lo que estoy escribiendo, es que viviste aquella época de los 90, como yo. Si no, es que te lo has perdido todo.

El IDE QB64

También en aquellos años (en los 90), existía QBasic, que era muy parecido a QuickBasic, pero sin la capacidad de compilar su código.

Por cierto, en Options >> Display, encontraremos la oportunidad de cambiar la visualización de 80x25 a 120x50, mucho más aconsejable.

Si, sí. QB64 genera código ejecutable de 64 bits. Pero además, es portable a nivel de código fuente entre Mac, Windows y Linux.

O dicho de otra forma: además de Free Pascal (para Pascal "retro"), puedes programar en BASIC "retro" y generar código sin que exista forma alguna de distinguirlo del código generado por gcc para C, por poner un ejemplo.

Así, en modo texto (aunque existe un IDE gráfico llamado Phoenix), podemos teclear nuestros programas, que el IDE los compile, y ejecutarlos con solo pulsar F5.

Como ejemplo, programé este cálculo de Fibonacci:

' Secuencia de Fibonacci

For n = 1 To 25
    Print fibo(n);
Next


Function fibo (x)
    Dim n1 As Long
    Dim n2 As Long
    Dim aux As Long

    n1 = 1
    n2 = 1

    For n = 2 To x
        aux = n2
        n2 = n1 + n2
        n1 = aux
    Next

    fibo = n2
End Function
Enter fullscreen mode Exit fullscreen mode

Salida de Fibo

Con la salida, previsible, siguiente.

1 1 2 3 5 8 13 21 34 55 89 144 233 377...
Enter fullscreen mode Exit fullscreen mode

Para poder llegar a los resultados más altos, es necesario cambiar Integer, el tipo que usaríamos normalmente, por Long, un entero de 32 bits.

Pero... ¿qué incorpora este ejecutable?

$ ldd fibo                                                                   
        linux-vdso.so.1 (0x00007f7cc39f9000)
        libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f7cc394b000)
        libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00007f7cc38f4000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f7cc37b2000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f7cc3400000)
        libm.so.6 => /usr/lib/libm.so.6 (0x00007f7cc36a4000)
        libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f7cc33d3000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007f7cc3000000)
        libGLdispatch.so.0 => /usr/lib/libGLdispatch.so.0 (0x00007f7cc335a000)
        libGLX.so.0 => /usr/lib/libGLX.so.0 (0x00007f7cc3329000)
        libOpenGL.so.0 => /usr/lib/libOpenGL.so.0 (0x00007f7cc3305000)
        libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f7cc32da000)
        /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f7cc39fb000)
        libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f7cc369b000)
        libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f7cc32d2000)
Enter fullscreen mode Exit fullscreen mode

Podemos ver cómo, además de incorporar las bibliotecas básicas del sistema operativo (esto cambiará en Windows o Mac), está claro que genera código C++, pues incluye la librería estándar de este lenguaje de programación. También podemos ver que proporciona capacidades gráficas, pues OpenGL está presente.

¡Probemos! Sí que tenemos que hacer algo "raro" con respecto a GW-BASIC: crear una "pantalla" del ancho y alto que deseamos:

screen _newImage(ancho, alto, profundidad_de_color)
Enter fullscreen mode Exit fullscreen mode

Podemos dibujar una línea con line:

line (x1, y1) - (x2, y2)
Enter fullscreen mode Exit fullscreen mode

¿Podemos dibujar un triángulo? Al margen de que haya otras maneras, si dibujamos "todas" las líneas desde un vértice superior hasta, primero, el vértice inferior izquierdo, y después al vértice inferior derecho, y todas las líneas intermedias, ya lo tendremos.

La esquina superior izquierda es el origen de coordenadas, es decir, (0, 0). Podemos colocar el vértice superior en (maxX / 2, maxY / 2). El vértice inferior izquierdo sería (100, maxY), y el vértice inferior derecho, (maxX - 100, maxY).

' Draw a triangle

Const maxX = 620
Const maxY = 450
Screen _NewImage(maxX, maxY, 32)


Call drawTriangle(maxX, maxY, maxY / 2)

Sub drawTriangle (maxX, maxY, length)
    ' The upper vertex is the center of the screen
    orgX = Int(maxX / 2)
    orgY = Int(maxY / 2)

    ' From the lower left to the lower right
    For x = 100 To maxX - 100
        Line (orgX, orgY)-(x, orgX + length)
    Next
End Sub
Enter fullscreen mode Exit fullscreen mode

La salida es un triángulo, lo prometido.

Triángulo dibujado en QB64

Mientras las funciones (que se crean con FUNCTION... END FUNCTION) pueden ser invocadas directamente, tal y como estamos acostumbrados en lenguajes de programación modernos, los procedimientos tienen que ser invocados con CALL.

BASIC es sin duda el lenguaje de programación retro. No puedo dejar de pensar en ZX BASIC de Boriel, el Basic del ZX Spectrum pero mucho más moderno, capaz de compilar para el aparato de Sinclair o el ZX Spectrum Next.

¿Y tú? ¿Cuáles son tus vivencias con BASIC?

Top comments (2)

Collapse
 
canro91 profile image
Cesar Aguirre

QBasic fue mi primer encuentro real con la programacion en la escuela. Claro, habia tenido clases de algoritmos, pero esa fue la primera vez que escribi unas lineas de codigo. No fue nada surreal o magico, fue otra clase mas que estudiar. Ni idea que iba a terminar dedicandome a eso :)

Collapse
 
baltasarq profile image
Baltasar García Perez-Schofield

Para mí sí que fue mágico. Una vez que tecleé mi propio programa en el ZX Spectrum, sabía a qué quería dedicarme. Y en el cole, en extraescolares, tuve un profe que nos enseñaba con ordenadores Amstrad PC1512, MS-DOS 3.3 y GW-BASIC. Lo cierto es que se sentían un paso atrás, comparados con el Speccy.