17611538698
webmaster@21cto.com

Rust 是如何从电梯项目发展成为世界上最受欢迎语言的?

编程语言 0 363 2024-08-22 04:50:10

图片

很多编程语言的项目的出现,都是因为某个地方的程序员需要解决个人问题。这个个人问题并不是单身,是他自己遇到在技术上的挑战或改变。

格雷登·霍尔(Graydon Hoare)的经历也大致如此。

图片

格雷·登霍尔出生在1979年

2006 年,霍尔还是一名 29 岁的计程序员,为开源浏览器公司 Mozilla 工作。有一次他回到温哥华的公寓后,发现电梯坏了,原因是软件崩溃了。这事早不是第一次发生了。 

霍尔住在 21 楼,他一边爬楼梯一边恼火的挠头。他这样想:“真是可笑,我们这些计算机专业人员竟然无法制造出一台不死机的电梯! ”

霍尔知道,许多此类死机都是由于程序使用内存的方式存在问题。电梯等设备中的软件通常是用 C++ 或 C 等语言编写的,这些“低级语言”以允许程序员编写运行速度非常快且非常紧凑的代码而闻名。但比较严重的问题是,这些语言也很容易意外引入内存错误,会导致崩溃等错误。据微软估计,代码中 70% 的漏洞都是由使用这些语言的代码中的内存错误引起的。

大多数人如果发现自己要爬 21 层楼梯,通常开始会很生气,到了后面就此不了了之了。

但是,霍尔决定自己做点什么。

他打开自己的笔记本电脑,便开始设计一种新的计算机语言,希望这种语言能够让程序员们编写出小巧、快速且没有内存错误的代码。

后来,他将这种语言命名为 Rust,以纪念一种极其顽强的真菌,他说,这些真菌“为了生存而过度设计”。

十七年后,Rust 成为了地球上最热门的新语言之一,甚至可能是最热门的语言。

据数据表明,有 500 万以上程序员使用 Rust 编写代码,从微软到亚马逊等公司都将其视为未来的关键。聊天平台 Discord 使用 Rust 来加速其系统,Dropbox 使用它将文件同步到您的计算机,Cloudflare 使用它来处理超过 20% 的所有互联网流量。 

当程序员问答社区 Stack Overflow 每年都对全球开发者进行一次调查时,Rust 连续七年被评为最“受欢迎”的编程语言。

甚至,美国政府也在积极推广 Rust 语言,以使其流程更加安全。与许多成功的开源项目一样,该语言已成为一项明星级筹款活动:现在有数百名忠实的贡献者,其中许多都是它的志愿者。

霍尔本人于 2013 年退出Rust项目,他说很高兴将其移交给其他工程师,包括 Mozilla 的核心团队。

图片

有人创造一种新的计算机语言并不罕见。很多程序员一直在创造一些小语言作为业余项目。但很少有一种语言能像流星一样脱颖而出,成为与 JavaScript、Python 或 Java 等知名语言并驾齐驱的万神之殿的一部分。

Rust 是如何做到的?

要了解 Rust 为何如此有用,我们值得深入了解一下编程语言如何处理计算机内存。

您可以非常粗略地将计算机中的动态内存想象成一块黑板。当软件运行时,它会不断地将少量数据写入黑板,跟踪哪个数据位于何处,并在不再需要时将其删除。

不过,不同的计算机语言有不同的方式管理这一点。

像 C 或 C++ 这样的“旧编程语言”旨在让程序员能够控制软件使用黑板的方式和时间。这种能力很有用:通过对动态内存的如此多样的控制,程序员可以让软件运行得非常快。这也就是为什么 C 和 C++ 经常被用来编写“裸机”代码,即直接与硬件交互的代码。

在没有 Windows 或 Linux 等操作系统的机器,包括从透析机到收银机的所有设备,都运行在这样的代码上。它也用于更高级的计算:在某些时候,操作系统需要与硬件通信。Windows、Linux 和 MacOS 的内核也都是用 C 编写的。

“编写 Rust 很有趣,这么说可能有点奇怪,但这门语言实在太棒了。很有趣。你会觉得自己像个魔术师,而这在其他语言中是永远不会发生的。”


——Parker Timmerman,软件工程师

但是,尽管 C 和 C++ 等语言速度很快,但也有它的弊端。它们要求程序员要仔细跟踪正在写入的内存以及何时删除。如若你不小心忘记删除某些有用的内容,那会怎样?这可能就会导致崩溃:软件稍后可能会尝试使用它认为是空的内存空间,而实际上那里是有内容的。再或者你可能会给黑客入侵者提供潜入的方法。黑客可能会发现程序没有正确清理内存——应该被删除的信息(密码、财务信息)仍然存在,这样就可以偷偷获取这些数据。随着 C 或 C++ 代码越来越大,即使是最谨慎的程序员也可能会犯下大量内存错误,导致软件充斥一些漏洞。

“在 C 或 C++ 中,你总是担心你的代码可能会随时爆炸,”一家叫做 Fusion Engineering 的无人机公司联合创始人兼 Rust 团队负责人 Mara Bos 如此说道。

