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 是怎么做到的?
你可以非常简单地将计算机中的动态存储器想象成一块黑板。一个软件运行时会在黑板上不停地写下数据,记录哪一个数据在哪里,然后在不需要的时候擦除。但是,不同的计算机语言对数据的处理方法是不一样的。传统的 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 的内存管理机制可以避免这一问题。
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,都有研究内存和编码语言的学术经历。
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 版。
Copyright © 2022 杏彩体育官网入口网址·(中国)手机客户端登录 版权所有 苏ICP备2021054995号-3杏彩体育手机客户端登录