| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛 | 
共有 1479 人关注过本帖
标题:昨天直接冲上 Hacker News 头版的 FoxDevStudio - A modern IDE and 64-bit ...
只看楼主 加入收藏
roadcom
Rank: 1
等 级:新手上路
帖 子:164
专家分:0
注 册:2026-7-9
收藏
 问题点数:0 回复次数:30 
昨天直接冲上 Hacker News 头版的 FoxDevStudio - A modern IDE and 64-bit runtime for Vfp9
好不容易终于找开了 github,一看,已经 55 Stars 啦,厉害厉害!
https://
https://

这是用 Rust 重写的 VFP,目前还只是个雏形。
标题起得狠冲:

微软2007年杀了Foxpro。
总之,这是复活版的Foxpro。

*---------------------------

FoxDev Studio
A modern Visual FoxPro style IDE built with Electron, React and Fluent UI.

Milestone 1 delivers the IDE shell and the visual designers:

Form Designer with a VFP-like toolbox, drag/resize/marquee selection, grid snapping, page frames, grids, containers, clipboard and undo/redo.
Properties Window (All / Data / Methods / Layout / Other) with typed editors and VFP property names and defaults.
Method editor (CodeMirror) opened by double-clicking a control or an event.
Run Form (Ctrl+E) preview rendered with live Fluent UI controls; fired events show in the Output panel.
Menu Designer with a live menu-bar preview.
Project Explorer over JSON project files (), forms (), menus () and programs ()..fxproject.fxf.fxm.prg
Milestone 2 adds the language: a FoxPro compiler and bytecode VM written in Rust and compiled to WebAssembly, plus the runtime that puts live forms on screen.

Compiler and VM (): lexer, error-recovering parser, bytecode compiler and a fiber-based interpreter with 151 built-in functions. The editor lints through the same compiler.crates/foxvm
Run a form (Ctrl+E), a program (Ctrl+D) or the project main (F5). Forms appear on the Screen tab and their methods execute: updates the label as you would expect.THISFORM.pgfMain.Page1.lblGreeting.Caption = cMsg
MESSAGEBOX, INPUTBOX and WAIT WINDOW park the running program until answered, without freezing the UI.
Menus run: installs the menu bar and its items execute their command or procedure text.DO Main.fxm
Command Window (Ctrl+F2) and an Output window, with an event trace toggle.
Build App... compiles the project to a bundle; Build Executable... wraps that bundle in a copy of the installed runtime, producing a folder with that runs the application with no IDE..fxa<Name>.exe
The data engine has started: opens a table, chooses a work area, and move the record pointer, and a field reads by name (, , and for the memory variable of the same name), memo fields included. The host owns the bytes and the VM owns the meaning: the main process seeks and reads, and records are decoded in the VM a page at a time. / and // walk a table, with the scopes (ALL, REST, NEXT n, RECORD n) and FOR/WHILE clauses; makes every movement step over deleted records. SELECT-SQL runs: a select list with expressions, , names and the aggregates COUNT/SUM/AVG/MIN/MAX; several sources joined by a WHERE clause or by INNER and LEFT OUTER JOIN; WHERE, GROUP BY, ORDER BY, DISTINCT and TOP n; uncorrelated subqueries in , , , and ; and or , where the array may be a property such as . A query is compiled to nested loops over the same primitives a hand-written SCAN uses, so it reads a table larger than memory the same way. A or opened in the IDE shows in a table browser.USESELECTGOSKIPcustnocustomer.custnom.custnoSCANENDSCANLOCATECONTINUEFOUND()SET DELETED ON*ASINNOT IN= ANY= SOMEEXISTSINTO CURSORINTO ARRAYTHISFORM.aSamples.dbf.dbc

Tables are written as well as read: (with the scopes and FOR/WHILE), , and . A record is a fixed run of bytes, so a change never moves anything - the new field bytes go where the old ones were and the record goes back where it came from - and APPEND sends the header's new record count with it. The browser edits the same way: double-click a cell, or click a record number to mark it deleted.REPLACEAPPEND BLANKDELETERECALL

Still to come, and reported by name: and indexes, , , writing memo fields, and / binding.SEEK.cdxSET FILTERHAVINGControlSourceRowSource

docs/language-reference.md lists every built-in function, with its argument count and, for the ones that cannot run yet, why. It also lists every property of every control with its default. It is generated from the two registries by , and a test fails if it falls out of step, so it is worth consulting before assuming something is missing.npm run docs:reference

