一次电梯故障,“逼得”这个程序员在 29 岁时写出了 Rust

2006 年,29 岁的 Hoare 在开源浏览器公司 Mozilla 当程序员。当他回到位于温哥华的公寓时发现电梯出了故障,里面的软件也崩溃了,而这事儿已经不只一两次了。

当他爬楼上去时,心里十分很恼火,因为 Hoare 住在 21 楼。“这也太荒唐了,”他心想,“我们搞计算机的,连一部正常运行的电梯都造不出来!”Hoare 明白,这类很多故障都是程序如何使用内存的问题。诸如电梯之类的设备中,软件一般都是用 C 或 C++ 语言编写的,这些编程语言以能让开发者写出快速、紧凑的代码而著称。但问题在于,这些语言很可能会在不经意间引入内存错误,从而造成软件崩溃。比如微软曾估计,他们代码中有 70% 的漏洞是使用这些程序设计语言编写代码的内存错误所致。

我们中的大多数人,当发现自己要费劲爬上 21 层楼时都会感到愤怒,但随后就抛诸脑后了。不过 Hoare 还是决定做点什么。

他打开笔记本电脑,开始设计一门新的计算机语言,他希望这门语言可以在没有内存错误的情况下,编写出更短、更快的代码。他以一种非常耐寒的真菌 Rust 的名字命名,并称这种真菌“为了生存而过度设计”。

注:锈病菌类(rust disease fungixiubingjun)是引起植物发生锈病的真菌,属有隔担子菌纲锈菌目。

17 年过去了,Rust 已经成为世界上最流行的新语言之一,也许是最热门的。有 280 万程序员使用 Rust,微软和亚马逊等公司都认为 Rust 是他们未来发展的关键。聊天平台 Discord 利用 Rust 加快了系统的速度,Dropbox 则利用 Rust 将文件与你的计算机进行同步,Cloudflare 则将 Rust 用于处理 20% 以上的互联网流量。

在程序员论坛 Stack Overflow 每年一次的全球开发者调查中,Rust 连续七年被评为程序员最“喜爱”的语言,甚至美国政府也在积极推动 Rust 语言的软件,来增强其程序的安全性。

和其他很多成功开源项目一样,Rust 也成为了“谷仓”:目前有数以百计的铁杆贡献者,其中很多都是志愿者。Hoare 本人在 2013 年就离开了这个项目,并且很乐意地把他交给了其他工程师,其中就有 Mozilla 的一个核心团队。

凭什么脱颖而出

一个人发明一门新的程序设计语言并不稀奇。许多程序员一直把创建小项目作为自己的副业。但很少有一门语言可以像 JavaScript、Python、Java 这样的著名语言一样屹立不倒。Rust 是怎么做到的?

要明白为什么 Rust 如此有用,就必须要深入地研究一下程序员是怎样处理计算机内存的。

你可以非常简单地将计算机中的动态存储器想象成一块黑板。一个软件运行时会在黑板上不停地写下数据,记录哪一个数据在哪里,然后在不需要的时候擦除。但是,不同的计算机语言对数据的处理方法是不一样的。传统的 C 或 C++ 等程序设计语言被设计成,程序员在软件如何以及何时使用黑板的问题上有很大的权力。

这种权力很有用:有了对动态存储器如此多的控制,程序员可以让软件运行得非常快速。这也是 C 和 C++ 常常用于编写“裸机”代码的原因,也就是可以直接与硬件进行交互。没有搭载像 Windows 或 Linux 操作系统的机器,包括从透析机到收银机,都是基于这样的代码运行的。(它也适用于更高级的计算:有时,操作系统必须和硬件进行通信)Windows、Linux 和 MacOS 的内核基本上都是用 C 语言编写的。

不过,虽然 C 和 C++ 之类的语言很快,但要付出一定的代价。它们需要程序员密切跟踪哪些存储器被写入以及何时进行擦除。万一你不经意间忘记擦除了些什么,那很有可能会造成程序崩溃:软件稍后可能会试图利用那些它认为是空的内存空间,而那些内存空间中却存在着一些东西。或者,你可以给数字入侵者一个潜入的方法。黑客们可能会发现,某个程序没有正确地清理它的内存——那些本应被删除的信息(如密码、财务信息等)还留在那儿,并悄悄地将其窃取。C 或 C++ 代码越长就越容易出现内存错误,即使是最细心的程序员,也会让软件充满大量的漏洞。

