# 阿波罗登月代码：玩笑之后，再检查一次

格得

发布：2026-10-16

原创文章。

登月舱准备进入点火流程前，要确认一件很具体的事：着陆雷达的天线，是否已经转到了规定位置。

程序先读硬件状态。如果位置不对，就提示宇航员处理。写程序的人在旁边留下一句心里话：“请把那个蠢东西转过去。”等宇航员选择继续，下一行注释又说：

> PROCEED — SEE IF HE'S LYING  
> 继续——看看他有没有撒谎。

初读时，很容易只记住这份不客气。但真正值得停下来看的，是玩笑左边的指令：它把程序送回刚才检查天线的位置。

**宇航员说“好了”，程序就再看一次。**

## 确认之后，仍然看看世界

这段代码来自阿波罗11号登月舱的 Luminary099 程序。在公开转录中，检查天线的入口叫 `P63SPOT3`。后面的几行读取硬件通道，判断天线位置；满足条件，才跳往下一步。等待人的回应之后，`PROCEED` 对应的分支又回到 `P63SPOT3`。

不用懂汇编，也可以沿着两个相同的名字，看懂这个小小的回环。

![阿波罗登月舱源码节选，PROCEED分支返回P63SPOT3，再次读取天线状态](https://taste.fangs.cc/images/articles/apollo-code-check-again/antenna-check.png)

人按下一个键，只能证明他发出了“继续”的意思。天线有没有到位，是另一个问题。可能操作还没完成，可能拨错了开关，也可能设备没有按预期动作。这些是我们理解这段设计时可以想到的情境；代码本身并没有给宇航员的动机下诊断。

它做了一件更有用的事：把是否继续的判断，重新接到可读取的硬件状态上。

这里的分寸在于，程序没有要求人反复保证自己认真，也没有用一段更严肃的警告替代检查。它留给人一个操作入口，再让机器完成机器能够完成的核对。

今天，许多界面仍会把“我已完成”当成事情完成的证据。一份文件显示上传成功，真正要紧的却是对方能否打开；一项设置显示保存成功，真正要紧的是下一次使用时是否生效。并非所有事情都能自动验证，但能验证的部分，值得接回实际结果。

这段源码让人欣赏的，正是这种非常具体的负责。

## 玩笑贴着工作，才有意思

另一份文件的标题更出名：`BURN, BABY, BURN — MASTER IGNITION ROUTINE`，可以译作“烧吧，宝贝，烧吧——主点火例程”。

但往下读几行，语气立刻变了。说明列出这套例程服务于哪些程序、覆盖点火前后哪个时间区间、不同程序如何通过表格传入各自的参数。再往后，还明确写出：它由 Adler 和 Eyles 构思、实现，并且——请注意——由他们维护。

“燃烧吧”把人拉近，接下来的说明则让接手者知道该怎样使用、该找谁。

同样，“看看他有没有撒谎”之所以比随手写一个笑话更好，是因为它紧贴着返回检查的动作。读者笑过之后，反而更容易记住：这一行不能只看人的回答。

这也有代价。带刺的语气未必适合公开界面，文化典故会让不熟悉它的人多绕一步。源码中的这句玩笑是写给读代码的人看的，并不是登月舱显示器真的向宇航员说了这句话。欣赏它，不必把同一种口吻搬进每个产品。

可借鉴的是两种声音如何放在一起：人在语言里保留性格，程序在行为上交代清楚。轻松的标题下面，有足够精确的说明托着。

## 连感动，也值得再检查一次

围绕这些源码的文章常把许多故事串在一起：古怪的名字、莎士比亚、极小的内存、写着“希望”的临时代码。它们很容易组成一幅“从前的人无所不能”的画面。

但打开文件，会遇到一个很有意思的提醒。键盘与显示程序开头明确说明：某一类标记的注释，是 Virtual AGC 项目在21世纪加上的，并非原始源码。

例如，关于“动词＋名词”界面如何从实验室演示延续到飞行软件的那段故事，署名是 Ron Burkey，时间是2009年7月。主点火例程名称与电台主持人口头禅之间的渊源，也被标明是2009年补入的回忆说明。

名称本身属于老代码；解释名称的这段文字，属于后来的人对历史的整理。两者都有价值，但分开读，才能听清是谁在什么时候说话。

这也让那座 GitHub 仓库多出一层值得欣赏的东西。它不只是展示一群天才留下的漂亮遗物，还保留了整理者的劳动：原件来自哪里，谁做了数字化，谁在转录，哪里修正过错字，哪些话是后来补充的。仓库甚至明确欢迎大家对照纸本扫描，找出转录的差异。

工程师留下了检查硬件的回环，整理者留下了检查文本的入口。前者不把一次按键当成天线已经到位，后者也不要求读者把眼前的转录奉为不可质疑的原件。

我愿意把这种品质叫作可靠的体贴：给使用者一条走得下去的路，也给后来的人一次重新确认的机会。

再看那句“看看他有没有撒谎”，它最动人的部分，仍然是左边那条朴素的返回指令。

---

本文由[新智物种的阿波罗源码介绍](https://mp.weixin.qq.com/s/6nJtmLn3ngcAdOcRU8sE5w)引出，独立核对了[仓库说明](https://github.com/chrislgarry/Apollo-11/tree/911e5c0283c629c50cb97666f34065e8c07d71a5)、[天线检查代码](https://github.com/chrislgarry/Apollo-11/blob/911e5c0283c629c50cb97666f34065e8c07d71a5/Luminary099/THE_LUNAR_LANDING.agc#L239-L255)、[主点火例程](https://github.com/chrislgarry/Apollo-11/blob/911e5c0283c629c50cb97666f34065e8c07d71a5/Luminary099/BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc)及[键盘与显示程序的后补说明](https://github.com/chrislgarry/Apollo-11/blob/911e5c0283c629c50cb97666f34065e8c07d71a5/Luminary099/PINBALL_GAME_BUTTONS_AND_LIGHTS.agc)。英文短句的中文译意与设计判断由本文作者提供；本次为源码文本细读，未运行飞行软件或模拟器。

## 图片出处

- Luminary099《THE_LUNAR_LANDING》中的天线检查片段。依公开转录重新排版；蓝色一行返回顶部标签。省略前后代码，非1969年纸本扫描。 · [来源](https://github.com/chrislgarry/Apollo-11/blob/911e5c0283c629c50cb97666f34065e8c07d71a5/Luminary099/THE_LUNAR_LANDING.agc#L239-L249) · 仓库及文件标注Public domain。本文节选公版源码并重新排版，图像用于正文及本文封面。
