Hacker News 中文摘要

RSS订阅

FoxPro复活,曾被微软2007年砍掉 -- Microsoft killed FoxPro in 2007. Anyway, here's FoxPro revived

FoxDev Studio 面向 Visual FoxPro 9 应用程序。它能打开你已有的项目、表单和表格,并按照你记忆中的方式运行:无需重写、无需转换、也没有导出步骤。把它指向一个多年没打开过的文件夹,里面是什么,打开后就是什么。项目、表单、类库、菜单和报表都直接从现有文件打开,不先做迁移,也不落下任何东西。

正文

你的 FoxPro 应用,在现代机器上安然无恙

FoxDev Studio 打开你已有的项目、表单和表,并按你记忆中的方式运行它们:无需重写、无需转换、无需导出。

从你离开的地方继续

指向一个多年未打开的文件夹,里面有什么你就看到什么。

你的项目,原本模样

项目、表单、类库、菜单和报表直接从你已有的文件打开。无需先迁移,也不会遗漏什么。

你熟悉的设计器

表单、类、菜单和报表在你预期的位置编辑,旁边是项目管理器、命令窗口和一个能停在你那行的调试器。

你的数据还是你的数据

表、索引、备注和数据库就地进行读写。磁盘上随后留下的文件和之前是同一种。

它曾打交道的,依旧能打交道

你的应用依赖的系统调用、自动化对象和旧插件库继续工作,所以没人想碰的那些部分保持原样。

看起来是怎样的

IDE 运行在 Visual FoxPro 自带的示例项目上。每张图都是真实会话。

Visual FoxPro 自带的 Solution 示例已导入并运行:Screen 选项卡上的启动表单,项目管理器列出 123 个表单、7 个菜单和 11 个类库,运行时等待事件。

编辑器打开 FormsUI 示例,linter 在 FOR 行内联标记语法错误,下方有输出和命令窗口;编辑器通过运行时自身的编译器 lint,标出的就是会失败之处。

调试器停在 Solution 示例主程序第 26 行,越过第 25 行断点一步:当前行高亮,下方输出窗口、调用栈、局部变量、监视框和断点列表。

表浏览器显示数据库容器的 17 条记录,备注字段为链接,旁为资源管理器列出表单、菜单、程序、类库和数据库;该容器有 8 个字段、17 条记录,备注一键可及。

FoxScript 程序用 lambda 注册 HTTP 路由,其中一个内部调用 32 位加密库,输出窗口报告服务器监听 8080 端口。

为匹配而构建,而非近似

细微差异就能让旧应用崩溃:数字打印宽了一列、事件晚到片刻、错误号不对。因此这里的行为是通过询问 Visual FoxPro 自身并匹配其答案来确定,而非读参考页碰运气。

由此产生的是一个从零编写的运行时:启动快、自包含,并对尚未触及的角落直白说明。

运行时已知 Visual FoxPro 9 语言参考中的 1,722 个元素;其中 1,534 个由对比产品答案的测试覆盖;尚未遇到的名称仅 3 个,其余要么运行、要么刻意忽略、要么按名拒绝。

Visual FoxPro 10 本该的样子

Visual FoxPro 止步于第 9 版,且为 32 位。这是同一种语言,重建于 2007 年以来未冻结的基础之上。四个部分使之可能。

调用去向 / 以及 32 位世界的尽头

端到端的 64 位

32 位带来的天花板已消失

Visual FoxPro 是 32 位程序,这决定的比看起来多:表限于 2GB、备注文件限于 2GB、大报表在内存充足的机器上却耗尽内存。这些限制是文件处理中埋藏的有符号 32 位数值,而非许可决定。

FoxDev Studio 全面 64 位。每个文件偏移量都是 64 位,且表从不整体读入内存,因此曾卡死的 .dbf 可继续到数百 GB。需注意:超过 2GB 的表将无法在 Visual FoxPro 中再次打开。若你仍在两者间工作,这是单向门。

偏移量 / 及其抵达之处

虚拟机

编译器,以及为运行其产物而建的机器

Visual FoxPro 将程序编译为 p 代码并附带运行时执行。此处重蹈此安排:用 Rust 编写并编译为 WebAssembly 的编译器和字节码解释器,令同一台机器在应用运行处执行你的代码。编辑器通过该编译器检查输入,因此标出之处与运行时拒绝之处不会分歧。

运行中的程序是纤程。当它需要外界事物(消息框、模态表单、下一条记录)时,不调用阻塞;而是让步,工作在电力机出栈时完成,答案回传。这便是 MESSAGEBOX() 停止程序却不冻结背后窗口、READ EVENTS 等待却不空转、SetFocus 能触发 GotFocus、Init 可在表单构建中按 FoxPro 一贯顺序运行的原因。

参见 机器如何工作 和 它运行什么。

屏幕

你看到的表单是对象树,而非其图画

运行中的表单是具备预期属性的活对象树,界面由 React 直接据此树绘制。每个对象仅观察自身,故 THISFORM.lblGreeting.Caption = cMsg 只重绘一个标签而非整表。在密集屏幕上,这关乎即时与迟缓。

设计器编辑的是早一步的同一棵树。没有需与前者保持同步的第二模型,而那通常是表单与设计器开始讲不同故事的地方。

32 位桥

旧库依旧加载,尽管此处无一为 32 位

.fll 是 32 位映像,而 64 位应用中的每个进程皆 64 位,故应用内部无法打开之。SET LIBRARY TO 遂启动仅以持有你的库为职的小 32 位进程,运行时与之通信。调用同步,因程序可能于表达式中途调用库,迟来的答案不算答案。已对照真实库测量:加密库、FoxTools 及基于微软 API 示例构建的库。

