五十年前人类首次登月的程序代码和美少女程序员

支付宝内搜索 9155838 即可领现金红包 每天都能领哦

20:45:03
大概是两个半月前写过一篇关于人类五十年前首次登陆月球的文章,也提到了土星五号运载火箭、指挥舱、登月舱,今天就说说它们所用到的登月程序以及相关的硬件条件,因为正好在网上看到讲这方面的内容。

首先要说的是Apollo 11导航的源代码,这些代码的设计负责人叫玛格丽特·希菲尔德·汉密尔顿(Margaret Heafield Hamilton),此汉密尔顿不是开F1赛车那个,而是一个女程序员,专业是数学和哲学,1960年得到一个MIT麻省理工大学的临时的软件开发职位,负责在PDP-1和LGP-30上运行天气预报的软件(注:在计算机历史上,PDP系统机器被称为Hack文化的重要推手,PDP-11推了Unix操作系统,而Unix操作系统则是黑客文化的重要产品,参看《Unix传奇》)。后来她又为美国空军编写探测知敌方飞行的软件,之后于1965年的时候,她加入了MIT仪器实验室,并成为了这个实验室的主管,这个实验实就是Apollo计划的一部分,她负责编写全新的月球登录的导航软件,以及后来该软件在其他项目中的各个版本。

奥巴马授予汉密尔顿总统自由勋章

她编写的程序都以最大程度防止崩溃为目的,从而防止了阿波罗11号登月计划中断甚至失败。她告诉我们,最美的一条人生之路是用你的智慧为这个世界带来一点点改变。2016年奥巴马授予她总统自由勋章(图内后排几位大佬你是否认识?)。

玛格丽特·希菲尔德·汉密尔顿 Margaret Heafield Hamilton

上图的这位年轻美女就是汉密尔顿,当时她站在她和她的麻省理工团队为阿波罗项目制作的导航软件源代码旁边,在Github上的开源的代码 Apollo-11(2016年开源)。我们可以看到,有两个重要的目录,一个目录叫“Comanche055”,一个目录叫“Luminary099”,前者是指令舱用的(英文为 Command Module )后者为登月舱用的(英文为 Lunar Module),这里需要说明一下的是,指令舱是把登录舱推到月球上,在返回的时候,登录舱是被抛弃掉的,而返回到地球的是指令舱。如果你想看这两份源代码的纸版,你可以访问这两个链接:Comanche 55 AGC Program ListingLuminary 99 REv.1 AGC Program Listing。其中的55 和 90 是各自的build 版本号。

我们细看一下,这些文件的日期是,1969年7月14日,而Apollo 11登月的日期是1969年7月16日起程,7月19日经过月球背面,7月20日下午8点登月。代码写好,两天后就直接上生产,然后就登月,还是导航代码,这代码写的的健壮性得有多强。

如果你仔细比较一下这两个目录中的文件,你会发现有些文件是一样的,不但文件名一样,而且内容也一样。这说明这两个模块中的一些东西是相似或者是可以共用的。

指令舱登月舱程序代码文件

这些代码应该是很难读了,因为当时写这些代码的时候,C语言都没有被发明,所以基本上来说都是汇编代码了,而且还可以发现,这些代码的源文件全是以agc后缀结尾的, 看来这还不是我们平时所了解的汇编,所谓的AGC代表了运行这些代码的计算机:Apollo Guideance Computer 。沿着这个Wikipedia的链接,你可以看到AGC这个电脑的指令是什么样的,看懂那几条指令后,这些源代码也就能读懂了。当然,因为是写成汇编的,所以,读起来还是要费点神的。不过,其中有一个文件是 LUNAR_LANDING_GUIDANCE_EQUATIONS.agc 你会不会很好奇想去看看?

打开源文件,你还可以看到每个文件都有很多很多的注释,非常友好,但是也有一些注释比较有趣。这里有一组短视频带你读这些代码:Exploring the Apollo Guidance Computer(AGC) Code,一供10个小视频,每个2分钟左右,如果你英文听边还行(我觉得很容易听懂),可以看看,了解一下AGC的工作方式,挺有趣意思的。

当时的AGC有32公斤,主频只有2MHz,2K的RAM,36K的ROM。嗯,当年就是这么一个小玩意,把人送上了月球,如今一个微信就占几GB的空间……

Apollo11指令舱里的AGC

如上图就是AGC在Apollo11指挥舱里的样子,这个高质量的3D扫描来自 Simithsonian 3D: Apollo 11 Command Module (美国人干这些事干就是很漂亮啊,这种高清的3D扫描太牛了,如果你仔细看,这个舱里还有宇航员在舱壁上的手写)

