打开网易新闻 查看精彩图片

1969年7月20日,阿姆斯特朗踩下那一步时,支撑他的不是勇气,是6万行汇编代码。这些代码最近被NASA工程师Chris Garry完整甩上GitHub,公共领域,随便下,随便改。Virtual AGC项目和MIT博物馆花了几年时间,把MIT博物馆里发黄的纸质打印件逐页扫描、校对、数字化。现在你打开网页就能看见当年程序员手写的注释——有人吐槽老板,有人抱怨内存不够,有人在代码里藏了莎士比亚。

两份代码,两个大脑

两份代码,两个大脑

整个项目拆成两个仓库:Comanche055是指令舱(Command Module)的代码,Luminary099是登月舱(Lunar Module)的代码。每艘飞船各装一台阿波罗制导计算机(AGC),4KB内存,72KB只读存储器,运算速度约4万次每秒。作为对比,你现在用的手机内存是它的百万倍。

但就是这个"电子算盘",在登月最后阶段救了命。

1969年7月20日,登月舱"鹰号"下降过程中,AGC连续触发1201和1202号警报——计算机过载。任务控制中心27岁的Steve Bales在几秒内判断可以继续,阿姆斯特朗手动接管,在燃料仅剩4%时找到着陆点。那段处理警报的代码,现在就在GitHub的ALARM_AND_ABORT.agc文件里,注释写得像急诊室手册:记录警报状态、点亮警告灯、区分"要命的"和"还能忍的"。

另一个被疯狂转发的文件只有30行:用多项式逼近计算正弦余弦的汇编代码。没有浮点单元,没有数学协处理器,程序员用移位和加法硬算三角函数,精度足够把飞船导航到月球。推上有人截图感叹:"我现在的IDE自动补全都比这行数多。"

代码里的活人痕迹

代码里的活人痕迹

真正让程序员破防的是注释。MIT仪器实验室的程序员团队在60年代写下了这些代码,当时"软件工程"这个词还没被发明。他们面对的硬件约束堪称变态:AGC重量32公斤,功耗55瓦,内存用磁芯存储,每个比特一个小米粒大的磁环,女工手工穿线编织。

在Luminary099的某个文件里,有人写:"TEMPORARY, I HOPE HOPE HOPE"(临时的,希望希望希望)。另一处注释抱怨:"THIS ROUTINE IS CALLED BY PINBALL, WHICH IS CALLED BY THE KEYBOARD, WHICH IS CALLED BY THE ASTRONAUT"(这段代码被PINBALL调用,PINBALL被键盘调用,键盘被宇航员调用)——三层调用栈的无奈,隔着55年都能摸到。

还有更皮的。程序员在代码里埋了莎士比亚《亨利五世》的台词,在显示模块的注释里写:"IT WILL BE PROVEN THAT A LUNAR LANDING CAN BE ACHIEVED WITH A MANUAL OVERRIDE"(将证明登月可以靠手动覆盖完成)。这行注释写于1969年之前,后来成真了。

这些注释没有被"清理",因为当年没有代码审查流水线,没有Jira工单,只有打印纸和铅笔。

GitHub仓库的README里,Chris Garry特意感谢了Virtual AGC项目的Ron Burkey——他从1990年代开始,凭一人之力逆向工程整个AGC系统,扫描原始文档,写模拟器,让这段代码能在现代电脑上跑起来。现在你用Virtual AGC软件,可以在Linux、Windows、Mac甚至FreeBSD上编译执行这些汇编,看着1969年的程序在你屏幕上闪烁。

为什么现在放出来

为什么现在放出来

这不是NASA第一次开源老代码,但Apollo 11的特殊性让这次发布有了不同重量。2016年Chris Garry首次上传时,GitHub服务器一度被挤爆,程序员们蜂拥而至,有人找bug,有人做表情包,有人单纯想摸一摸"人类首次"的代码质感。

更深层的背景是太空计算的复兴。NASA的Artemis计划要2026年送人重返月球,SpaceX的星舰在测试轨道加油,商业月球着陆器接连发射。当年的AGC代码成了活教材——不是学它的汇编技巧,是看一群资源受限的工程师怎么在不可能的任务里做取舍。

MIT媒体实验室的David Mindell写过一本《Digital Apollo》,里面有个细节:AGC的设计哲学是"让人类在回路中"。计算机负责常规计算,关键时刻把控制权交还宇航员。这种"人机共生"的思路,在今天自动驾驶和AI接管一切的争论里,反而显得超前。

55年前的代码库,意外成了人机交互的考古现场。

GitHub上的Star数已经超过几万,Issues区有人认真提问:"这段中断处理为什么不用更高效的算法?"也有人玩梗:"提交了PR,把缩进从2空格改成4空格,被拒绝了。"最实用的贡献可能是中文翻译——有开发者把关键注释译成中文,方便国内航天爱好者阅读。

如果你真想跑起来,Virtual AGC项目提供了完整工具链。从汇编到二进制,从模拟器到虚拟仪表盘,甚至有个叫"Moonjs"的浏览器版本,让你在网页里体验登月舱的操控界面。当年宇航员看的数字显示,现在你的Chrome里就能复现。

代码开源的副作用是祛魅。你看不到"黑科技",只看到一堆条件跳转和内存地址。但正是这种朴素,让这次发布有了特殊意义——它证明人类登月不是神话,是具体的人写的具体的代码,一行一行,在磁芯存储器里占着具体的物理空间。

有个细节很少被提及:AGC的内存分配是手工计算的。程序员要知道每个变量存在哪个磁芯的哪个位置,因为存储密度太低,每一比特都是成本。这种"内存地理学"的训练,让当年的工程师对系统有着近乎肌肉记忆的熟悉。今天的我们依赖垃圾回收和虚拟内存,某种程度上是能力的退化,也是生产力的解放。

Chris Garry在GitHub的提交记录里,最后一条是2023年的更新:修正了几个扫描错误,补全了缺失的页面。Virtual AGC项目还在维护,Ron Burkey已经七十多岁,仍在回复邮件。这个开源社区的速度很慢,以年为单位,但跨度是半个多世纪。

现在打开那个仓库,最先跳出来的文件是MAIN.agc,主程序入口。注释第一行写着:"THIS IS THE MAIN PROGRAM FOR THE APOLLO GUIDANCE COMPUTER"。没有版本号,没有作者署名,没有版权声明。1969年的程序员大概没想到,他们的工作会在55年后被全球程序员围观、吐槽、致敬。

你编译运行的时候,模拟器会弹出一个复古的界面:数字在闪烁,状态灯在变化。那是阿姆斯特朗和奥尔德林看过的同款显示。代码是死的,但执行它的瞬间,某种东西活了过来。

最后一个问题留给打开仓库的你:如果让你用4KB内存写一段必须成功的代码,你会先删哪行注释?