50年前,3名宇航员带着2台数字计算机奔赴月球。几天后,5亿地球人在电视上看到了尼尔·阿姆斯特朗和巴兹·奥尔德林爬出阿波罗11号登月舱并且在月球静海的粉尘状土壤上留下第一个人类脚印(指令舱驾驶员迈克尔·柯林斯则操控指令舱留在了月球轨道上)的模糊画面。随后,这3名宇航员立刻成了全球知名的名人。而辅助引导、操控飞船的计算机却只在技术爱好者的小圈子里赢得了一些名声。即便如此,阿姆斯特朗为人类迈出的一小步也同样标志着数字计算机技术的一次巨大飞跃。
 
  身处21世纪这个一切都由计算机控制的时代回望往事,我们很难体会到美国宇航局(NASA)在阿波罗飞船上安装计算机这一决定究竟有多么大胆。当时的计算机体积庞大、容易出错、特别耗电,但在飞船上,阿波罗导航计算机必须安装在比随身行李还小的空间之内,使用的能源不能超过一盏电灯。另外,它还必须100%可靠,一次小小的故障就会置宇航员于万劫不复的境地。
 
  尽管阿波罗导航计算机的名头没有阿波罗号的宇航员响亮,人们还是完整记录了它在阿波罗计划中扮演的角色。至少有5本书讲述了它的故事,网络上的相关信息更多。在所有这些可以查到的资料中,历史文献宝库让我们能够非常直接且近距离了解这台新奇计算机的运作机制。技术爱好者自发研究了极少量流传至今的打印输出文件,把某几个版本的阿波罗导航计算机软件转录出来并发布在网络上。因此,你可以在网上通读这些指引阿波罗11号登陆月球的程序,甚至可以在一台“虚拟阿波罗导航计算机”上运行那些程序。
 
  毫无疑问,这些用深奥且过时的编程语言写就的冗长机器指令阅读起来并不容易,哪怕是理解很小一部分程序片段也是异常艰巨的任务。而完成这些任务的回报则是能亲眼看到当时的程序员如何解决一些棘手问题,哪怕是今时今日,这些问题也仍旧是软件工程的巨大挑战。此外,虽然这些文件本身技术性很强,但其能激起普罗大众强烈的共鸣,让我们一窥当时这个高关注度、高风险、高压力工程项目的文化背景。
 
导航、制导和操控
 
  每一次阿波罗登月任务都会携带两台阿波罗导航计算机,一台安在指令舱里,另一台安在登月舱里。两台计算机的硬件几乎一模一样,但软件赋予了它们不同功能。
 
  为了说明计算机在登月任务中开展的工作,我们以登月舱上的阿波罗导航计算机在任务关键阶段(通过自主动力登陆月球表面)的工作负荷为例。第一个任务就是导航:测算飞船的位置、速度和方向,然后绘制出前往目标登陆点的飞船运行轨迹。其中涉及的数据由内部制导系统中的陀螺仪和加速计测算得到,在登陆阶段后期,还会用雷达测高计计算从月球表面返回的信号作为补充。
 
  计算出飞船运行轨迹之后,阿波罗导航计算机必须转动火箭发动机的喷嘴,让登月舱始终保持在既定路线上。与此同时,计算机必须不断调整推力大小,以便登月舱维持适宜的登陆速度。这些制导和操控任务难度非常大,因为登月舱的质量和质心随着燃料的消耗在不断变化,也因为处于火箭废气管顶端的飞船从本质上说就不稳定,就像一把直立在你手掌上的笤帚一样。
 

图片1

阿波罗导航计算机(Apollo Guidance Computer)软件的打印输出文件堆积起来,形成了一座5.5英尺(约1.68米)高的“文件塔”,这个高度和玛格丽特·汉密尔顿(Margaret H. Hamilton)的身高相当。汉密尔顿在1963年以程序员的身份加入了登月项目,数年后成了软件工程部主任。每沓打印文件都对应着某项任务中的指令舱或登月舱程序。这张照片是1969年阿波罗11号启航之前在麻省理工学院仪器实验室拍摄的

 

  除了这些导航、制导以及操控的主要任务之外,阿波罗导航计算机还必须时刻更新驾驶员座舱内的设备运行状况,回应宇航员发出的指令,管理与地球指挥中心之间的数据交流。这种多任务管理机制在如今的计算机系统中已经司空见惯,你手边的笔记本电脑就可以同时运行几十个程序。然而,在20世纪60年代初,创造这种交互式“实时”计算环境的工具和技术都处在非常原始的阶段。
 
