ARTICLE · 1200803
阿波罗11号源码刷屏GitHub!90岁女掌门离世,4KB内存藏着最逆天的架构

作者 | 异象
编辑 | 乔见真
一句简短的英文推文,突然在全网技术圈炸开了锅。
“阿波罗11号的源代码,现在可以在GitHub上看。”
评论区里瞬间沸腾,有人调侃“现在谁都能在车库里手搓一个航天局了”,也有程序员灵魂发问:“有没有人已经用Rust把它重写了一遍?”

▲ 引发全网技术圈围观的极简热帖
顺着网线点进去,是一个名为 chrislgarry/Apollo-11 的开源仓库。约7.53万颗星,8200多个Fork。里面整整齐齐地躺着1969年把人类送上月球的全部核心代码:指令舱程序 Comanche055,以及登月舱程序 Luminary099。
为什么一个2014年就建立的老仓库,会在2026年10月中旬再次刷屏?那些满屏天书般的汇编字符背后,到底藏着什么让当代顶尖工程师都头皮发麻的秘密?
顺着代码里的蛛丝马迹一层层往下剥,你会看到一场横跨半个世纪的硬核工程奇迹。

▲ GitHub上狂揽约7.53万星的阿波罗11号源码仓库
01一页发黄的签名,与一位传奇的谢幕
很多人第一反应是:NASA怎么突然想通,把压箱底的绝密代码一键上传了?
真相反而是个极其硬核的“愚公移山”故事。
上世纪60年代,程序员用纸质清单保存和核对代码。阿波罗飞船的代码,是一厚摞保存在麻省理工学院(MIT)博物馆里的纸质打印清单。2000年代起,航空史研究者保罗·菲尔德(Paul Fjeld)在博物馆协调下,把这些发黄的纸页一页页拍成照片;随后,全球志愿者对着扫描件,用键盘一行一行把代码重新敲进电脑,再由 Virtual AGC 项目配齐仿真器与汇编工具链 yaYUL。
打开指令舱源码的第一页 CONTRACT_AND_APPROVALS.agc,一段用纯字符拼出来的表格瞬间把人拉回1969年3月28日。在“提交人”一栏,赫然印着一个名字:玛格丽特·H·汉密尔顿(Margaret H. Hamilton),Colossus编程负责人。
就在不久前的 2026年9月30日,90岁的玛格丽特·汉密尔顿在剑桥市离世。《卫报》、《纽约时报》等全球主流媒体纷纷刊文悼念。在那个计算机只有硬件大牛、写代码被视作“文员杂活”的年代,正是这位年轻的母亲带领MIT团队写下了登月代码,并推动普及了“软件工程”(Software Engineering)这个词。
翻开这些代码,也能重温这位“代码女皇”和她的团队留下的工作。
024KB内存与“纺织女工”:把代码织进铜线里
点开 .agc 源码文件,1960年代极客们的幽默感便从注释里冒了出来。
比如负责登月舱发动机点火的核心文件,名字竟然叫 BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc(烧吧宝贝,烧吧,主点火例程)。这是程序员唐·艾尔斯(Don Eyles)从当年黑人电台DJ的口头禅里借来的名字。再往下翻,注释里还夹杂着法语格言“愿心怀恶意者蒙羞”和拉丁语“勿触碰我”。

▲ 登月舱主点火例程,注释中可见适用程序、点火时间窗以及法语和拉丁语格言
幽默归幽默,一旦看清这台计算机的硬件参数,所有现代程序员都会倒吸一口凉气。
今天我们手机里随便一张表情包就要几百KB,一个空白的聊天软件动辄吃掉几百MB内存。而当年把阿姆斯特朗送上月球的阿波罗制导计算机(AGC),可擦除内存(RAM)只有2048个字(约4KB),只读程序存储(ROM)只有36864个字(约72KB),时钟频率仅仅 2 MHz。
这72KB的代码又是怎么存进去的?
答案是:用针线织进去的
根据硬件逆向专家肯·希里夫(Ken Shirriff)的拆解,AGC整机由大约 5600个三输入NOR门(或非门)硬连线搭成,没有任何现代微码。而它的只读存储器叫“磁芯绳”(Core Rope Memory)。在雷神公司(Raytheon)的工厂里,纺织女工们拿着铜线在细小的磁环阵列里穿梭:铜线穿过磁环代表 1,绕过磁环代表 0。