docs/not-supported.md is the shorter and more final list: what is refused on purpose rather than merely unbuilt, and why. Today it is four sample forms built around Microsoft Agent, Windows Messenger and the Media Player control.

Table size
Visual FoxPro stops at 2 GB per table and per memo file, because it uses signed 32-bit file offsets internally. FoxDev is designed to go past that: the data engine keeps every byte-level operation in the main process behind a seek-and-read request, with 64-bit offsets throughout, and never loads a table into memory. Verified on Node 24 by writing and reading a record at a 5.2 GB offset.

Visual FoxPro    FoxDev
Table file    2 GB    558 GB at 130-byte records, 4.4 TB at 1 KB records
Records per table    ~1 billion in practice    4.29 billion (the DBF header's 32-bit count)
Memo file    2 GB    4 GB at block size 1, 274 GB at block size 64
The remaining ceilings are the DBF format's own 32-bit fields, not ours: the record count in the header, and the memo block number that addresses the memo file in block-size multiples.

Two caveats worth knowing before you rely on this:

A table grown past 2 GB will no longer open in Visual FoxPro. If you still work in both, that is a one-way door.
Memo files are capped at the block number times the block size, so a table whose memo file uses a block size of 1 (real VFP files do; the samples in this repository are an example) is limited to 4 GB of memo data however large the table itself gets.
Architecture
crates/foxvm         Rust: lexer, parser, compiler, bytecode, VM, builtins, wasm exports
crates/foxvm-cli     headless runner: foxvm run|check|disasm file.prg
src/wasm/foxvm       the compiled module, inlined as base64 and loaded with initSync
src/shared/runtime   React-free: object model, scheduler, host contract, bundle format
src/renderer/src/runtime  session, Screen tab, control renderers, dialogs, Command Window
src/renderer/src/player   the runtime player entry (player.html)
Every side effect the VM needs is yielded as a host request and performed while the VM is off the stack, then the fiber resumes. That is what lets a modal dialog block a FoxPro program without blocking the UI thread, and it keeps the wasm module free of re-entrancy.

Development
npm install
npm run dev          # Electron with hot reload
npm test             # Vitest + jsdom (primary verification, no display needed)
npm run typecheck
npm run lint
npm run build        # production bundles into out/
npm run package      # installers into release/ (Linux targets under WSL2)
npm run build:wasm   # rebuild the Rust VM (runs automatically when the crate changes)
npm run test:rust    # cargo test for the compiler and VM
npm run check        # typecheck + lint + vitest + cargo test
Open the sample project from the welcome page: .resources/samples/HelloWorld.fxproject

Continuous builds
Four workflows under :.github/workflows

CI (): every branch and pull request runs on Linux and Windows, and builds the site so a stale instruction reference is caught early. Nothing is packaged.ci.ymlnpm run check
Nightly (): every push to packages the product and replaces the rolling nightly pre-release: the Windows installer, the Windows runtime zip, the command-line runner and the compiled VM as a wasm package, versioned . Windows only, because runner minutes are billed; run it by hand with set to all three runners for a full set.nightly.ymlmainfoxvm<version>-nightly.<date>.<sha>platforms
Release (): a tag packages on Windows, Linux and macOS and publishes a release under that tag. The tag must match , so cutting a release is: bump the version, commit, , .release.ymlv<version>package.jsongit tag v0.1.0git push origin v0.1.0
Site (): a push to touching deploys the website to Cloudflare with wrangler, as a Worker serving static assets. It needs the repository secrets (Account > Workers Scripts > Edit) and .site.ymlmainmarketing/CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID
The packages are unsigned. is the tag check; is the packaging step the workflow runs after .scripts/version-check.mjsnpm run package:cinpm run build

Verifying without a screen
Tests run under jsdom and cover the designer interactions with pointer events. To capture the real window as a PNG:

FOXDEV_OPEN=$PWD/resources/samples/HelloWorld.fxproject FOXDEV_SCREENSHOT=/tmp/foxdev.png npm run dev
FOXDEV_OPEN (or a command-line argument) opens a project and its main item at startup; saves the window after ms (default 2500) and exits..fxprojectFOXDEV_SCREENSHOTFOXDEV_SCREENSHOT_DELAY

To run a built application instead of the IDE, pass a bundle: , or . A packaged application carries its bundle at and starts in player mode automatically.FOXDEV_PLAY=/path/app.fxa npm run devFoxDevStudio.exe --play app.fxaresources/app.fxa

File formats
All documents are JSON with a and field. Forms keep Visual FoxPro property names and store only values that differ from the defaults, so a later importer maps directly onto them. See for the schemas, and for examples.$schemaversion.scx/.vcxsrc/sharedresources/samples

Layout
src/main: Electron main process (path-guarded file access, dialogs, recent projects).
src/preload: sandboxed bridge exposing the typed .FoxDevApi
src/shared: document schemas, control registry, path helpers; no Electron or React imports.
src/renderer/src: React app: , , , , , , .designer/preview/editor/menu-designer/explorer/shell/stores/
tests: Vitest suites mirroring .src
The website
marketing/ is the public site and the documentation, a separate Astro package: . Its own README says how the pages are arranged and how to add one.cd marketing && npm install && npm run dev



[此贴子已经被作者于2026-9-23 22:55编辑过]

搜索更多相关主题的帖子: table Run with the and 
2026-09-23 22:54
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:USA
等 级:贵宾
威 望:67
帖 子:2792
专家分:4967
注 册:2012-2-29
收藏
 得分:0 
2026-09-24 06:33
roadcom
Rank: 1
等 级:新手上路
帖 子:164
专家分:0
注 册:2026-7-9
收藏
 得分:0 
大致这样子理解:

传统VFP --> 编译成专用的字节码 --> 在 VFP系统环境/VFP运行库 运行
FoxDevStudio重写的VFP --> 编译成WebAssembly字节码 --> 在浏览器以及通过 ‌WASI‌,在服务器、边缘节点、嵌入式设备‌等多种环境中运行

这意味着,你写的VFP代码,将来有可能直接运行在你的安卓/苹果手机上。

2026-09-24 12:51
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1272
专家分:1687
注 册:2021-10-13
收藏
 得分:0 
百誉佳不是已经有了?
2026-09-24 13:39
iswith
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:806
专家分:753
注 册:2013-5-14
收藏
 得分:0 
这个有价值,走c+通道,关键编译器要净化很多次才能达到实际使用,真成了,价值还是很大
2026-09-24 13:43
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11667
专家分:43678
注 册:2014-5-20
收藏
 得分:0 

核心技术是通过 wasm 让 C/C++/Rust 等语言也可以运行在浏览器上。

虽然没有什么惊喜,但期待不是简单show一下,而是真正能复活vfp,功能和性能上有质的飞跃。大难不死,必有后福。


2026-09-24 15:10
ykxby001
Rank: 4
等 级:业余侠客
帖 子:157
专家分:236
注 册:2023-7-6
收藏
 得分:0 
复活即巅峰
2026-09-24 20:40
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1272
专家分:1687
注 册:2021-10-13
收藏
 得分:0 
兴冲冲去下载,无奈下载网速太慢,预计时间居然要4天。。。

先问DS知不知道这个开源项目。
DS给出的结论:

开源项目:旨在“复活” Visual FoxPro
这是近期在技术圈引发讨论的热点,它不是一个成熟可用的产品。

宣称的目标:用现代技术重写微软已停止支持近20年的 Visual FoxPro 9,让老旧的 .prg 源码和 .dbf 数据库能在现代64位系统上“无重写、无转换”地直接运行。

技术路线:使用 Rust 编写编译器和虚拟机,并编译为 WebAssembly,前端界面则是 Electron + React。

宣传亮点:宣称覆盖了1722个VFP语言特性中的1534个,并通过差分测试比对原版行为;同时将传统VFP的 2GB 单表上限 提升至理论上的数百GB。

现实状况(关键风险):根据2026年9月的代码审查,该项目 GitHub 仓库仅有2次提交,核心的索引(.cdx)、SEEK 检索、备注字段写入以及旧格式(.scx)导入等功能 均未完成。其预构建安装包甚至没有数字签名。它目前只是一个概念原型,不能用于任何真实业务
2026-09-24 22:31
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1272
专家分:1687
注 册:2021-10-13
收藏
 得分:0 
还有个致命问题,用这个软件生成的应用非常大,通常要100M以上。。。
2026-09-24 23:43
bobwu
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2009-7-25
收藏
 得分:0 
不折腾Electron,这玩意,扛着浏览器到处跑。VFP做GUI,功能不足,用RUST或DELPHI来补,VFP还是很能打的。
2026-09-25 07:43
快速回复:昨天直接冲上 Hacker News 头版的 FoxDevStudio - A modern IDE and 6 ...
数据加载中...
 
   
关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016577 second(s), 9 queries.
Copyright©2004-2026, BCCN.NET, All Rights Reserved