最近,NASA 正式将 1969 年阿波罗 11 号(Apollo 11)所使用的 AGC(Apollo Guidance Computer)导航计算机系统源码公之于众,并以“公有领域”(Public Domain)的形式托管在 GitHub 上。
回顾当年,这套系统的硬件资源极其有限:仅依赖 4KB RAM、74KB ROM 以及一颗主频为 1.024MHz 的处理器,便成功支撑了人类首次登月这一壮举。要知道,在1969年,像 Intel 4004 这样的微处理器尚未面世。AGC 系统是基于约 2800 个双输入 NOR 门构建的集成电路,指令长度为 16 位,每秒大约能执行 4 万次加法运算。
这 4KB RAM 采用的是 Magnetic Core Memory(磁芯内存),容量大约相当于 2000 个字(Words)。而配套的 74KB ROM 则使用了 Core Rope Memory(芯绳存储器),其制造过程非常独特——由纺织厂女工手工将导线穿过磁芯编织而成。导线穿过磁芯代表逻辑“1”,绕过去则代表“0”。这意味着程序是真正物理意义上的“硬编码”,几乎不可能因辐射或断电而被篡改。
整台计算机重约 32 公斤,功耗约 70 瓦。对比之下,如今一个普通 USB-C 充电器或电子烟内置的微控制器,其算力都可能轻松达到 AGC 的数十甚至上百倍。然而,正是这 2800 个 NOR 门,成就了人类迈向太空的关键一步。
由于硬件资源极度紧张,AGC 的全部 源码 体积仅有 72KB,甚至放不下一张现代的高清图片。但这区区 72KB 却包含了完整的导航、控制、着陆与返回地球的全部逻辑。当年的开发人员完全手写汇编语言,每一行代码都经过精心设计,力求不浪费任何一个比特。
在这份六十多年前的代码中,可以看到仅用三十多行汇编指令,就实现了高精度的正弦/余弦(Sine / Cosine)计算函数,这在当时堪称一项惊人的技术成就。更令人惊叹的是,代码中还实现了超前的“多任务处理”与“错误恢复”机制。
在阿波罗 11 号登月过程中,AGC 曾因雷达数据过载触发著名的“1202 报警”,几乎耗尽了 4KB 的 RAM。幸亏程序内置了优先级调度系统,能够自动丢弃低优先级任务,优先保障最关键的发动机控制与导航任务,并在处理后自动重启。这种“优雅降级”的设计理念,可以说是现代操作系统稳定性的早期雏形。
此外,源码中的注释也展现了当年工程师们的幽默感。例如,在点火程序里,直接写入了当时流行的电台 DJ 口号“BURN_BABY_BURN”;在处理登月雷达的子程序中,注释写着“SEE IF THE SILLY THING IS STILL ON”;甚至还引用了莎士比亚《亨利六世》中的台词来吐槽繁琐的数据输入流程。

值得一提的是,在此次 NASA 公开 AGC 源码后,已有开发者制作出了 AGC 模拟器,让现代人也能体验这套登月系统是如何运行的。
最近发生的一件趣事形成了鲜明对比:NASA 的阿尔忒弥斯 II 号(Artemis II)任务在飞往月球途中,竟然遇到了 Microsoft Outlook 软件故障,需要地面控制中心远程修复。在当今软件动辄消耗数 GB 内存的时代,回看六十多年前那精巧的 72KB 登月代码,它不仅仅是一份历史档案,更深刻地阐明了一个道理:优秀的软件架构与极致的编程艺术,能够极大地弥补硬件能力的不足。这对于当今的软件工程师而言,依然具有深刻的启发意义。
“That’s one small step for man, one giant leap for mankind.”
向六十多年前打造 AGC 导航计算机系统的软件工程师们致敬。
项目地址与代码:
Apollo-11
https://github.com/chrislgarry/Apollo-11?tab=readme-ov-file
|