夜雨聆风学习资料网

ARTICLE · 1203568

阿波罗11号源码再爆火!90岁女掌门谢幕,揭秘4KB内存如何救下人类登月生死局

阿波罗11号源码再爆火!90岁女掌门谢幕,揭秘4KB内存如何救下人类登月生死局

— 作者 —Null

— 编辑 —Patch

只有短短一句话

2026年10月中旬,工程类账号 World of Engineering 在社交平台上丢出一行字:“阿波罗11号的源代码,可以在 GitHub 上看到。”

短短的一行字未配任何插图,却如火星坠入干草堆,在全球程序员的圈子里激起千层浪。

▲ 一句简短的提醒,再次让半个世纪前的登月代码引发全网围观

评论区很快变成了大型整活现场有人冷幽默地感叹:“现在谁都能自己搞个航天计划了。”也有程序员条件反射般地抛出了那个经典的互联网梗:“已经有人用 Rust 把它重写一遍了吗?”

▲ 程序员的本能反应:万物皆可 Rust 重写

被无数人点开、收藏的,是一个名叫 chrislgarry/Apollo-11 的公共仓库。它早已攒下超过 7.52 万颗星标(Star)和 8200 多次分支(Fork)。里面静静躺着两套人类航天史上最著名的阿波罗制导计算机(AGC)汇编源码:指令舱程序 Comanche055,以及登月舱程序 Luminary099。

▲ GitHub 上的 Apollo-11 仓库首页,星标数已突破 7.5 万

一个已经在网上存在了十多年的老仓库,为什么会在 2026 年的秋天再次掀起波澜?

答案藏在两周前的一则讣告里这是极客们的技术寻根,也是一场跨越半个世纪的集体致敬。

01纸堆里敲出来的神迹,与刚刚谢幕的“软件工程之母”

很多人看到热搜的第一反应是:美国宇航局(NASA)终于把压箱底的代码一键开源了?

并非如此在1969年,代码托管平台与云端存储尚未问世。

在热帖评论区,网友 Geoff 还原了源码背后的曲折经历:这批代码由志愿者对着麻省理工学院(MIT)博物馆珍藏的纸质硬拷贝逐页拍摄,再手工录入校对,并非出自 NASA 官方的公开上传。

▲ 网友 Geoff 指出,这些代码是志愿者从 MIT 博物馆的纸质档案中逐字转录出来的

这是一场持续数年的数字愚公移山当年 MIT 博物馆保存着厚达数英尺的汇编代码硬拷贝,在博物馆人员 Deborah Douglas 的协调下,研究者 Paul Fjeld 完成了数字化拍摄,再由 Virtual AGC 项目的志愿者们逐行录入、校对,编译成可以在现代模拟器上运行的文本。

当你点开指令舱代码开头的批准文件 CONTRACT_AND_APPROVALS.agc,历史的温度会瞬间扑面而来。

在这份用纯字符排版的 1969 年 3 月 28 日审批记录中,提交人一栏赫然印着一个名字:Margaret H. Hamilton(玛格丽特·汉密尔顿),职务是“Colossus 编程负责人”。

▲ 指令舱 Comanche055 源码开头的合同与审批文件(CONTRACT_AND_APPROVALS.agc)

就在这次源码翻红的前两周,2026年9月30日,这位领导了阿波罗机载飞行软件开发的传奇女性在剑桥市辞世,享年90岁。

▲ 《卫报》刊发讣告,纪念这位享年90岁的阿波罗软件领军人

在 1960 年代初,造火箭、焊电路才是男人们眼中的“真工程”,写代码则被视为像打字员一样的文书附属品。是汉密尔顿在 MIT 实验室里力排众议,亲手推广了“软件工程(Software Engineering)”这个词。

她让全世界明白:决定宇航员安危的,既关乎万吨推力的土星五号重型火箭,同样系于微小芯片中运转的每一行控制逻辑。2026年秋天科技界对这套源码的重新审视,是全球工程师用极客专属的仪式,向这位远行的先驱深情致意。

02用绣花针“织”出的代码,连三角函数都抠到骨子里

如果你用今天的眼光去看阿波罗制导计算机(AGC),它的硬件参数寒酸得像个电子玩具。

整台机器重约 70 磅,主频只有 2 MHz。它的可读写内存(RAM)只有 2048 个字(约 4 KB),只读程序存储(ROM)也不过 36864 个字(约 72 KB)。 要知道,今天你手机里随便拍一张照片,体积都是它的几千倍。