芯片与磁芯
 
  阿波罗导航计算机由惯性制导先驱查尔斯·斯塔克·德雷珀(Charles Stark Draper)创办的麻省理工学院仪器实验室设计和生产。虽然德雷珀的这间实验室也设计过弹道导弹上使用的数字化电子设备,但阿波罗导航计算机是该实验室出产的第一台完全可编程数字计算机。
 
  对于硬件工程师来说,困难之处在于要在非常有限的重量、体积和能耗配额下建造出能达到预期要求的计算机。为此,他们采用了一项新兴技术:硅集成电路。每次登月任务中的计算机都包含大约2 800块硅芯片,而每块芯片上又有6根晶体管。
 
  至于记忆系统,设计师则使用了磁芯技术。磁芯就是一些微型铁氧体螺旋管,能且只能在一个方向上磁化,这样就可以代表二进制中的1或0。大部分要储存的信息都是在单次任务期间不会发生任何变化的程序,因此,许多磁芯都是按照只读模式绕线的,存储的内容在建造计算机的时候就固定下来。
 
  逻辑回路和记忆核心都封存在设备舱内的金属箱中。宇航员通过一件叫作“显示键盘”(DSKY)的设备与计算机互动。显示键盘看上去有点像是微波炉上的操控面板,上面有数字小键盘、几个其他功能的按钮以及一块足够显示21位明亮十进制绿色数字的空间。
 
压缩成15位
 
  航天器计算机早期设计中的一项关键决定就是设定构成一个“字”的位数(也即比特数)。单个字的位数越长,所能包含的程序指令就越多,能达到的数学精度就越高,但体积、重量和能耗也会随之增加。阿波罗导航计算机的设计者选择了16位的长度,其中一位用于校验差错,因此,只有15位用于表达数据、地址或指令(现代计算机都是32位或64位的)。
 
  一个15位的字可以容纳215=32 768种不同比特模式。就数字数据来说,阿波罗导航计算机演绎这些模式的方式通常就是±16 383这个范围的数字。将两个字组合在一起就能产生范围在±268 435 455之内的双精度数字。
 
  计算机中的字还可以表示程序中的指令。在阿波罗导航计算机的原始计划中,指令字中的前三位指定为“操作码”或命令码,剩下的12位则记录计算机内存的地址。这个地址可能指向了计算所需的数据,也可能指向了执行下一个指令的位置,具体如何取决于前后程序。
 
  操作码只分配到了3位,意味着只有8种不同指令(也就是从000到111的8种二进制模式)。而12位的地址则将内存中的数字限制在了4 096(212)以下。随着阿波罗计划的深入,这些限制带来了诸多不便,而工程师也找到了方法规避它们。他们把内存组成若干“库”:每个指定位置都存放在对应库里,而独立运行的寄存器则会显示哪个库处于激活状态。设计者还额外增加了几个位数把操作码的容量从8提升到了34。
 
  登上月球的阿波罗导航计算机用于储存程序的只读内存有36 864个字,而用于计算的读写内存则有2 048个字。全部加在一起的总数据容量差不多相当于70 000字节。现代笔记本电脑的内存要比它高10万倍。速度方面,阿波罗导航计算机每秒可执行4万条指令,而现代笔记本电脑可以执行100亿条。
 