话说 20 世纪 90 年代,Java、JavaScript 和 Python 等一系列新语言开始流行。

这些编程语言后来采用了截然不同的方法,是什么方法呢?

为了减轻程序员的压力,他们使用“垃圾收集器”自动管理内存,垃圾收集器是一种软件运行时定期清理内存的组件。很快,你便可以编写没有内存错误的代码。但缺点是失去了这种细粒度的控制。你的程序运行起来也就更慢(因为垃圾收集占用了关键的处理时间)。而且用这些语言编写的软件要占用的内存要多得多。因此,编程世界大致分为两个阵营。如果软件需要快速运行或在嵌入式设备的微型芯片上运行,则更有可能用 C 或 C++ 编写。如果是 Web 应用程序或手机应用程序(占代码世界的比重越来越大),则可以使用较新的垃圾收集语言。

而 Hoare 的目标是通过 Rust 创建一种全新的编程语言,将这两种方法的差异区分开来。

它不需要程序员手动找出他们将数据放在内存中的哪个位置;Rust 会自动做到这一点。但它会对程序内部数据的使用或复制方式加入许多严格的规则。

而程序员需要再学习这些编码规则,这些规则比 Python 或 JavaScript 中的规则可是要复杂得多。因此您的代码会更难编写,但它能够做到“内存安全”,不用再担心会意外插入致命的内存错误。

另外更重要的是,Rust 还将提供了“并发安全”:现代级程序会同时执行多项操作。换句话说,代码同时执行,有时这些不同的代码线程会尝试在几乎相同的时间修改同一块内存。

Rust 的内存管理系统可以有效防止这种情况发生。

图片

当 Hoare 第一次打开笔记本电脑开始设计 Rust 时,他已经是一名拥有 10 年软件经验的老手,全职在 Mozilla 工作。

Rust 最初只是Hoare的一个副业,他却为Rust埋头苦干了好几年。

当他向其它程序员展示时,反应得到的也是褒贬不一。“有些人对他的产品很热情,”他在一封邮件中倾诉道。“还有很多人翻白眼,说‘这玩意永远行不通’或者‘这永远没法用’。”

不过,Mozilla 的高管们对他的产品却很感兴趣,他们意识到 Rust 可以帮助公司构建更好的浏览器引擎。

正如人们所知道的,浏览器是一种复杂的软件,是很容易出现危险的内存错误的。

参与其中的一名员工名叫帕特里克·沃尔顿 (Patrick Walton),他是决定放弃编程语言博士学位加入 Mozilla 的。他清晰记得 JavaScript 的发明者布伦丹·艾希 (Brendan Eich) 把他拉进了 Mozilla 的一次会议:“他说,‘你要不要来下这个房间,我们要讨论一下 Rust 的设计决策?’”沃尔顿认为 Rust 听起来很棒;于是他也加入了霍尔和越来越多的工程师团队,共同开发这种语言。

许多人也相继加入,比如 Mozilla 工程师尼科·马萨基斯 (Niko Matsakis) 和菲利克斯·克洛克 (Felix Klock),都有研究内存和编码语言的学术和实践经验。

图片

Mozilla 的高管意识到 Rust 可以帮助他们构建更好的浏览器引擎,于是他们派了几位工程师一同参与该项目。其中包括 Patrick Walton(图1) ,他在决定放弃编程语言博士学位后加入 Mozilla;Niko Matsakis (图2) 和 Felix Klock (图3),他们都拥有研究内存和编码语言的学术经验;以及 Manish Goregaokar (图4),他目前负责 Rust 的开发工具团队。

2009 年,Mozilla 决定正式赞助 Rust。

该语言的性质是开源的,只对开发它的人负责,但 Mozilla 愿意通过支付工程师薪资费用来引导和发展它。于是,一个 Rust 小组接管了公司的一间会议室;Mozilla Research 的联合创始人戴夫·赫尔曼 (Dave Herman) 将它称为“书呆子洞穴”,还在门口贴了一块正式的牌子。

在接下来的 10 年里,Mozilla 将聘请十几名工程师全职从事 Rust 研发工作。

“每个人都真的觉得自己正在做一件可能真正伟大的事情,”沃尔顿兴奋地说道。

这种激情也延伸到了 Mozilla 大楼之外。到 2010 年代初,Rust 吸引了来自世界各地科技界各的志愿者,有些人还同时为大型科技公司工作。其中一位主要贡献者是来自德国的一名高中生艾希

在 2010 年不列颠哥伦比亚省举行的 Mozilla 会议上,艾希站起来说,他有一场关于实验语言的演讲,他这样说:“除非你是一个真正的编程语言迷,否则请不要参加,”沃尔顿说道,“虽然如此,房间里仍然挤满了人。”

在 2010 年代初期,Mozilla 工程师和来自世界各地的 Rust 志愿者逐渐完善了 Rust 的核心,即管理内存的方式。他们创建了一个“所有权”系统,这样一段数据只能由一个变量引用;这大大降低了出现内存问题的可能性。Rust 的编译器(它将编写的源代码行转换为可在计算机上运行的软件)会严格执行所有权规则。如果程序员违反了规则,编译器将拒绝编译代码不将其转换为可运行的程序。