无人机公司 Fusion Engineering 的联合创始人、Rust 库团队的负责人 Mara Bos 说:“在 C 或 C++ 中,你一直都很担心自己的代码会突然崩溃。”

在 90 年代,一组新的语言如 Java、JavaScript 和 Python 开始风靡全球。这些语言采取了完全不同的方式。为了减轻程序员的压力,它们通过使用“垃圾收集器”来自动管理内存,这些组件会在软件运行时定期清理内存。转眼间,你就可以编写没有内存错误的代码了。

但是坏处在于,你会丧失细粒度的控制,你的程序也会变得更慢(因为垃圾回收会占用关键的处理时间),并且用这种语言编写的软件需要更多的内存。所以,编程的世界大致被划分为两个部分。如果一个软件需要快速运行或者在嵌入式设备很小的芯片上运行,那么这个软件就倾向于使用 C 或 C++ 编写。如果是 Web 应用或移动设备应用——在代码世界中越来越壮大——那么你就得使用较新的、具备垃圾回收特性的程序设计语言。

对于 Rust,Hoare 的目的是创建一门语言来这些方法的差异。该语言不要求程序员手工计算出他们在内存中放置数据的位置,Rust 会做到这一点。但是它对如何在程序中使用或者复制数据,却有很多严格的规则。你必须学会那些编程规则,它们比 Python 或 JavaScript 中的那些规则复杂得多。

Rust 代码编写起来可能会比较困难,但是“内存安全”,你不必担心无意中插入了一个致命的内存错误。最重要的是,Rust 还会提供“并发安全”的特性。现代程序可以同时处理多个任务,也就是并发处理。有时候不同的线程会在同一时间对同一内存位置进行编辑,而 Rust 的内存管理机制可以避免这一问题。

Mozilla 的“书呆子洞”

Hoare 刚开始使用笔记本电脑设计 Rust 的时候,他就已经是一个拥有十年软件开发经验的老鸟了,当时正在 Mozilla 全职工作。Rust 最初仅仅是他的一项副业。

Hoare 花费数年的时间对 Rust 进行了研究,并向其他程序员展示了 Rust,结果引起了不同的反响。他在一封邮件中说道,“有些程序员表现出了极大的热情,但也有许多程序员却对我嗤之以鼻,说‘这样是行不通的’,或者‘这根本就不管用’。”

尽管如此,Mozilla 的高管们对 Rust 很有兴趣。他们认识到 Rust 能够帮助公司开发出一个更好的浏览器引擎。众所周知,浏览器是一个非常复杂的软件,存在着大量潜在的内存错误。

Patrick Walton 是参与其中的一名员工,他在决定放弃程序设计语言的博士学位后,加入了 Mozilla。他记得,JavaScript 发明者 Brendan Eich 邀请他参加 Mozilla 的一次会议,“他说,‘你怎么不来,我们要讨论 Rust 的设计决定?’”

Walton 想着 Rust 听上去很不错,于是他与 Hoare 以及一支不断壮大的工程师团队一起努力开发这个语言。许多人,像 Mozilla 工程师 Niko Matsakis 和 Felix Klock,都有研究内存和编码语言的学术经历。


参与 Rust 构建的工程师:Patrick Walton) (1),他在决定放弃编程语言的博士学位后加入了 Mozilla;Niko Matsakis (2) 和 Felix Klock (3),他们都有研究记忆和编码语言的学术经验;Manish Goregaokar (4),目前负责 Rust 的开发者工具团队

2009 年,Mozilla 决定正式赞助 Rust。这门语言将是开源的,并且仅由开发者承担责任,但是 Mozilla 愿意通过为工程师支付薪酬来启动这个项目。

Rust 团队征用了 Mozilla 的一间会议室,Mozilla 研究部门的联合创始人 Dave Herman 把这间会议室叫做“书呆子洞”,并在门外挂了一张牌子。据 Hoare 的估计,在接下来的十年里,Mozilla 雇用了十几名工程师从事 Rust 研发的全职工作。

“所有人都认为自己正在干一件很有意义的事。”Walton 回忆道。这种兴奋还蔓延到 Mozilla 大楼之外。

到 2010 年代初,Rust 已经在全球范围内吸引了许多来自技术领域的志愿者,其中一些人还在大型科技公司工作。德国一位高中生是其中一位重要的贡献者。2010 年,在不列颠哥伦比亚省举行的 Mozilla 会议上,Eich 站起身来,表示将有一场有关实验语言的演讲,Walton 回忆说:“如果你不是真正的程序设计语言爱好者,就别去,不然会议就开不完了。”

