@ 2016.07.12 , 15:34
37

阿波罗计划软件代码公开,可免费下载

[-]

控制阿波罗11号的飞行软件代码近日首次上传到著名的代码共享网站GitHub上。这不仅让当代码农得以一窥过去,里面也充满了上世纪60年的流行文化痕迹,这就像一个代码时间胶囊。

这些代码是由MIT仪器实验室的程序员们在60年代中期从零写起的,因为人类之前从未去过月球。为了圆满完成任务,团队发明了一种让电脑储存程序的新方式——“磁心线储存器”,其中用到了一种复杂到逆天的汇编语言。

[-]

现在这些代码全部都在GitHub上了,传说中的“阿波罗导航电脑代码(Apollo Guidance Computer——AGC)”。它们第一次公开是几年前MIT上传的扫描件,直到2003年,一个叫做Ron Burkey的人手动将每一行代码敲了出来,并上传到网上。

Bukey说:“一个叫做Gary Neff的科罗拉多飞行员扫描的。MIT拿到了这些扫描件,然后把图片上传到网上,但很不幸,上传过程中被损坏了,很多地方都看不清。”

“后来,我想办法从Gary Neff那搞到了损坏部分的副本,结果发现我补上的那部分竟然是100%正确的。”

尽管Burkey付出了大量心血,这份代码从未在网上流传开来。直到上周一位叫做Chris Garry的前NASA实习生把它上传到GitHub上。

虽然这些代码对今天的程序员意义重大,因为他们可以从中看到前辈们的历史,但是对我们这些门外汉而言,最酷就是能看到码农们在字里行间抖的机灵和那些60年代的梗。

煮个栗子,其中一个文件叫做“燃烧吧_宝贝_燃烧吧- -主要_点火_程序”(BURN_BABY_BURN- - MASTER_IGNITION_ROUTINE),描述如下:

[-]
这要追溯到1965年的那场洛杉矶骚动,灵感来源于著名DJ Magnificent Montague,他一边打碟,一边说着“燃烧吧,宝贝!燃烧吧!”。他那时是50年代中期到60年代中期芝加哥、纽约和洛杉矶的灵歌歌王。

还有引用莎士比亚的著作:

[-]

整个AGC中有着无数这样的包袱,那些MIT的程序员可能觉得永远也没人能注意到这些。

[-]

[-]
太长不译

它还告诉我们在过去这半个世纪中,人类的科技取得如此大的进步。AGC帮助宇航员在1969年登上月球,它用的内存只有64K,而iPhone 6的内存几乎是它的25万倍。

戳这里可以看到完整的AGC代码。

本文译自 sciencealert,由译者 许叔 基于创作共用协议(BY-NC)发布。


给这篇稿打赏,让译者更有动力
支付宝打赏 [x]
您的大名: 打赏金额:

4.7
赞一个 (22)