其实,Rust 所采用的许多技巧也都不是新想法:“它们大多是几十年前的研究成果,”Rust 开发工具团队负责人 Manish Goregaokar 坦承说道,他早年曾在 Mozilla 工作。但是, Rust 工程师善于发现这些经过精心打磨的概念,并将它们转化为实用、可用的功能。

随着Rust团队改进内存管理系统,Rust 越来越不需要自己的垃圾收集器了。到了 2013 年,团队将垃圾收集器完全删除,这样用 Rust 编写的程序现在运行速度更快:计算机执行清理时也不会定期暂停。

霍尔指出,有些软件工程师会认为 Rust 仍然拥有一些类似于垃圾收集的元素,它的“引用计数”系统,是其内存所有权机制工作方式的一部分。但无论如何,Rust 的性能已经变得异常高效。它更接近金属层,深入到 C 和 C++ 的水平,而且它是内存安全的。

删除垃圾收集“使得语言更加精简与高效”,Rust团队程序员 Steve Klabnik 说,他在 2012 年开始接触 Rust,并在接下来的 10 年里为其编写详细的技术文档。

在此过程中,Rust 社区也建立了一种对新人异常友好,并且开放而闻名于市的团队文化。“在社区里,没有人会叫你菜鸟 ”,现任微软首席工程师、当时在 Mozilla 从事 Rust 工作的 Nell Shamrell-Harrington 说。“没有一个人的问题是愚蠢的。” 

他说,有一部分原因是 Hoare 很早就发布了“行为准则”,禁止人员骚扰开发小组,任何为 Rust 做出贡献的人都应遵守该准则。社区所有人对此表示欢迎,而且,Rust 社区的长期成员表示,这吸引了同性恋和跨性别程序员参与 Rust,其参与比例高于其他语言。甚至当程序员犯错时,编译器创建的错误消息也异常贴心;它们描述了错误,并礼貌地建议如何修复它。 

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

到 2015 年,该团队一直执着于发布 Rust 的“稳定”版本,该版本足够可靠,可供企业用于为实际客户开发软件。转眼,Mozilla 收购 Rust 已有六年时间,在这段漫长的开发时间内,程序员一直渴望尝试可演示版本,即使它们可能存在问题:“编译器总是出问题,”Goregaokar 说。现在是时候将“1.0”推向世界了。

沃尔顿记得自己曾花好几个小时趴在笔记本电脑前。他回忆道,“Klabnik 在过去两周内写了大约 45 页的文档”。

2015 年 5 月 15 日,该团队终于发布了第一个版本,世界各地的 Rust 爱好者们齐聚一堂,举行盛大派对庆祝。

Mozilla 的投资很快就开始获得回报。2016 年,Mozilla 的一个团队发布了 Servo,这是一款使用 Rust 构建的全新浏览器引擎。第二年,另一个团队使用 Rust 重写了 Firefox 中渲染 CSS 的部分,CSS 是一种用于指定网站外观的语言。这一变化使浏览器的性能得到了显著提升。

该公司还使用 Rust 重写了处理 MP4 多媒体文件的代码,这些代码曾面临引入不安全恶意代码的风险。

Rust 开发人员(他们开始喜欢这样称呼自己)很快就听说其他公司也在尝试他们的新语言。 

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

很快,Rust 就出现在一些非常重要的软件的核心中。

2020 年,Dropbox 发布了其“同步引擎”的新版本——该软件负责在用户的计算机和 Dropbox 的云存储之间同步文件,研发工程师们用 Rust 重写了它。该系统最初是用 Python 编写的,但现在要处理数十亿个文件(以及数万亿个在线同步的文件)。

离开 Dropbox 的软件工程师 Parker Timmerman 后来说,Rust 让处理这种复杂性变得非常容易,甚至令人愉悦。

“编写 Rust 代码是一种享受,这么说可能有点奇怪,但这门语言太棒了。它很有趣。你会觉得自己像个魔术师,而这在其他语言中是永远不会发生的,”他说,“我们确实下了很大的赌注——这是一项新技术。”

一些团队发现 Rust 减轻了他们对内存错误的担忧;文前提到的Mara Bos 使用 Rust 完全重写了公司的无人机控制软件,该软件最初是用 C++ 编写的,相当于卸掉了一枚定时炸弹。 

还有其他一些人发现了放弃垃圾收集的乐趣。

在 Discord,工程师们一直对 Go 中的垃圾收集器感到恼火,他们用 Go 语言构建软件的关键部分,但是GC会减慢速度。Go 引擎大约每两分钟执行一次该过程,尽管 Discord 工程师编写的东西非常仔细,几乎没有垃圾需要收集。

到了2020 年,他们用 Rust 重写了该系统,发现它现在运行速度比以前提高了 10 倍以上。

作者:洛逸

参考: 

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

评论