夜雨聆风学习资料网

ARTICLE · 1271045

4KB登月源码引爆GitHub!90岁软件教母离世,揭秘57年前女工“手织”的救命

4KB登月源码引爆GitHub!90岁软件教母离世,揭秘57年前女工“手织”的救命

一条只有十个英文单词的帖子,最近在社交平台上再度刷屏。

账号 World of Engineering 甩出一句话:“阿波罗11号的源代码,已经在 GitHub 上公开了。”

评论区瞬间沸腾有人摩拳擦掌,调侃说“现在谁都能在车库里搞自己的太空计划了”。也有程序员算了一笔账,忍不住发帖自嘲:当年把人类送上月球的计算机,内存只有大约 4KB;而今天,你电脑上随便打开一个浏览器标签页,就要吞掉几百兆内存。

▲ 再次引起讨论的阿波罗11号源码帖(本地渲染卡片)

▲ 程序员对 4KB 登月内存与现代浏览器内存占用的调侃(本地渲染卡片)

但如果你顺着链接点进那个名为 chrislgarry/Apollo-11 的仓库,狂热的猎奇感很快就会冷却下来,变成一种深沉的震撼。

就在这波讨论再次冲上热搜的前几天,2026年9月30日,当年领导阿波罗机载软件团队的传奇女科学家玛格丽特·汉密尔顿(Margaret Hamilton)刚刚离世,享年90岁。

▲ 麻省理工学院发布的玛格丽特·汉密尔顿讣告

当全球开发者再次点开这份 57 年前的代码,纸页上留下的细节,让登月工程的艰难重新浮现在眼前。

01纸堆里的十年考古

社交网络的病毒式传播,很容易给人一种错觉:仿佛是 NASA 某天突然大发慈悲,把尘封在绝密硬盘里的登月代码一键上传到了 GitHub,承诺让全世界的极客随时下载、随时复刻。

现实却要笨拙得多,也珍贵得多

这份拥有超过 7.6 万颗星标的仓库,根本不是 NASA 官方导出的电子档。早在 2016 年前后,它就已经上线它的诞生,是一群硬核志愿者耗时多年的“数字考古”。

▲ GitHub 上的 chrislgarry/Apollo-11 仓库主页,包含指令舱与登月舱两大目录

1969 年的代码保存在哪里?保存在麻省理工学院博物馆的箱子里,那是厚达数千页、早就泛黄的纸质汇编打印清单。

为了不让人类第一次登月的逻辑死在故纸堆里,研究者保罗·菲尔德(Paul Fjeld)在博物馆协调员黛博拉·道格拉斯(Deborah Douglas)的帮助下,对着这些纸质档案一页一页拍照扫描。随后,Virtual AGC 项目的维护者罗恩·伯基(Ron Burkey)带领志愿者,像抄写中世纪羊皮卷一样,把纸上的字符一行行敲进电脑,再用专门编写的 yaYUL 汇编器反复比对校验。最后,克里斯·加里(Chris Garry)才把这套可检索的文本搬上了 GitHub。

打开仓库,迎面就是两个主目录:Comanche055 和 Luminary099。

前者装在指令舱里,对应著名的 Colossus 2A 程序;后者装在“鹰号”登月舱里,对应 Luminary 1A 程序。这两份代码保存了 1969 年 7 月飞船所用程序的原始汇编指令。

点开 Comanche055 目录下的 CONTRACT_AND_APPROVALS.agc 文件,时间仿佛瞬间倒流。这是一页被原原本本敲进代码的合同审批单:日期写着 1969年3月28日,提交人一栏赫然签着 Margaret H. Hamilton(Colossus 编程负责人),下面整齐排列着六位主管的审批署名。

正如中文技术社区博主“卡夫卡”在长帖中拆解的那样:这个仓库至今仍接受代码合并请求(PR),但规矩极其特殊,它拒绝任何试图“优化”或“改进”代码的现代聪明才智,只接受将转录文本与 1969 年原始扫描件对齐的勘误。

▲ 开发者对仓库来源与 PR 规则的梳理(本地渲染卡片)

它不解决你今天工作中的任何 Bug。7 万多颗星标,是现代程序员向半个世纪前那群拓荒者行的一场集体注目礼。

02女工手织800米铜线的死线

第一次翻看阿波罗源码的年轻程序员,往往会被里面的“摇滚气息”迷住。

在很多人想象中,那是一个充满极客浪漫的黄金年代:天才程序员们喝着咖啡,在只有 2.048 MHz 主频、2048 字(约 4KB)RAM 的阿波罗制导计算机(AGC)上谈笑风生,随手写下改变世界的代码。