这个AGC的操作界面又叫DSKY – Display 和 Keyboard的缩写,下图是一个 AGC 模拟器,其官方主页在https://www.ibiblio.org/apollo/ 源代码在 https://github.com/virtualagc/virtualagc 。在这个界面上我们可以看到:下面的键盘上左边有两个键,一个是动词Verb一个是名词Noun,Verb指定操作类型,Noun指定要由Verb命令修改的数据。右边的显示器下面有三个5位的数字,这三个数值显示表示航天器姿态的矢量,以及所需速度变化的显示矢量。是的,当年的导航就靠这三个数字和里面的程序了。

AGC的操作界面DSKY

如果你想了解AGC更多的细节,你可以看看 这篇 AGC for Dummies。这篇文章讲述了AGC这个嵌入式系统的背景和操作指令。一份详细的AGC汇编语言手册可以让你了解更多的细节。

另外,我在Youtube上找到了一个讲当时Apollo电脑的纪录片:Navigation Computer,太有趣了。比如:21分51秒开始讲存储用的 Rope Memory 绕线内存,汉密尔顿也出来讲了一下在这种内存上编程,画面切到一个人用个比较长的金属针在一个像主板一样的东西上,左右穿梭,就像刺绣一样,但是绣的不是图案,而是程序……太硬核了,真正的通过“硬编织”的方式来写程序。

为阿波罗11写程序

看完上面这个纪录篇,我是非常之惊叹,惊叹于50年前的工程能力,惊叹于50年前这些人面对技术的的一丝不苟,对技术的尊重和严谨的这种精神和方法,一点都不比较今天差。

不过,最牛的还不是这个,当年Apollo登陆雷达开关放在了错误的位置,导致AGC收到了不少错误的信号。结果就是AGC既得执行着陆必须的计算,又要接受这些占用其15%时间的额外数据。但是AGC的程序居然可以用高优先级的任务打断低优先级的任务,于是,AGC自动剔除了低级别的任务以保证了重要的任务完成。Hamilton 原话说—— 如果当时的程序不能识别错误并从错误中恢复,我怀疑阿波罗不能成功登月。if the computer hadn’t recognized this problem and taken recovery action, I doubt if Apollo 11 would have been the successful moon landing it was。

看到这里,你有没有觉得“这个女程序员的一小步,是整个人类的一大步”?

Hamilton的牛逼之外还在于,她是第一个将“软件工程”提出来的人,在MIT,她想让软件开发就像其它工程一样,有相应的工程纪律,给于相关的尊重,于是她创造了Software Engineering这个词。2018年,IEEE在纪念软件工程50周年的时候,他们把 Hamilton 请过去讲了一个叫 What the Errors Tell Us 的主题。她绝对可以称得上是程序员的Pioneer。

汉密尔顿在担任阿波罗飞行软件首席设计师期间

曾经的程序员美少女今年83岁高龄。

关于的更多汉密尔顿的信息可以看https://en.wikipedia.org/wiki/Margaret_Hamilton_(software_engineer)

推荐文章

已有 17 条评论
  1. 云中君

    这是不是有多一件证明登月是真的证据

    云中君 回复
    1. xylx

      @云中君

      已经完全不用证明了。

      xylx 回复
    2. Unee Wang

      @云中君

      现在还相信登月是假的,基本上不要再来往了

      Unee Wang 回复
      1. 云中君

        @Unee Wang

        不信的多了去了,也不知道为啥

        云中君 回复
        1. Unee Wang

          @云中君

          可能大家都喜欢阴谋论吧

          Unee Wang 回复
  2. 大鸟博客

    真的是好流弊啊。

    大鸟博客 回复
  3. 双双对对爸爸

    美少女战士

    双双对对爸爸 回复
  4. 挖站否

    厉害了,真正的高手。

    挖站否 回复
  5. zmmio

    厉害,值得敬重。

    zmmio 回复
  6. 青山

    认识一个比尔盖茨

    青山 回复
  7. 张波博客

    用牛X来说不为过的哟

    张波博客 回复
  8. repostone

    请勿滥用美少女的字眼。

    repostone 回复
  9. 趣知识

    真牛啊,不服不行!

    趣知识 回复
  10. 可乐

    niu逼,确实是美少女。

    可乐 回复
  11. 浮白载笔

    真 硬核

    浮白载笔 回复
  12. 征文网

    所以证明了程序员并不会秃头,秃头是自己的原因

    征文网 回复
  13. ZAERA

    至今到现在为止,还有很多人怀疑登月是假的,这个是一个很好的证明登月是真的

    ZAERA 回复
发表新评论