1202 警报如何救下登月:读阿波罗 11 号 68K star 源码里超前 20 年的容错设计
一句话总结
这是 1969 年阿波罗 11 号制导计算机(AGC)飞行软件的社区转录归档——13 万行汇编,在一台只有约 2K 字 RAM、36K 字「绳索存储」的机器上,提前几十年实现了优先级实时调度、检查点重启容错、字节码数学虚拟机、过载优雅降级四项现代关键系统的支柱设计。它不是用来跑的,而是用来读的:一部「为失败而设计」的工程圣经,外加一个 68K star 的互联网文化现象。
值得关注的理由
- 登月惊魂的代码现场可以亲手定位:着陆时连发的 1201/1202 程序警报,根因和解法都能在
Luminary099/EXECUTIVE.agc里读到——计算机过载时不死机,而是按 Hal Laning 设计的优先级调度「丢弃低优先级任务、保住制导」,再靠重启保护从检查点续跑。这套设计直接让阿姆斯特朗得以继续着陆。 - 1969 年的四项设计超前现代 20+ 年:非抢占式优先级 RTOS 内核(商用化要等 1987 年的 VxWorks)、检查点/可重入容错(「crash-only software」这个术语 2003 年才出现)、字节码数学虚拟机(JVM 思想早了十余年)、负载脱落式优雅降级(云原生时代才成共识)。读它等于读一份关键系统设计的「先知文本」。
- 它是「软件工程」一词的诞生地,也是顶级内容选题:Margaret Hamilton 在此期间提出并推广「software engineering」;代码里藏着
BURN_BABY_BURN、TEMPORARY, I HOPE HOPE HOPE、# PLEASE CRANK THE SILLY THING AROUND等工程师彩蛋;issue 区更是全球开发者把历史代码玩成「行为艺术现场」的奇观。故事密度极高。
项目展示
仓库本身是纯代码 + 多语言文字,无截图。最佳「亲手体验」入口是把 VirtualAGC 编译进浏览器的在线仿真器,可直接操作 DSKY 面板:
- 在线仿真 moonjs(浏览器内运行真实 AGC + DSKY):https://www.svtsim.com/moonjs/agc.html
- 配图建议:Margaret Hamilton 站在与自己等身高的阿波罗源码打印纸旁的 1969 年 NASA/MIT 历史照片(公有领域,来源标注「NASA / MIT Museum」)
项目画像
| 维度 | 数据 |
|---|---|
| GitHub | https://github.com/chrislgarry/Apollo-11 |
| Star / Fork | 68,038 / 7,694 |
| 代码行数 | 13 万行 AGC 汇编(指令舱 Comanche055 65,348 行 + 登月舱 Luminary099 64,838 行,175 个 .agc 模块;行内注释率约 48%)。注:tokei 不识别 .agc,须本地实测 |
| 项目年龄 | 转录项目 12 年(2014 起),原始代码作于 1969 |
| 开发阶段 | 低维护(历史存档,代码已冻结) |
| 贡献模式 | 社区众包转录 + 60+ 语言 README 翻译(215 人,hacktoberfest 友好) |
| 热度定位 | 大众热门 / 存量经典(GitHub 历史高星「文化·教育」类第一梯队) |
| 质量评级 | 注释「A+」 容错设计「A+」 模块化「A」 可读性「B」(汇编时代局限) |
作者视角:为什么存在这个项目
本仓库要分两层看「作者」:原始代码的创造者,与 GitHub 仓库的转录策展者。
创始人/作者背景
原始作者 = 1969 年 NASA / MIT 仪器实验室团队:
- Margaret Hamilton——COLOSSUS 编程负责人,领导阿波罗在轨飞行软件开发,并在此期间提出并推广「software engineering」一词,为这门学科正名。那张她站在与自己等高的源码打印纸旁的著名照片,正出自这批代码。
- Hal Laning——设计了 AGC 的优先级调度执行系统(Executive),即「过载时丢弃低优先级、保住关键任务」的核心机制,登月时正是它救了场。
- Don Eyles——25 岁编写登月舱着陆下降制导程序,1202 警报中正是他的代码扛住了过载。
仓库策展者 = Chris Garry(chrislgarry)+ 215 位社区贡献者:前 NASA 实习生,2016 年 7 月把这批源码上传 GitHub 后病毒式走红(commit 月度分布在 2016-07 单月暴增 126 次)。真正的转录主力是社区(James Harris 127 commits 等),Top 贡献者仅占 24.4%,是典型的「逐字打字录入 + 多语言翻译」众包项目。权威源头则是 Ron Burkey 的 VirtualAGC 项目(从 MIT 博物馆原始打印件扫描转录)。
问题判断
团队面对的是一个当时无人解决过的命题:用一台内存比今天一封电子邮件还小的机器,跑一个永不停机的实时操作系统。Hamilton 观察到的关键现实是——宇航员会在错误的时刻按错键、硬件会瞬态抽风、任务会比预算的算力更重。她坚持软件必须像桥梁一样被工程化地设计成「为失败而生」。
解法哲学
三条贯穿全代码的信条:
- 优先级即生命线:算力不够时不是平均变慢,而是保高优先级、丢低优先级(Laning 的 Executive)。
- 状态可重建胜过状态不丢:与其防止崩溃,不如让崩溃后能在毫秒级从最近检查点无缝续跑(Hamilton 主导的重启保护 + phase table)。
- 空间比速度贵:宁可用解释执行慢一个量级,也要把数学运算的代码密度压到极限(解释器虚拟机),好把够多的物理塞进 36K 绳索。
战略意图
AGC 是阿波罗「自主返回能力」的核心:即便与地面失联,飞船也能靠机上软件完成入轨、着陆、起飞、交会、再入。这套软件在整个登月工程里承担的是「最后一道、不能失败」的实时控制职责——这也是它把可靠性置于一切之上的根本原因。
核心价值提炼
创新之处(1969 年的超前设计)
- 非抢占式优先级调度 + 静态 core set 池(
EXECUTIVE.agc,新颖度 5/5,历史意义 5/5,现代可迁移性 5/5):维护 7 个 core set(每个 12 个寄存器的任务上下文)+ 5 个 VAC 区,作业按PRIORITY寄存器排序、主动让点切换。当 core set 耗尽就TC BAILOUT1 / OCT 1202——这正是登月著名的 1202 警报;VAC 区耗尽则报 1201。过载时不死机,而是软件重启 + 丢弃积压的低优先级作业,制导照常。现代叫优先级 RTOS,商用化晚了 20+ 年。 - 检查点 + 可重入 phase 重启保护(本套代码最伟大的设计,新颖度 5/5):把每个长任务切成可重入的 phase,推进时调用
PHASCHNG把「组号.相位号」写进 phase table(冗余存原值+补码,异或校验防位翻转)。硬件复位后GOPROG校验并从检查点把每个活动任务重新派发、从断点续跑。1202 当天BAILOUT反复触发、每次都从 phase 续跑,制导从未中断。现代叫 checkpoint-restart / crash-only software,术语 2000 年代才定型。 - 字节码数学虚拟机(
INTERPRETER.agc,新颖度 5/5):硬件只有定点加减,却要算向量叉积、矩阵旋转、反三角、双精度。团队实现了一台解释执行的「数学协处理器」——每个 15 位字解出两个 7 位伪操作码,伪指令集含VXV(叉积)、DOT(点积)、MXV(矩阵乘向量)、UNIT(归一化)、SQRT、ARCSIN等。一行VXV顶几十条原生指令,用执行速度换代码密度。和 JVM 同思想、早了十余年。 - 名词-动词人机接口(
PINBALL_*.agc,新颖度 4/5):一切交互归约为一对两位十进制码——Verb(动作)+ Noun(数据对象)。「Verb 16 Noun 68」= 监视着陆数据。用最少硬件表达近乎无限的命令组合。这就是今天命令调色板、git commit、REST「动词+资源」的同构思想。
可复用的模式与技巧(给现代工程师的启示)
- 为失败而设计,而非假设不失败:AGC 不试图杜绝崩溃,而是让崩溃后毫秒内从检查点续跑——对应今天的幂等、重试、断点续传、crash-only。
- 优雅降级是关键系统第一美德:过载时丢弃低优先级、保住核心功能(1202 当天救了登月)——对应现代的 load shedding / 背压 / 熔断。
- 资源约束催生简洁:2K RAM 逼出了静态分配、无锁内核、表驱动、字节码——约束是好设计的助产士。
- 注释即沟通:每个文件头有功能描述、调用序列、报警/中止模式、所需初始化、产出、「被破坏寄存器(debris)」清单——把维护者当人看的工程礼仪。
- 把人的错误纳入设计:DSKY 输入校验、着陆程序里「让宇航员手动转雷达天线、之后复查他是否在撒谎」的防御逻辑——假设操作者会犯错。
关键设计决策
最值得现代工程师深读的是 1202 警报的代码闭环:过载发生在 EXECUTIVE.agc 的 NEXTCORE 找不到空闲 core set 时触发 OCT 1202 → 走 BAILOUT(OCT 40400)软件重启 → GOPROG/FRESH_START_AND_RESTART.agc 校验 phase table 完整性 → 把每个活动任务从其检查点 phase 重新派发。整条链路(PHASCHNG → RESTART_TABLES.agc → GOPROG)共同实现了「重启对宇航员近乎透明」。这套「调度降级 + 检查点续跑」的组合拳,是一份比任何教科书都鲜活的高可靠系统实证。
竞品格局与定位
本仓库无传统竞品(历史存档,不与任何在研项目争夺用户)。此节改述其与权威项目的关系与生态定位。
与 VirtualAGC 的互补关系
唯一强相关的是 VirtualAGC(Ron Burkey 2003 年发起,github.com/virtualagc/virtualagc)。二者互补而非竞争:
chrislgarry/Apollo-11= 面向大众的「展示版/阅读版」转录——目录清晰、README 多语言、为浏览与玩梗优化,star 量是 VirtualAGC 的数十倍,占据大众认知入口;VirtualAGC= 可仿真运行的权威版——含汇编器 yaYUL + CPU 仿真器 yaAGC + DSKY 仿真,是学术与考据的源头。
本仓库 issue #38「Merge changes with upstream VirtualAGC」(至今 open)明确承认 VirtualAGC 是上游权威。引用考据细节时应以 VirtualAGC / ibiblio.org/apollo 为准。
生态定位
它凭「易读 + 高 star + 强文化属性」占据「人类登月源码」这一不可复制话题的大众入口;护城河就是话题本身。派生出 moonjs(在线仿真)、iAGC(iOS 仿真器)等衍生玩法。
套利机会分析
- 信息差:它不是技术选型对象,而是故事密度满分的内容选题——「软件工程」一词诞生地、Margaret Hamilton 传奇、1202 警报登月惊魂、代码注释梗、社区玩梗文化,每条都是公众号爆款料。中文圈对这些故事的系统梳理仍不充分,套利空间大。
- 技术借鉴:优先级调度、检查点可重入容错、字节码 VM 换空间、负载脱落式降级——这四项 1969 年的设计是今天高可靠/嵌入式/分布式系统的核心范式,可直接当设计灵感。
- 生态位:填补「人类登月源码的大众可读入口」,与权威的 VirtualAGC 形成「展示版 ↔ 权威版」分工。
- 趋势判断:存量经典,不靠迭代涨星,靠永恒话题持续吸纳新读者;护城河不可复制。
风险与不足
- 它是只读历史存档,不可用于任何现代工程:强绑定 AGC 硬件与 bank 切换结构,无现代可移植性;要「跑起来」需用 VirtualAGC 而非本仓库。
- commit 历史易被误读:586 个 commit 是 2014+ 的社区转录/翻译活动,不是 1969 年原始开发——分析时务必厘清,否则会闹「阿波罗团队 12 年只提交 586 次」的笑话。
- 权威性需溯源:策展者 chrislgarry 是可信的社区整理者,但权威源头是 Ron Burkey 的 VirtualAGC;细节考据应以上游为准。
- 可读性门槛高:AGC 汇编 + bank 切换 + 偏移寻址使控制流跳转密集,靠近半数的注释才得以补偿——非汇编背景读者需借助 DeepWiki 等导览。
行动建议
- 如果你要用它:别当软件用——它是只读史料。要体验就用 moonjs 在线仿真器操作 DSKY;要可运行/可汇编的权威版用 VirtualAGC。
- 如果你要学它:直奔
Luminary099/EXECUTIVE.agc(1202 警报的代码现场)与重启保护链(PHASCHNG→RESTART_TABLES.agc→FRESH_START_AND_RESTART.agc),再看INTERPRETER.agc(数学虚拟机)、THE_LUNAR_LANDING.agc(Don Eyles 的着陆程序)。配 DeepWiki 导览读最高效。 - 如果你要传播它:最佳叙事角度是「1202 警报:一套调度系统如何救下登月」「软件工程之母 Margaret Hamilton」「68K star 代码注释梗与社区玩梗文化」——技术与人文双线都有料。
知识入口
| 资源 | 链接 |
|---|---|
| DeepWiki | https://deepwiki.com/chrislgarry/Apollo-11(已收录,覆盖 Executive/调度/解释器/PINBALL/制导/IMU 对准等) |
| Zread.ai | https://zread.ai/chrislgarry/Apollo-11(访问返回 403,收录未确认) |
| 权威源 / 文献 | VirtualAGC https://www.ibiblio.org/apollo/ ;1201/1202 警报权威技术文档 Cherry「Exegesis of the 1201 and 1202 Alarms」 |
| 在线 Demo | moonjs 浏览器内 AGC 仿真 https://www.svtsim.com/moonjs/agc.html |