源码里的注释似乎也在印证这种浪漫。登月舱的主点火例程,文件名狂野地叫作 BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc(燃烧吧宝贝!主点火程序),这是程序员唐·艾尔斯(Don Eyles)向 1960 年代著名黑人电台 DJ 口头禅的致敬。处理宇航员键盘和指示灯的交互程序,被命名为 PINBALL_GAME_BUTTONS_AND_LIGHTS.agc(弹珠台游戏按钮与灯光)。

▲ 登月舱源码中著名的 BURN_BABY_BURN 主点火例程

但如果你仔细搜索整座代码库,会发现一个令人毛骨悚然的细节:有开发者翻看代码后感叹,很少见到现代代码里常见的 TODO(待办)或 FIXME(待修复)标记。

这些感叹,也让人想起当时修改飞行软件的代价。

因为现实是,他们的代码一旦写完,就要变成一团无法修改的金属丝。

在 1960 年代,要把 36,864 字(约 72KB) 的只读程序塞进一个手提箱大小、功耗仅 55 瓦的机箱里,而且还要扛住火箭发射时的狂暴震动与太空辐射,普通磁芯根本做不到。普通的 RAM 磁芯,一个微型铁氧体磁环只能靠顺时针或逆时针磁化存 1 比特数据。

▲ 阿波罗制导计算机(AGC)、DSKY 键盘界面与核心硬件参数

为了把存储密度暴增 5 倍以上,MIT 仪表实验室用上了一种今天听起来像天方夜谭的黑科技,磁芯绳存储器(Core Rope Memory)。工程师们干脆把编译出来的软件直接叫作“绳子(Ropes)”。

它的原理极其精妙:不用普通小磁环,而是用超薄坡莫合金金属带缠绕出直径约 6.3 毫米的高导磁环。每一颗磁环对应 192 根细如发丝的检测铜线。

这 192 根线分成 12 股,每股 16 根代表一个 16 位的机器字(15 位数据加 1 位奇偶校验)。规则简单粗暴到了极点:如果这一位代码是 1,铜线就从磁环中心的孔里穿过去;如果是 0,铜线就从磁环外侧绕过去 这样,单单一颗小磁环,就硬生生“绑”进了 192 比特的死数据!

读取的时候更绝电路采用了一种“反向抑制寻址”的排除法:就像老师在 128 个学生的礼堂里找人,先命令其余 127 个学生同时用双手捂死耳朵(通过 16 根抑制线通入反向抵消电流),然后对着全场大吼一声(注入 450 毫安强电流脉冲)。全场只有那 1 颗没被抑制的磁环发生磁极翻转,在穿过它肚子的铜线上感应出几百毫伏的微弱电压,瞬间还原出二进制指令。

那么问题来了:一台 AGC 有 6 个磁芯绳模块,每个模块 512 颗磁环,要把足足半英里(约 800 米)长的细铜线,分毫不差地穿进或绕过几百颗小铁环,靠谁来做?

靠位于马萨诸塞州沃尔瑟姆的雷神(Raytheon)工厂里,一群从当地纺织厂和沃尔瑟姆钟表厂招募来的女工。

当汉密尔顿团队的代码在大型机上编译通过后,输出一卷打孔的聚酯薄膜纸带(Mylar Tape)。在雷神车间里,两名女工面对面坐着,机器读取纸带上的 0 和 1,带动磁芯阵列在平面上自动平移,把代表 1 的那颗磁环精准对准面板中央的一个白色圆形导孔。女工手里拿着装有铜线的空心长针,一针一针穿过白孔,再挂上尼龙定位销拉紧。

因为织线的是这群手艺精湛的纺织与钟表女工,程序员们在内部敬畏又亲切地把这种只读内存称为 “LOL Memory”(Little Old Lady Memory,老太太存储器)。

当 192 根线全部织完,测试台逐字比对无误后,工人会浇入环氧树脂,把整块磁芯绳彻底灌封冻死。

这就是 1969 年写代码的残酷代价:每一块磁芯绳模块的织造与测试周期长达 8 周,单块造价高达 15,000 美元(全机 6 块就是 9 万美元)。飞行软件因此需要提前交付制造一旦女工穿针引线完毕、浇上环氧树脂,若改动影响程序机器码,就可能需要重新制造相应的存储模块。

今天读到那些幽默的注释,仍能感到工程师们在紧张工作中留给彼此的一点轻松。

03带着报警码绝地求生