无需桥的 64 位事物:DECLARE ... DLL 在同一进程触达现代库,自动化对象以一贯方式抵达。旧路仍开,只是不再是唯一。

FoxScript:同种语言,更大空间

你写过的所有代码仍意指原意。FoxScript 仅叠加:可交他者稍后运行的块,以及从熟知业务的代码应答 Web 请求的方式。

server.prg / FoxScript

其中每行都运行于你表单所用的同一运行时。查询、游标和库调用是普通 FoxPro;lambda 与服务器是 FoxScript 所加:无第二语言,无旁置服务。关键字 与 HTTP API 均全文载述。

下载

每夜版从每次推送到 main 重建,作为预发布发布于 GitHub,未签名,首次启动需确认。

Windows:安装包(.exe)和运行时(.zip),x64。下载

Ubuntu 及其他 Linux:AppImage 和 .deb,x64。下载

源代码,GitHub:FoxDevCommunity/FoxDevStudio:IDE、VM、本站点及每次发布。链接

即将到来

已规划的工作,大致按构建顺序:

最后的语言特性:仍开放的少数角落,每个关闭时对照原版检查。

报表:报表设计器与引擎,逐带测量,同其余一致。

超过 2GB 的表,作为自有格式:64 位偏移今已具备;诚实对待 DBF 头限制的容器紧随。

为你发布之物制作安装器:将应用作为单件可运行物交付用户,无需预先设置。

评论

讨论整体是怀旧与实用主义交织:多数人认可给仍在运行的海量 VFP 业务系统续命有真实价值,分歧在于 DBF/DBC 这套地基是否值得复活,以及新项目是否出自 AI 之手。

认为老业务应用不会消失,重写才是真正的商业风险

  • VFP9 在 2007 年停更,但大量 32 位程序至今还在跑,因为花二十年重写一个业务应用就是丢掉这门生意;新运行时用 Rust 编译到 wasm、对照真实 vfp9.exe 校验、突破 2GB 表限制、旧 32 位 .fll 插件照旧加载。(高赞)
  • 有人的前公司一直把 VFP 用到最近几年,ETL 搬数据效率惊人。(较多人)
  • Microsoft Access 也还活着,32 位版三年前才拿到 Large Address Aware 支持,且既无平替也无便宜迁移路,早年写的那套 VBA 大概仍在生产环境。(较多人) > 重写一个二十年的业务应用,就是丢掉这门生意。(@boredjohnny)

认为低门槛高生产力是优点,但在网络盘上跑 DBF 注定翻车

  • 门槛低、开发效率高、高度贴合专有流程都值得称道,可惜应用一旦超出平台能力就很痛苦;如今各种 overlay 网络下访问 DBF,而"无缝远程访问"恰恰是 VFP 应用最不擅长的场景。(较多人)
  • 有诊所的 VFP 系统在网络盘上共享,文件锁和多人同时修改同一记录的问题层出不穷,改造成客户端/服务器加服务端 RPC 后才彻底消失。(较多人) > 无缝远程访问正是 Visual FoxPro 应用失败的地方。(@EvanAnderson)

认为 DBC 的安全模型是硬伤,早晚得搬到真数据库

  • 数据库容器要能用就必须对所有用户可读写,完全没有权限方案;其存储的可执行 FoxPro 代码以纯文本存在 memo 字段里,还能发起 Win32 调用,稍懂技术的人改一条 INSERT 触发器就能为所欲为。(高赞)
  • 建议尽快弃用 DBF/DBC,有源码就通过 ODBC 或 OLE DB 指向服务端数据库;这个漏洞报上去二十多年也没修,因为修它等于重写数据库引擎的大半。(高赞) > DBC 要对所有人可读写,根本没有权限这回事。(@mikestew)

怀疑这个项目是 AI 生成的一次性作品

  • 能明显感到 LLM 在推销自己,AI 生成的落地页味道太重,让人很难认真对待;但也不断言代码差或功能不行。(较多人)
  • 项目凭空出现、只有一个 commit、看不到此前历史,自然会被问是不是 vibe coded。(较多人) > 我不是说代码不好或功能不行,只是 AI 生成的落地页味道太重了。(@whalesalad)

把它看作一代人的编程启蒙和怀旧对象

  • 有人的父亲用 FoxPro 做过好几个项目,如今大概得翻出软驱和旧箱子才能找回那些文件。(较多人)
  • 有人青少年时靠 dBase 和 Fox 产品拿到第一份有偿开发,这类工具对小孩都意外地友好;那位退休海军陆战队雇主的口头禅就是"搞明白它",从修改车队保险数据库到跨会计系统迁移全丢给他。(较多人)
  • 高中教 FOXBASE 成为第一门正式语言,以及在 Mac 上用 FoxPro 学会 SQL,也是类似回忆。(少数人) > "嘿,小子",他会说,我们得让这个 dBase 车队保险库支持更多车辆,搞明白它。(@neilv)

有价值的补充

  • 微软虽然终结了 FoxPro,但 Windows 11 的 moricons.dll 里仍留着它的图标,按目前趋势会在每个 Windows 版本里永生。
  • 有人写过 pgdbf 把 VFP 数据文件转成 PostgreSQL,过渡期靠 cron 同步,让老前端继续录入、Postgres 后端跑快速报表,不优雅但很管用。
  • 报出 DBC 漏洞的人当时就在 Fox 团队,明确说了不重写数据库引擎核心就没法修,这是设计层面的取舍而非疏忽。
  • Clarion 和 Paradox 当年都以为这场"活到最后"的赌局赢家会是自己——如今被复活的却是 FoxPro。