Tras el anuncio de que Powerbasic es ahora gratuito, y después de los últimos artículos que publiqué relativos a Ejemplo con PB/Forms y a Ejemplo con PB/CC, he estado siguiendo activamente la situación de Powerbasic, para ver cómo evoluciona, esperemos que de manera feliz, y no a mucho tardar, tengamos un Powerbasic 11 con soporte Win64.

Lo cierto es que me topé en la página de testimonios de la compañía, con lo que han bautizado por Friends of PowerBASIC, donde en 2010, me hacía eco de Sieve en BASIC. Si recordáis, era una comparativa donde diferentes compiladores de BASIC, ejecutaban el mismo programa de la Criba de Eratóstenes para calcular números primos. En ella, Powerbasic demostraba su liderazgo en tiempo de ejecución, siendo la versión más rápida de toda la comparativa, que incluía a FreeBasic, Hotbasic, PureBASIC, QB64 y Visual Basic .NET. Ofrecía un rendimiento parejo al de la implementación de Sieve en Pascal, e incluso vencía a Free Pascal, sin llegar a quedar demasiado alejado de los resultado de Sieve en C.

En aquel año 2010, usaba Powerbasic Console Compiler 5, pues la versión 6, no aparecería hasta el año siguiente (2011). Ahora, he aprovechado para actualizar la comparativa, y esta vez, sí que he usado PB/CC 6.04, la última versión disponible hasta el momento, publicada en 2013.

He comentado varias veces, que una de las virtudes de Powerbasic, es su énfasis en la eficiencia y el rendimiento. Dos aspectos que tal vez no asocies al lenguaje BASIC, pero que efectivamente, no son excluyente, como ahora podréis ver. Tan simple como partir de exactamente el mismo código fuente de Sieve.bas que usé en 2010, y recompilarlo con PBCC 6 sin modificar nada en absoluto:

#Register All
Macro MAXITER = 50000&
 
FUNCTION PBMain
    Register i AS LONG, k AS LONG
    DIM found AS LONG, iter AS LONG
    DIM flags(MAXITER) AS LONG
    DIM start AS DOUBLE, finish AS DOUBLE
    DIM a AS STRING
 
    PRINT MAXITER "iterations"
    start = TIMER
    FOR iter = 1 TO MAXITER
        found = 0
        FOR i = 0 TO MAXITER
            flags(i) = 0
        NEXT
        FOR i = 2 TO MAXITER
            IF flags(i) = 0 THEN    ' found a prime
                Incr found
                FOR k = i+i TO MAXITER STEP i
                    flags(k) = 1
                NEXT
            END IF
        NEXT
    NEXT
    finish = TIMER
    PRINT found; "primes in"; INT((finish-start)*1000) ; "ms."
    INPUT A
END FUNCTION

No está nada mal, dentro del poco juego en cuanto a optimizaciones adicionales que da este Sieve, la última versión de Powerbasic, ha dado una mejora de algo más de un 5%, sin tocar nada del código fuente original.

Cuesta de creer, pero esta mejora de velocidad, no es a costa de aumentar el tamaño del código, más bien lo contrario, pues el tamaño, se ha reducido en casi un 11%.

Compilador Tamaño ejecutable (bytes) Tiempo de ejecución (ms)
PowerBASIC Console Compiler 5.0 15.872 11.483
PowerBASIC Console Compiler 6.04 14.336 10.908

De manera que en el transcurso de tres años, desde 2008, cuando se presentó PBCC 5, hasta 2011, cuando se lanzó PBCC 6, Robert Zale logró que sus herramientas generasen no solamente un código más veloz, sino también más compacto. Nada que ver, por desgracia, con la evolución de la mayoría de herramientas actuales.

Si tienes curiosidad, he dejado el código fuente, y los binarios aquí (18 Kb. en formato ZIP).