DEV Community

¿Vuelve dBASE?

Me he encontrado con varios vídeos en Youtube que hablan de cómo utilizar dBASE, o incluso Clipper, utilizando emuladores como DosBOX para MS-DOS.

dBASE III+ para MS-DOS

Chico, esto trae memorias. dBASE III+ fue un auténtico éxito comercial, pues permitía manejarse con bases de datos de manera muy, muy sencilla, imperativamente, eso sí (no como SQL, que se supone que lo hace todo por ti), pero de forma que, si sabes lo que estás haciendo, el acceso a la base de datos sea muy rápido.

Podías manejarte con una base de datos mediante las opciones de los menús, pero es que también podías utilizar comandos que permitían hacer consultas, modificar la estructura de la base de datos, añadir, modificar o eliminar registros...

Por ejemplo, lo que sigue es el ¡Hola, mundo!

procedure main()
     * This is an example
     clear
     ? "Hello, the weather is fine today"
return
Enter fullscreen mode Exit fullscreen mode

Poco después surgió Clipper, ¡un compilador! Podías distribuir ejecutables de tus programas, sin necesidad de que el cliente tuviese instalado dBASE.

El siguiente código crea una base de datos de contactos:

* Inicia la base de datos de contactos
procedure ini_contactos()
    create contactos
    use contactos

    * Campo nombre
    append blank
    replace field_name with "nombre"
    replace field_type with "c"
    replace field_length with 30

    * Campo email
    append blank
    replace field_name with "email"
    replace field_name with "nombre"
    replace field_type with "c"
    replace field_length with 20
    close
return
Enter fullscreen mode Exit fullscreen mode

La instrucción create crea una base de datos nueva, que se almacena en el archivo contactos.dbf (de nuevo, que recuerdos). La instrucción use la abre, y creamos los campos necesarios, para cerrarla con close.

Podemos crear un contacto molón como el que aparece abajo, con el siguiente procedimiento:

* Inserta un nuevo contacto
procedure inserta_contacto(nombre, email)
    use contactos
    append blank
    replace nombre with nombre
    replace email with email
    close
return
Enter fullscreen mode Exit fullscreen mode

Parece que una empresa ha recogido el testigo de dBASE, dBASE LLC. Pero lo que me ha impresionado más es que... ¡existe un alternativa moderna, de código abierto, llamada Harbour. He podido compilar el código que he escrito ahí arriba, y funciona creando un archivo de código fuente C que después debes compilar.

Clipper existió en una época en la que todas las interfaces eran de texto, sobre MS-DOS, por lo que, para pedir unos datos...

* Pide los datos de un nuevo contacto y lo inserta
procedure nuevo_contacto()
    local nombre, email

    clear

    * Muestra el prompt de entrada
    @ 5, 10 say "Nombre:" get nombre
    @ 7, 10 say "Email :" get email

    inserta_contacto( nombre, email )
return
Enter fullscreen mode Exit fullscreen mode

Sí, efectivamente, la arroba permite mover el cursor a un punto determinado de la pantalla, y say permite escribir algo en ella. Con get, en cambio, pedimos un contenido para una variable. Como se puede ver, las variables no tienen tipo, adoptando el tipo del valor que almacenan (como Python).

Una curiosidad: ojeando el código generado:

HB_INIT_SYMBOLS_BEGIN( hb_vm_SymbolInit_CONTACTOS )
{ "CONTACTOS", {HB_FS_PUBLIC | HB_FS_FIRST | HB_FS_LOCAL}, {HB_FUNCNAME( CONTACTOS )}, NULL },
{ "INI_CONTACTOS", {HB_FS_PUBLIC | HB_FS_LOCAL}, {HB_FUNCNAME( INI_CONTACTOS )}, NULL },
...
HB_FUNC( INI_CONTACTOS )
{
    static const HB_BYTE pcode[] =
    {
        36,3,0,176,2,0,106,10,99,111,110,116,97,99,
        116,111,115,0,100,100,9,100,20,5,36,4,0,176,
        3,0,9,100,106,10,99,111,110,116,97,99,116,111,
        115,0,100,100,9,20,6,36,7,0,176,4,0,20,
        0,36,8,0,106,7,110,111,109,98,114,101,0,78,
        5,0,36,9,0,106,2,99,0,78,6,0,36,10,
        0,92,30,78,7,0,36,13,0,176,4,0,20,0,
        36,14,0,106,6,101,109,97,105,108,0,78,5,0,
        36,15,0,106,7,110,111,109,98,114,101,0,78,5,
        0,36,16,0,106,2,99,0,78,6,0,36,17,0,
        92,20,78,7,0,36,18,0,176,8,0,20,0,36,
        19,0,7
    };

    hb_vmExecute( pcode, symbols );
}
Enter fullscreen mode Exit fullscreen mode

Esto explica por qué existió una herramienta que permitía decompilar código fuente para Clipper (llamada Rescue5, pensada para cuando perdías los fuentes), y que incluso era capaz de obtener los nombres de las variables... ¡precompilaba todo a una máquina virtual! Me preguntaba si ese p-code era el mismo del antiguo Pascal, pero ya he visto que no, aunque seguro que les sirvió de inspiración.

Top comments (0)