17611538698
webmaster@21cto.com

从业余项目到全世界最受欢迎的编程语言之一,Rust 是如何做到的?

编程语言 0 1237 2023-06-01 11:55:57

图片

导读:几十年来,开发人员使用 C 和 C++ 编写关键系统。现在他们都开始转向 Rust。

许多软件项目和编程语言的创建,都是因为某个程序员遇到了一个需要解决的特别问题。Graydon Hoare 的故事也源由于此。

Rust 诞生背景

2006 年,Hoare 是一名 29 岁的计算机程序员,就业于开源浏览器公司 Mozilla。有一天,他回到温哥华的公寓,他发现电梯坏了,原因是电梯的软件系统崩溃了。这已不是第一次发生这样的事情。

Graydon Hoare 住在 21 楼,想到要爬楼梯回家,他顿时感到很恼火:“我们这些从事计算机工作的人甚至无法制造出一部不会崩溃的电梯!”

Graydon Hoare 清楚,许多此类的崩溃都是由于程序使用内存的方式存在问题而造成的。电梯之类的设备内部的软件通常是用 C++ 或 C 等语言编写,用这两种语言编写的代码运行速度非常快,而且代码非常紧凑。然而问题是,这两种语言也很容易意外引入内存错误,这些错误会导致程序崩溃。根据微软的评估,其代码中 70% 的漏洞是由于使用这些语言编写的代码存在的内存泄漏造成的。

对于大多数人而言,当知道自己需要爬到 21 楼时,都会很生气,但也就仅此而已了。但 Graydon Hoare 决心为此做点什么事。他打开笔记本电脑,开始设计一种全新的计算机语言,他希望这种语言能够编写出没有内存错误、小而快的代码。他将其命名为 Rust,英文单词“rust”本是一种真菌,中文中叫植物锈病的不少都是这类真菌造成的,他说这个名字的寓意是:“为了生存而过度设计”。

成为“最受程序员喜爱”的编程语言

17 年后,Rust 发展成为了全球最热门的新语言之一。有将近 280 万程序员使用 Rust 编写代码,从微软到亚马逊,许多公司都将其视为未来的关键。聊天平台 Discord 使用 Rust 来加速其系统,Dropbox 使用它来将文件同步到用户的计算机,而 Cloudflare 使用它来处理超过 20% 的互联网流量。

在 Stack Overflow 的年度调查中,Rust 连续七年蝉联“最受程序员喜爱”的编程语言。就连美国政府也在积极地推广 Rust 软件,将其作为确保流程更安全的一种方式。与许多成功的开源项目一样,Rust 的发展也离不开社区的共同努力,现有数百名贡献者仍在支持,其中许多是志愿者。Graydon Hoare 本人在 2013 年退出了该项目,很放心地将其移交给了其他工程师,包括 Mozilla 的核心团队。

创造一种新的计算机语言并不罕见。许多程序员都会利用业余时间建立一个小项目。但是,能够在 JavaScript、Python 或 Java 等众多流行的编程语言之中站稳脚跟,实属罕见。

C/C++ 的天然“大坑”

为了理解 Rust 为何如此实用,我们应该深入了解编程语言对计算机内存的处理。

简单来说,你可以将计算机中的动态内存想象成一块黑板。软件运行时会不断地在黑板上写数据,记录哪个数据保存到了哪里,并在不需要的时候将其擦除。但是,不同的计算机语言,管理这块黑板的方式也不同。C 以及 C++ 等早期的语言倾向于赋予程序员很大的权力,让他们来决定何时以及如何使用这块黑板。这种能力很强大,代码可以动态控制内存,加快软件的运行速度。这就是为什么 C 和 C++ 常用于编写“裸机”代码,即直接与硬件交互。许多没有 Windows 或 Linux 之类的操作系统的机器,比如透析机或收银机等,都运行着这样的代码。(此外,C 和 C++ 之类的语言也用于更高级的计算:有时操作系统需要与硬件通信。Windows、Linux 和 MacOS 的内核都是用 C 语言编写的。)

虽然 C 和 C++ 的速度很快,但这是有代价的。开发人员需要仔细记录写入哪块内存,以及何时擦除。如果不小心忘记删除某些内容,结果会怎样?可能会导致软件崩溃,当软件尝试使用它认为是空的内存,但实际上其中已保存了数据,就会崩溃。或者,这会成为非法用户的入侵渠道。