软件基础架构
 
  只保留必要元素的框架、少到可怜的内存、简化到不能再简化的指令集给设计阿波罗导航计算机软件的程序员出了一道难题。此外,麻省理工学院的这个软件工程团队要开发的不仅是阿波罗任务期间可以运行的程序,还有大量用于支持开发过程的软件基础架构。
 
  一件至关重要的工具就是汇编程序,它可以将符号指令(例如,用AD表示加法,用TC表示传送控制)转化成阿波罗导航计算机硬件可以识别的二进制编码。这套汇编程序的主要开发者是工程师休·布莱尔-史密斯(Hugh Blair-Smith),他在那个时代的大型计算机编程方面拥有深厚背景知识。汇编程序并不直接在阿波罗导航计算机上运行,而是在大型主机上运行。所有飞行控制程序都会在飞船发射升空前就完成汇编并存入只读内存,这样就没必要在飞船上安装解析汇编程序的机器。
 
  阿波罗导航计算机的数字仿真程序也是在一台主机上运行的,这样就可以在硬件准备就绪之前测试相关程序。随后,一台“混合”模拟器会将真正的阿波罗导航计算机和显示键盘组合到一起,一起整合进来的还有飞船剩余部分及其相关环境的模拟模型和数字模型。
 
  另一项工具则是高级编程语言的解译器,由J·哈尔康姆·拉宁(J.Halcombe Laning)设计,主要撰写人则是查尔斯·芒茨(Charles A.Muntz),两人都是麻省理工学院团队的成员。解译后的语言就能让计算机有能力处理基本算术之外的数学概念,比如矩阵(在表达控制律上很有用)以及三角函数(在导航中必不可少)。实现这些便利功能的代价就是计算机运行速度会放慢到原来的1/10。不过,解译指令和汇编语言可以以任意比例自由混合,这样一来,程序员就可以在确有必要的时候牺牲运行速度,换取更多数学功能。
 
  一个名叫“执行者”的阿波罗导航计算机程序充当了微型操作系统的作用。这个程序也是由拉宁设计,其保持有一张待执行程序的清单,清单中的程序则根据它们的优先级分类。计算机还拥有一个中断系统,以应对外部事件。计算机还允许一些紧急小任务“窃取”小部分内存,而完全不会影响其他程序。这个装置的作用是为来自惯性制导系统和雷达的脉冲流计数。
 
在代码迷宫之中
 
  我第一次阅读阿波罗导航计算机程序时,发现它们很神秘。这些程序并不只是难懂的简洁操作码,更大的挑战在于必须学习如何在众多冗余程序和无关程序中遵循主程序的功能。像传送控制和保存数据这样的指令都会产生程序分支。一旦遇到这类分支程序,指令序列路径就会突然跳到其他位置,并且未必会再度返回原来的位置。追踪指令路径的过程就像是在玩滑梯和梯子棋一样。
 
  阿波罗导航计算机汇编语言的学习强度很高,但难度并不算太大,原因很简单:它包含的操作码太少了。然而,要想真正弄懂其中的程序,你必须掌握麻省理工学院团队为最大程度利用这台小机器而设计的约定和协议。程序打印稿上的一些源程序片段展示了这些不成文规则的几个例子。
 
  我对调用子程序(从程序中的不同位置调用一段代码,然后再把控制交还给当前位置)的这种设计尤为感到困惑。在阿波罗导航计算机中,调用子程序的操作码是TC,它不仅可以把控制传送到子程序的地址上,还可以根据TC指令将相关命令的地址保存到叫作Q寄存器的地方。子程序完成自己的工作之后,只要执行TC Q指令就可以回到主程序。这个流程我理解得还比较透彻。然而,事实证明子程序竟然可以自行更改Q寄存器中的内容,从而改变自己的返程目的地。阿波罗导航计算机中的许多程序都会充分利用这个便利条件。在打印稿上列出的源程序片段中,某个子程序拥有3个返回地址,分别对应某次查询的3种可能回应。在我弄明白这些规则之前,这些源代码简直无法理解。
 
  如今的软件工程规范不提倡使用这种复杂且容易误解的程序,因为它们会让代码变得难以理解、难以维护。不过,符合现代标准的软件是塞不进70 000字节的内存里。
 
