【问题标题】:Why was the software for Apollo missions written in assembly and not in a high level programming language? [closed]为什么阿波罗任务的软件是用汇编而不是高级编程语言编写的? [关闭]
【发布时间】:2017-11-28 04:21:46
【问题描述】:

根据this articlethis question 的回答,用于阿波罗11 号任务的软件是用汇编语言编写的

我觉得这很令人震惊,因为该项目始于 1960 年,任务发生在 1969 年。此时已经有几种高级编程语言可用。例如 Lisp,它是一种相当高级的语言,即使有垃圾收集,它今天仍在使用。

假设垃圾收集的高级语言减少了编程中人为错误的可能性以及当局的高风险规避,为什么管理人员允许如此巨大的危险? p>

【问题讨论】:

  • 然后到 1980 年代,程序集仍然用于日常应用程序,并不是因为它仍然存在,只是不像当时那样普遍。
  • 垃圾收集和动态内存管理引入了新问题:内存溢出、无实时响应、GC 和内存管理代码中可能存在的错误、内存碎片、内存开销……
  • GC引入了新问题,这类应用不需要动态内存分配,所以不需要管理堆,也没有内存泄漏的风险。在这方面,使用一些高级语言和 GC 和动态内存分配实际上会使事情变得更复杂、效率更低,并且代码会更大(更多的错误机会)。回到那个单一任务 SW 的时代,编码人员经常手动设计内存使用情况,将变量放在代码之间的最佳位置。不是在 A11 中,但有时甚至会使用令人讨厌的诡计来节省空间(双关语。)
  • 早期的 GC Lisp 是一个简单的标记和扫描。人们通常会重新启动他们的 lisp,这样他们就不需要 GC,因为当它启动时,您基本上必须等待它完成。对于太空中的系统,如果系统需要随时响应输入,那么突然离线执行 GC 的系统将无法工作。
  • 在 1969 年,如果你想要一个成功的任务,你需要有丰富经验的优秀开发人员。你知道,像 15-20 年或更长时间。在关键任务角色中使用像 Pascal(当时只有两岁)这样的新高级语言就像在今天使用 Rust。没有几十年经验的人会这样做。

标签: assembly lisp programming-languages


【解决方案1】:

如果您查看硬件规格(2 K RAM,36 K 硬连线内存),只有手工制作的汇编语言才足够高效,可以做任何有用的事情。高级语言编译器通常会生成大量多余的代码和低效的内存处理,因为它是通用的。 Apollo 11 中的软件非常具体,考虑到准备时间,正确测试几 KB 的代码应该是可行的。

【讨论】:

  • 谢谢!但是你认为这些硬件规格是在项目开始时给出的,还是决定使用组装的结果?也就是说,如果首先决定使用组装,那么决策者可能会因此选择有限的硬件规格,因为这些资源就足够了。
  • 文章解释说,计算机必须非常小(你不能将巨大的机器带入太空),非常可靠并且可能很节能。这些要求对我来说似乎比计算机应该使用高级(浪费)语言轻松编程更重要
  • @MartinDrozdik 请注意,阿波罗 11 号任务是在 1969 年。当时 2k RAM 是相当大的内存量,尤其是考虑到它必须抵抗太空辐射时。
【解决方案2】:

维基文章:

https://en.wikipedia.org/wiki/Apollo_Guidance_Computer

大部分(但不是全部)程序都被硬编码到只读核心内存中。在计算机中使用所有 NOR 门的原因之一是它们具有抗辐射性。虽然后面的wiki文章提到了RAM和ROM,但RAM真正的意思是read + write core memory,ROM是read only core memory。

所有登月的阿波罗任务,包括阿波罗 11 号,都使用了 Block II 版本的 AGC,它有 36 千字(72 千字节)的只读核心内存用于程序,以及 2千字(4096 字节)的读 + 写核心内存(其中一些用于程序的某些部分,以允许在飞行中进行一些更改)。

回到 OP 的问题,AGC(阿波罗制导计算机)上使用的指令集对高级语言不友好。这是一个多线程(单核)程序。考虑到代码相对较小,不到 36,000 个指令字,并且多年来对代码所做的更改相对较少,因此创建和测试某种类型的编译器将花费更长的时间。

在 8 位家用电脑和游戏机的早期,几乎所有为这些系统编写的游戏和其他程序都是用汇编语言编写的,大小通常在 16KB 到 64KB 之间。

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2010-10-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多