不懂 Rust 的开发者用 AI 重写 PHP 引擎:Phargo 通过 17.4% 测试并运行 WordPress

一位不会 Rust 的开发者用 AI Agent 从零编写了一个 Rust 实现的 PHP 解释器 Phargo,通过了 PHP 上游 22,000 个测试中的 17.4%,甚至成功运行了 WordPress。其方法论核心是:用外部测试套件作为不可贿赂的验证者。
一位自称"不懂 Rust、没写过词法分析器、无法解释 tree-walking evaluator"的开发者,用 AI 创建了一个名为 Phargo 的项目——用 Rust 从零实现了 PHP 解释器,通过了上游测试套件的 17.4%,甚至成功渲染了 WordPress 页面。
核心方法论:不让 AI 给自己打分
这个实验的核心设计原则是:用别人写的测试来验证 AI 的输出。PHP 上游有约 22,000 个 .phpt 测试文件,由 PHP 内部团队在 30 年间编写,覆盖从 DateTime 夏令时计算到 var_dump() 浮点数输出格式的每一个细节。

图1:Phargo 的 PHP 测试套件通过率从 0 攀升至 17.4%
这些测试不是 AI 写的,不是作者写的,不可被讨好、谈判或用更好的 prompt 改善心情。要么 bug40261.phpt 通过,要么不通过。当前成绩:3,844 / 22,037 = 17.4%。考虑到约 40-45% 的测试涉及 C 扩展(GD、curl、SOAP 等)不在范围内,实际可用范围内的通过率更高。
开发循环极其精简
作者作为人类的贡献"大约就是瞄准"。AI 写代码,作者指向目标,读返回结果"像中世纪国王审视海图——严肃点头,零理解",然后输入现代软件开发中最强大的短语:"looks good, continue."

图2:AI 编程工作流——人类瞄准,AI 写码,测试套件验证
循环如下:AI 运行失败直方图找到最大可修复集群 → 实现 → 运行 22,000 测试(约 7 分钟风扇噪音)→ 数字上升则提交,下降则说"hmm, that regressed, look again"。
测量你的测量工具
项目早期,通过率在明显简单的测试类别上停滞。失败 diff 与预期输出看起来完全相同——就像在"找不同"游戏中盯着两张一模一样的照片。
差异是看不见的,因为它是字面上看不见的:回车符。测试集在 Windows 上以 CRLF 行尾检出,而测试比较器逐字节比较。PHP 自己的测试运行器在比较前会规范化行尾,而 Phargo 的不会。一行规范化代码——数百个测试瞬间翻绿。
教训刻在了项目里:你的 oracle 只有连接你的管道和它一样诚实。此后每个可疑的停滞都会先问同一个问题——是引擎错了,还是测试运行器在撒谎?
"波特金内置函数"——存在的假象
测试套件无情地揭露了一类最喜欢的 bug:存在、能解析、运行不报错,但什么都不做的功能:
clone——解析正常,求值为 NULL,所有 DateTimeImmutable 测试从一开始就静默失败unset(key])——完全 no-op,键值纹丝不动trim(charlist)——从项目开始就忽略 charlist 参数spl_autoload_register()——接受你的自动加载器,微笑着,从不调用catch (\Throwable)——什么也匹配不到
这些 bug 每一个都能在 demo 中存活,在代码审查中被一个不懂 Rust 的人(作者自己)错过。但没有一个能在 22,000 个测试的考验中存活。
最终成就:WordPress
让 wp-load.php 基础引导就耗费了一系列阻塞链——goto(WordPress 的 HTML 解析器使用 goto)、str_replace 的引用参数 $count、正则字符类中的 \xNN 转义、function_exists() 对半数内置函数的盲区。
然后一个晚上:wp_install() 完成,管理员用户创建,选项表填充,三篇文章存入 SQLite。首页渲染——真实主题、真实文章、真实永久链接。/wp-admin/ 仪表盘也正常渲染。目前速度约为 PHP 原版的 55 倍慢(7.1s vs 126ms),但新的字节码 VM 已在微基准中达到 PHP 8.5 的 1-3 倍。
关联推荐
- crustc:将 Rust 编译器整体翻译为 4600 万行 C 代码 — 另一个编译器翻译项目
- 2026 AI 编程代理格局:从 Cursor 到 Claude Code — AI 编程工具全景
- Short Leash:一个资深开发者的 AI 编程方法论 — AI 编程的实践方法论
评论 (0)
加载评论中…