黑客会发现程序没有正确清理内存,本应被清除的密码或财务等信息仍然存在,他们就会偷偷攫取这些数据。随着 C 和 C++ 代码的规模增大,即便是程序员再细心,也可能会犯很多内存错误,从而导致软件中 bug 累累。

无人机公司 Fusion Engineering 的联合创始人兼 Rust 库团队负责人 Mara Bos 表示:“在 C 或 C++ 中,你总是会担心代码随时出现问题。”

上个世纪 90 年代,Java、JavaScript 和 Python 等一系列语言开始流行。这些语言采取了完全不同的方法。为了减轻编程人员的压力,这些语言使用“垃圾收集器”自动管理内存,这些组件会在软件运行时定期清理内存。你可以编写没有内存错误的代码。但缺点是失去了细粒度的控制。程序的执行速度也减慢了(因为垃圾收集占用了关键的处理时间)。用这些语言编写的软件需要使用更多的内存。因此,编程世界分成了两大阵营。如果软件需要快速运行或在嵌入式设备的微型芯片上运行,则选用 C 或 C++ 编写更合适。如果是网络应用程序或手机应用,则可以选用一种更新的、具有垃圾收集功能的语言。

编程大佬纷纷加入 Rust

Graydon Hoare 创建的 Rust 语言与上述这些方法有很大的不同。Rust 不需要程序员手动找出数据在内存中的位置,而是由语言本身来管理。但 Rust 对于如何在程序中使用或复制数据有许多严格的规则。程序员必须学习这些编程规则—— 比 Python 或 JavaScript 更繁琐的规则。虽然编写代码的难度有所提高,但代码是“内存安全的”,你无需担心不小心插入致命的内存错误。最为重要的是,Rust 还将提供“并发安全”。现代程序可以同时做多件事——并发,有时不同的线程会尝试修改同一块内存,而 Rust 的内存系统会阻止这种操作。

在刚开始设计 Rust 时,Graydon Hoare 在 Mozilla 工作,他已是一名拥有十多年软件开发经验的老程序员。起初,Rust 只是一个业余项目。Graydon Hoare 花了几年时间来开发 Rust,当第一次向其他程序员展示这门语言时,收到的反馈褒贬不一。“有些人很热情,而有些人则表示不喜欢,还说这门语言压根不行,永远没机会使用。”

但是,Mozilla 的高层却对 Rust 很感兴趣。他们认为,Rust 可以帮助他们构建更好的浏览器引擎。浏览器是非常复杂的软件,出现内存错误的风险极高。

Patrick Walton 也是 Mozilla 的一名员工,他也参与了 Rust 的开发工作。当初,Patrick Walton 放弃继续攻读编程语言博士的学位,并加入了 Mozilla。偶然的一次机会,JavaScript 的创建者 Brendan Eich 把他拉进了 Mozilla 的一次会议:“我们在讨论 Rust 的设计决策,你要不要来看看?”Patrick Walton 觉得 Rust 非常棒,于是,他开始和 Graydon Hoare 一起开发该语言。后来越来越多的工程师加入了他们的队伍。当时的很多人,包括 Mozilla 的工程师 Niko Matsakis 和 Felix Klock,都有内存和编程语言相关的研究经验。

图片

  Patrick Walton、Niko Matsakis、Felix Klock与Manish Goregaokar

2009 年,Mozilla 决定正式赞助 Rust。该语言将是完全开源的,而且其决策由创造者全权负责,而且 Mozilla 同意出钱资助。于是,Rust 小组占据了公司的一间会议室,Mozilla Research 的联合创始人 Dave Herman 将其称为“书呆子洞穴”,并在门外张贴了一个标志。在后面的十年里,Mozilla 雇佣了十几名工程师全职研发 Rust。

Walton 回忆道:“每个人都觉得自己在从事一项伟大的事业。” 这种兴奋延伸到了 Mozilla 的大楼之外。2010 年代初期,Rust 吸引了世界各个角落的志愿者,他们中的有些人在大型科技公司工作。其中一名主贡献者是德国的一名高中生。2010年,Mozilla 在加拿大不列颠哥伦比亚省举行会议,Eich 发表了关于实验性语言的演讲,他说:“如果你对编程语言充满了兴趣,就一定要试试看 Rust。”