旁注
 
  与神秘、难懂的操作码和地址相比,阿波罗导航计算机软件的另一部分则要好理解得多。代码旁边的注释清晰明了,甚至有些好玩。这些旁注是程序员在开发软件时加进去的,完全是为了方便人类理解,对机器没有任何帮助。
 
  这些注释中的大多数都直接解释了相关程序的功能,比如“清除第7位和第14位”“查看上一个运行周期中高度是否小于35 000英尺”。一些语气严厉的警告性注释则标记出了严禁修改的代码。有一行代码被标记为“别动”,而某个常数表程序的标注就是更加专横的“禁止触摸”(Noli Se Tangere,源自圣经的拉丁文)。每个程序旁边的注释风格都不相同,这很有可能是因为其作者不同。
 
  最有趣的是那些大胆摆脱了技术文档刻板、冷漠特征的旁注。一位心怀歉意、紧张不安的程序员将两行代码标注为“只是暂时的,后面我会改的,会改的,会改的”。某个常数被标记为“神秘数字”。一次内存不足的情况被加上了“旅店客满”的注释。某些地方的注释语气则变得轻松愉快起来。打印输出稿的一段文字上写着下面这个请求:“宇航员:请你把这个蠢玩意儿转动一下。”某个程序的作用是检查宇航员有没有遵照规定行事,于是它的旁注是这么写的,“看看这兄弟有没有撒谎”。有读者不禁会问:宇航员会深入研究这些源代码吗?对此,我的回答是,某些宇航员(其中最出名的是巴兹·奥尔德林)是阿波罗导航计算机诞生地仪器实验室的常客。
 
  这些搞怪的提示在子程序名称和标签的选择上也有体现。与警报和故障有关的部分软件用上了“哭泣”“紧急救助”“完蛋了”“灾难”这样的符号。我们还在其他地方碰上了某些面巾纸、橡皮擦和灌肠剂品牌的商标。还有一些则用了花生漫画中的梗作注释,比如“莱纳斯=毯子”(译注:花生漫画是美国的一部著名长篇漫画,莱纳斯是其中的一个漫画形象,出场时常常与毯子为伴)。飞船登陆月球时启动火箭发动机的程序名叫“燃烧吧,宝贝”,这明显是参考了1965年洛杉矶瓦茨骚乱时打出的标语:燃烧吧,宝贝,燃烧!
 
  源代码中的这些轻浮、戏谑的标记或许并没有那么令人意外。程序员大多很年轻,而且显然都很聪明。在这样一群人组成的工作小组中,无论任务有多重大、多严肃,都肯定会衍生出许多内部笑话。此外,他们也都在麻省理工学院任职,这个地方有着悠久的“黑客文化”搞怪历史。另一方面,这个项目由NASA监管,软件的每次更迭都必须经过各级联邦官僚机构审查并批准。因此,惊喜之处并不在于程序中埋藏的这些俏皮话,而在于写下这些俏皮话的人并没有被某些严肃刻板的官员开除。
 
  在一次邮件交流中,我向玛格丽特·汉密尔顿(Margaret H.Hamilton)询问此事。汉密尔顿起初是位数学家,后来改行当了程序员,在1963年加入阿波罗导航计算机小组,之前已经在麻省理工学院的其他几个项目工作。她后来成了麻省理工学院仪器实验室的软件工程(软件工程这个词就是她发明的)部主任。她在邮件中写道:“大家都会认真对待自己的工作,但与此同时,他们也会在各方面的幽默调侃行为中获得乐趣,就比如给飞船上的部分飞行软件起一些滑稽或神秘的名字。”同时,她也坦承NASA否决了一些他们的搞怪发明。
 
哪里可能出错呢?
 
  汉密尔顿说过,阿波罗计划提供了“让各种人为的差错成为可能的机会”。不用费太多力气,我们就能想到一长串本来有可能出错但最终没有出错的隐患清单。
 
  例如,阿波罗导航计算机有两种表达带符号的数字的形式:1的补码和2的补码。这两种形式一旦混用就会造成数值误差。类似,飞船的位置和速度的计算单位是米,但展示给宇航员看的时候单位却是英尺和英尺/秒。只要出现一次计算疏忽,没有转换单位(或者双重转换),就可能引起巨大危害。另一项始终存在的危险则是算术溢出:如果某个数字超过了14位字所能表达的最大正值,那么就会“掉过头”来,变成一个负数。
 

