自创语言编写56000行DOOM代码
速览
一位开发者用自己设计的编程语言完整实现了经典游戏DOOM,代码规模达56,000行。该成果证明了自创语言在复杂系统开发中的实用性,同时展示了作者对DOOM游戏机制和底层架构的深入理解。这一项目对编程语言设计、代码可读性以及游戏逆向工程领域具有启发意义。
AI 深度解读
背景
这篇来自 Hacker News 的文章出自一位独立开发者之手。他在尝试开发一个能卖钱的产品未果后,决定利用休息时间做一个有明确边界、能真正完成的项目。他长期以来一直想写一个编译器,于是借“玩笑语言”的借口,创造了一门名为 bet 的小型编程语言——表面上是俚语风格的关键词,底层却是一个严肃的编译器。他给自己定了一条规则:不做任何前期调研,不查是否有人已经做过类似的东西,以免网络上的信息扼杀这个想法。直到项目完成后,他才知道 Geoffrey Huntley 此前已经用几乎相同的方式(AI 指导 + 俚语关键词 + LLVM 编译)做出了一个名为 cursed 的语言。作者坦然承认 Geoffrey Huntley 的先驱地位。
核心内容
bet 语言通过 LLVM 编译到本地代码,自己管理内存,能够自举(self-host),并且成功运行了经典游戏 DOOM。整个移植工作涉及超过 56,000 行代码,将 id Software 的原始 C 源码(包括渲染器、游戏逻辑、WAD 加载和音频)全部改写为 bet 语言,编译成本地二进制文件,在一个窗口中运行真正的共享版 DOOM。
内存模型是这项工作的真正核心。 游戏过程中对象会不断分配和释放,手动管理 free() 或依赖垃圾回收都会破坏帧预算。bet 采用 arena(竞技场) 机制:开发者在一个作用域(称为 crib)内分配内存,在一帧内使用,然后在帧结束时用 evict 一次性释放整个作用域,时间复杂度为 O(1)。没有逐对象跟踪,没有帧中段的停顿。这种模式本身并不新——Zig 提供了单次释放所有内存的 arena allocator,Odin 也在游戏代码中内置了相同的 arena 和临时分配器思想——但 bet 将 arena 作为一等特性,配有专门的关键词,使语言读起来有自己独立的设计,而不是现有语言的俚语换皮。
作者将这个项目同时视为一个 实验:他想测试 AI 编码助手在完全不出手干预实现过程的情况下,能在一个定义清晰且困难的项目上走多远。他的角色是架构师:只设定问题和验收标准,并坚持标准,不做任何代码审查。每一个改动只有通过测试、满足验收标准、并且通过语料库检查后才能合并。这是唯一的门槛。
证明它有效的是 DOOM 的完整移植。 启动后 DOOM 会自动进入演示模式(attract mode),重放游戏原始录制的输入。定点数学运算让这个测试异常严格:哪怕偏差一个步长,玩家角色就会开始撞墙。bet 逐帧与 C 参考版本严格锁定重放输入,整个模拟结果逐比特一致。能做到这一点而没有任何捷径,正是把玩具语言和能承载真实软件的语言区分开来的标志——也是作者最信任的结果,毕竟他从未做过代码审查。
整个项目已完成:编译器、自举、文档和这个网站。作者明确表示不会有版本二,没有路线图,功能请求会审查但项目已结束。他说:“如果这件事能说明我的什么,那便是我能把开始的事情完成。”
时间投入的实际数据来自提交跟踪的时间日志,记录了有效工作时间并剔除了等待时间。有一个缺口:在移植 DOOM 的过程中,有三个 AI 代理因使用限制而停滞,但计时器仍在走,因此移植游戏的行实际多记录了约 12 小时。去掉这部分,真实总时间接近 22 小时。
关键要点
- 语言设计:bet 是一门完整的编程语言,表面使用俚语风格关键词(如
squad、crib、evict),底层通过 LLVM 编译为本地代码,支持自举。 - 内存管理:采用 arena 机制(
crib分配,evict一次性回收),专为游戏开发中频繁分配/释放的场景优化,避免手动 free() 和 GC 暂停。 - 实验性质:作者作为架构师,将实现完全交给 AI 编码代理,只负责设定问题定义和验收标准,零代码审查,以测试 AI 在严格规范下的完成能力。
- 验证成果:成功将 id Software 的 DOOM 原始 C 源码(超过 56,000 行)完整移植到 bet,编译后运行共享版 DOOM,逐帧重放演示模式,输出与 C 参考版本比特一致。
- 项目边界:作者明确该项目是一个有始有终的玩笑和实验,不打算商业化,也不计划推出第二版。
- 巧合与致谢:作者事后发现 Geoffrey Huntley 用几乎相同的方法(AI 指导 + 俚语关键词 + LLVM)创造了 cursed 语言,比 bet 更早,并表示该荣誉属于 Huntley。
意义与影响
bet 语言本身并不追求成为通用产品或生态工具,它的价值在于:
-
展示了“有限边界完成”的工程哲学。在开源和商业化浪潮中,作者刻意选择一个能真正收尾的项目,从编译器到 DOOM 移植再到自举,所有环节闭合,没有留下“待完善”的尾巴。这种对完整性的追求在软件项目中值得推崇。
-
验证了 AI 代理在严格规范下的工程能力。作者通过零代码审查、仅靠测试和验收标准把关的方式,让 AI 完成了超过 56,000 行的复杂代码移植。这一实验为人类与 AI 协作(人类做架构、AI 做实现)提供了真实案例——当问题定义足够清晰、验收标准足够刚性时,AI 可以承担大量实现工作,且结果可靠到能复现定点数学的比特级一致性。
-
为游戏开发语言的内存管理提供了一种极简思路。arena 机制虽然并非创新,但 bet 将其提升为语言的一等公民,并赋予简洁的关键词,可能启发其他语言或框架在特定领域(实时系统、游戏引擎)采纳类似设计,以平衡性能与开发效率。
-
讽刺与幽默的价值。一台用“群聊风格关键词”写成的语言,却运行着最经典的硬核游戏 DOOM,这种反差本身就是对编程语言严肃性的一种挑衅。它提醒我们:语言的表面风格可以任意,只要底层工程能力足够坚实,就能完成真正的工作。
-
对“重复发明轮子”的坦然承认。作者在不知情的情况下重走了 Geoffrey Huntley 的路径,但丝毫没有懊恼,反而公开致敬。这体现了开源社区中良性的探索精神——即使目标相同,不同作者的独特路径和思考过程也能带来差异化的见解和乐趣。