确认 Rust 内核,程序运行更快,更安全

2010 年代初期,Mozilla 的工程师和世界各地的 Rust 志愿者逐渐打磨出了 Rust 的内核:内存的管理方式。他们创建了一个称为“所有权”的系统,一个数据只能由一个变量引用,这大大降低了内存出问题的风险。Rust 的编译器会严格执行所有权规则。如果编程人员违反这些规则,编译器将拒绝编译代码,也不会将其变成可运行的程序。

Rust 使用的许多技巧都算不上新颖,Manish Goregaokar 是 Rust 开发人员工具团队的负责人,早年他也曾在 Mozilla 工作,他表示:“很多都是几十年前的研究”。但 Rust 工程师善于发现这些设计概念,并将它们转化为实用功能。

随着这个团队不断改进内存管理系统,逐渐地 Rust 不再需要自己的垃圾收集器,直到 2013 年,他们删掉了垃圾收集器。如今用 Rust 编写的程序运行速度更快,因为计算机不会每隔一段时间就停下来清理垃圾。Hoare 指出,一些软件工程师认为 Rust 仍然拥有类似于垃圾收集的元素,这被称为“引用计数”系统,这个系统是内存所有权机制的一部分。但是,不论采用了哪种方式,如今 Rust 的性能确实提高了,距离硬件越来越近,就像 C 和 C++ 一样,同时也保证了内存安全。

2012 年,Steve Klabnik 开始接触 Rust 的开发工作,并在之后的十年里负责编写相关文档,他表示,删除垃圾收集器后,“Rust 变成了一门更精简且更有效地语言。”

友好的社区文化

在语言开发的过程中,Rust 社区建立了一种文化:对新人异常友好,而且非常开放。微软首席工程师 Nell Shamrell-Harrington 曾在 Mozilla 从事 Rust 的开发工作,她这样表示:“我们不会称任何人为菜鸟,没有一个问题是愚蠢的。”

她说,部分原因是 Hoare 在很早以前就发布了“行为准则”,任何为 Rust 做出贡献的人都应该遵守这些准则。Rust 社区成员说,社区接受了这套准则,并且成功地吸引到了很多编程高手加入 Rust。即便程序员犯错,编译器抛出的错误消息也很友好,不仅描述了错误,而且还会就如何修复礼貌地提出建议。

Shamrell-Harrington 说:“当我犯错误时,C 和 C++ 的编译器会让我觉得自己是一个很糟糕的人。而 Rust 编译器更像是在指导你编写超级安全的代码。”

2015 年,该团队全力以赴地发布了 Rust 的“稳定”版本。这个版本相当可靠,可用于为真正的客户编写软件。

如今距离 Rust 归入 Mozilla 旗下已经过去六年了,在漫长的开发期间内,编程人员一直渴望尝试演示版本,尽管这些版本的表现会很糟糕,Goregaokar 说:“编译器一直在崩溃”。

终于,到时候将“1.0”推向世界了。

Walton 记得自己蜷缩着身体坐在电脑前奋战了几个小时。Klabnik“在过去两周内写了大约 45 页的文档,”他回忆道。2015 年 5 月 15 日,他们终于发布了第一个版本,众多 Rust 粉丝聚集在世界各地,举杯庆祝。

Mozilla 的投资很快开始获得了回报。2016 年,Mozilla 小组发布了 Servo,这是一款使用 Rust 构建的新型浏览器引擎。第二年,另一个小组使用 Rust 重写了 Firefox 中渲染 CSS 的部分。这一变化给浏览器带来了明显的性能提升。此外,Mozilla 还使用 Rust 重写了处理 MP4 多媒体文件的代码。

很快,Rust 开发人员就听到很多公司都在尝试他们的新编程语言。

荣获科技巨头青睐

三星的程序员告诉在法国 Mozilla 办公室工作的 Klock,他们已经开始使用 Rust 语言了。Facebook(现改名为 Meta)使用 Rust 重新设计了程序员管理其内部源代码的软件。Walton 如今在 Meta 工作,他表示:“无论怎么夸奖 Rust 的重要性都不为过。”

很快,许多重要软件的核心部分都开始采用 Rust 编写。2020 年,Dropbox 推出了其“同步引擎”的新版本,他们的工程师也用 Rust 重写了该引擎。该系统最初是用 Python 编写的,但现在要处理几十亿个文件(以及在线同步的数万亿个文件)。软件工程师 Parker Timmerman(最近离开了 Dropbox)表示,Rust 降低了处理如此复杂的系统的难度。

