Rust最近有点忙。
前有微软CTO公开放话:“是时候用Rust取代C/C++创建新项目了!”后有Linus Torvalds表示,如无意外,Linux 6.1将初步支持Rust。
作为一门新语言,Rust近年来可谓风头正盛。
据开发者调查分析公司SlashData报告,从2021年到2022年的第一季度,Rust是使用数量增长最快的语言。而在StackOverflow相关调查中,Rust也多年蝉联最受欢迎的编程语言。另外,苹果、微软、谷歌、亚马逊、Meta 等科技巨头陆续使用Rust,无疑也加速了Rust生态的成长。
被很多人视作“C++后继者”的Rust开始越来越多地进入人们的视野。未来Rust是否会取代C++的议题也逐渐涌现,但新旧编程语言之争素来如此,只有时间才能带来终局。当下,不妨先来看一看Rust最近活跃的身影,从中也许能窥见其一路发展的履迹。
谷歌:兜兜转转,寻觅C++继任者
在外界看来,谷歌对Rust向来秉持非常开放的态度。
谷歌于近日推出的开源操作系统KataOS引发了一波关注。值得关注的是,出于将安全性放在首位的宗旨,KataOS专门使用Rust语言开发,并基于seL4微内核进行了构建。之所以选择Rust,谷歌方面表示,“这为其安全性提供了一个强有力的起点,因为Rust消除了entire classes错误,例如大小差一(off-by-one errors)和缓冲区溢出”。
除了在新系统开发中采用Rust编写,谷歌在去年就宣布AOSP支持使用Rust开发Android操作系统。彼时,谷歌工程师指出,C和C++中的内存安全bug是长期痼疾之一。尽管谷歌已经投入了大量的精力和资源来检测、修复、预防这类bug,内存安全bug仍然是导致稳定性问题的主因,它在Android严重安全漏洞中长期占比约70% 。相较于C和C++在内存管理方面的复杂性,Rust可以利用编译时检查(确保对象的生命周期和所有权)和运行时检查(确保内存访问有效)来保证内存安全。而且Rust在实现安全性的同时还提供了与C和C++相当的性能。
此外,在是否应将Rust代码引入Linux内核的讨论中,谷歌曾公开表示支持立场。谷歌安全博客曾发文称:“我们认为,Rust现在已经准备好加入C语言,成为实现内核的实用语言。它可以帮助我们减少特权代码中潜在的bug和安全漏洞,同时与内核也配合得很好,可以很大程度上保留其性能特性。”
可以说,谷歌对Rust一直不吝支持。但在寻找C++继任者的实验之路上,谷歌并未止步于Rust。
在今年7月举办的CPP North C++大会上,谷歌开源并发布了新型语言Carbon,并称其是C++的实验性继任者。
谷歌工程师Chandler Carruth介绍,Carbon旨在与现有的C++代码完全互操作,目标是尽可能轻松地从C++迁移到Carbon。与之相比,Rust固然在内存安全性上优势鲜明,但其可能永远无法与C++达成足够的互操作性,以致很难实现平滑迁移。
对于Carbon的出现,C++之父Bjarne Stroustrup应媒体之邀给出了直白的回应:“总有新的语言试图成为C++的继任者。我欢迎对编程语言和编程风格进行实验,但我不想引发争议。批评已建立的语言很容易,因为我们知道它们的问题,但通常很难在不产生语言规则、库和管理方面的全新问题的情况下提供替代方案。Carbon太新了,而且规范不足,以至于我无法真正做出有意义的技术评论。”
微软Azure:CTO力挺Rust与C++之父隔空battle
同样是支持,相较于谷歌对Rust的态度,微软就显得激进很多。
自2004年以来,微软安全响应中心(MSRC)已对所有报告过的微软安全漏洞进行了分类,发现其年度补丁中约有70%是针对内存安全漏洞的修复程序。而造成这一结果的主要原因是Windows和大多数其他微软产品主要使用C和C++这两种memory-unsafe的语言编写。
如果能消除这些漏洞将明显提高软件安全性,同时降低漏洞修复成本。于是,微软开始探索使用诸如Rust之类的memory-safe语言作为C和C++等语言的替代方案,以此来改善应用程序的安全状况。除此之外,在Rust的启发下,微软还着手开发了自己的内存安全编程语言Project Verona。
微软对Rust前景的看好有目共睹。今年9月,微软Azure CTO Mark Russinovich的公开表态又引起了热议。
Russinovich在推特上表示:“是时候停止使用C/C++创建任何新项目了。如果你要开新项目,而且需要使用非GC语言的时候,建议使用Rust替代。出于安全和可靠的考虑,业界应该宣布弃用C/C++。”不过他也强调,并非是要用Rust完全取代C/C++写好的东西,只是“对于新工具,我会偏向Rust”。
对这一观点,Bjarne Stroustrup这次给出的回应更为“辛辣”:“人们——尤其是高管——迷恋那些承诺可以让他们的生活更轻松的新事物,这并不少见。此外,支持新事物远比解决旧工具和知名工具的已知问题更令人兴奋。不过,新语言通常需要多年时间和重大努力才能在其广泛的应用领域与成熟语言相匹配。爱好者很少看到这一点,并且他们的评论往往是片面的。”
同时,Stroustrup表示,多年来他一直致力于提高C++的安全性,现在已经可以在ISO C++中实现有保证的完美类型和内存安全。“要注意的是,包括Rust在内的每一种‘安全’语言都存在允许不安全代码的漏洞。”
Rust加入Linux之旅:千呼万唤始出来
Rust的迅速崛起离不开顶级的项目引入。而Linux内核何时能支持Rust一直备受瞩目。
自Rust崭露头角,许多人呼吁在Linux内核中增加Rust语言的支持,甚至还为此诞生了一个叫“Rust for Linux”的组织。
早在2020年,Linus Torvalds就回应过相关问题,他并没有否定这一提议。而在Linux Plumbers Conference 2020大会上,内核开发者们普遍达成共识:没必要将已有内核用Rust重写,应专注于可以用Rust编写的新代码。此后,Linus也一直对此持观望和开放态度。
Rust到底有没有可能成为Linux内核中除C之外的第二种官方语言呢?答案是肯定的。
不过本以为能在6.0版本看到Rust合并进内核,但最终没有实现。究其原因,主要有两个,一个是非标准的Rust扩展的处理,另一个是Rust编译器还不稳定。Linus表示自己更关心后面这个原因,因为Rust编译器的可靠性和稳定性更重要。
而今年的LPC大会举行了一个Rust相关的小型会议。会上,西部数据公司的工程师Andreas Hindborg的发表颇为引人注目,其主旨是围绕基于Rust的NVMe驱动程序。
目前Linux内核已经拥有出色的由C编写的NVMe驱动程序,不需要替换。但鉴于NVMe驱动程序的广泛使用度及其重要性,使用Rust编写的NVMe驱动程序也是一个非常有趣的尝试。基准测试结果表明,虽然Rust NVMe驱动程序仍处于早期阶段,但其已表现不俗——结果表明该Rust驱动程序能够实现与C驱动程序相当的性能。
就在LPC大会之后的2022 Linux内核维护者峰会上,Linus提议将Rust支持合并到Linux 6.1中。他表示,希望在内核中看到Rust的一个原因是鼓励新的开发者研究内核。不过他也提醒,目前“Rust只在核心基础设施使用”。不过,这对Rust和Linux来说,都将是历史性的第一步。
新旧语言之争:唯有时间是永远的庄家
在编程世界中,新旧语言之争历久弥新。不少人期待Rust对标C++,就像TypeScript之于JavaScript,Kotlin之于Java。
不过事实上,两者并非“你死我活”的关系。一些C++的拥趸也并非完全排斥Rust,一些鼓吹Rust的人或许也并不完全了解Rust,就像某位网友的反讽“They don't write a piece of code, but they're trying to rust everything”。
推陈出新固然是技术演进的必然,但像C++、C、Java等老牌编程语言能有如今的江山,也非一日之功。况且任何要弥补C++缺陷的语言, 都得和C++协作, 复用C++的轮子。
而今时今日,Rust说到底仍然是一门年轻的语言,或许我们可以争论Rust是否为异步编程提供了最好的模型,摆脱垃圾回收对开发人员助益如何,但要讨论它是否终将取代C++,显然为时尚早。
对于Rust,无论你是爱它还是恨它,都不能否认其崛起的速度,但未来究竟会如何,尚需时间的检验。正如微软首席工程师Nick Cameron所说,现如今Rust正处于一个良好的发展局面:受欢迎程度越来越高、贡献者越来越多,还在一些重要领域进行了应用。但在这个充满变化的时代,从一个研究项目到一个新的、快速变化的语言再过渡到一个流行的、成熟的项目,是一个困难的演变过程。
就开发人员来说,Rust可能适合也可能不适合你或你的项目,可能是也可能不是创建相关程序的最优解决方案。但至少它提供了一个新的选择,增加了更多探索和想象的路径。就像Peter Wayner在《喜欢/讨厌Rust的七个理由》一文中总结的那样:“作为一门语言,Rust很新颖,学习它可以使人的大脑得到延伸。作为程序员,它让我们有理由重新思考我们的挑战,重新制定我们的目标,并着手寻找编写现代软件的最佳方式。还有什么能比这更好呢?”
参考链接:
https://www.theregister.com/2022/10/17/google_kata_os/?td=rt-3a
https://www.theregister.com/2022/09/28/is_it_time_to_retire_c/