太硬核了,50年前的登月程序和程序员绝对超乎你的想象
作者:陈浩
原文链接:https://coolshell.cn/articles/19612.html
2019年7月20日,是有纪念意义的一天,这天不是因为广大网民帮周杰伦在新浪微博上的超话刷到第一,而是阿波罗登月的50周年的纪念日。早在几年前,在Github上放出了当年Apollo飞船使用的源代码(当然是汇编的),但完全不明白为什么这几天会有一些中国的小朋友到这个github的issue里灌水……,人类历史上这么伟大的一件事,为什么不借这个机会学习一下呢?下面是一些阿波罗登月与程序员相关的小故事,顺着这些东西,你可以把你的周末和精力用得更有价值。
首先,要说的是Apollo 11导航的源代码,这些代码的设计负责人叫Margaret Heafield Hamilton ,是一个女程序员,专业是数学和哲学,1960年得到一个MIT麻省理工大学的临时的软件开发职位,负责在PDP-1和LGP-30上运行天气预报的软件(注:在计算机历史上,PDP系统机器被称为Hack文化的重要推手,PDP-11推了Unix操作系统,而Unix操作系统则是黑客文化的重要产品。参看《Unix传奇》)。然后,她又为美国空军编写探测知敌方飞行的软件,之后,于1965年的时候,她加入了MIT仪器实验室,并成为了这个实验室的主管,这个实验实就是Apollo计划的一部分,她负责编写全新的月球登录的导航软件,以及后来该软件在其他项目中的各个版本。
上图是Hamilton站在她和她的麻省理工团队为阿波罗项目制作的导航软件源代码旁边,在Github上的开源的代码 – Apollo-11 (2016年开源)。我们可以看到,有两个重要的目录,一个目录叫“Comanche055”,一个目录叫“Luminary099”,前者是指挥舱用的(英文为 Command Module )后者为登月舱用的(英文为 Lunar Module),这里需要说明一下的是,指挥舱是把登录舱推到月球上,在返回的时候,登录舱是被抛弃掉的,而返回到地球的是指挥舱。如果你想看这两份源代码的纸版,你可以访问这两个链接:Comanche 55 AGC Program Listing 和 Luminary 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……
下面是AGC在Apollo 1指挥舱里的样子(图片截自上面的视频),这个高质量的3D扫描来自 Simithsonian 3D: Apollo 11 Command Module (我觉得美国人干这些事干就是很漂亮啊,这种高清的3D扫描太牛了,如果你仔细看,这个舱里还有宇航员在舱壁上的手写)
这个AGC的操作界面又叫DSKY – Display 和 Keyboard的缩写,下图是一个 AGC 模拟器,其官方主页在 https://www.ibiblio.org/apollo/源代码在 Github/VirtualAGC。在这个界面上我们可以看到:下面的键盘上左边有两个键,一个是动词Verb一个是名词Noun,Verb指定操作类型,Noun指定要由Verb命令修改的数据。右边的显示器下面有三个5位的数字,这三个数值显示表示航天器姿态的矢量,以及所需速度变化的显示矢量。是的,当年的导航就靠这三个数字和里面的程序了。
如果你想了解AGC更多的细节,你可以看看 这篇 AGC for Dummies。这篇文章讲述了AGC这个嵌入式系统的背景和操作指令。一份详细的AGC 汇编语言手册可以让你了解更多的细节。
另外,我在Youtube上找到了一个讲当时Apollo电脑的纪录片 – Navigation Computer,太有趣了。比如:21分51秒开始讲存储用的 Rope Memory 绕线内存,Hamilton 也出来讲了一下在这种内存上编程,画面切到一个人用个比较长的金属针在一个像主板一样的东西上,左右穿梭,就像刺绣一样,但是绣的不是图案,而是程序……太硬核了,真正的通过“硬编织”的方式来写程序。
看完上面这个纪录篇,我是非常之惊叹,惊叹于50年前的工程能力,惊叹于50年前这些人面对技术的的一丝不苟,对技术的尊重和严谨的这种精神和方法,一点都不比较今天差。
不过,最牛的还不是这个,我在Hamilton的Wikipedia词条上找到了他说的一个事件—— 当年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。
三年前,Apollo的源代码被开源时候,Twitter有个叫 Lin Clark 的人发了一条推:“我妈50年前的代码被放到Github上了”,虽然,她不是 Hamilton 的女儿,但她妈妈也是Apollo其中一个程序员,现在Lin Clark同样也是一个程序员,目前在 Mozilla工作,Staff Engineer,专长 WebAssembly, Rust, 和 JavaScript ,也是个非常厉害的程序,Youtube上各种演讲,也是一个跟他妈妈一样牛的人。
当她在Twitter上这么自豪地发了一条这样的推后,我不知道各位有什么想法?想不想你的后代在未来也会这样自豪的发条微博?
最后,尤其是想对那些到Apollo源代码的issue里发spam垃圾信息的人说一下,你看看人家,再看看你们自己,你们是不是想让你们的孩子在登月100周年纪念的时候说——50年
猜你喜欢
1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结
2、如何才能成为优秀的架构师?
3、从零开始搭建创业公司后台技术栈
4、程序员一般可以从什么平台接私活?
5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...
6、滴滴业务中台构建实践,首次曝光
7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事
8、15张图看懂瞎忙和高效的区别!
太硬核了,50年前的登月程序和程序员绝对超乎你的想象相关推荐
- 50年前的登月程序和程序员有多硬核?
来自:酷 壳 - CoolShell,作者:陈皓 链接:https://coolshell.cn/articles/19612.html 2019年7月20日,是有纪念意义的一天,这天不是因为广大网民 ...
- 50年前的登月程序和程序员有多硬核
作者:陈浩 原文链接:https://coolshell.cn/articles/19612.html 2019年7月20日,是有纪念意义的一天,这天不是因为广大网民帮周杰伦在新浪微博上的超话刷到第一 ...
- 程序员的数学全三册密码_阿波罗50年前成功登月,少不了这位硬核女程序员
大约在50年前的这个时候,1969年7月21日,载着巴兹·奥尔德林和尼尔·阿姆斯特朗的阿波罗11号登月舱正在月球轨道上与CSM和迈克尔·柯林斯会合. 大家都知道这件事,但你知道吗,阿波罗能成功登月的背 ...
- 太硬核!2亿股万科股票,约53亿元,一次性全部捐给清华,干一件大事!
01 大手笔,见证历史的时刻! 当前, 人类社会正处在一个关键时刻. 新冠肺炎疫情正在全球蔓延, 全世界人民的生命健康正遭受着巨大威胁, 全球公共卫生安全正面临着严峻挑战. 疫情面前, 守护人民生命安 ...
- 因一次骑行的脸刹着地,诞生了自动驾驶自行车!不愧是野生钢铁侠!太硬核了~~~...
鱼羊 金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 果然高手在民间. 谁能料到,一辆自行车的硬核打开方式,竟是大火的自动驾驶. 踢开脚撑,金鸡独立.稳如泰山: 单侧加个板砖?小场面: 毕 ...
- 这个B站up主太硬核了!纯手工打造AI小电视:硬件自己焊接,驱动代码全手写...
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 晓查 发自 凹非寺 本文转自自:量子位(QbitAI) 一个低调的 ...
- 这只机械手太硬核!失去手指的机械工程师独立打造,网友:赛博朋克,太酷了...
鱼羊 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 这只硬核机械手火了. 能稳稳抓握,也能伸张自如: 是不是有点金刚狼内味了? 更令网友们惊叹的是,这样一只机械手,是一位失去左手四指的机 ...
- 纯手工打造AI小电视,这个B站up主太硬核了!硬件自己焊接,驱动代码全手写...
点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...
- 太硬核了!十天十场技术干货分享,其中有一个大佬还是我的死党!
引言 14 世纪的欧洲,佛罗伦萨瘟疫盛行,10名男女在乡村一所别墅里避难.他们终日游玩欢宴,每人每天讲一个故事,共住了10天讲了百个故事.这就是文艺复兴时期的第一部现实主义巨著--<十日谈> ...
- 50 年人类登月史:那些不为人知的故事
来源: CSDN 2019年7月20日是纪念人类登月五十周年的好日子.人类于1969年首次正式登上月球,历史将永远铭记两位宇航员的名字:尼尔·阿姆斯特朗与巴兹·奥尔德林. 然后,这背后还有很多不为人知 ...
最新文章
- DeepMind开源面向对象的机器学习库Sonnet,请与TF配合服用
- chrome下老是弹出网页显示 true
- php实现数据排序算法,PHP实现数据结构中的排序算法_PHP教程
- redhat 6.5 【源码编译安装 mysql-5.5.47】
- 调试wifi简单记录
- 文件系统:NTFS、FAT32和exFAT
- 计算机三级网络技术 = =
- 计算机编程的双引号怎么打,计算机双引号怎么打出来
- “海大与我“ Scrum Meeting(第九周会议记录)
- PCB设计走线细节讲解(图文结合|强力推荐)
- Dart语言(一)--基础语法
- Web安全之SQL注入漏洞学习(一)
- form表单与ajax的两种提交方式
- RabbitMq 虚拟主机 virtual-host ,Springboot 中使用 RabbitMq 虚拟主机 virtual-host
- DDN周报|3月19日-3月25日
- OpenCV打开摄像头,RGB转HSV空间
- 进制转换 原码、反码、补码
- 调用百度接口实现人脸识别
- 如何使用微信小程序视频客服功能?
- addr2line查看死机代码的位置
热门文章
- Linux driver 板级文件跟踪一般方法
- Linux管理员常用网络资源(收集帖)
- XSS挖漏洞 - CSS编码和反斜杠的三个技巧
- 在RHEL4.0下面安装oracle10g数据库
- BAT程序员总结的力扣刷题指南,已经在Github了!!刷题顺序,优质题解一网打尽!
- 浅谈跨平台框架 Flutter 的优势与结构 1
- Linux基本命令之seq
- java.lang.IllegalArgumentException at java.sql.Date.getHours
- webpack的可视化资源分析工具webpack-bundle-analyzer的使用
- 用足球阵型告诉你,阿里云如何护航全网70%世界杯流量