图片2

宇航员可以通过安装在指令舱和登月舱控制面板上的“显示键盘”与舱内的阿波罗导航计算机取得联系,他们还能通过输入一段程序、一个动词或者一个名词(所有这些都用二进制数表示)来完成预先设定好的动作。图中展示的显示键盘来自史密森航空航天博物馆,从未安装在阿波罗飞船上

  你或许会觉得这种差错永远都不可能通过严格的航天任务审查程序,但历史告诉我们,真实的情况恰恰相反。1996年,一个算术溢出导致的差错致使阿丽亚娜五号火箭坠毁,一同陪葬的还有火箭上搭载的4颗卫星。1999年,一个测量单位没有转换的错误导致我们痛失了火星气候轨道器。
 
  阿波罗导航计算机的体积受限一定增加了程序员的认知负担,这里又可以使用子程序设计的例子加以说明。在更大的计算机中,一种叫作“栈”的数据结构会自动追踪子程序的返回地址,哪怕主程序是深度嵌套的。也就是一个程序会调用另一个,而另一个则会调用第三个,以此类推。而阿波罗导航计算机并没有负责追踪返回地址的栈,它只有Q寄存器,其大小只够储存一个地址。无论何时某子程序调用了另一个子程序,程序员都必须找到安全的地方保存返回地址,随后再把它恢复。这个过程中出现的任何意外都会让整个程序彻底迷失。
 
  作为一个想象自己正在为这样一台机器编程的门外汉,我最担心出现错误的地方是多任务机制。当有多项任务需要完成时,“执行者”程序总是会先处理优先级最高的任务。然而,我们也必须保证所有任务最后都能完成,这些目标很难调和。
 
  中断操作就更加危机四伏了。外部环境中发生的任何事件(比如宇航员按下了显示键盘上的按键)都可以在几乎任何时刻暂停正在进行的计算工作并且接管处理器。中断程序必须把可能受到影响的所有寄存器中的内容都保存下来,并且在中断操作结束后把这些内容都恢复出来,这就像是某个盗贼强行进入了民宅,在里面做顿饭,之后为了逃避侦查又把所有东西放回原位。
 
  然而,哪怕有中断﹣恢复协议的保护,有些进程也是严禁中断的(比如在各项工作中进行切换的执行者主程序)。因此,阿波罗导航计算机提供了一个严禁中断的指令和另一个解除这种禁制的指令。但这种机制本身也带来了风险:如果禁止中断操作的时间过长,那么某些重要外部事件可能被忽视。
 
  时至今日,中断操作与多任务处理之间的协调仍旧是对设计者的巨大智力挑战。这些机制引入了对随机行为与不确定行为的度量:只是掌握系统现在的状态还不足以预测其未来的状态。它们的存在加大了我们对程序进行推理或者测试程序所有路径的难度。最令人烦恼、最不常见和最难以预料的故障的根源常常可以追溯到竞争进程之间的某些意想不到的冲突。
 
