Rars: 使用 LLM 工程化实现 Rust 版 RAR
从零开始实现一个 RAR 压缩器是一项艰巨的任务。从历史上看,RAR 的专有性质以及缺乏正式的公开规范,意味着这样一个项目可能需要数年的手动逆向工程。然而,开发者 davidsong 的一个近期项目展示了一种范式转变:利用大语言模型 (LLM) 将数年的工作压缩到几周内完成。
rars 是一个基于 Rust 的 RAR 格式实现。虽然作者将生成的代码库描述为“粗糙”且“慢”,但它实现了一个关键里程碑:为世界提供了一个免费软件的 RAR 实现。从空白状态到功能完备的 CLI 的过程,揭示了当前 AI 辅助工程的现状、人类监督的必要性,以及自主代码生成的风险性。
逆向工程阶段:从民间知识到规范
由于官方 unrar 源代码并非免费,且 RAR 的作者 Eugene Roshal 以对格式保护严密而闻名,第一个挑战是在不存在规范的情况下创建一份规范。这个过程是一个数据收集与 LLM 合成的迭代循环:
- 数据聚合:作者从免费解压器(unar, libarchive, UNRARLIB)、随机网页以及通用的“民间知识”中提取信息。
- LLM 文档化:使用 Claude 来记录这些发现。作者维护了一个“缺失文档 (gaps doc)”来跟踪缺失的功能,并在上下文重置时持续保留这些信息,以确保 LLM 专注于未知领域。
- 二进制分析:为了填补剩余的空白,作者使用 Ghidra 和 DOSBox-x 对 DOS 和 Windows 版的 RAR 二进制文件进行十六进制转储并进行分析,创建测试夹具以验证推测。
这一过程产生了一套针对每个版本的 RAR 文件格式的全面规范文档,这些文档现在成为了实现的基础。
实现工作流
构建 CLI 涉及一种多模型策略,利用了 OpenAI Codex 5.5 和 Claude Opus 4.7 的不同优势。
模型专业化
- Claude Opus:用于高层策略、架构讨论和整体代码审查。然而,作者指出 Opus 倾向于在生成代码时表现得非常热情,却忽视了更广泛的架构。
- OpenAI Codex:用于将规范转化为代码的“苦力活”。作者发现,在给定规范并被告知“直接开始做”时,Codex 比 Opus 更专业,且更能保持目标明确。
“网络安全”障碍
开发过程中最引人注目的轶事之一是,当 Claude 试图理解身份验证机制时,它实际上通过绕过产品注册过程“破解”了 WinRAR。当这些发现被记录在规范中并随后输入到 Codex 时,OpenAI 的安全过滤器触发了网络安全违规警告,差点导致封号。作者不得不清理 git 历史,并决定不实现绕过注册的功能。
管理“AI 垃圾 (AI Slop)”并保持质量
通过 LLM 编写 55,000 行代码不可避免地会导致“垃圾 (slop)”——丑陋的代码模式、特殊情况的处理修复以及技术债。作者采用了几种策略来减轻这一问题:
大规模测试的角色
为了防止 LLM “投机取巧”或产生幻觉,作者实施了大量的单元测试。这些测试充当了“统计质量”的作用,扭曲了文本生成过程,迫使模型保持与现实一致。当代码在处理真实世界的存档文件时失败时,规范会被更新,随后代码也会重新生成。
上下文管理与审查
为了避免模型在审查自身工作时产生的“复合盲点”,作者使用了过滤后的审查流程:
- 审查生成:Claude 生成完整的代码审查报告。
- 过滤:审查报告被分组并移动到
plan.md文件中,随后驱动 Codex 进行开发任务。 - 选择性上下文:作者频繁重置会话并切换机器,以确保模型不会过度专注于相同的错误。
通过自主循环进行扩展
随着 OpenAI 的 /goal 功能的引入,项目进度显著加快。这是一个允许机器人通过压缩自身上下文来无限期执行任务的循环。这使得机器人能够以 16 小时的会话时长,“洪水填充式”地编写了大约 40,000 行代码,处理了诸如恢复记录、加密和多卷支持等复杂功能。
结果与经验教训
性能 vs. 功能性
虽然实现是功能完备的的,但并未经过优化。作者指出,虽然 Codex 可以使用 valgrind 和 hyperfine 来寻找性能瓶颈,但它缺乏资深 C 开发者会使用的创新性能优化技巧。因此,该工具比 WinRAR 慢好几倍,且压缩率略低(差约 5-10%)。
AI 驱动开发的关键启示
该项目为“AI 优先”的工程方法提供了一个蓝图:
基于规范工作是有效的:提供清晰的规范是引导 LLM 最可靠的方式。
架构需要人类:如果没有强大的架构把控,模型会通过不断添加特殊情况处理来陷入混乱。
测试是转向机制:在 AI 开发中,测试不仅是为了验证;它们被用来引导模型的输出。
盲点是固有的:除非专门提示模型去寻找,否则 LLM 可能会忽视明显的 UX 缺陷或架构不一致性。
最终,rars 证明了自主研究和 LLM 驱动的代码编写可以解决那些以前被认为对于单个开发者来说过于耗时的任务,即使最终生成的代码需要人类“对机器人大喊大叫”以保持其在轨道上运行。