▲ 肯·希里夫拆解AGC磁芯绳内存:字面意义上的“把软件织进电线里”
工程师们半开玩笑地把这种存储器叫做 “LOL Memory”(Little Old Lady memory,老太太存储器)。
这种物理存储方式带来了一个极其残酷的工程约束:代码一旦织成铜线,就无法像今天这样发个热更新补丁。改一行Bug,意味着工厂要拆掉重织。软件发布之日,就是逻辑彻底焊死之时。
03两个“零”的世界,与一行顶四行的极限操作
在如此窒息的物理极限下,怎么写代码才能不超内存、不出差错?
如果你顺着链条拆解AGC的原生指令集,会发现当年的架构师把每一个比特都榨出了汁。
首先是反直觉的数字世界现代计算机几乎全部使用“二进制补码”,而AGC使用的是 15位“一补码”(1's Complement),外加1位硬件奇偶校验。在阿波罗的世界里,同时存在两个“零”:15个0组成的“正零(+0)”,以及15个1组成的“负零(-0)”。程序员在写每一个循环判断时,脑子里都得时刻提防负零这个幽灵孪生兄弟。
既然有正零和负零,AGC干脆顺水推舟,设计出了一条堪称神来之笔的复合指令,CCS(Count, Compare, and Skip,计数、比较并跳步)。
整台机器最初只有十来条基本指令,没有复杂的分支预测。但只要执行一条 CCS 指令,硬件不仅会自动把数值绝对值减一,还会根据原数值是 > +0、= +0、< -0 还是 = -0 四种状态,直接跳往后面紧挨着的第1、第2、第3或第4行代码!一行指令,同时干完了循环计数、取绝对值和四路条件分支三件事,把控制流压缩到了极致。
同样毒辣的还有数值计算在没有硬件浮点单元的机器里怎么算正弦函数
?如果照搬大学高数课本里的泰勒展开公式,为了保证边缘精度,必须算很多项,CPU根本算不过来。
AGC的工程师直接扔掉了标准泰勒系数。他们只用了极简的三项多项式,但对每一个常数系数进行了微调(切比雪夫近似思想),让整个区间里的误差保持较小的幅度。结果令人拍案叫绝:花同样的计算代价,这套微调常数的精度比标准泰勒展开高出了整整一个数量级以上!

▲ 网友拆解AGC源码中的正弦多项式近似:通过微调常数,用三项式跑出了比泰勒展开高一个数量级的精度
04终极悬念:72KB的铁盒子里,竟然藏着一台“虚拟机”!
故事讲到这里,最核心的悬念其实还没有解开。
哪怕指令再精巧、常数再完美,登月计算远比初中数学题复杂。飞船在太空中要实时计算三维轨道力学、四元数姿态旋转、三维矩阵乘法以及卡尔曼滤波。如果把这些极其庞杂的高等数学全部用只有15位精度的原生加减法汇编展开,36K字的磁芯绳面临严峻的容量压力。
阿波罗11号到底是怎么解决这个死局的?
翻开 Virtual AGC 的底层技术手册,你会看到整套源码里最惊世骇俗的架构设计:MIT的哈尔·兰宁(Hal Laning)和查尔斯·芒茨(Charles Muntz)等人,竟然在这台只有4KB内存的16位机器里,用纯软件手搓了一台“虚拟机”,AGC解释器(The Interpreter)!
在源码里,你会频繁看到一行指令:TC INTPRET。一旦执行这行代码,CPU便开始运行解释器,用原生指令逐步解码并执行后续的解释型指令。
这台1960年代的“虚拟机”干了三件逆天的事:
- 双指令极限打包
:原生指令一个字(15位)只能放一条指令。而在解释器里,一个15位的内存字被劈成两半,高7位和低7位同时塞进两条解释器伪指令!操作数地址仍需按规则另存,但操作码的存储更紧凑了。 - 原生级三维矢量与高精度运算
:原生硬件只能算15位小数。但解释器直接把数据抽象成了28位双精度、42位三精度,甚至是占6个字的三维空间矢量(Vector)。程序员只需要写一行 VXP(矢量叉积)或MXV(矩阵乘矢量),解释器就会在后台自动完成几十步繁琐的拆字与循环运算。 - 抹平内存分行的痛苦
:硬件为了突破寻址限制搞出了极其繁琐的Bank切换,而解释器直接提供了一套扁平的线性伪地址空间,让写天体物理方程的科学家彻底摆脱了底层硬件的泥潭。
看到这里,任何一个懂点技术的读者都会感到一阵战栗。
现代读者熟悉Java虚拟机和Python解释器。在阿波罗11号上,先驱们却是为了在36K字的绝境中“省下救命的存储空间”,主动选择用时间换空间!
他们对工程边界有着手术刀般精准的切割:像姿态反推力喷管点火(RCS)这种对微秒级延迟极其敏感的生死动作,全部用原生汇编裸机狂飙;而像每秒更新一次的轨道预测与导航规划,可以承受解释执行的额外耗时,从而节省宝贵的程序存储空间!
再加上汉密尔顿团队设计的异步优先级调度系统,当阿波罗11号距离月面仅几公里、雷达数据意外塞满CPU触发著名的 1201 / 1202 报警时,系统果断丢弃低优先级界面任务,死保高优先级的发动机与姿态控制循环,最终把人类稳稳托举在静海基地之上。
今天,当我们在几个G的依赖包里搭积木、抱怨32GB内存不够用时,不妨去GitHub上翻一翻那本57年前的代码清单。
那些清单保留着人类软件工程刚刚诞生时的模样:用最简陋的或非门,织最精密的铜线,在4KB的方寸之地里,装下整片星辰大海。















































