触发了5次警报的登陆行动
 
  值得庆幸的是,所有阿波罗导航计算机在执行空间任务时都没有出现大的故障,但还是出现了一些我们不想看到的时刻。当阿波罗11号登陆舱朝着月球表面降落时,显示键盘上突然跳出“程序警报”,代码是1202。阿姆斯特朗和奥尔德林不知道是否应该继续登陆。作决定的重担落到了身处休斯敦任务控制中心的指挥员史蒂夫·贝尔斯(Steve Bales)身上。他手上拿着警报代码的备忘单,并且可以和NASA以及麻省理工学院的幕后专家联系。他最后做出决定,“继续登陆”。在登陆舱最终降落在月球表面之前的时间里,登陆舱还发出了4次程序警报,贝尔斯都选择了继续登陆。
 
  在麻省理工学院,阿波罗导航计算机开发团队的成员也在关注着这些变化,并且手忙脚乱地求证1202警报的含义以及可能的起因。相关程序旁边的注释写着“无法提供更多核心集”。每当执行者程序启动一项新任务时,它都会专门为这个新进程分配大小为11个字的读写内存,这就是一个核心集。而为这类核心集预留出的空间最多只能同时容纳8个核心集(也就是说,执行者程序最多只能同时执行8项任务)。如果有进程要求执行者程序提供8个以上的核心集,后者就会发出1202程序警报并且跳转到名为“紧急救助”的主程序上去。
 
  在登月舱降落到月球表面期间,从不需要同时执行8项任务,那么它又怎么会要求执行者程序提供超过8个核心集呢?在需要执行的任务中有一项任务比较繁重:这就是“服务器”程序,它会执行导航、制导和操控所需的所有计算。按照设定,这个程序每2秒运行1次,并且应该在一个运行周期中完成它当时的任务,之后就会关闭,释放自己占用的核心集。2秒后,一个新的服务器程序进程就会带着一个新的核心集启动。然而,由于某些原因,这个程序中的计算工作花费的时间要比设定的长。于是,当下一个服务器程序进程启动时,上一个却还没完成自己的工作,这就导致了未完成任务的积压,并同时继续占用了本应释放的核心集,最后就出现了程序警报。
 
  这个现象的起因倒算不上很神秘。实际上,这个现象在测试飞行硬件时就出现过。两个不同步的电源驱动雷达发出大量伪脉冲,而阿波罗导航计算机则负责把这些脉冲忠实记录下来。每一次脉冲都要消耗一个计算机内存运行周期,持续大约12毫秒。雷达每秒可以发出12 800个脉冲,足以占用计算机内存容量的15%。为此,设计者给每个程序运行周期留出了10%的时间余量。
 
  讨论这种异常情况起因的文章已经很多,它们在谁该为此负责以及如何避免再次出现这种情况这两个问题上还没有形成统一观点。我更感兴趣的是,计算机在面对这种异常情况时是如何回应的。在许多计算机系统中,关键资源耗尽是致命错误,错误发生后,屏幕会变得一片漆黑,键盘也不听使唤,唯一还能工作的就是电源键。阿波罗导航计算机的反应则与此不同,它会尽力处理这种意外情况并且尽力保持运行。每当程序警报出现时,紧急救助程序会把所有在执行者程序下运行的任务清理掉,然后再重启其中最重要的几个。这个过程很像是重启计算机,但只需要几毫秒时间。
 
  计算机屏幕上突然出现的烦人警报现在已经司空见惯,但汉密尔顿指出,这种情况在20世纪60年代还是新鲜事。阿波罗导航计算机的核心是优先级驱动下的多任务工作机制,这样程序警报才可能出现在显示键盘的屏幕上。这种警报机制的功能还不止于此:它们不仅有“胆量”中断其他程序,甚至有胆量在必要的时候中断宇航员自己的操作。
 
令人紧张不安的工作
 
  阿波罗导航计算机项目的一些老人每月会聚餐一次。50年后,这伙人仍旧保留着这个习惯,这表明阿波罗计划在他们的生命中画上了多么浓墨重彩的一笔。(这还表明他们当时是那么年轻。)2017年的时候,我碰巧有机会参加了一次他们的聚会。我发现有两个问题是自己会对遇到的每个人都问的。第一个问题是:在随时可能出现错误的雷区,你是如何制造如此好、如此可靠的东西?第二个问题是:在如此重压下,你没有惊慌失措吗?
 
  就第二个问题来说,桌边的某人将阿波罗导航计算机的开发行动描述为“令人紧张的工作”。不过,其他人则称,自己当时只想着怎么解决这些技术问题,完全没有仔细思考过出现错误的后果。布莱尔﹣史密斯指出,开发团队的非正式座右铭是“我们一定能做到”,这可不只是勇敢而已。他们坚信:凭借自己的能力能够搞定这一切。
 
  至于他们究竟是如何做到这一切的这个问题,则引发了热烈讨论,但我无法将其中的任何一条归结为他们取得成功的秘密。他们非常小心,他们工作非常努力,他们测试也非常彻底;所有这一切都千真万确,没有任何问题,但许多其他软件项目也有才华横溢、勤劳勇敢的成员参与,最后为什么出问题了呢?真正让阿波罗导航计算机项目变得与众不同的究竟是什么呢?
 
  回想起1202警报事件,我问他们成功的关键是不是追求弹性而非追求完美。如果不能做到完全不出错,是不是至少能减小出错造成的破坏呢?结果,他们断然否决了这个答案,他们的目标始终都是开发出一款完美无缺的产品。
 
  我在邮件中也向汉密尔顿提出了类似的问题,她也提到“永远专注于把每件事都做得尽可能完美”。她还认为,中断系统和基于优先级的多任务处理机制(这两个我之前认为是潜在隐患的地方)保证了程序能够“检测到突发状况并且实时从中恢复的灵活性”。
 
  就我而言,“他们如何完成了这个伟大成就?”仍旧是个开放问题,并且也是值得引起学术圈关注的问题。工程学传统要求我们对事故和故障做出细致入微的剖析,但研究那些非常成功的案例也许能对我们有所帮助。
 
