dBASE会回来吗?
发布: (2025年12月17日 GMT+8 20:36)
3 min read
原文: Dev.to
Source: Dev.to
dBASE III+ 及其使用方式
dBASE III+ 之所以取得巨大的商业成功,是因为它能够以非常简单且命令式的方式(不像 SQL 那样假设全部由系统完成)来操作数据库。你可以使用菜单,也可以直接输入命令进行查询、修改结构、添加、修改或删除记录。
Hello, world
procedure main()
* This is an example
clear
? "Hello, the weather is fine today"
return
Clipper
不久之后出现了 Clipper,这是一种编译器,能够在客户机未安装 dBASE 的情况下分发可执行文件。
创建联系人数据库
* 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
create 语句会创建一个 contactos.dbf 文件。use 打开它,在定义完字段后,close 将其关闭。
插入联系人
* Inserta un nuevo contacto
procedure inserta_contacto(nombre, email)
use contactos
append blank
replace nombre with nombre
replace email with email
close
return
请求新联系人的数据
* 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
在 Clipper 中,@ 用来移动光标,say 用来输出文字,get 用来获取用户输入。变量没有固定类型,会根据所存储的值自动采用相应的类型(类似 Python)。
Harbour:现代替代方案
一家企业在 dBASE LLC 继续了 dBASE 的传承,但同时也有一个现代的开源替代方案:Harbour。我已经使用 Harbour 编译了上面的代码,Harbour 先生成 C 源代码,再进行编译。
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 );
}
这段 p‑code 解释了为什么曾经有针对 Clipper 的反编译工具(Rescue5)能够恢复变量名:代码会预编译成其自有的虚拟机指令集。
