Sieve en PowerBASIC Console Compiler 6

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%.

CompiladorTamaño ejecutable (bytes)Tiempo de ejecución (ms)
PowerBASIC Console Compiler 5.015.87211.483
PowerBASIC Console Compiler 6.0414.33610.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).

17 comentarios en “Sieve en PowerBASIC Console Compiler 6”

  1. No está mal. Una prueba mas de lo que podría dar de sí esta herramienta, si los tiempos que corren no fueran en los que estamos. La «gente corriente» piensa: «¿y para qué? Yo prefiero mi Android». Pues estas herramientas y con esta filosofía son las que un día puede que lleven al hombre a Marte, o a la conquista del Espacio; por eso la USSS con su informática fueron los primeros (y únicos, hasta el momento, ni la NASA lo ha logrado) que pudieron hacer aterrizar una sonda en Venus, o realizar cálculos más precisos y a punto de ser los primeros en llegar a la Luna con un presupuesto irrisorio comparado con el que tenían los USA. Si la gente espera con Android y con navegadores patateros hechos en China con máquinas virtuales que petan por todos lados conquistar las galaxias, van listos. Pero nada, mientras haya menús animados, con transparencias y degradados, ellos tan contentos. Eso sí, para desplegarlos requieren un chip que a lo único que se dedica el 99% de su CPU es ha calcular mezclas de colores y hacer grafías de contornos y sombreado. De chiste.

  2. Así es BiaNamaran. Por ejemplo la Mars Pathfinder, ejecutaba VxWorks, un sistema operativo en tiempo real, pero sin alardes gráficos. Cuando lo que priman son los resultados, y recordemos que ese es el objetivo de la informática o computación, procesar lo más eficientemente posible unas entradas, para generar unas salidas lo más exactas y veloces posibles, debemos olvidarnos de chorradas: ni sombras, ni texturas, ni 3D.

  3. Muchísimas gracias Fernando. Hace un tiempo estuve buscando ese tipo de información en fuentes oficiales, y estaba tan disgregada, que apenas saqué nada en claro. Este artículo, me ha resultado interesantísimo. Ver que utilizan arquitecturas estándar, pero construidas de manera reforzada, con protecciones adicionales, y en muchos casos, con certificados MIL.

  4. Hay más de un comentario que es, al menos, igual de bueno que el artículo…

    No he podido encontrar el artículo que buscaba, en parte porque no recuerdo dónde lo leí, en el que explicaba cómo se desarrollaba el software de un satélite.

  5. Buenas. Soy Nuevo preguntando y estoy programando en Powerbasic 6.03, me hago mis propias aplicaciones personales y no soy un gran programador sofisticado. en realidad quisiera ver si me puedes ayudar sacandome de dudas en esto: cuando usaba Powerbasic en plataforma windows x 32 podia usar el juego de caracteres ANSI hasta 255, cuando me pase a windows x64 solo puedo usar hasta el chr$(125) por encima de esta valor Powerbasic 6.03 no me los reconoce, por lo que si tengo esos caracteres graficos las pantallas de entrada de datos pierden mucho, y no puedo usar los caracteres acentuados. gracias por toda tu ayuda.

  6. Es muy extraño Crispin Nunez. Llego años usando una arquitectura x64 y nunca me había ocurrido. He hecho una prueba rápida, compilada con PBC 6.04 y ejecutada sobre Windows 10 x64. Este es el código:

    Function PBMain
    Print Chr$(200)
    End Function

    Lo he ejecutado, y como esperaba, la salida de pantalla ha mostrado en la consola:
    È

  7. Hola Javier. Note que sabes mucho de PBCC y quizas me puedas ayudar. hago pequeños programas en Powerbasic Consola para mi uso persona, no soy un gran programador pero suficiente para mi uso. mi problema es que antes usaba win7 x 64 y podia usar todo el juego de caracteres ASCI hasta 255, el los codigos de programas, Bien cuando me pase a Win7 x 64 Resulta que solo puedo usar los codigos ASCI hasta 127, y esto es un problema para el diseño de pantallas, Te pregunto si esto tiene solucion o es un problema sin solucion. Gracias de antemano por tu ayuda y seguire muy de cerca tu Blog. hasta Pronto y Gracias de mi Parte.

  8. Gracias por tu mensaje Crispin Nuñez. Creo que la pregunta está muy relacionada con la de hace 3-4 meses. Como ves el código de ejemplo que utilicé usaba el carácter ANSI 200 y se mostraba correctamente. Tal vez si proporcionas más información sobre lo que no funciona, o el código que tienes podría ser más conciso.

  9. Hola Javier. Gracias por tu pronta respuesta. Lo que quiero decir es que en los programas con PBCC no puedo usar los codigos para imprimir en pantalla (CHR$(189), CHR$(190) o CHR$(200) y estos los uso para diseñar las pantallas de los programas en el Monitor.
    Tambien aprovecho para preguntarte si es posible usar en la consola de PBCC una Paleta de colores superiores a los que van de 0-8 y 9-16 que es la paleta basica. esto si es posible sin usar el modo Grafico o salida en cajas Graficas.
    Muchas Gracias.

  10. Crispin Nuñez, en principio Windows usa desde hace tiempo la página de códigos ISO-1252 (https://es.wikipedia.org/wiki/Windows-1252), esto ocurre tanto en las versiones x86 como en las x64. Otra cosa eran las versiones de DOS, que en castellano usaban la 437 (https://es.wikipedia.org/wiki/Página_de_códigos_437). Supongo que estás al tanto, pero esencialmente quiere decir que todos aquellos caracteres que están fuera del rango definido por ASCII, se mapean diferente en función a la página de códigos. Como el 200 es un extendido no incluído en ASCII, cada página lo dibuja diferente.

    Por fortuna Powerbasic te permite cambiar la página de códigos a usar, algo que puedes hacer así:
    Function PBMain
    UCodePage 850
    Print Chr$(200)
    End Function

    En la documentación tienes más detalles al respecto, pero ya que la he tenido que mirar, te lo pego aquí:

    Purpose
    Set the default codepage used for ANSI / UNICODE conversions.

    Syntax
    UCODEPAGE ANSI|OEM|NumExpr [TO PrevPage&]

    Remarks
    PowerBASIC will make many conversions between ANSI and UNICODE (wide character) strings. UCODEPAGE specifies the CodePage to be used for these translations. The default is UCODEPAGE ANSI which will use the system ANSI codepage for your computer. UCODEPAGE OEM will use the system OEM codepage for your computer, while a expression can specify a particular CodePage of your choice.

    If the optional TO clause is used, the number of the previous default CodePage is assigned to the long integer variable specified by PrevPage&. By saving the previous codepage, you can later restore it, if that’s appropriate.

    This statement does not change the CodePage in use by your computer. It tells which codepage PowerBASIC should use for ANSI/UNICODE conversions.

    By default, the system ANSI CodePage, is used to map the character translation, and this generally works very well, as it represents the usual codepage for your primary language. However, if you are compiling a CONSOLE application which makes use of the high-order ANSI codes, CHR$(128) through CHR$(255) for line drawing and a few international characters, you should declare an OEM CodePage by placing UCODEPAGE OEM at the start of your MAIN function.

    The CodePage specification is maintained on a thread-by-thread basis. At program start, the default is the system ANSI CodePage. If a new procedure is launched, it inherits the CodePage in use by the main thread.

    See also
    ACODE$, UCODE$

  11. Hola Javier. Muchas gracias por tu ayuda, en realidad no entendia bien lo de el uso o cambio en las paginas usado por PBCC, siento al de pena por haberte molestado por esto. Perdona.
    Volviendo a molestarte, puedo usar en el modo consola sin usar salida Grafica en PBCC un juego de paleta de colores mas completos que los que van del o al 16. Vi algo como usar RGB pero no se hacerlo, un Millon de infitas gracias. y Perdona mi atrevimiento

  12. Me alegra haberte sido de utilidad Crispin Nuñez. Los colores que acepta COLOR, por razones de compatibilidad son sólo del 0-15. Efectivamente puedes modificar la paleta o usar el modo RGB, pero eso requiere el modo gráfico, no de consola. De hecho las consolas nativas con más de 16 colores es algo que recientemente se agregó a Windows 10, mucho después de la última actualización de PBCC.

  13. Muchas Gracias Por tu tiempo Javier. Me fue muy util tu ayuda. Mil Gracias Si se me ocurre otra duda te consultare: de nuevo. Muchas Gracias.

Deja un comentario