保护与展示
 
  史密森航空航天博物馆收藏了大约3 500件阿波罗计划的文物,但阿波罗导航计算机软件并没有在那展出。一些规模较小的博物馆分别保存了一些软件打印稿,但现在这些程序之所以能够广泛传播,几乎完全是因为业余热心人士的努力。
 
  2003年,罗纳德·伯奇(Ronald Burkey)观看了电影《阿波罗13号》(Apollo 13)。电影讲述的是阿波罗13号在奔赴月球途中因一次爆炸事故而陷于险境,其中有多个场景出现了显示键盘的画面。在嵌入式计算机系统行业工作的伯奇看到后就开始学习更多有关阿波罗导航计算机的知识。一开始并不怎么在意的一些小问题最后演变成了对原始文件的不懈追求。他的目标就是开发一台可以执行阿波罗导航计算机程序的模拟器。
 
  伯奇得知仪器实验室把部分阿波罗11号上使用的软件存放在了麻省理工学院的图书馆,但捐赠条款不允许这些资料随意扩散。经过漫长的谈判,博物馆收藏处主任黛博拉·道格拉斯(Deborah Douglas)确保了这些打印文件公开后的安全性,并且安排伯奇负责文件的扫描事宜。接着就是一项枯燥乏味的工作:把3 500页扫描出来的图像转换成可供机器阅读的文档。幸好有几位志愿者加入了进来,分担了任务。
 
  与此同时,伯奇忙着开发的还不只是那个叫作“虚拟阿波罗导航计算机”的模拟器,他还在开发一款新汇编程序。(起初,他无法访问原始汇编程序的源代码,因为这些程序无论如何也不可能在现代硬件设备上运行。)检验这一切努力的关键测试是通过新汇编程序运行转录的阿波罗11号源代码,并且将产生的二进制输出与1969年的原始输出作比较。经过几轮校对和修正(某些扫描文件几乎完全看不清),测试产生的新二进制数据终于和原始数据一一对应。
 
  这几年来,伯奇和他的伙伴还拿到了其他几次阿波罗任务软件的打印件,主要由那些保留着个人备份的麻省理工学院软件开发团队成员提供。那些程序同样经过了扫描、转录和重新汇编的流程。所有这些扫描件和转录的源代码都可以在虚拟阿波罗导航计算机软件网站(http://ibiblio.org/apollo)上找到。同时在网站上展示的还有编程手册、工程绘图以及大约1 400份备忘录、报告和其他同期文件。
 
  阿波罗计划可能是20世纪美国技术优势的巅峰体现,而阿波罗导航计算机则是这个辉煌成就的关键组成部分。因此,当我发现大型博物馆和档案馆对阿波罗导航计算机软件如此兴致寥寥,甚至把保护、转录、传播这些珍贵历史材料的工作都交给业余爱好者的时候,我感到奇怪与不安。另一方面,这些活力四射、充满创造力的业余爱好者取得的成果是如此耀眼,是他们把这段属于美国的辉煌历史带回到了人们的视线之中。他们的成功几乎和当初那些阿波罗导航计算机项目的程序员一样光彩夺目。
 

  资料来源 American Scientist