他说:“使用 Rust 写程序很愉快,这门语言太棒了,很有趣。你感觉自己就像一位魔术师,使用其他语言时根本不会有这样的感觉。我们做了一个很明智的决定,这是一项新技术。”

一些公司发现 Rust 减轻了他们对内存错误的恐惧,Mara Bos 使用 Rust 重写了控制无人机的软件,该软件最初是用 C++ 编写的。

还有一些人感受到放弃垃圾收集的好处了。在 Discord,长期以来工程师们一直对 Go 中的垃圾收集器很不满。他们用 Go 编写的软件大约每两分钟就需要执行一次垃圾收集,尽管 Discord 的工程师写得非常仔细,没有垃圾需要收集。2020 年,他们用 Rust 重写了该系统,如今运行速度提高了 10 倍。

现如今,就连科技巨头亚马逊的云计算平台 AWS 的高管和工程师也越来越相信 Rust 可以帮助他们编写更安全、更快的代码。Shane Miller 为 AWS 创建了一个 Rust 团队,他表示:“Rust 具有独特的优势,可以提供其他语言无法提供的优势。Rust 能提供一种语言的多种超能力。”

对这家云计算巨头来说,最重要的是,一项基于 Rust 代码的研究发现,Rust 代码的运行效率非常高,其耗电量只有用 Java 编写的同等程序的一半。Miller 说:“因此,我可以创建一个数据中心,运行 2 倍的工作负载。或者,只需一半大小的数据中心就可以完成同等量的工作,毕竟数据中心需要建立在城市中心,不能放到郊区。”

Rust 的成功让一些长期贡献者感到有些紧张。随着科技巨头陆续开始采用这种语言,他们对 Rust 产生的影响也越来越大。这些巨头公司资金充沛,足够负担工程师全职开发 Rust,实际上如今 Rust 团队的几位领导者就是亚马逊和微软的员工。而其他有价值的贡献者必须在业余时间从事 Rust 的开发,比如 Bos 除了运营她的无人机创业公司外,还需要承担华为的 Rust 工作,但作为 Rust 库的团队负责人,她的这部分工作并不会获得任何酬劳。

Bos 表示,这种现象在开源项目中很常见:大公司有能力更多地参与项目开发,他们可以推动整个项目,解决他们关心的问题,但小公司就没有这种能力。她说:“大公司确实有这样的一些影响力”。但到目前为止,没有任何公司采取任何措施来敲响警钟。Klabnik 对亚马逊参与 Rust 的开发表示担忧,“我担心吗?当然担心了。我会觉得这个项目比其他项目更糟糕吗?并不会。”

基金会成立,开源不再用“爱”发电

2021 年,各大科技公司出资成立了一个非营利性 Rust 基金会,以支持志愿者。在 Miller 领导该基金会的头两年里,他们提供了 2 万美元的资助,用于支持希望承担 Rust 主要功能开发但短期内需要资金支持的贡献者。此外,该基金会还为托管 Rust 代码的服务器提供了资金,并付钱给一家技术公司,以确保这些服务器全天候运行。Miller 说,在常见的开发风格中,这项工作以前是由“两名志愿者完成的,他们基本上有 50% 的时间在待命,其中一名是来自意大利的学生。”

这种语言的发展速度非常不可思议。如果说 Rust 诞生于 2006 年,那么如今即将结束青春期,走向成熟期。汽车公司正在采用 Rust 来构建运行车辆的关键代码,航空航天公司也在使用这种编程语言。Dropbox 的 Timmerman认为:“将来,到处都会使用 Rust。”微软高管甚至公开表示,他们将使用 Rust 编写越来越多的新代码,而C和C++的使用将越来越少,最终为零。

所有使用 C 和 C++ 编写的旧代码不会消失,会一直使用,可能会持续数十年。但是,如果 Rust 成为编写快速和裸机代码的常用语言,我们会逐渐地意识到,我们的软件环境将变得越来越可靠,不那么容易崩溃,也不至于那么不安全。

看到 Rust 如今的发展,最惊讶的人莫过于 Hoare 本人。因为,“许多语言都半路夭折了,”他说。


编辑:场长

评论