七万行汇编代码,AI三天移植完三十年老游戏

更新时间: 2026-09-05 浏览:4222

1993年,巴格达。国际制裁之下,一天只有几小时电力,没有硬盘,一位开发者用Amiga 500手写了72,758行纯68000汇编代码,做出了游戏《Babylonian Twins》。三十三年后,Claude Fable 5用三天时间,把这款游戏连同它的C++引擎一起移植到了Godot引擎上——全程没有人工引导。 这不是一次普通的代码迁移。它是对大语言模型推理能力的一次刻意测试:当训练数据里几乎没有Amiga汇编代码时,模型是凭记忆复述,还是真的读懂了这些晦涩的指令? 三个阶段的移植实验 整个移植被拆成三个阶段。第一步,把34,000行的C++引擎搬进Godot——一夜完成,可玩角色在21分钟内跑通。第二步,把72,758行68000汇编重构为能在Godot运行的代码,用vasm重建字节级一致的二进制文件,耗时十五分钟,通过diff验证。第三步,把两者合并成一个完整产品:玩家购买现代版本,就能同时启动1993年的原版游戏。 作者在一年前曾用较旧模型尝试过同样的任务,需要多轮对话和大量提示。这次Claude Fable 5一次性输出正确结果。区别在哪里?作者认为,关键在于模型是否具备对陌生代码的真正推理能力,而非简单回忆训练数据。 逆向工程未记录的格式 游戏里有几种从未被文档化的数据格式:关卡瓦片、地图格子属性(6位物理编码于16位字中)、对象表、加密数据头。LLM没有获得任何指导,靠阅读68000汇编中的消费者例程,追踪这些格式的结构,然后通过重建像素级精确的关卡图像和字节一致的二进制文件来验证自己的推断。 这个过程中有一个发现让作者本人感到意外:发布的二进制文件并非干净的汇编输出,而是运行时内存的快照。游戏直接从RAM保存,导致文件里包含了未初始化变量的内存内容。LLM在重建源码后检测到108字节的差异,定位到未初始化变量。作者说,他自己永远不会注意到这一点——他当时读到那一行,继续往下读,过了几周才意识到这是整个项目中最重要的一点。 帧率陷阱与手工调优参数 原版游戏运行在50 Hz,2010年的iOS移植版运行在60 Hz。固定时钟物理在不同帧率下会产生隐形的兼容性问题:每秒施加60次乘法阻力,与每秒50次,手感完全不同。LLM正确保留了两组时钟频率——1993年重建版以50 Hz运行,现代版以60 Hz运行。作者指出,这类bug几乎不可能通过阅读diff发现。 这也解释了为什么关卡数据的直接移植会产生一座门口全是天空的塔楼——门从未绘制在地图数据中,而是在运行时绘制。LLM通过追踪汇编代码发现了这个逻辑,而不是靠猜测。 字节比较作为客观验证 这次实验最有价值的部分,或许是它提供了一种客观的验证方法:字节比较。每个关于游戏的断言,都可以通过重建源码与原始二进制文件的对比来验证。LLM对每种格式的逆向工程结果,都经过了像素级图像重建和字节一致性检查。 作者在文章里说:"文件格式和汇编阅读是AI的工作,如何处理三十年旧代码的决策也是AI做出的,而且速度比我跟上还要快。"这次测试是刻意的——如果模型更擅长推理而非回忆,这就是它展示能力的地方。 一个值得注意的细节:作者提到,LLM训练集中几乎没有Amiga汇编代码。这意味着模型不是从记忆里调出答案,而是真的在推理这些指令的含义。对于软件保存这个领域来说,这可能是一个转折点——那些依赖特定硬件、特定汇编语言的老游戏,终于有了一个可行的迁移路径。 特别

about image