外行看登月,总以为阿波罗的成功是因为打造了一台“零缺陷、永不出错”的完美机器。

工程师必须预先考虑故障,为飞行中的意外留下恢复的余地。

既然整套软件是靠半英里长的铜线手工织出来的,万一火箭升空时的剧烈震动,震断了某根铜线的焊点,或者击穿了一颗立木焊接的二极管,正在飞向月球的宇航员怎么知道自己的电脑没“失忆”?

翻开 GitHub 仓库里 Luminary099/AGC_BLOCK_TWO_SELF_CHECK.agc 这个文件,你会看到一个让人拍案叫绝的设计。

启用相应自检模式后,CPU 进入 0 优先级的空闲循环(DUMMYJOB)时,后台会运行一个叫 ROPECHK 的巡检程序,把全部 36 个存储体(Banks)里的铜线指令从头到尾做加法校验。一旦不对劲,立刻点亮 01102 报警码。

但这里有个难题:如果为了核对每个存储体(1,024 字)的累加和是否正确,专门在内存里存一张“标准答案对照表”,不仅浪费宝贵的存储空间,对照表本身所在的铜线也可能断掉。

怎么在不存答案的情况下核对答案?

阿波罗的程序员和汇编器玩了一个极其聪明的数学魔术。在每一个存储体有效代码的末尾,汇编器会自动塞进一个专门计算出来的 15 位凑整常数,源码第 436 行的注释里,程序员调皮地把它命名为 BUGGER WORD(捣蛋字/凑整字)。

这个 BUGGER WORD 的数值被精确配平到什么程度?当你把第 05 号存储体里从第 1 个字到 BUGGER WORD 为止的所有指令全部加起来,算出来的总和,在数值上不多不少,正好等于存储体自己的编号:+00005(或 -00005)!

宇航员可以在 DSKY 键盘上敲入动词 V91E,屏幕第一行显示当前存储体的累加和,第二行显示存储体编号。将显示的累加和与存储体编号按校验规则比较,就能检查是否出现存储错误。校验和相符,是一项检查结果,不能保证每根铜线都毫发无损。

这种“把错误恢复写进基因”的工程哲学,在 1969 年 7 月 20 日人类距离月面只有几千英尺的生死关头,真正救了阿波罗11号的命。

当时,“鹰号”登月舱正在全力点火下降,宇航员面前的屏幕突然疯狂闪烁,接连爆出 1202 和 1201 报警码!

原因是交会雷达的开关位置不对,导致大量无用的雷达脉冲信号像洪水一样涌入计算机,直接把只有 2.048 MHz 的 CPU 塞爆了,每秒钟要求处理的任务量,超过了硬件极限。

若系统无法及时恢复过载,着陆所需的制导计算就会受到威胁。

但阿波罗计算机没有死得益于哈尔·兰宁(Hal Laning)奠定、汉密尔顿团队完善落地的异步执行体(Executive)与优先级调度机制,软件在过载的瞬间做出了极其冷酷而正确的决断:通过重启恢复机制清理过载作业,优先恢复着陆所需的关键制导与控制计算。

计算机一边带着 1202 报警重启清理低优先级队列,一边稳稳托住飞船,直到阿姆斯特朗说出那句“鹰已着陆”。

04写在最后:为什么我们还在给57年前的代码点Star?

当时光来到 2026 年的秋天,90 岁的玛格丽特·汉密尔顿走完了她传奇的一生。

上世纪 60 年代,当她在麻省理工学院负责阿波罗飞行软件时,软件还被视为硬件的附属品,像是女工手里的毛线活,在工程会议上根本上不了台面。汉密尔顿在工作中坚持推广 “Software Engineering”(软件工程) 这个词。

她坚持把写代码当作和造火箭发动机一样关乎生死的严肃工程。

今天,我们拥有了近乎无限的内存、每秒运算数十亿次的芯片、随时可以热修复的云端服务器,甚至有了能在一秒钟内生成上千行代码的 AI。但在这个代码变得无比廉价、一个网页标签页就能挥霍几百兆内存的时代,全球却有超过 7.6 万名开发者涌进 GitHub,给一份根本无法在现代电脑上直接运行的 1969 年汇编档案点下 Star。

人们是在透过那些泛黄扫描件转录出的 .agc 文件,凝视人类工程史上最滚烫的年代,在那个年代里,飞行程序经编译后被织进磁芯绳。一位 32 岁的女性工程师在审批页郑重签下自己的名字,与团队一起,把经过反复验证的软件送向月球。

相关学习资料