返回

文章详情

56000行DOOM,用我自己创造的语言

Hacker News2026年7月16日 16:24

我构建bet的原因是:bet是一个小型的真正编程语言:表面上的俚语关键字,底下有一个严谨的编译器。它通过LLVM编译为本地代码,管理自己的内存,自我托管,并能够运行DOOM。我将其作为一个独立实验构建,并顺利完成。我在没有尝试制作可以售卖的项目的空档期间构建了bet。我想要一个有明确边界的项目,一个我可以真正完成的项目,而构建一个编译器已经在我的计划单上很久了。一个笑话语言给了我借口:关键字像群聊一样,包裹着一个必须真正有效的编译器。一开始我设定了一条规则:不做研究。我从不检查是否有人以前构建过这个,因为我不想让互联网在我写下第一行之前就扼杀这个想法。结果发现,Geoffrey Huntley已经做过了,但我直到后来才得知。一个只在语法层面上有效的语言其实只是一种伪装,因此我给它一个真实的工作。游戏不断地分配和释放对象,手动记账和垃圾回收都会消耗你无法分配的帧。bet通过区域管理这个问题:在一个范围内分配,使用它一帧,然后一次性丢弃整个范围。这个模式本身并不新颖。Zig提供一个可以在一次调用中释放所有内容的区域分配器,而Odin在游戏代码中也使用同样的区域和临时分配器概念。我希望bet把它作为一项一流的特性,拥有自己的关键字,这样语言会被视为一个独立的设计,而不是已经存在的东西的俚语重塑。这是一个笑话。我仍然希望它实际上能够做一些事情。我构建它的另一个原因是进行实验。我想看看,一个AI编码代理在一个困难、明确规定的项目中能够进展多远,如果我不参与具体实现。我的工作是做建筑师:我设定问题和验收标准,然后严格遵循它们。我没有进行代码审查。只有在通过测试、符合验收标准并通过代码库的情况下,变更才能发布。那是唯一的门槛。它有效的证明是完整移植的DOOM。id Software的原始C源代码用于渲染器、游戏逻辑、WAD加载和音频,全部用bet重写:超过56000行,编译为一个本地二进制文件,在窗口中运行真实的共享软件游戏。启动它后,DOOM会在吸引模式下自行播放。那些片段是游戏的原始录制输入,通过模拟重播。固定点数学使得这是一个真正的测试:偏差一步,玩家就会开始走进墙壁。bet通过和参考C构建的逐帧同步重播输入,因此整个模拟逐位完全相同。在没有捷径的情况下达到这一点是将一个玩具语言与能够承载真实软件的语言区分开的,这也是我对一个我从未进行代码审查的构建最信任的结果。因此,它完成了,从头到尾:编译器、自我托管、文档以及这个网站。这就是它停止的地方。如果有特性请求进来,我会对此进行审查,但没有路线图,也没有第二版在路上。bet是一个笑话、一个实验以及一种学习这样的构建实际需要什么的方法,它做到了这一切。如果我希望它对我说一件事情,那就是我完成我开始的事情。 我认真对待的部分 手动free()记账和GC暂停都毁掉了帧预算。在bet中,你在一个范围中分配,一个作用于帧的区域,并通过O(1)的evict一次性释放整个区域。没有每个对象的跟踪,没有在帧中断。那就是实验。表面上是一个笑话,底下真正解决了一个困难的问题,构建只受其测试限制。它编译为本地代码,自我托管,并且能够运行DOOM。它从未打算成为一个产品,也不需要成为一个产品。它已经完成。如何构建的 从记录提交的时间日志中获取的真实数值,计算活动的努力时间,并排除空闲时间。这个限制有一个缺口:三个移植DOOM的代理在使用限制上停滞,而时钟仍在运行,因此移植游戏这行的时间大约高达12小时。如果去掉这些,真实的总时间接近22小时。 移植游戏: DOOM,俄勒冈小径,乒乓球 18小时 自我托管编译器 bet,编译bet 4小时 安全审查 cwage问题 #30–#48 3小时 基础架构、工具和网站 ci,docker,冻结,文档 3小时 前端词法分析器 · 解析器 · 语法 2小时 语言和集合 关键字、类型、容器 2小时 LLVM后端 实际的困难部分 1小时 区域内存 crib · evict · 重要部分 29分钟 总计 · 大部分用在移植游戏上

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