当前位置: 首页 > 科技观察

发誓不使用Java的程序员不得不在太空调试Lisp

时间:2023-03-16 21:29:10 科技观察

1998年10月24日,随着火箭的轰鸣声,美国宇航局的深空一号成功升空。深空一号是美国宇航局的一项重要任务,旨在验证未来星际探索所需的十多项新技术。深空一号飞行2.4亿公里后,突然出现故障,一个进程停止工作。地面人员非常紧张,赶紧打电话给软件组商量对策。软件组在会议上绞尽脑汁、激烈争论,最终决定调试深空一号的软件。调试?如何调试?该软件并非部署在某个机房,而是部署在距地球2.4亿公里的飞船中。即使有光,来回也要半个小时。但是NASA的工程师成功解决了这个问题,原因是深空一号上的控制软件是用Lisp写的!想要了解整个事情的来龙去脉,就得把时间拉长一点。1988年,罗恩来到美国宇航局的JPL(喷气推进实验室,钱学森是创始人之一),在自主机器人人工智能组工作。JPL当时制定了火星探测计划,希望能够到达火星并返回样本。任务艰巨,预算达数十亿元。罗恩他们要做的就是研制火星探测器的原型机。这些原型车有大有小,包括Robby,重达一吨,像一辆SUV;还有像玩具车一样小巧玲珑的Tooth:为了让火星车能够自主避开障碍物在火星上漫游,就必须配备强大的软件,让它拥有强大的大脑。你使用什么编程语言?80年代,没有Java,没有Python,没有JavaScript,航天器大都是汇编写的。而罗恩和其他人决定尝试一种新语言:Lisp。Lisp是当时人工智能的编程语言,恰好配合火星探测器的任务,不需要用C语言管理指针,还支持垃圾回收。然而,当时的NASA对Lisp持怀疑态度。许多人认为Lisp很奇怪,担心Lisp奇怪的垃圾收集技术会突然杀死应用程序进程。但Ron相信:“当你使用的语言提供高级抽象时,工作会更快更容易地完成。”Ron他们首先使用Lisp为手头的问题定义了一种自定义语言,相当于DSL,然后为漫游者的硬件进行编译,这对于内存受限的硬件很有用。在将代码安装到火星探测器上进行测试之前,Ron的团队还在Macintosh计算机上编写了一个模拟器,对代码进行了非常彻底的测试。罗恩的团队不仅可以编写火星探测器的漫游和避障程序,还可以编写底层编译器和模拟器,可见技术能力还是很强的。虽然Lisp漫游车进展顺利,可以使用立体视觉传感器在户外自主导航并在崎岖地形上漫游,但Ron和其他人并不是唯一的漫游车原型组,他们还有竞争对手。罗恩回忆道:NASA内部也有高山和政治斗争。不幸的是,Lisp火星探测器成了牺牲品。最后,团队解散,许多成员离开。1997年,第一辆火星探测器旅居者号抵达火星。这个时候是用C语言驱动的。幸运的是,NASA改变了领导层,启动了一项名为“新千年”的计划,其中之一就是深空探索。深空一号计划飞越小行星和彗星。它需要一个称为远程代理的自主航天器控制系统。C++派和Lisp派之间发生了一场大战,这次Lisp赢了。Ron和其他人又用了同样的把戏,再次使用Lisp定制了一种特定领域的语言,其结构可以防止您编写某些有问题的代码,例如竞争条件。代码在深空一号的备份上反复测试过。罗恩等人对软件很有信心,相信绝对不会出差错。可是世间哪有绝对的事呢?越是认为不会出错,越是会出错。Lisp代码已部署到生产环境:深空一号航天器行驶了2.4亿公里到达了一颗小行星。就在这时,深空一号出现了故障,它应该做的一件事情都没有做。罗恩和其他人必须在深空一号上调试Lisp软件。这个调试不是在机房的服务器上。代码运行的地方在2.4亿公里之外。就算是光,来回也要半个小时!幸运的是,深空一号运行的是Lisp,它支持REPL(read-eval-print循环)等功能,您可以在其中输入命令并查看结果。一群人开会,绞尽脑汁,讨论发什么命令去debug。当然,每一条调试命令都需要层层审批,大家签字,然后训练有素的操作员在深空网络控制台前输入命令,按下红色按钮,信号就会通过一个巨大的70-米天线发出去,以光速向深空一号飞去。罗恩他们要做的第一件事就是查看系统转储信息,查看当前活动进程的列表,然后他们向深空一号发送了一个S表达式。数据传回后,大家立刻发现了问题:一个进程在等待一个已经发生的事件。这不应该发生,主要是因为一个程序调用了一个底层Lisp函数。该团队决定手动触发该事件,以允许流程继续执行。多亏了LISP的魔力,以及在深空一号飞船上安装实时REPL的惊人想法,他们成功地挽救了任务。在2.4亿公里外调试代码,修复问题令人印象深刻,但NASA并没有拥抱Lisp。NASA当时有个响亮的口号“更好、更快、更便宜”,但实际上这更像是一个不可能的三角形。在这种思路的指导下,深空探测项目资金很少,时间也很紧迫。所以当出现进度延误和预算超支时,Lisp就成了替罪羊。关键的转折点是一次有200人参与的重大审查,其中包括JPL的许多高级管理人员,当时一位软件集成工程师正在做演示,他被问到:如果你能改变一件事,你就能让它变得更好。这是什么?工程师回答:摆脱Lisp。这几乎宣告了Lisp在喷气推进实验室的死刑判决。罗恩非常沮丧。他在JPL被边缘化了,想和他一起工作的人越来越少。这时,他找到了一个网站,名叫谷歌。这个网站的搜索结果好得出奇,速度快得吓人。罗恩很快找到了招聘链接,将简历发了过去。2000年,在喷气推进实验室工作了12年后,罗恩加入了后起之秀公司谷歌。Ron一直觉得软件行业令人生畏,因为管理层正在寻找一种开发过程,在这种过程中,程序员将成为可插入、可替换的组件。而Java正好契合了这种管理的需要,于是他发誓永远不做Java程序员,而在90年代后期,这个决定为他关闭了90%以上工作的大门。Ron选择谷歌的一个重要原因是他们没有使用Java,但他在谷歌的第一份工作是领导公司的第一个Java项目!这个项目最终成为了GoogleAdWords。Ron非常想念Lisp。他有过在JPL推广Lisp的经验,于是故技重施。他首先在团队中展示了Lisp,成功俘获了程序员的芳心。每个人都同意使用Lisp是个好主意。接下来只需要说服工程副总裁。罗恩满怀信心地去找副总。Ron:有件事我想和你谈谈……VP:让我猜猜,你想使用Smalltalk?Ron:呃,不……VP:Lisp?罗恩:是的!副总统:不可能!罗恩:...参考:https://corecursive.com/lisp-in-space-with-ron-garret/https://flownet.com/gat/jpl-lisp.htmlhttps://www.youtube.com/watch?v=_gZK0tW8EhQ