让人叹为观止的是,当年固化程序的载体完全不同于现代闪存,而是工程人员用铜线一针针手工穿织出来的。

这种技术叫作磁芯绳存储器(Core Rope Memory)。在雷神公司(Raytheon)的工厂里,女工们拿着穿线针,按照 MIT 工程师写好的代码清单,把导线穿过一个个微小的铁氧体磁环:穿过磁环代表 1,绕过磁环代表 0。

▲ 技术博主 Ken Shirriff 拆解“织进电线里的软件”:磁芯绳存储器

当時の工程师半开玩笑地把这种内存叫作 “LOL Memory”(Little Old Lady memory,老太太内存)。这也意味着,软件一旦定稿交给工厂去“织毛衣”,就几乎不可能再用打补丁的方式修改,改一行代码,就得拆线重织。

在如此窒息的硬件牢笼里,MIT 的程序员们展现出了令人头皮发麻的工程美学。

账号 Matheorems 专门拆解了源码里计算正弦函数(Sine)的一段神仙操作。在实时制导中,计算机需要频繁计算三角函数,但 4KB 内存根本塞不下庞大的数学查表,算力也撑不起冗长的泰勒级数展开。怎么办?

阿波罗工程师只用了短短三项多项式,就搞定了正弦计算!

▲ 仅用三项多项式计算正弦:通过微调常数,将精度提升了整整40倍

他们没有照搬数学课本上的泰勒展开系数(比如泰勒公式里  是 -0.3229820),而是故意把常数微调成了 -0.3216147。这一丁点看似不起眼的改动,让原本会堆积在区间两端的计算误差,均匀地平摊成了微小的波浪。在完全不增加半点计算成本的前提下,最大误差直接缩小了 40 倍!

这就是顶级的工程品味:好的工程,往往就藏在选对那几个常数里。

可千万别以为这群算抠到小数点后七位的工程师是一群无趣的苦行僧。当你翻开登月舱源码目录,最抢眼的一个文件名赫然写着:BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc(燃烧吧宝贝,燃烧!,主点火例程)。

▲ 登月舱主点火例程代码(BURN_BABY_BURN),注释中夹带了历史格言与幽默调侃

这是负责登月舱发动机点火的核心生死程序。代码作者 Don Eyles 在注释里坦白,这个狂野的名字来自 1960 年代著名黑人电台 DJ Magnificent Montague 播到热门金曲时的招牌口头禅:“Burn, baby! BURN!”

除了摇滚口号,你还能在代码注释里翻出法语格言 HONI SOIT QUI MAL Y PENSE(愿心怀恶意者蒙羞)、拉丁语警告 NOLI SE TANGERE(勿触碰我),甚至还有提醒宇航员去摆弄某个“蠢东西(silly thing)”的吐槽。在冰冷的机器指令间隙,那群二十多岁的年轻人把滚烫的幽默感一起封存进了月球档案。

03距离月面几千英尺的生死劫:1201与1202警报之谜

如果这套代码仅因机巧幽默引人入胜,尚不足以载入史册。让汉密尔顿团队名垂青史的关键战役,发生在 1969 年 7 月 20 日那个惊心动魄的下午。

当时,阿波罗11号登月舱“鹰号”正处于动力下降段,距离怪石嶙峋的月球表面只有几千英尺。突然,驾驶舱显示屏(DSKY)上黄灯闪烁,接连跳出两个危急的代码:1202 警报!1201 警报!

许多科普文章会笼统地告诉你:“当时雷达开错了,计算机算力过载。”但如果你结合核心开发者 Don Eyles 撰写的技术复盘报告去读这套源码,就会发现真相远比小说更惊悚,那是一场由硬件幽灵、人类操作与软件底层自救共同交织的极限生死局。

第一重杀机,来自一个隐蔽的硬件乌龙。在下降过程中,为了防备随时可能发生的紧急中止(Abort)并返航对接指令舱,宇航员按操作手册提前打开了“交会对接雷达”。然而,登月舱承包商格鲁曼公司在设计电路时留了个大坑:给雷达供电的 800 Hz 交流电,与给计算机耦合数据单元(CDU)供电的 800 Hz 交流电,只锁定了频率,却没有同步相位!

在阿波罗11号通电的那一刻,两路电源的随机相位角偏偏卡在最不利的 90 度与 270 度附近。