TOTAL COMMENTS: 37+1

  1. tzwcard
    @1 year ago
    3197642

    太长不译

    [47] XX [1] 回复 [0]
  2. 冬风
    @1 year ago
    3197644

    我好像看到哈利波特大了

  3. 季默
    @1 year ago
    3197650

    这段代码我知道,翻译成Basic是Print “Hello world”

    [5] XX [35] 回复 [0]
  4. 装模做样芝麻
    @1 year ago
    3197654

    数十年前哈利波特因公然女装遂被抓走
    数十年后竟出现在美国国家航空航天局

    [34] XX [1] 回复 [0]
  5. 大杰宝图图
    @1 year ago
    3197655

    莫名的敬意

    [25] XX [1] 回复 [0]
  6. 艾尼路
    @1 year ago
    3197656

    所以说这套完整代码90%全是废话?

    [9] XX [14] 回复 [0]
  7. ayaoayaoaya
    @1 year ago
    3197657

    你确定 wizard 是女巫?

    [11] XX [1] 回复 [0]
  8. 3197662

    最后不废话的人拿起一只鸟砸在猪头上

  9. 3197665

    一直看成ACG

    [17] XX [0] 回复 [0]
  10. maotou
    @1 year ago
    3197666

    “看看我们把登月代码都公开了,中国人要再登不了月,就真搞笑了。”

    [10] XX [33] 回复 [0]
  11. maotou
    @1 year ago
    3197675

    @艾尼路:

    控制降落部分的代码,仅有2000多行,
    包含了废话。

  12. bbciused
    @1 year ago
    3197679

    明显就是哈里波特用法术做出来的

  13. 巴多胺
    @1 year ago
    3197687

    @maotou: 对,说的好!到时候等中国人登完月,我们可以说“中国人一定是抄了阿波罗的代码才能登上月球的!都是山寨货!”

    [40] XX [3] 回复 [0]
  14. 3197702

    @ayaoayaoaya: 额…抱歉,翻错了,我心里明明想着男巫的…

  15. chichi
    @1 year ago
    3197704

    著名的1202 bug在的地方:
    Comanche055/EXECUTIVE.s, 第200 – 205行
    NEXTCORE CAF COREINC
    ADS LOCCTR
    CCS EXECTEM2
    TCF NOVAC3
    TC BAILOUT # NO CORE SETS.
    OCT 1202

    [21] XX [0] 回复 [0]
  16. 3197711

    都是中断驱动的…..
    分时多线程操作系统还没出现的时代。

  17. 3197727

    都是汇编。。。

  18. ayaoayaoaya
    @1 year ago
    3197766

    @许叔:

    我感觉也不是男巫啊 😂:D

  19. 卡卡
    @1 year ago
    3197770

    看看别人的积淀…………
    兲朝要是把人派到月球了,美国早就积累足够技术把人送出太阳系了。

    [3] XX [24] 回复 [0]
  20. 3197773

    @ayaoayaoaya: 蛤?那应该怎么翻?

  21. didi2050
    @1 year ago
    3197779

    QQ群好友evi运行了源码后的截图
    //ww1.sinaimg.cn/mw600/3eac3076jw1f5ra27o68ej20s40mhdl9.jpg
    //ww1.sinaimg.cn/mw600/3eac3076jw1f5ra33oevqj20q00fejv4.jpg

    [16] XX [1] 回复 [0]
  22. cesium
    @1 year ago
    3197780

    @许叔: 绿野仙踪那个吧

  23. 天下布舞
    @1 year ago
    3197797

    这个女博士好漂亮啊···

  24. 3197800

    所以纳粹才能用iphone造飞碟 飞回来。

  25. 3197826

    @艾尼路: 只不过在注释区偶尔吐槽几句罢了,注释区在编译时都是无视的。虽然是60年代的代码,但注释依然十分详尽,比有些现代的代码还要强。

    [12] XX [1] 回复 [0]
  26. 3197831

    @天下布舞: 那是玛格丽特·汉密尔顿,曾担任MIT仪器实验室软件工程部的主管,开发阿波罗计划的飞行软件,其编写的程序都以最大程度防止崩溃为目的,从而防止了阿波罗11号登月计划中断。1986年,她创立了汉密尔顿技术有限公司。她发明了软件工程一词,还是并行计算、优先级调配、端对端测试等技术的先驱者。

    汉密尔顿的程序曾防止了阿波罗11号登月任务失败:在阿波罗登月舱到达月球表面三分钟前,数个计算机警报响起,表示计算机输入数据过多,原因是雷达系统更新了系统中的一个强制计数器,致使主机发生周期挪用。但由于汉密尔顿的软件健壮性很强,整个系统仍然可以工作。阿波罗的机载软件是以异步执行为思想开发的,高优先级的任务能打断低优先级任务。

    由于登陆雷达开关放在了错误的位置,计算机收到了不少错误的信号。结果就是计算机既得执行着陆必须的计算,又要接受这些占用其15%时间的额外数据。但是它,或说是它里面的软件,聪明到可以判断它执行着不该执行的任务,所以就发出了警报……实际上,这台计算机不光能报警,它有着一整套恢复措施,这种情况下,计算机能自动剔除低级别任务以保证重要任务得以完成……如果当时计算机不能发现错误所在并从中恢复,我怀疑阿波罗号不能成功登月。

    [55] XX [2] 回复 [0]
  27. 天旋地转
    @1 year ago
    3197911

    Wizard翻译为巫师不就挺好

  28. 天旋地转
    @1 year ago
    3197919

    We’re Off to See the Wizard是来自于绿野仙踪的插曲

  29. 3198037

    太长不译的那段,似乎除了开头的“欢迎光临”以及最后的“下次再见”以外没有别的吐槽了啊,中间的注释都是正经的程序功能注释。

  30. 给哈哈哈
    @1 year ago
    3198051

    如果人类基因是外星人写的,那会不会是,有很多相声段子在那些无用基因里

  31. o啊熊o
    @1 year ago
    3198176

    @天下布舞: 你说那个穿女装的哈利波特?

  32. 3198283

    确定这个女的不是肖耳朵的女友?

  33. ayaoayaoaya
    @1 year ago
    3198348

    @许叔:

    巫师+1

  34. 3198678

    如chichi提到,1202来源于EXECUTE.S, 写这段程序的人是美国工程院院士J. Halcombe Laning,当时他单人全责负责实时进程调度设计,抢占式优先中断驱动设计就是他的手笔。

    计算机有八组寄存器组,12个15位寄存器为一组,当需要执行矩阵运算的时候还有多43个备选寄存器(向量累计器)。因为只有八组,运算核只有一个,在队列中等候运算时刻到达的进程最多只能有八个,其中最多五组可以请求使用向量累计器。可以想象,如果在队列里的进程持续时间太长都不能终止,为了保存他们执行状态寄存器使用率必然增多,甚至最大程度时耗尽所有寄存器资源。

    需要占用计算资源的,除了进程(为一系列动作,譬如姿态调整、调节喷气阀等一系列动作),还有“硬件中断”(譬如输入键盘),以及”定时任务“(定时执行)。

    可以想象调度的复杂度大,于是有了重启保护,重启保护有三种情况可以激发:供给不稳(特殊的中断),死循环检测(通过在程序上设置记录点和计数器),以及软触发。软触发,譬如就是上面的代码里的:

    TC BAILOUT

    1201 和 1202,分别对应核心寄存器耗尽以及向量寄存器耗尽,这种情况都会调用重启保护BAILOUT 。BAILOUT会洗清队列里的任务,并从上次记录的任务之中的起始点开始执行。

    系统设计之时,登月时计算密集情况下仍留有10%的计算时间裕度,但是雷达计数器中断足足占了达到13%。也就是系统有3%的负计算裕度。体现在系统里表现,便是现在的降落计算进程根本没能完成,又一个同优先级进程要求占用资源,尽管是系统有BAILOUT保护每一次都清洗一遍队列,但是计算资源不足以完成目前实时计算任务。

  35. 3198679

    要明白,这是一个实时调度系统,跟什么windows android要求根本不同!就算是任务的完整性能够通过优先级被保护,但是时间对不上目前的状况,也有可能出严重的问题! 就像你过马路听电话,电话里重要的事情占用了你大脑所有资源,但是这时候一部车撞过来,你根本来不及反应,即便是你有能力反应。

    在Laning的谨慎的设计之下,调度还有个特征,就算当机重启,也不会影响实时降落。。这已经是极其难得,因为这样程序执行绝不崩溃。虽然如此,像我们之前解释过的一样,对于实时任务来说,计算被分配的时间依然不能够足以能够及时反应计算出准确地址。所以阿波罗十一落点地址依然发生严重偏离。在阿姆斯特朗致电休斯顿出现1201和1202警告并得到Go回复时,是系统在自动纠正并报对应的错误码,然而纠正不能解决问题。就算是这时候完全交给计算机操控,也有可能因为降落地点严重偏离而撞到地面。

    是当阿姆斯特朗切换了半自动模式之后,才算是解决了问题。

  36. 3198683

    1202和1201,不是bug,只是一个自我修复进程启用前报告的错误码。倒不如说正是因为Laning的极灵活性的设计避免了更糟糕的错误,如果是运用当时时代任一一种流行的程序调度思想登月任务都会直接崩溃失败。

    真正的bug,是文档记录错误,休士顿指示了宇航员们的操作规范之中在错误时候依然保持雷达启动。

    这个黑锅被设计工程师背了很多年。

  37. 3199237

    @mean: 介绍得很详尽。稍微纠正一点,错误的真正原因也不是在着陆时开着对接雷达(与轨道上的阿波罗舱对接用),对接雷达是有意开着的。因为着陆随时可能失败,一旦失败的话就要飞回去,那时就要用到对接雷达。考虑到着陆失败会给宇航员带来很大的心理压力,接下来的繁琐操作中很可能出错,比如忘记打开对接雷达,因此对接雷达一直开着。

    真正原因是对接雷达的设计问题。对接雷达的电路和姿态控制采用了两组独立的28V 800Hz电源,文档中说这两组电源是“频率锁定”的,但设计检测电路的人却把它理解成“相锁定”,因此如果没有相锁定的话,即使频率相同,也会发出警告信号。但实际上,这两组电源只是频率相同,相位是完全随机的。设计中也没有任何措施来确保它们相锁定。这一问题在测试中发现过,并且记录在案,却没有改正。结果在着陆前打开对接雷达时,恰好没有实现相锁定,从而持续向计算机发出中断请求。

发表评论


24H最赞