¿Vuelve dBASE?
Source: Dev.to
dBASE III+ y su modo de uso
dBASE III+ fue un auténtico éxito comercial porque permitía manejar bases de datos de manera muy sencilla e imperativa (no como SQL, que se supone que lo hace todo por ti). Podías trabajar con los menús o bien usar comandos para hacer consultas, modificar la estructura, añadir, modificar o eliminar registros.
Hola, mundo
procedure main()
* This is an example
clear
? "Hello, the weather is fine today"
return
Clipper
Poco después surgió Clipper, un compilador que permitía distribuir ejecutables sin que el cliente tuviese instalado dBASE.
Crear 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_type with "c"
replace field_length with 20
close
return
La instrucción create crea un archivo contactos.dbf. use lo abre y, tras definir los campos, close lo cierra.
Insertar un contacto
* Inserta un nuevo contacto
procedure inserta_contacto(nombre, email)
use contactos
append blank
replace nombre with nombre
replace email with email
close
return
Pedir datos de un nuevo contacto
* 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
En Clipper la arroba (@) mueve el cursor, say escribe texto y get solicita la entrada del usuario. Las variables no tienen tipo fijo, adoptando el tipo del valor que almacenan (como en Python).
Harbour: alternativa moderna
Una empresa ha retomado el testigo de dBASE con dBASE LLC, pero también existe una alternativa moderna y de código abierto: Harbour. He podido compilar el código anterior con Harbour, que genera primero código fuente C y luego lo compila.
Código generado por Harbour
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 );
}
Este p‑code explica por qué existió una herramienta de decompilación para Clipper (Rescue5) que podía recuperar nombres de variables: el código se precompila a una máquina virtual propia.
