作者 | 蔡芳芳
前不久,Rust 编程语言的审查团队(Moderation Team)通过 GitHub 宣布集体辞职,在技术圈引发了一场关于开源治理的热烈讨论。Rust 社区的关注度也随之飙升,相关报道在朋友圈持续刷屏。一位圈内人士对此调侃道:“知道 Rust 火,没想到能这么火。”上一次 Rust 获得这么高的关注度,还是 2021 年初 Rust 基金会官宣成立的时候。
2021 年 2 月 9 日,Rust 基金会成立,Mozilla、Amazon、华为、谷歌、微软作为创始白金成员,五家企业承诺在两年时间里,每年投入不少于 100 万美元的预算,用于 Rust 项目的开发、维护和推广。
对于 Rust 基金会创始成员里出现华为的身影,不少人感到惊讶,因为大家此前并没有太多听说华为在 Rust 项目上的投资(其他四个创始成员公司都有大量的 Rust 项目组成员)。实际上,华为内部有不少用 Rust 写的产品,比如 StratoVirt,这是华为开源的操作系统 openEuler 旗下基于 Rust 的下一代虚拟化平台,从 2019 年就开始开发。而如果追溯华为最初与 Rust 结缘的契机,甚至早在 2017 年。
近日 InfoQ 有幸对华为开源首席专家、Rust 基金会董事侯培新和多位在华为从事 Rust 开发工作的技术专家进行了独家专访,探寻华为大力投入 Rust 社区背后的人和事,进一步了解华为正在开展的 Rust 工作,以及对 Rust 重点技术方向和未来发展的思考。
采访嘉宾: PEIXIN HOU(侯培新)博士, 华为开源首席专家,Rust 基金会董事、Linux 基金会董事 Yijun Yu(俞一峻)教授,华为可信编程首席专家 Guillaume Gomez,华为 Rust 技术专家,Rust 官方 dev-tools(开发工具团队)Member,rustdoc 团队 leader Amanieu d'Antras 博士,华为 Rust 技术专家,Rust 官方 library team(库团队)Member 李原,华为 Rust 工程师,Rust ARM SIMD roadmap 特性主要贡献者
Rust 迈向新征程
Rust 作为一门通用系统级编程语言,由于其出色的内存安全机制、不亚于 C 语言的性能优势等特点,近年来吸引了大量开发人员关注。从正式发布 1.0 版本之后的 2016 年至今,Rust 已经连续六年在 Stack Overflow 开发者年度调查报告中被评为“最受欢迎”编程语言。
除了在开发者群体中颇受欢迎,Rust 也获得了国内外多家头部大厂的公开支持。各大厂商纷纷使用 Rust 语言支持从网站到开发者工具、再到电子游戏的多种应用场景。Facebook 一直在使用 Rust 语言构建 Diem 币(即原 Libra 币);Amazon 则使用 Rust 为其无服务器平台 Lambda(此平台允许开发者在无需管理底层服务器的前提下,轻松运行并扩展开发代码)等产品编写代码;微软公开表示将探索使用 Rust 编程语言作为 C、C 和其他语言的替代方案,以此来改善应用程序的安全状况,并展开了一些使用 Rust 重写 Windows 系统组件的实验;谷歌也已经开始在那些对内存安全和性能要求极高的设置中使用 Rust,包括将其用在关键的 Chrome 浏览器和 Android 系统中。
虽然 Rust 语言本身一直保持良好的发展势头,但 Rust 团队却在 2020 年经历了一波动荡。Rust 初创于 Mozilla,早期非常重要的应用场景就是火狐浏览器的开发。2020 年 8 月,Mozilla 宣布由于疫情压力进行组织调整,裁员约 250 人,其中就包括不少 Rust 项目和 Rust 社区的活跃开发人员。这次裁员给 Rust 项目带来了很多不确定性,也让社区对 Rust 的未来命运产生了担忧。
结束这波动荡的,正是 Rust 基金会的成立,这被许多人视为 Rust 语言未来看涨的信号。
Rust 社区其实早就有推进开放治理、吸引更多玩家参与的想法,2020 年 8 月 Mozilla 因疫情裁员这件事恰好成为一个契机,让 Rust 社区的成员们加速了这一过程。2020 年下半年,华为在与 Rust 社区成员交流的过程中得知了这一消息。出于对 Rust 语言未来发展的看好以及对 Rust 社区的支持,华为主动加入了这一进程,并将之前参与 Linux 基金会、CNCF 等基金会治理或创建的经验应用其中。最终 Rust 社区成员们一同促成了 Rust 基金会的成立,华为也成为了创始白金会员。
华为很长时间以来一直都在进行编程语言方面的探索,同时也一直在关注 Rust 的发展,在华为的知识共享平台上,关于 Rust 的介绍和分析文章最早可以追溯到 2013 年。早在 2017 年,华为微内核操作系统的原型开发就尝试过使用 Rust。
据侯培新介绍,华为的业务形态中有大量需要高网络安全、高性能的场景,网络安全中由不正确的内存访问引起的问题占有相当突出的比例,而 Rust 就是一款以解决编程时引入内存访问问题、同时保持高性能的系统编程语言,这和华为的目标场景高度匹配。这两年业界对内存安全问题的重视程度日益提高,再加上 Rust 语言本身逐步成熟,华为已经有越来越多的产品和平台开始使用 Rust 开发。
Rust 基金会成立前后,硅谷同步掀起了一场 Rust 人才争夺大战。不少原 Rust 团队的活跃开发人员纷纷转而加入谷歌、微软、Amazon、Facebook 等科技巨头,华为也招募了部分 Rust 官方团队的人才。而 Rust 人才的动向,实际上标志着该语言社区在发展进程中迎来了新的转折点。
侯培新认为,Rust 语言的迅猛发展得益于大量个人贡献者,这使得 Rust 社区具有相当高的开放性及多元化的特点。同时,一项开源技术的长远发展也离不开大量商业公司的使用和持续投资,因此一些 Rust 开发者被商业公司招聘并继续在社区专职投入,是对社区与技术可持续发展非常好的保证。而这些开发者在解决商业公司遇到的技术问题的同时,也会将其落入社区的版本与技术路标中,更能增加 Rust 在大规模商用场景下的效率与技术韧性,结果将是双赢的。在他看来,Rust 基金会的成立就是为了保证 Rust 技术与社区能够不断获得资金、开发者拓展、品牌等方面的支持,同时 Rust 基金会开放治理的章程与架构也会尽量避免某一家机构对社区的垄断与掌控,确保 Rust 的开放性与多元化。
为了让 Rust 社区中众多来自全球各地、拥有不同文化背景和个性的个人开发者能得到更好的支持,Rust 基金会一方面于近期推出了社区资助计划,为社区及相关生态系统的维护者们提供资金支持(华为也是这一计划的首批赞助者之一);另一方面也在协助社区的团队成员们梳理、调整社区的治理架构,确保 Rust 的长远发展。
作为 Rust 基金会创始成员中唯一一家中国技术公司,接下来华为会积极承担 Rust 在中国大规模推广与生态构建的职责,包括发掘、赋能更多国内开发者及应用场景,并推动中国从使用者向贡献者转变。
华为围绕 Rust 的技术探索
当前在华为内部,Rust 主要用于嵌入式系统开发、系统驱动、云计算、虚拟存储、网络传输协议、并发编程框架基础库等产品中。同时,华为的可信理论、技术与工程实验室正在基于 Rust 进行软件工程能力的构建,并展开公司内部能力提升相关工作,包括探索先进的代码解析、安全分析等工具,用于解决已有嵌入式系统的内存安全性问题。
华为对 Rust 的探索不止于使用,在 Rust 社区的几大主要技术方向上,包括语言特性、核心库、标准库、基础库、文档和构建工具链等方面,华为也规划和主导了一些很重要的工作。其中包括 C 到 Rust 转换、内联汇编、交叉编译、Parking Lot 并发库、SIMD 基础库、文档导航、代码多态化、热补丁、AOP、构建优化、克隆检测、深度学习安全算法识别等等,这里面有多项特性是 Rust 社区路标图和 RFC 中标记的重要工作,也正在由华为的 Rust 技术专家主持开发。
这其中既有像李原这样的萌新,也有像 Amanieu d’Antras 这样的资深 Rust 专家。
98 年生的李原从开始参与 Rust 社区贡献至今刚满一年,但他现在已经是 Rust 社区官方 Roadmap 级特性 ARM SIMD 主要贡献者。他非常看好 Rust 的发展潜力,并认为 Rust 未来汇成为新一代内存安全系统编程语言,它可以更好地解决传统系统语言(如 C 语言)无法解决的内存泄漏、缓冲区溢出等安全问题。
李原在 Rust 社区的工作重点是 Rust SIMD 特性开发,在参与 Rust 社区这一年多时间里,李原解决了诸多 SIMD 特性相关问题,包括 Rust 编译器 IR 生成机制导致的部分 SIMD 接口无法实现的问题。单指令多数据流(SIMD)特性之所以重要,是因为它是一种能显著提升程序效率的计算加速技术,而运行效率又是评价程序和编程语言的重要考量。据李原透露,目前 x86 架构上的 SIMD 特性已经可以在 stable 版本编译器下通过标准库直接使用,ARM 架构上的 SIMD 特性也即将稳定化。
Amanieu d’Antras 接触 Rust 的时间要早得多,大概在 2014 年左右,当时他在工作中重度使用 C ,但后来因为 C 的复杂性转而投奔了 Rust 阵营。在他看来,Rust 既保留了 C 零成本抽象的核心思想,同时在语言设计上又做了显著改进,而这些改进对于 C 来说是完全不可能做到的。
Amanieu d’Antras 目前的重点工作是提高 Rust 编写低级代码(low level code)的可用性,他负责领导一个 Rust 工作组,为 Rust 添加对内联汇编(inline assembly)的支持。据介绍,目前工作组进展顺利,计划今年年底前在 Rust 稳定版本中提供内联汇编功能。此外,Amanieu d’Antras 也是 Rust 库团队(library team)的成员,负责 Rust 标准库和一些相关 crate 的维护工作。
Amanieu d’Antras 对 InfoQ 表示,Rust 开发工作中最大的挑战之一是维护 Rust 的稳定性保证。Rust 提供了非常强大的 API 稳定性保证,确保即使是 2015 年(Rust 1.0 发布时)编写的 Rust 代码也能继续用最新版本编译器进行编译。这意味着一旦库团队向标准库中添加了一个 API,就不得不永远支持它并且无法更改。“这给库团队带来了很大压力,因为团队成员在审查 API 时需要非常小心:我们犯的任何错误都可能变成永久性的!”
今年年初华为为 Rust 编译器提交了一系列代码,使得 Rust 编译目标可以支持 ARM AArch64 32 位大端变体 ILP32 芯片组, 使包括华为在内的通信厂商可以在常用网络硬件架构上执行 Rust 原生程序。这些代码就是通过 Amanieu d’Antras 提交给 LLVM 编译器、libc 库以及 Rust 编译器等开源项目的。
除了他们,华为内部参与 Rust 社区贡献的员工还有很多。在 trusted-programming.github.io 这个网站上,列出了华为员工做的所有 Rust 开源贡献,包括已经完成的工作和正在进行的工作。据了解,围绕 Rust,华为内部会在很多技术创新点上展开实践,当实践成果足够成熟,通过内部迭代到容易使用、容易推广的时候,团队就会把它回馈给 Rust 社区。
华为员工所做的 Rust 开源贡献(已有工作)
Rust 太难学,有解吗?
在包括华为在内的所有 Rust 社区成员努力下,Rust 语言正变得越来越成熟和完备,这是 Rust 发展好的一面,但从另一面来看,Rust 的实际用户增长数据并没有其他数据看上去那么美好。
根据 11 月份最新发布的 TIOBE 编程语言排行榜数据,Rust 的占比仅为 0.54%,排名第 29 位。虽然相比今年年初,这个占比数据和排名已经略有提升,但距离排在第 18 位的 Go 语言(相比去年 11 月下降五位,占比 1.21%),还有不小的差距。
在去年的 Stack Overflow 开发者年度调查报告中,虽然受访者们一如既往地将 Rust 评为最喜爱的编程语言,但同时有 93% 的受访者表示并未使用过 Rust,他们对 Rust 语言的喜爱,仍停留在“想学习”的阶段。造成这一情况的原因,很大程度上归咎于 Rust 长期被诟病的学习难度问题。
在 2020 年的 Rust 官方调查中,当受访者被问及对于提升 Rust 的采用率有何建议时,许多人提到的一个方案是降低 Rust 的学习难度,让 Rust 更容易学习。其中 15.8% 的受访者表示,如果 Rust “不那么令人生畏、更容易学习或不那么复杂”,他们会更多地使用 Rust。
因此,除了前文提到的围绕 Rust 核心技术方向展开的工作,华为内部也在围绕提高 Rust 可学习性做一些技术准备。
首先是针对已有软件项目的跨语言代码转换迁移,华为自研了一套 TXL 代码转换工具,实现了从 C 项目到 Rust 项目迁移的能力,并基于模式提升了 C 代码的安全代码比例;其次是通过深度代码学习,让机器替人学习一些简单的任务,比如华为自研的深度代码学习 Corder 工具已经能够实现 unsafe Rust 代码自动分类,准确率能够达到 93% 以上;还有 Rust 文档方面的优化工作,比如通过生成可互联的变量类型文档,使得 rustdoc 更容易导航。Guillaume Gomez 当前在 Rust 社区重点负责的就是 rustdoc 优化工作,从而让 Rust 文档更快、更轻量、更具交互性。他既是 rustdoc 团队负责人,也是 Rust 官方 dev-tools(开发工具团队)成员。
另外,为了更好地推广 Rust 最佳实践,制定 Rust 编码规范的工作也在稳步推进中。据俞一峻介绍,Rust 编码规范是由 Rust 专家张汉东和华为内部 Rust 开发者在产品开发过程中协作产生的。去年已经完成了一版,今年在原基础上又做了刷新和强化。团队比照华为内部主流编程语言合规要求,以及业界大厂的 Rust 规范,对规范做了扩充和改进,对 unsafe Rust 代码编码也做了针对性地规范。
期间,团队还引入了 Clippy 等规范检查工具,确保这些编码规范不仅能指导程序员手工编码,也能自动挑出违反规范的细节,提升 Rust 开发效率和质量。团队计划明年推出 1.0 版本在公司内进一步推广。
作为 Rust 基金会的一员,华为希望未来也能将这一编码规范贡献给社区,与社区共建。华为内部使用的版本将与社区版本同源,不过华为内部使用的规范会更严格,会有一些强制不允许违反的规则,以满足系统软件开发的质量要求。
根据华为在项目实践中的统计数据,在上述可学习性优化工作的基础之上,现有 C/C 团队只需要 2~4 周时间,就可以贡献产品化的 Rust 代码。从编码、测试、发布、维护全周期角度看,研发生产率能得到提升,而且内存安全可靠的代码也可以为客户带来更高的价值。
俞一峻表示:“很快,学习曲线的问题应该更多会是不想尝试新事物的借口了。”
“没有一个语言能够解决所有问题”
参照 Gartner 的技术成熟度曲线,俞一峻认为,当前 Rust 语言所处的发展阶段应该已经过了炒作巅峰的顶点。主要体现在几个方面:Rust 编译器的版本已经推出第三个大版本(Rust 2021)对应稳定版 1.56.1,Bug 已经很少了;Rust 库的数量在开源社区名列最受欢迎的精品,前 100 名的库的 GitHub Star 至少超过 3000, 前 20 名的库下载量至少超过千万;Rust 工具链的技术支持很强,大部分 Issue 能够及时得到解决;跟其他系统编程语言相比,Rust 编译器始终如一,没有那么多不同的实现,保证新的语言特性能够很快让最多的开发者使用,这一点是在体验过嵌入式开发五花八门的 C/C 编译软件版本后才能体会到的优点。而这些都意味着 Rust 已经相对比较成熟。
俞一峻表示还有一个值得一提的趋势,就是 Linux Kernel 和 Andriod、Fuchsia 等操作系统的部分驱动代码正在转向 Rust,在他看来,如果统计使用 Rust 机器的数量,Rust 可能很快就会名列前茅。
虽然对于 Rust 未来的发展非常乐观,但俞一峻也坦言,作为一个语言,Rust 可改进的技术问题还有很多。比如,如何借鉴一些其他编程语言的优点,取长补短?如何确保语言 Unsafe 代码的安全使用,并证明 Rust 工具链本身的安全性?这些都是 Rust 社区需要更多考虑的问题。
此外,Rust 想要被更广泛地采用,编程语言迁移成本是必须面对的一道难关。
Rust 的学习曲线不应该成为阻碍它在已有项目中使用的障碍。但是,任何编程语言的迁移都是有成本的,目前华为正在探索的可信代码平滑迁移工作,目标就是把这个成本降低下来,让迁移的工作变得不那么难。俞一峻表示,华为多年积累的 C/C 代码和其他编程语言代码是海量的,让各个产品线能够迁移部分安全攸关的代码到 Rust 是一个巨大的工程,意义重大。
目前团队主要采取使能的方式,通过开发更好用的迁移工具和更完善的工具支持,使得迁移成本降低到收益以下,这样才能促使大量的开发者自发迁移。目前华为已经在三个产品中试点了这个迁移工具,并取得了预期的效果,函数接口的 API 安全性已经提升到 95% 以上,同时,转化后的 Rust 项目功能正确,也能在嵌入式产品上板运行。对转化后的 Rust 代码做进一步重构和优化,以及满足产品线对 Rust 代码的定制化要求,是团队下一阶段的工作重点。
俞一峻强调,“没有一个语言能够解决所有的问题。在进一步推广 Rust 应用的同时,我们也应该看到,有些场景不用 Rust 更好,甚至不用代码更好。”在他看来,这些跨语言解决问题的能力,甚至程序分析、生成到合成方面,如果 Rust 能够做得比其他编程语言更好、跟应用领域相关的定制更容易,那么它的发展前景就会更好。
目前华为跟国内外高校正在联合展开技术探索,同时尝试多条路径,希望把学术界的最新成果以最快的速度应用到语言中来。而这其中最大的挑战之一是如何从社区需求出发,找到适合 Rust 发展的语言特性,把能够解决具体问题的方法或者偏学术的原型工具和技术变得更为通用和实用,让关于 Rust 的知识图谱更为人所知所用。