这导致了什么后果?计算机的接口电路被电信号噪声彻底搞糊涂了,它误以为雷达天线正在疯狂旋转,于是以每秒高达 6400 次的极限频率,拼命往计算机里塞入加减计数脉冲。每处理一次虚假脉冲,就要硬生生抢走计算机一个内存周期(11.7 微秒)。这个看不见的硬件小偷,在暗中死死掐住了 CPU 整整 13.36% 的算力!

第二重杀机,是压垮骆驼的最后一根稻草。登月舱的核心导航任务叫 SERVICER,它每隔 2 秒钟必须完整跑完一轮,算出飞船去哪、发动机推力多大。平时跑完一轮还剩 15% 的算力余量,但被雷达偷走 13.36% 后,系统已经走在了悬崖边上。

下降到第 5 分钟时,宇航员奥尔德林为了核对雷达高度与惯导高度的差值,在键盘上敲下了 Verb 16 Noun 68,要求屏幕周期性刷新监视数据。

算力彻底见底了!前一个 2 秒周期的 SERVICER 还没算完,下一个 2 秒的闹钟又响了,新的 SERVICER 任务挤了进来。

在 AGC 极其狭窄的内存里,操作系统一共只有 8 个核心作业槽(Core Sets,相当于8张小办公桌) 和 5 个矢量累加器工作区(VAC Areas,相当于5张专门算三维矩阵的大绘图桌)。因为旧任务没算完不肯腾地方,新任务瞬间把桌子占满了。

8 张小桌子占满,系统抛出 1202 警报;5 张大绘图桌用光,系统抛出 1201 警报!

换作普通电脑,此时早已蓝屏死机,登月舱将在几秒内失控撞向月球陨石坑。

但奇迹就在这一刻发生了

早在登月前一年,汉密尔顿与 MIT 团队就在系统里埋下了一套名为 BAILOUT(跳伞逃生)的“重启保护”机制。当调度器发现工作区耗尽时,系统并未陷入死锁,并在短短数毫秒内完成了自愈式软重启!

在重启瞬间,计算机干了三件极其果断的事:

  1. 清空积压队列
    ,把卡住的重复任务一把扫空;
  2. 依靠代码中预设的“路标点(Waypoints)”,精准恢复最新一份核心制导与发动机控制任务,推进器没有哪怕一毫秒的断火;
  3. 无情踢掉次要任务
    ,奥尔德林刚调出来的那个耗费算力的 Verb 16 Noun 68 屏幕刷新循环,被系统当场抛弃!

这就是教科书级别的“动态卸载(Load Shedding)”:在生死关头,扔掉仪表盘上的花哨显示,拼死保住方向盘和刹车!

与此同时,在距离月球 38 万公里外的休斯敦控制中心,年仅 24 岁的计算机工程师杰克·加曼(Jack Garman)低头看了一眼自己手写的报警代码速查表,在 30 秒内通过内线告诉 26 岁的制导官史蒂夫·贝尔斯(Steve Bales):只要警报不连续狂闪,说明计算机正在完美自愈,可以继续下降(Go)!

整个下降段,1201 与 1202 警报一共响了 5 次,计算机就用毫秒级的自愈机制成功化解了 5 次危机,最终护送阿姆斯特朗和奥尔德林安全降落在静海基地。

04尾声:穿越半个世纪的工程启示录

从 2016 年这段代码首次在 Hacker News 掀起热烈讨论,到 2026 年秋天的十周年重温,为什么每隔几年,全世界的程序员都会重新翻开阿波罗 11 号的源码?

因为在算力廉价、动辄几十 GB 内存起步、连写个贪吃蛇都要调用几百兆框架的今天,那套躺在 4KB 磁芯里的汇编代码,像一座用手工打磨出的远古方尖碑。

它让我们看到,在连“软件”这个词都还没被社会正视的荒莽年代,一群平均年龄二十多岁的年轻人,是如何用三项多项式抠出 40 倍的精度,如何用铜线一针一线织出通往星辰的阶梯,又如何用未雨绸缪的优先级架构,在距离月面几千英尺的绝境中,从死神手里抢回了人类的第一次登月。

玛格丽特·汉密尔顿已经合上了她的人生代码本。但只要你打开 GitHub,翻开那几万行由志愿者一字字敲回来的字符,那句写着 BURN, BABY, BURN 的点火指令,依然在屏幕里熠熠生辉。

相关学习资料