在 2010 年代早期,Mozilla 工程师和世界各地的 Rust 志愿者们逐步完善了 Rust 的核心——它被设计为管理内存的方式。他们创建了一个“所有权”系统,使得一个数据只能被一个变量所引用,这极大降低了内存问题发生的可能性。将你编写的几行代码编译成可以在计算机上运行程序的 Rust 编译器,将会严格执行所有权规则。如果程序员违反了这些规则,编译器将会拒绝编译代码并将其编译为可运行的程序。

Rust 所用的许多技巧都不是什么新点子:“它们大部分都是几十年前的研究成果了。”Manish Goregaokar 说,他管理着 Rust 的开发工具团队,早年为 Mozilla 工作。但是 Rust 的工程师们善于发掘这些成熟的理念,并将其转化为实际可行的特性。

随着团队对内存管理系统的改进,Rust 越来越不需要自己的垃圾收集器了。到了 2013 年,团队就将垃圾收集器移除了。用 Rust 编写的程序现在运行速度更快:在计算机进行清理时不会出现周期性停顿。

Hoare 指出,有些软件工程师可能会觉得 Rust 还是有一点类似于垃圾收集的东西,像“引用计数”系统,这也是它内存所有权机制运作方式的一部分。但是不管怎么说,Rust 的性能已经变得非常高效了。它更接近于裸金属,低至 C 和 C++ 的地位,但它是内存安全的。

Steve Klabnik 表示,移除垃圾收集“催生了一种更简洁、更低级的语言。”Steve 是一名程序员,在 2012 年参与了 Rust 项目,为该项目撰写了十年的文档。

一路走来,Rust 社区也形成了一种以非常友好和开放的方式对待新人的文化。“在 Rust 社区,没有人喊你菜鸟,”微软首席工程师 Nell Shamrell Harrington 说,他当时在 Mozilla 从事 Rust 的工作,“没有问题会被认为是愚蠢的。”

她说,部分原因是 Hoare 很早就颁布了禁止骚扰的“行为准则”,任何为 Rust 做出贡献的人都应该遵守这一准则。社区接受了它,而且 Rust 社区的资深成员表示,社区这一行为准则吸引了酷儿(指同性恋、双性恋和跨性别者)和变性者程序员参与到 Rust 中来,比例超过了其他语言。即使是程序员出错,编译器也会产生非常友好的错误信息;它们会描述这些错误,并且会很有礼貌地提出如何修复这些错误。

Shamrell Harrington 笑着说:“当我犯错误时,C 和 C++ 编译器会让我觉得自己很差劲。而 Rust 编译器更像是在指导你如何编写超级安全的代码。”

终于推出了第一个版本

到了 2015 年,该团队执着于最终推出一个“稳定”的 Rust 版本,这个版本足以让公司为真正的客户开发软件。自从 Mozilla 将 Rust 纳入其麾下以来,已经过去了六年,在这段漫长的开发过程中,开发者们都很想试用一下这个演示版本,虽然这个版本看起来有点粗糙:“编译器总是会出现故障。”Goregaokar 说。现在是时候将“1.0”版本推向世界了。

Walton 记得他花了几个小时俯身在笔记本电脑前,“在过去的两个礼拜里写了 45 页左右的文档。”他回忆道。2015 年 5 月 15 日,团队终于推出了第一个版本,成群的 Rust “书呆子”在世界各地举行派对庆祝。

Mozilla 的投资很快就开始有了回报。2016 年,Mozilla 的一支团队推出了 Servo,这是一个使用 Rust 构建的新浏览器引擎。第二年,另一个团队使用 Rust 重写了 Firefox 渲染 CSS 的部分,CSS 是一种用于指定网站外观的语言,这一改变极大地提高了浏览器的性能。Mozilla 还使用 Rust 重写了处理 MP4 多媒体文件的代码,而这些代码一直面临不安全、恶意代码的风险。

Rust 的开发者,开始称呼自己为“Rustaceans”(意为 Rust 开发者,Rust 用户,Rust 爱好者),他们很快收到了消息:其他公司会尝试使用他们的新语言。

三星的程序员告诉在法国 Mozilla 办公室工作的 Klock,他们已经开始使用 Rust。Facebook(也就是后来的 Meta)利用 Rust 重新设计他们程序员用来管理内部源代码的软件。如今为 Meta 工作的 Walton 说:“它的重要性怎么强调都不为过。”

“写 Rust 是一件很有意思的事情,虽然这听上去有些古怪,但它的语言太棒了。很有趣,你会有一种魔术师的感觉,这是在别的程序设计语言里不可能出现的,”他说。“我们肯定在这上面下了大本钱,这可是一项新技术。”

有些公司发现,Rust 缓解了他们对内存错误的恐惧;Mara Bos 使用 Rust 完全重写了她公司的无人机控制软件,而该软件最初是用 C++ 编写的。

其他人则发现了放弃垃圾收集的乐趣。在 Discord,工程师们一直对 Go 中的垃圾收集器(他们用来构建软件关键部分的程序设计语言)会减慢速度而感到恼火。尽管 Discord 的工程师们已经写得很仔细,没有垃圾需要收集,但他们的 Go 软件还是大约每两分钟就会执行一次程序。2020 年,他们用 Rust 重写了这个系统,发现现在的运行速度快了 10 倍。

就连科技巨头的云计算平台亚马逊云科技的网络服务的高管和工程师,也越来越相信 Rust 可以帮助他们编写更安全、更快速的代码。“Rust 具有独特的优势,这是我从其他语言中无法获得的。它在一种语言中能赋予你很多超能力。”Shane Miller 说,他在去年离开亚马逊云科技之前,在该公司创建了一支 Rust 团队。

对于这个云计算巨头来说,也许最关键的是,通过对基于 Rust 代码的研究发现,它的运行效率非常高,其耗电量是用亚马逊云科技常用语言之一 Java 编写的类似程序的一半。Miller 说:“所以我可以创建一个数据中心,它可以运行我今天工作负荷的两倍。”

让人“不安”的成功

Rust 的成功让一些长期贡献者感到有些不安。随着科技巨头们开始采用这种语言,他们对 Rust 的影响也越来越大。他们有足够的资金来支付工程师全职开发 Rust。例如,Rust 团队的几个领导人都是亚马逊和微软的员工。

其他有价值的贡献者不得不在业余时间从事他们的 Rust 工作。例如,Bos 除了经营她的无人机初创公司外,还要为华为从事 Rust 方面的合同工作,但她作为 Rust 库团队负责人的角色是无偿的。

Bos 表示,这在开源项目中是一种普遍趋势:大公司可以更多地参与进来,并且推动项目来解决他们所关注的问题,而小企业则可能不行。“这确实给了他们一些影响力,”她说,但迄今为止,还没有一家公司做过什么令人惊恐的举动。”

Klabnik(去年离开 Rust)也表示赞同她的观点,他对亚马逊加入 Rust 提出了担忧。他说:“我担心吗?是啊。它是特别糟糕还是比其他许多地方更糟糕呢?”

2021 年,各大科技公司出资成立了一家非营利性的 Rust 基金会,以资助志愿者程序员。在头两年中,Miller 负责为那些希望研究 Rust 某些重要特性的程序员提供 20000 美元的资金,以及需要短期经济需求的贡献者提供“困难”资助。

同时,它还资助了托管 Rust 代码的服务器和一家科技公司,保证它们 24 小时不间断地运行。Miller 说,在传统的开源模式下,这项工作以前是由“两个志愿者完成的,他们基本上 50% 的时间都是随叫随到,其中一个是意大利的学生。”

这门语言就这么不可思议地迅速成长起来。如果说 Rust 是在 2006 年诞生的,那么它现在正走出青春期、步入成熟期。

汽车公司正在采用 Rust 来构建运行汽车的关键代码;航空航天公司也在采用 Rust。Dropbox 的 Timmerman 预计,“它将会得到广泛的应用。”微软高管甚至公开表示,许多其他科技公司可能正在闭门思考的问题是:微软将会更多地利用 Rust 来编写新的代码,而 C 和 C++ 则会变得越来越少。最后可能永远都不会有。

所有那些已经在使用的 C 和 C++ 代码都不会消失,它们将会在未来的数十年中继续得到应用。但如果 Rust 成为编写需要快速和裸机的新代码的常用方法,我们就会开始注意到,慢慢地,我们的软件环境会越来越可靠,不会再像以前那样不稳定、不安全。

没有人比 Hoare 更惊讶了。“大多数语言,”他说,“都是半途夭折了。”

原文链接:

https://www.technologyreview.com/2023/02/14/1067869/rust-worlds-fastest-growing-programming-language

本文文字及图片出自 InfoQ

你也许感兴趣的:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注