likes
comments
collection
share

年终盘点 Rust 生态版图 | 星辰大海(上篇)

作者站长头像
站长
· 阅读数 15

作者 | 张汉东

文前

半年前,我写了一篇《三万言|2021 年 Rust 行业调研报告》 ,内容主要围绕 Rust 语言介绍 和 行业领域开源应用盘点 两大部分内容。时隔半年,我觉得有必要再写一篇年终的Rust 生态调研报告。因为我想给大家提供一个比较全面的视角,通过挖掘互联网上的各种散落且隐藏的信息,最终绘制出一张 Rust 的“生态版图”,让大家尽量客观公正地去认识 Rust 语言。

在完成本篇报告之后,我得出一个观点:Rust 的出现并不是要你去用它重写一切,而是希望你可以用它创造新的未来。当然这只是我个人观点,不代表任何人任何机构和公司。如果您有不同观点,欢迎探讨。

We choose to use Rust, not because it is easy, but because it is hard, because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone, and one which we intend to win, and the others, too.

我们选择 Rust ,不是因为它容易,而是因为它难。这会有助于我们去组织和衡量将精力和技能投入到一个最佳目标。当我们接受这份挑战之后,就代表这份挑战是我们愿意接受的,且愿意马上投入的,并且必须打赢的挑战。其他挑战也当如此。

本次报告的所有内容都来自于互联网公开信息,如有错误或不宜在本报告中提及的内容,请及时告知。

大纲

本次报告包含以下内容:

  • Rust Project 自身状态
  • Rust 在各个领域中的应用状态和趋势
  • Rust 职业岗位分布
  • Rust 语言在教育的普及状态

Rust Project 自身状态

截止 2021年底,距离 Rust 语言2015年5月15日正式发布已经长达六年半的时间。在这六年半的时间内,Rust 每隔三年发布一个大版本,叫做 Edition,中文翻译为版次。

版次这个翻译来自于书籍出版术语。比如《Rust 编程之道》第一版、第二版 等。

版次(Edition)的意义

版次(edition)的引入主要是为了 Rust 能在发展过程中方便地引入一些不向后兼容的特性,而不会影响之前的代码。比如 Rust 2018 edition中没有 async / await 关键字,但是在 2021 editon 中引入了 async/await 关键字,这样就避免破坏旧代码中 let async = 1;这样的写法。版次和语义化版本是正交的概念。

Rust 发布的每个版次都有其核心主题意义:

  • 2015 Edition:主题是 「稳定性(Stability)」。2015 edition 代表 Rust 语言 1.0 将趋于稳定。在 1.0 之前 Rust 每天都在变化,而 1.0 之后则意味着团队会致力于向后兼容,这样开发者才能稳定地使用 Rust 构建项目。版次的概念其实在2017年才引入,所以将 2015年正式发布之前的语义版本号,即 1.0 之前,都归为 2015 edition。
  • 2018 Edition:主题是 「生产力(Productivity)」。2018 edition 中引入的内容大部分是向后兼容的,即,在2015 中可以使用其中一些特性,比如对借用检查的改进NLL。但是对模块系统的改进则只能用于 2018 edition 中。2018 eidtion 既然是以生产力为主题,那么特性的优先级都会优先服务于这个主题。
  • 2021 Edition:主题是「成熟(Mature)」。 2021 edition 并没有引入太多新特性,而是清理了一些技术债务,比如持续对 Rust 编译器进行重构和改进,包括内部使用的新的 trait 系统chalk 和 query 系统(开源版本:github.com/nikomatsaki… 常量泛型、泛型关联类型等。

Rust Edition 现在已经确定了,每三年发布一个版次。这就意味着 Rust 每三年都会围绕一个引领 Rust 发展的主题。

2024 Edition 展望

2024 Edition:主题也许是「广泛应用」。

2021 年 2 月 9 号,Rust 基金会宣布成立。华为、AWSGoogle、微软、MozillaFacebook 等科技行业领军巨头加入 Rust 基金会,成为白金成员,以致力于在全球范围内推广和发展 Rust 语言。

随后,ARMAUTOMATA1PASSword、丰田汽车、动视、KnoldusTangram 等各个领域中对未来充满野心的公司都加入了基金会,为推动 Rust 做贡献。

最近 Rust 基金会又推选 在非营利组织有十五年经验的 Rebecca 称为了 基金会的执行董事(ED)和CEO。相信在 Rust 基金会的领导下, Rust 会有广泛的应用前景。

Rust Project 机遇与挑战

Rust 语言是完全开源的,它也是世界上最大的开源社区组织。由不同职责的团队和工作组共同协作。具体可以在 Rust 官网看到相关信息。目前拥有 3539 个贡献者。

截止目前,crates.io 上面 crates 的下载总量达到 11,012,362,794 次,即 110 亿次。

我们可以通过这些指标来评判一下 Rust 的成熟度。

  1. 用户数:Rust 连续六年是用户最受欢迎的语言,但实际用户数,可以从 TIOBE 编程语言排行榜中看出来,截止 2021年11月,Rust 排名 29 ,流行度是 0.54% 。任何没有进入 TIOBE 榜单前20的语言,其实都还需要进行营销和宣传,这意味着 Rust 依旧属于小众语言。
  2. 贡献者数量。Rust 贡献者数量截止目前为 3539 个。我们对比一下Github开源的其他语言:流行的 Go 语言目前贡献者是 1758个;Kotlin 目前的贡献者是 516 个。看一下流行的框架 Rails 的贡献者是 4379个。 相对而言,Rust 语言贡献者是相当多的。
  3. 错误修复/补丁频率。根据 Github issues 相关数据, Rust 目前肉眼可见每小时平均修复一个 issue 问题。从 2010年 6月17号 Rust 创始人 Graydon 的第一个提交开始,一共修复了 33942issues49011PR,十年间按 3832天计算,平均一天修复 8 个 issue,13PR
  4. 未解决问题数。目前有 7515 个 开放的问题,如果按上面的平均问题修复频率来计算,预计 3 年左右可以修复完毕。3年以后,又是新的 Edition 发布: 2024 Edtion
  5. 存储库统计: 目前 star 数有 60500 个,watch 数有 15000 个。
  6. StackOverflow 问题数量: Rust 相关问题一共有 24924 个,平均每周 150 个问题左右,每天 20 个问题左右。 相比其他语言,javascript 问题 2299100 个,Java 问题 1811376 个, Go 问题 57536 个,C 问题 368957 个,Cpp 问题 745313 个。 相比于 Go , Rust 的问题数几乎是它的一半。
  7. 新特性发布频率: Rust 稳定版 每六周发一个新版。
  8. 是否稳定: Rust 早已稳定。
  9. API 更改频率: 稳定版 API 基本不会更改。
  10. 是否存在“核心”开发人员: Rust 核心开发人员非常多,按工作小组来组织分配,参考 Rust 团队治理
  11. 文档数量和质量API 文档、书籍、教程和博客。Rust API 文档相当成熟和先进,目前国内外 Rust 书籍也越来越丰富,Rust Weekly 每周都会发布社区很多 Rust 相关博客、 视频等文章。
  12. 社区响应频率:有经验的用户如何帮助新用户。Rust 社区国内外都有,通过 群组织、论坛、线下活动等帮助社区成员进行交流。
  13. 商业支持度: Rust 基金会已经成立:Google、华为、微软、亚马逊、Facebook、Mozilla 、 丰田、 动视等公司都是其董事成员。
  14. 知名项目和产品应用的数量: 开源 CNCF 的一些知名项目: 数据库(TiKV)、云原生(LinkerdKrustlet)、事件流系统(Tremor),还有 Google Andriod 、亚马逊、 微软等都支持 Rust 开发,区块链(Near、Solana、 Parity等)。国内使用 Rust 的公司:蚂蚁金服、PingCAP、字节跳动、秘猿、溪塔、海致星图、非凸科技等。还有很多优秀的项目或产品这里没有列出来。
  15. “恐怖事故”的数量,如果没有这一项,则证明它并未在实际具有挑战性的生产环境中使用。Rust 有专门的 信息安全工作组,并且有专门的网站记录 Rust 生态中相关“恐怖事故” : rustsec.org/
  16. 工具链支持:新的链接器支持(mold)/ 新的 trace 工具 (tracy)/ profiler 商业产品也支持 Rust 了(superluminal)等等。

如果拿植物的成长阶段( 「播种- 发芽 - 开花 - 结果」)来类比的话,Rust 的成熟度应该属于 「开花」阶段。

Rust 语言作为一门新生语言,虽然目前倍受欢迎,但是面临的挑战还很多。

挑战主要来自两个方面:

  1. 领域的选择。一门语言唱的再好,如果不被应用,也是没有什么用处。Rust 语言当前面临的挑战就是在领域中的应用。而目前最受关注的是,Rust 进入 Linux 内核开发,如果成功,其意义是划时代的。
  2. 语言自身特性的进化。Rust 语言还有很多特性需要支持和进化,这里罗列了一些待完善的相关特性。

关于领域的选择,我们在下一节「Rust 在各个领域中的应用状态和趋势」中探讨。先来看看 Rust 语言自身还有哪些特性需要进化才能顺利完成 2024 Edition 的阶段目标。

Rust 语言内存安全初步成果显现

据 2021年12月31日发布于 arXiv 的论文 《SOK: On the Analysis of Web Browser Security》 中所言:

比较了四种浏览器架构,以及近十年来浏览器中内存安全问题依然是主流。但是观察 Firefox 通过 Oxidation 项目(Rust)替换了 12% 的组件。自2015年以来,Firefox 的内存安全漏洞数量出现了小幅但稳定的下降,其中,渲染器的内存安全漏洞明显下降。

Oxidation 是专门用于将 Rust 代码集成到 Firefox 中的一个项目。 Firefox 54 以来,所有平台都需要 Rust 支持,并且第一个主要的 Rust 组件是在 Firefox 56 (encoding_rs) 和 57 (Stylo) 中发布的。展望未来,Oxidation 的目标是让在 Firefox 中使用 Rust 变得更容易和更高效,并相应地增加 Firefox 中的 Rust 代码量。

可以说经过六年的应用,Rust 语言的内存安全保障终于看到了初步的效果。该论文建议浏览器供应商遵循这一最佳实践,并逐步将他们的浏览器转向内存安全的语言。

待完善的 Rust 语言特性

Rust 语言必须解决以下问题才能顺利往前发展:

  • 错误处理改进 。在 RFC 3058 中描述了 Try trait 的改进,为了达成错误处理大一统。
  • 安全 I/O。最近Rust官方合并了一个 RFC 3128 ,通过引入I/O安全的概念和一套新的类型和特质,为AsRawFd和相关特质的用户提供关于其原始资源句柄的保证,从而弥补Rust中封装边界的漏洞。
  • 泛型关联类型 GAT。泛型关联类型在 RFC 1598 中被定义。 该功能特性经常被对比于 Haskell 中的 HKT(Higher Kinded Type),即 高阶类型。虽然类似,但是 Rust 并没有把 Haskell 的 HKT 原样照搬,而是针对 Rust 自身特性给出 GAT(Generic associated type) 的概念。
  • 泛型特化(Specialization)。泛型特化这个概念,对应 Cpp 的模版特化。但是 Cpp 对特化的支持是相当完善,而 Rust 中特化还未稳定。在 RFC #1210 中定义了 Rust 的泛型特化的实现标准,在 issue #31844 对其实现状态进行了跟踪。目前还有很多未解决的问题。
  • 异步: async trait && async drop。Rust 目前异步虽然早已稳定,但还有很多需要完善的地方。为此,官方创建了异步工作组,并且创建了 异步基础计划 来推动这一过程。另外,官方也开启了异步运行时标准化的讨论,为了达成可移植性和可互操性的异步运行时在努力中。
  • 协程的稳定化。目前 Rust 的异步是基于一种半协程机制 生成器( Generator) 来实现的,但生成器特性 并未稳定。围绕 生成器特性 稳定的话题在 Rust 论坛不定期会提出,因为 生成器特性 在其他语言中也是比较常见且有用的特性。
  • 可移植的 SIMD。Rust 官方团队发布了 portable-simd ,你可以在 Nightly 下使用这个库来代替 packed_simd 了。这个库使得用 Rust 开发跨平台 SIMD 更加容易和安全。在不久的将来,也会引入到标准库中稳定下来。
  • 新的 asm! 支持asm! 宏允许在 Rust 中内联汇编。在 RFC #2873 中规定了新的 asm!宏语法,将用于兼容 ARM、x86 和 RISC-V 架构 等,方便在未来添加更多架构支持。之前的 asm! 宏被重命名为 llvm_asm!。目前新的 asm! 已经接近稳定状态,可在 issue #72016 中跟踪。总的来说,就是让 asm! 宏更加通用,相比于 llvm_asm!,它有更好的语法。
  • Rustdoc 提升。Rust 是一门优雅的语言。并且这份优雅是非常完整的。除了语言的诸多特性设计优雅之外,还有一个亮点就是 Rustdoc。Rust 官方 doc 工作组励志让 Rustdoc 成为一个伟大的工具。Rustdoc 使用简单,可以创建非常漂亮的页面,并使 编写文档成为一种乐趣。关于 Rustdoc 详细介绍你可以去看 Rustdoc book
  • 持续稳定 Rust for Linux 未稳定特性心愿单 中所列清单。这个是和 Rust for Linux 团队一起完成的。
  • 新的 GCC 后端。为了推动 Rust for Linux ,Rust 支持新的 GCC后端也是早已提上日程的事了。其中 rustc_codegen_gcc 进展最快,目前已通过了部分的 rustc 测试,rustc_codegen_llvm 是目前的主要开发项目,Rust GCC 预计在 1~2 年内完成。
  • 稳定 分配器 API 。添加标准分配器接口并支持用户定义的分配器,允许不同的集合支持不同的分配器,等等。具体在 RFC 1398 中有完整描述。目前状态是为 Vec<T> 增加了一个分配器泛型参数。

上面罗列的只是 Rust 待完善问题的一部分工作而已,还有很多内容没有列出来。Rust 语言还在不断进化中。

Rust 开源治理中凸显的问题

今年 Rust 开源组织发生了Rust 语言审核团队(mod team)集体离职的事件,引起国内外技术社区广泛讨论。

官方描述矛盾产生于审核团队和核心团队成员之间关于如何处理审核问题时造成的分歧。因为这些矛盾涉及了很多相关人员很多个人隐私,所以官方也不能透露更多内幕信息,这就导致外界对这件事有很多猜测和夸大影响。这件事本来也就是 Rust 官方团队内部事件,其实根本没有必要让外界知道。

要管理一个规模超过大多数公司,却由志愿者组成的开源项目是很困难的。他们有很多工作要做,但他们相信Rust Project会因此变得更加强大。虽然这些问题很严重,需要谨慎地得出积极的结论,但他们相信这不会对Rust语言及其核心工具、文档和支持进行改进的能力产生负面影响。

对于关心 Rust 的 中文社区的朋友和技术媒体而言,我觉得没必要过度解读。因为我们不了解美国社会以及处于该社会下人们所关心和敏感的问题是什么,真正想去理解也是比较困难的,因为有文化差异。我们只知道,这是一个超过大多数公司人员规模且都是志愿者组成的开源组织所要面临和解决的问题,问题一旦经过解决,那么这个社区将得到进化,会更加强大。所以没必要担心什么 Rust 会被负面影响。

但此时,我又想起 2020 年 Rust 1.44 版本发布时,官方博客说过这么一句话:「tech is and always will be political」。

当时,正好赶上了明洲白人警察跪杀黑人事件,美国的所有企业现在都在站队。所以,Rust 官方也必须得表个态:坚决反对美国警察的暴行。当时看上去好像很正常,但我没有注意到在官方内网上对此已经有了 很多讨论 ,现在回头再看这件事,感觉审核团队离职事件并非偶然。

对于美国文化不太了解的我,之前还对审核团队存在的重要性嗤之以鼻,现在感觉审核团队的存在对于 Rust 这样深处文化政治复杂的美国是多么重要。我终于理解 Rust 官方团队所说这件事的背景相当复杂的原因了。

真心希望 Rust 社区少一些政治、种族等非技术言论和矛盾。Rust 语言是全球的,不是某个国家的。 真心希望 Rust 团队能处理好这件事。对此,我们能做些什么呢?也许只能祈祷世界和平。

Rust 在各个领域中的应用状态和趋势

接下来,我们来盘点一下 2021 年 Rust 在各个领域中应用的状态和可能的趋势是什么。

操作系统

先从操作系统来看起。

Rust for Linux

从 2020 年 6 月,Rust 进入 Linux 就开始成为一个话题。Linux 创建者 Linus 在当时的开源峰会和 嵌入式 Linux 会议上谈到了为开源内核寻找未来维护者的问题。

Linus 提到:“内核很无聊,至少大多数人认为它很无聊。许多新技术对很多人来说应该更加有趣。事实证明,很难找到维护者。虽然有很多人编写代码,但是很难找到站在上游对别人代码进行 Review 的人选。这不仅仅是来自其他维护者的信任,也来自所有编写代码的人的信任……这只是需要时间的”。

Rust 作为一门天生安全的语言,作为C的备选语言,在帮助内核开发者之间建立彼此的信任,是非常有帮助的。三分之二的 Linux 内核安全漏洞( PDF )来自内存安全问题,在 Linux 中引入 Rust 会让其更加安全,这目前基本已经达成一种共识。

在今年(2021)的 开源峰会上, Linus 说道:“我认为C语言是一种伟大的语言,对我来说,C 语言确实是一种在相当低的水平上控制硬件的方法。因此,当我看到C语言代码时,我可以非常接近地猜测编译器的工作。它是如此接近硬件,以至于你可以用它来做任何事情。但是,C语言微妙的类型交互并不总是合乎逻辑的,对几乎所有人来说都是陷阱。它们很容易被忽视,而在内核中,这并不总是一件好事。Rust 语言是我看到的第一种看起来像是真的可以解决问题的语言。人们现在已经谈论Rust在内核中的应用很久了,但它还没有完成,可能在明年,我们会开始看到一些首次用Rust编写的无畏的模块,也许会被整合到主线内核中。”

Linus 认为 Linux 之所以如此长青,其中一个重要的基石就是 乐趣(Fun),并且 乐趣也是他一直追求的东西。当人们讨论 使用Rust编写一些Linux内核模块的可能性时,乐趣就出现了。

在刚过去的 2021 年 9 月 的 Linux Plumbers 大会上, 再一次讨论了 Rust 进入 Linux 内核的进展。

  1. Rust for Linux 的主力开发者 Miguel Ojedal 说,Rust 如果进入内核,就应该是一等公民的角色。Linus 则回答,内核社区几乎肯定会用该语言进行试验。
  2. Rust 进入内核肯定会有一些维护者需要学习该语言,用来 review Rust 代码。Linus 说, Rust 并不难懂,内核社区任何有能力 review patch 的人都应该掌握 Rust 语言到足以 Review 该语言代码的程度。
  3. Ojedal 说,目前内核工作还再使用一些 Unstable 的 Rust 特性,导致兼容性不够好,不能确保以后更新的 Rust 编译器能正常编译相关代码。但是 如果 Rust 进入 Linux 内核,就会改变这种情况,对于 一些 Unstable Rust 特性,Rust 官方团队也会考虑让其稳定。这是一种推动力,迟早会建立一个只使用 Rust 稳定版的 内核,到时候兼容问题就会消失。
  4. 另一位内核开发者 Thomas Gleixner 担心 Rust 中并没有正式支持内存顺序,这可能会有问题。 但是另一位从事三十年cpp 并发编程的 Linux 内核维护者 Paul McKenney 则写了一系列文章来探讨 Rust 社区该如何就Rust 进入 Linux 内核这件事正确处理 内存顺序模型。对此我也写了另一篇文章 【我读】Rust 语言应该使用什么内存模型?
  5. 关于 Rust 对 GCC 的支持,其中 rustc_codegen_gcc 进展最快,目前已通过了部分的 rustc 测试,rustc_codegen_llvm 是目前的主要开发项目,Rust GCC 预计在 1~2 年内完成。

这次大会的结论是:

  1. Rust 肯定会在 Linux 内核中进行一次具有时代意义的实验。
  2. Rust 进入 Linux 内核,对于 推动 Rust 进化具有很重要的战略意义。

2021 年 11 月 11 日,在 Linux 基金会网站上,又放出另一场录制的网络会议: Rust for Linux:编写安全抽象和驱动程序,该视频中 Miguel Ojeda 介绍了 Rust 如何在内核中工作,包括整体基础设施、编译模型、文档、测试和编码指南等。

我对这部分视频内容做了一个简要总结:

  1. 介绍 Unsafe Rust 和 Safe Rust。
  2. 在 Linux 内核中使用 Rust ,采用一个理念:封装 Unsafe 操作,提供一个 安全抽象给 内核开发者使用。这个安全抽象位于 github.com/Rust-for-Li…kernel 模块中。
  3. 给出一个简单的示例来说明如何编写 内核驱动
  4. 对比 C 语言示例,给出 Rust 中什么是 Safety 的行为。
  5. 介绍了 文档、测试和遵循的编码准则。

2021.12.6 早上发出了更新的补丁,介绍了在内核中处理 Rust 的初始支持和基础设施。

这次更新的内容包括:

  1. 升级到了最新 Stable 编译器和 Rust 2021 edition 。因此可以摆脱了 const_fn_transmuteconst_panicconst_unreachable_uncheckedcore_panictry_reserve 这几个之前未稳定的特性。未稳定特性心愿单
  2. 自定义 corealloc。为 alloc 添加了更加模块化的选项,以便禁用一些他们不需要的功能:no_rcno_sync,主要是为上游 Rust 项目添加。
  3. 更严格的代码、文档和新的 lint
  4. 抽象和驱动程序更新。添加了序列锁、电源管理回调的抽象,io 内存(readX/writeX)、irq 芯片和高级流处理程序,gpio 芯片(包括 irq 芯片)、设备、amba 设备和驱动程序以及证书。此外,也改进并简化了 Refrefcount_t 支持)对象并用它替换了 Rust 的 Arc 的所有实例。完全地从 alloc crate 中删除了 ArcRc

从现在开始,Rust for linux 团队将开始定期提交补丁,每两周左右。

除了来自 Arm、Google 和 Microsoft 的支持外,这次该团队又收到一封来自红帽的信:红帽对 Rust 用于内核的工作也非常感兴趣(There is interest in using Rust for kernel work that Red Hat is considering)。

综合上面我们了解到的这些信息,2022 年,我们很可能会看到 Linux 内核中的实验性 Rust 编程语言支持成为主流。如果这次实验成功,那么就意味着 Rust 正式从 C 语言手里拿到了时代的交接棒。

Redox + Theseus

Redox 是 纯 Rust 实现的类似于 MINIX 的微内核设计,它提供了内存分配器、文件系统、显示管理器、核心实用程序等等,它们共同构成了一个功能性操作系统。

Redox 的发起者虽然在 System76 工作,但实际上 Redox 这个项目并未得到 System76 的赞助。我曾经以为 Redox 属于 System76 的商业开源项目,但最近才发现,Redox 的花费都是来自于社区赞助。 Redox 的主要开支基本都是用于 Redox OS Summer of Code ,招募一些学生,为其完善功能。

Redox 在 2021 年比较重要的一个动态是,另一个 Rust 实现的操作系统 Theseus 宣布加入 Redox 。

现代 OS 中不同进程会共享很多状态,这会导致 state spill 的问题,比如,如果 Android 系统服务失败,“整个用户空间框架”就会崩溃,影响所有应用程序,甚至影响那些不使用失败服务的应用程序。

Theseus OS 有许多微小的组件,称为单元,每个都有明确的界限。每个单元都是一个 Rust crate。然而,更大的创新是他们所谓的“语内(Intralingual)操作系统设计”,他们的意思是使用编程语言机制来实现操作系统,即,“将语义错误从运行时错误转变为编译时错误”。这意味着,Theseus 相比于其他 OS 与 Rust 的关系更加紧密。

Theseus OS 故障恢复涉及用新的单元替换损坏的单元。研究人员声称,这“允许 Theseus 在面对多个故障子系统时容忍最低系统层中的故障。” 这是一种单元交换技术,也许这就是 Theseus 这个名字的由来,忒修斯之船的故事应该都听过吧?

嵌入式 OS

Tock OS 2.0

Tock 是一个嵌入式操作系统,设计用于在基于Cortex-M和RISC-V的嵌入式平台上运行多个并发的、互不信任的应用程序。Tock的设计以保护为中心,既可以防止潜在的恶意应用程序,也可以防止设备驱动程序。Tock使用两种机制来保护操作系统的不同组件。首先,内核和设备驱动程序是用Rust编写的,Rust是一种提供compile-time内存安全、类型安全和严格别名的系统编程语言。Tock使用Rust来保护内核(例如调度程序和硬件抽象层)不受特定于平台的设备驱动程序的影响,并将设备驱动程序彼此隔离。其次,Tock使用内存保护单元将应用程序彼此和内核隔离开来。

Google发布的这个 OpenSK 是跑在 Tock上面的!OpenSK 是用Rust编写的安全密钥的开源实现,该密钥同时支持FIDO U2F和FIDO2标准。

今年 Tock OS 的一个动作是,它升级到了 2.0 版本,并且这次升级是一次重大更新,完全是新内核,核心内核 API 被重新设计。

并且对芯片和开发板的支持基本覆盖的非常全面:RISC-V / ARM CortexM0+ / ARM CortexM7 / Nano RP2040 / Rapsberry Pi Pico/ ESP32-C3-DevKitM-1 等等。

Hubris

Hubris 没有运行时创建或销毁任务的操作,没有动态资源分配,没有以特权模式运行的驱动程序代码,系统中也没有C代码。通过这种构造,消除了许多通常存在于类似系统中的攻击面。

OXide 公司在今年 OSFF Mini Summit 2021 会议上分享了 即将到来的固件革命 中提到,Rust 将会是即将到来的固件革命的一部分。所以,他们重新审视嵌入式操作系统并用 Rust 开发了 Hubris。 Hubris 目前只支持 Arm Cortex M 平台。

Hubris vs TockOS :

  • Tock 使用动态加载,Hubris是静态的
  • Tock 是非常异步的,Hubris是严格同步的
  • Tock 的驱动程序与内核在同一保护区,Hubris 的驱动程序位于不同的投影域中

其他

新版VxWorks

风河 VxWorks 是一款确定性、基于优先级的抢占式实时操作系统,具有超低延迟和最小抖动。其官网在最新版宣布 唯一支持 C ++ 17BoostRustPythonpandas等开发语言的实时操作系统。

Google Fuchsia

2021年5月,Google Fuchsia OS 正式发布,截止 12 月 Fuchsia 即将在第二款设备( Nest Hub Max)上运行。

众所周知,Fuchsia 近 30% 的代码都由 Rust 实现。 Fuchsia 编程语言政策对 Rust 的分析:

优点:

  • Fuchsia 平台源代码树在使用 Rust 方面有着积极的实施经验。
  • 该语言提供内存安全保证,从而降低了以该语言开发的软件存在安全漏洞的风险。
  • 可以使用直线代码编写异步程序。
  • Fuchsia 项目有机会影响语言的发展。

缺点:

  • Rust 目前还不是一种广泛使用的语言。
  • 我们当前的终端开发人员都没有使用 Rust。

所以最终决定:

  • 终端开发人员目前不支持 Rust。
  • Rust 被批准在整个 Fuchsia 平台源代码树中使用,但以下情况除外:
    • 内核. Zircon 内核是使用一组受限制的技术构建的,这些技术已经建立了在生产操作系统中使用的行业跟踪记录。

云原生

Linkerd2

2021 年对于 Linkerd 来说是标志性的一年。该项目在 Cloud Native Computing Foundation 中毕业了,它代表项目成熟度的最高级别。Linkerd 的采用率在今年飙升,组织范围广泛,如MicrosoftS&P Global,以及挪威劳工和福利管理局,以及许多其他机构,都公开采用了 Linkerd。

Linkerd 2.11 在2021年9月发布,更多组件向 Rust 迁移。Linkerd 之前只有 proxy 部分是 Rust 实现,发布的2.11.0版本中,Linkerd采用了一个用Rust编写的新策略控制器组件!它使用 kube-rs 与Kubernetes API进行通信,并暴露了一个用Tonic实现的 gRPC API。

虽然 Linkerd 在数据面有丰富的Rust经验,但他们选择Go作为控制面组件,因为Kubernetes生态系统(以及它的API客户端等)是如此严重地倾向于Go。然而,由于u/clux在kube-rs上的出色工作,现在用Rust实现控制器已经变得可行。这对Linkerd项目来说是一大进步,他们计划在整个项目中更多地使用Rust。它发布了多个基准测试,显示性能和资源使用领先于 Istio 一个数量级;它继续引领着将 Rust 带入云原生领域。他们希望Linkerd的这个新方向将有助于欢迎更多希望增长Rust实践经验的贡献者。

如果对 Linkerd2 的 2022 年路线图感兴趣可以点击这里

Deislabs 的项目

Akri

Akri 是 云原生计算基金会 (CNCF)的一个沙盒项目,用于为 Kubernetes 提供边缘计算解决方案。Akri 旨在成为在边缘的 Kubernetes 集群上使用物联网设备的标准方式,这就是为什么 Akri 在希腊语中不仅意味着“边缘”,而且还代表 Kubernetes 资源接口。

Krustlet

Krustlet 是一种 kubelet 实现,使用户能够在同一个 Kubernetes 集群中运行 WebAssembly 和传统容器工作负载。

在 2021 年,Krustlet 和 krator 项目(Kubernetes Rust 状态机操作框架)一起成为了 CNCF 的沙盒项目,到目前为止,已经发布了 1.0-alpha.1 版本,1.0 正式版本即将发布。

那么,这个 1.0究竟意味着什么?它意味着稳定性和向后兼容性保证。人们就可以开始用它构建一些真正的产品了。随着 WebAssembly 和 WASI 的成熟,后面还会添加更多功能。

WebAssembly ServerSide 与 边缘计算

Lucet

Fastly 2021 回顾 文章中提到:

Daily request traffic for Compute@Edge experienced explosive growth in 2021, skyrocketing over 31,000% from January’s daily traffic. Customer usage is on pace to reach 2 trillion total requests across 2021, with a target to reach 50 trillion requests by the end of 2022.

2021年,Compute@Edge的每日请求流量经历了爆炸性的增长,比1月份的每日流量暴涨了31,000%以上。客户使用量有望在2021年达到2万亿次总请求,目标是在2022年底达到50万亿次。

而这个 Compute@Edge 是 Fastly 的边缘计算平台,它能够运行你在自己的系统上编译并上传到 Fastly 的自定义二进制文件。通过将代码编译到WebAssembly来提供安全性和可移植性,他们使用 Lucet 在边缘运行它,Lucet 是由 Fastly 创建的开源 WebAssembly 运行时。而 Lucet 是基于字节码联盟的 wasmtime WebAssembly 运行时来实现的。

其他

在 WebAssembly Serverside 领域,还有很多极具创新的产品:

  • WasmEdge,是用于边缘计算和软件定义车辆的轻量级、快速和任务关键型代码 runtime 。目标是大幅降低复杂性并提高开发速度。它是目前市场上最快的 Wasm 虚拟机,由 Cpp 开发,但是现在正在开发 Rust SDK,会全面拥抱 Rust。
  • WasmCloud,是一个基于 WebAssembly 的分布式计算平台,目前也是 CNCF 沙盒项目。比较有创新的地方在于,它制定了一个 waPC 标准,用于 Guest 和 Host 的安全过程调用,来解决当前 WASI 等特性不完善的问题。

字节跳动的飞书、安全部门、基础设施部门都已经用上了 Rust ,并且还开源了一些基础库

其中比较出色的可用于云原生项目的基础库有:

  • monoio,是一个基于 io-uring 的 Thread-per-core 模型的异步 Runtime,详细介绍参见:《Rust 异步运行时的设计与实现》
  • keyhouse ,字节内部使用的密钥管理系统已经在github上开源了,支持加解密和敏感配置管理。目前字节内部很多业务都基于该系统进行开发。

物联网(IoT)

Rust 嵌入式工作组进展

  1. 树莓派2021发布首款RP2040微控制器中有两个Cortex M0内核。这让工作组的成员开始思考,在多核微控制器下该如何提供安全性,由此有了 rp-rs 组织。
  2. Espressif (乐鑫)正式雇佣mabez 针对eso芯片开发Rust支持:esp-rs
  3. 其他平台也逐渐开始支持Rust,包括:Atmel ARM SAM-D和SAM-E、Atmel AVR、NXP ARM iMX. RT微控制器、ARM nRF51、52和9160蓝牙/LTE设备、RISC-V、树莓派、STM32等。
  4. 嵌入式Rust生态得到长足发展:
    • 嵌入式并发框架RTIC已经1.0
    • 嵌入式异步框架Embassy正在大力开发且支持STM32,nRF和RP2040平台,并且还深深影响着Rust异步的改进
    • 嵌入式开发和调试工具Knurling又发布了新的探针工具
    • 嵌入式 TCP/IPsmoltcp 发布了新版本
    • 嵌入式图形库embedded-graphics 发布了新版本
    • 新的嵌入式实时OS Hubirs 开源。
  5. 嵌入式工作组自身维护的项目在这一年也是大力开发和维护中。

更多参见: blog.rust-embedded.org/this-year-i…

总的来说,Rust 在嵌入式领域越来越成熟了。

乐鑫芯片(Espressif) esp-rs 进展

2021 年,乐鑫公司宣布雇佣 mabez 来全职从事 Rust 对 ESP32 的支持,对应GitHub 开源组织是 esp-rs。 这意味着,Rust 将全面进入 esp32 领域。

截止年底,mabez 完成的工作可以在其博客看到,总的来说目前进度为:

  • esp-rs book
  • probe-rs 对 esp32c3 的支持现在比较完善了
  • espflash 达到了 1.0
  • 引入 esp32-hal
  • 其他,还有很多

更多更新可以参见 Rust on Espressif chips - 10-01-2022 。 不得不说,乐鑫是一家很有远见的公司。

趋势

ARM 是迄今为止在物联网边缘使用的芯片组和传感器等嵌入式设备的领先制造商,今年已经加入了 Rust 基金会。

Rust 完全有能力在嵌入式计算等更高级别的物联网领域完成特定任务,例如边缘轻量级计算和后端服务的实现,并同时可以在一定程度上满足这类物联网基础设施的功能安全需求。

由于其生态系统与物联网相关的部分,仍在不断发展,甚至缺乏一些重要的基础,而且远非稳定。但从好的方面来说,我们看到像 Drogue、Ferrous Systems 和其他独立的几家公司正在努力推动 Rust 进入物联网领域而对至关重要的基础正在进行积极的开发,并为 Rust 带来更光明的未来。

游戏

GPU 图形渲染值得关注的项目

rust-gpu

rust-gpu 是 embark studios 开源的一个项目,致力于让 Rust 成为图形渲染领域的第一类语言。目前正联合 Traverse research 公司一起构建rust-gpu。

Embark 是和韩国游戏公司 Nexon (《冒险岛》《跑跑卡丁车》)合开的。Embark CEO 是前EA 首席设计官 Patrick ,曾是《战地》系列开发商 DICE 的 CEO。Embark 也是 Rust 游戏工作组的成员之一,该公司也赞助了很多 Rust 生态开源项目的作者。

Traverse research 公司位于荷兰 Breda 中心区,愿景是让Breda 成为游戏开发强镇。该团队的核心成员在图形学领域造诣很强。

rust-gpu 主要是针对图形渲染引擎,希望可以把 Rust 引入为一种着色语言。通过 rustc 后端 编译到 spir-v (着色器的二进制中间语言 )来达成这个目标。 目前该领域常用的是 GLSL/HLASL ,但它们并未随着游戏行业发展提供处理大型代码库的机制,所以在这个领域急需一门优秀的着色语言,而 embark 的人们认为 Rust 就是最佳选择,所以他们做了这项工作。

embark 还基于 rust-gpu 开源了一个实验性的全局光照渲染引擎 kajiya

Rust-CUDA

Rust-CUDA 则是一个旨在使 Rust 成为使用 CUDA 工具包进行极快 GPU 计算的 1 级( tier-1)语言的项目。该团队希望通过这个项目,可以推动 Rust GPU 计算行业向前发展,并使 Rust 成为此类任务的优秀语言。Rust 提供了很多好处,例如高效利用每个内核的性能优势、出色的模块/crate系统、用 unsafe分隔 CPU/GPU 代码的不安全区域、为底层 CUDA 库构建高级包装器等。

WGpu

gfx-rs 社区的目标是让 Rust 中的图形编程变得简单、快速和可靠。主要项目有:

  • wgpu,建立在wgpu-halnaga之上。它为图形应用程序提供安全性、可访问性和可移植性。
  • naga,着色器语言翻译库,包括 WGSL。它还提供着色器验证和转换,确保在 GPU 上运行的用户代码安全高效。

其中 wgpu 2021 年发展:

  • gfx-hal 迁移到新创建的wgpu-hal并重组了存储库以将所有内容放在一起。
  • wgpuDeno紧密集成
  • 正确性和可移植性方面,完成了确保所有资源正确零初始化的艰巨工作。事实证明,这比看起来要复杂得多,现在用户将获得跨平台的一致行为。

Naga 2021 年发展:

  • 增加了更多的后端(HLSL、WGSL)并极大地改进了对桌面的支持
  • 放弃了 SPIRV-Cross

游戏引擎中的佼佼者

Bevy

Bevy 是一个基于 Rust 实现的 数据驱动游戏引擎。相比于 Rust 实现的其他游戏引擎,比如 Amethyst, Bevy 属于后来着居上。Bevy 在 API 设计方面独具匠心,充分利用 Rust 语言特点,让开发者上手非常简单方便。得力于其 Plugin 机制,目前 Bevy 已经逐渐形成自己的生态,逐步涌现出很多基于 Bevy 的 Plugin 。

Bevy 作为开源项目,在 GitHub 上接受的赞助现在基本已经达成了每月 6000 美刀的目标。虽然目前 Bevy 只发布了 0.6 版本,但是其生态在逐步建立,并且受到很多人的欢迎和期许。

Bevy 0.6 版本中有大量改进、错误修复和质量提升,这里罗列一部分:

  • 一个全新的现代渲染器,更漂亮、更快、更易于扩展
  • 原生 WebGL2 支持。您可以通过在浏览器中运行 Bevy 示例来测试它
  • 更强大的着色器:预处理器、导入、WGSL 支持
  • Bevy ECS 人体工程学和性能改进。没有了.system()

更多参见Bevy 0.6 介绍

顺便提一句:国内已经有公司将 Bevy 应用于商业项目,同时也在招人。

Fyrox(Rg3d)

Fyrox(rg3d) 是另一款 Rust 实现的游戏引擎,支持 3D 和 2D ,之前项目名为 rg3d,现在已经改名为 Fyrox

该游戏引擎虽然没有 bevy 那样受人关注,但也在高速发展中,目前已经发布了 0.24 版本。简单来说的变化:

  1. 2d 支持。从一开始,引擎只专注于 3D 游戏,但在 rg3d 0.23 中情况发生了一些变化,添加了一个简单的 2D 场景版本。
  2. 增加了开发指南
  3. 物理集成
  4. 引入了声音引擎 rg3d-sound

详细参见 rg3d 0.24 功能亮点

Amethyst 新的开始

Amethyst 引擎宣布停止开发,游戏引擎的火炬传递给了 Bevy,未来 Amethyst 基金会还会在游戏领域创造价值,但不局限于游戏引擎。

为什么会这样?

  1. Amethyst 从自上而下的BDFL模式转为扁平的对等模式之后,一直没有找到自己的立足点。团队内部对 Amethyst 的目标缺乏统一看法。

  2. Bevy 引擎发展的不错,将会把 Amethyst 引擎的火炬传递下去。

Amethyst 引擎做的好的一面:建立了一个先进的、由ECS驱动的游戏引擎,数以百计的Rust游戏开发爱好者通过Amethyst相互联系,并建立了持久的友谊 。

BDFL: BDFL 是英文「Benevolent Dictator For Life」的缩写。中文翻译为「仁慈的终身独裁者」。在此架构下,有一个人(通常是项目的最初的作者,或者是社区选举的一个人)拥有项目中所有最后的决定。较小的项目可能默认就是 BDFL 结构,因为此类项目一般就是一到两位维护者。若是公司组织的项目也极有可能会采用 BDFL 结构,以便掌握项目的决策权。

Amethyst 的未来

Amethyst 早就成立了基金会,虽然游戏引擎停止了开发,但是 Amethyst 基金会还会在游戏领域继续投入。但未来将不再单一地专注于制作任何特定的游戏引擎。

接下来可能会帮助 Rust 游戏开发新人进入这个领域而做一些努力,比如 推广、协调、教育、社区建设等。并且现在 Amethyst 团队做的一些都将和引擎无关,比如 Distill, specs, Legion, Laminar 等。

注意: Amethyst 只是停止了游戏引擎的开发,但他们将迈向更广泛的 Rust 游戏开发领域去做更具价值的事。

其他

Quilkin

quilkin 是 Google Cloud 与 Embark工作室 合作开发的一个UDP代理,为高性能的实时多人游戏量身定做,以提供一个标准的、开源的解决方案。其目的有两个方面:

  1. 将安全、访问控制、遥测和指标等通用功能从单体的专用游戏服务器和客户端中剥离出来。
  2. 以一种可组合和可配置的方式提供这些通用功能,这样它就可以在广泛的多人游戏中重复使用。

总的来说,是让 Quilkin 通过吸收无效流量来帮助保护服务器免受攻击,或者在边缘运行为玩家流量提供最佳延迟。这对于任何游戏工作室都是利好,可以据此拥有与大型巨头相同的网络功能。

Rapier

rapier 是用 Rust 编写的用于游戏、机器人和动画的 2D 和 3D 物理引擎。2021年发布了新的版本,新增了很多改进。此版本的重点是对多体关节的支持。

*Resolution Games* 公司的CTO 说 ,要用 Rust 创建 VR 游戏,其中就用到 Rapier 物理引擎。

数据处理

Databend 数据云

Databend 旨在成为一个开源的弹性可靠的云仓库,它提供了极快的查询,并结合了云的弹性、简单性和低成本,旨在使数据云变得简单 。

Databend 受 ClickHouse 启发,计算模型基于 apache-arrow。Databend实现了弹性的完全面向云架构的设计,它强调状态和计算的分离。相比传统数仓,用户使用Databend会获得更低成本、更易用、按量付费的体验。Databend会向着Serverless方向迭代。Serverless意味着把资源的调度做到更加精细化,云数据库的计算结点可以和一个函数一样,使用的时候拉起,使用完毕后销毁,只需要用使用付费,资源调度会非常精确。

数据流处理

Tremor

Tremor 是一个事件处理系统。 它最初是为了替代 Logstash 或 Telegraf 等软件而设计的。 然而,通过支持更复杂的工作流(例如聚合、汇总、ETL 语言和查询语言),tremor 已经超出了这个单一用例的范围。

Tremor 每年 365 天 24x7 运行,并使用 Rust 编程语言实现。

深挖了一下 tremor-runtime 项目背后的公司,原来是 Wayfair 。Wayfair 是美国最大的家具电商,2017 年市值就达58亿美元,前身是早在2002年就成立的CNSStores。亚马逊都吃不下它。

Tremor 应该是 Wayfair 公司旗下的开源项目,已经进入 CNCF 。2021 年 九月份还召开了一次小型的线上的 Tremor Conf

2020年3月份的一次分享:Rust 如何为 Wayfair 省掉数千个核心和TB级的内存的成本 :2020-03-31-RustAndTellBerlin-functions

从2018年开始, tremor 就是跑在了 wayfair生产环境中,每天处理10兆字节的数据,或每分钟100亿条消息,每秒1000万个指标。tremor 降低了成本,减少了复杂性,巩固和简化了操作环境,以激发SRE的乐趣,减少NOC的工作量,并降低运营成本。

实时分析的流式数据库 Materialize

Materialize 是一个提供增量视图更新的反应式数据库,它帮助开发人员使用标准 SQL 轻松构建流数据。在无需复杂的数据管道的情况下,只须用标准SQL视图描述计算,然后将 Materialize 连接到数据流,就能实现增量计算。底层的差异数据流引擎(相关论文 Online Analysis of Distributed Dataflows with Timely Dataflow)能够执行增量计算,以最小的延迟提供一致且正确的输出。与传统数据库不同,定义 Materialize 的视图没有任何限制,并且计算是实时执行的。

该公司已经进入 B 轮,融资 4000万美刀。

其他
  • fluvio : 是一个开源数据流平台,可聚合、关联并将可编程智能应用于动态数据。Fluvio 由 Rust 提供支持,在云原生架构上提供低延迟、高性能的可编程流。
  • vector: 用于构建可观察性管道的轻量级、超快速工具。

图数据库

海致星图:金融级分布式高性能图数据库

海致星图是国内致力于金融级图平台产品的公司,该公司已经使用 Rust 进行高性能分布式图数据库的研发中。目前并未开源。

据我了解,该产品在防疫场景中用于在第一时间找出人与人、人与地点、人与交通工具之间存在相关关系,从中提取有价值的关系链,对于阻断传播链和及时发现密切接触人起着至关重要的作用。

机器学习与科学计算

2021 年 NLP 领域明星项目 Transformers

Hugging Face 是一家总部位于美国纽约的聊天机器人初创服务商。该公司在 NLP界鼎鼎大名,2021 年 3 月份刚刚完成4000万美元B轮融资。在GitHub上发布了开源 NLP 库 Transformers ,而 Transformers 库集成了 tokenizers。

tokenizers 是 Hugging Face 公司开源的一款 Rust 实现的分词库,只需不到20秒即可用服务器CPU进行1GB文本处理。基于深度学习的现代 NLP 管道中的瓶颈之一就是tokenization,尤其是通用性强且独立于框架的实现。所以,该分词器的核心是用Rust编写的,并且存在Node和Python的绑定。提供当今最常用的分词器的实现,重点是性能和通用性。

目前 Transformer 模型预测已经遍布特斯拉、谷歌、微软、Facebook 等科技巨头。Transformer 在特斯拉 AutoPilot 自动驾驶系统中驱动汽车、在 Gmail 中补全句子、在 Facebook 上及时翻译用户的帖子以及在 Bing 中回答用户的自然语言查询等。

可以说,Hugging Face 这家创业公司 使用 Rust 来构建分词器,对于机器学习模型的准确率和性能方面的巨大提升应该是有积极作用等。

linfa

Linfa 是一个 Rust 实现的 类似于 python scikit-learn 的库,旨在提供一个全面的工具包,可以使用 Rust 构建机器学习应用程序。该团队还创建了 Rust-ML 组织。

“ scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包。 它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法应用,并且涵盖了几乎所有主流机器学习算法。

更多资料:Rust 机器学习之书

2021 年该库已经发布了 0.5 版本,其 Roadmap 中 24 个任务,截止目前已经完成了 20 个。该 Roadmap 的目标就是在功能方面要和 Python 的scikit-learn (基于SciPy针对机器学习领域发展出的一个分支版本)提供的算法完全一致。目前仅剩下 高斯过程、随机森林、集成学习和 最小角度回归没有完成。这个 Roadmap 进行了大概两年开发,预计 2022 年应该会完成。

也就是说,在 2022 年,Rust 生态中会出现一个功能和 python sklearn 完全一致,但性能比sklearn更好的库。

Polars

在数据操作层面,每个人都喜欢 Pandas 的 API。它快速、简单且有据可查。但在生产方面,Pandas 有点棘手。Pandas 不能很好地扩展……没有多线程……它不是线程安全的……它不是内存效率。这一切都是 Rust 存在的理由。

Polars 用 Rust 实现的新 Dataframe 库,具有方便的 Python 绑定。它试图做到以线程安全的方式进行读取、写入、过滤、应用函数、分组和合并。它使用Apache Arrow,这是一个专门为跨语言进行高效数据处理和数据共享而构建的数据框架。

Polars 有两个优势:

  1. 它是性能杀手,参考 db-benchmark
  2. 它的 API 非常简单。哪怕不懂 Rust 语法也能看懂该接口要做什么。

也有三个缺点:

  1. 构建 Dataframe API 很困难,Pandas 花了 12 年才达到 1.0.0,而 Polars 很年轻,所以目前还不够成熟。
  2. 使用它的时候,不仅仅要熟悉 Polars API,还需要熟悉 Arrow API,因为很多繁重工作是 arrow 来完成的。
  3. 编译时间太慢,可能需要 6 分钟左右。

Polars 现在由 Xomnia 公司赞助。Xomnia 是荷兰一家人工智能公司,在研究自动驾驶船只,被人称为水上特斯拉。

oxide-enzyme

oxide-enzyme 也是 linfa 团队在 2021 年底新创建的另一个项目。 oxide-enzyme 是 Enzyme 的 Rust 前端库,该库目前是实验性的,但在积极开发中。

Enzyme 是 MIT 提出的自动微分框架,它能够合成以 LLVM 中间表示(IR)表示的静态可分析程序的梯度。Enzyme 能够合成任何以面向 LLVM IR 编译器为语言编写的程序的梯度,包括 C、C ++、Fortran、Julia、Rust、Swift、MLIR 等,从而提供这些语言的本机 AD 功能。

Enzyme 出现的背景

当前,PyTorch、TensorFlow 等机器学习框架已经成为了人们开发的重要工具。计算反向传播、贝叶斯推理、不确定性量化和概率编程等算法的梯度时,我们需要把所有的代码以微分型写入框架内。这对于将机器学习引入新领域带来了问题:在物理模拟、游戏引擎、气候模型中,原领域组件不是由机器学习框架的特定领域语言(DSL)编写的。因此在将机器学习引入科学计算时,重写需求成为了一个挑战。

为了解决这一问题,现在的发展趋势包含构建新的 DSL,让重写过程变得简单,或者在编程时直接进行构建。这些方法可以让我们获得有效的梯度,但是仍然需要使用 DSL 或可微分的编程语言进行重写。为了方便开发者,来自 MIT 的研究者开源了 Enzyme。

MegFlow

MegFlow 是旷视天元在 2021 年 9 月份开源的面向计算机视觉应用的流式计算框架,提供了一套可快速完成AI应用部署的视觉解析服务方案。AI应用开发者可以基于MegFlow提供的图像和视频解析服务,最快15分钟即可完成客制化所需功能,例如发票扫描、明火检测等。

常规的 AI 算法交付流程一般分为模型训练、SDK 封装、业务集成和交付验收四个步骤,冗长繁杂。MegFlow总结了旷视内部多年的AI应用工程落地经验,将资源、消息、任务等概念进行了清晰一致的抽象化,将冗长的算法交付流程简化为模型训练、业务集成及交付验收三步。通过 MegFlow ,AI 算法研究人员可以快速将训练好的模型集成部署成简单易用的 AI 服务并完成交付。

MegFlow 的研发团队调研了多种技术方案,最终选择了安全且零额外开销的 Rust 异步生态,从基础上保证了 MegFlow 的安全性与性能。

MegFlow 开源的这四个月里,增加了一些特性,并且还增加了一个使用案例:猫猫围栏 ,相关视频:懒出新境界!程序员竟然造出一台人工智能猫粮机! ,实验效果还不错。并且开发者还可以从旷视天元申请免费的算力。

qdrant : 神经网络搜索引擎

qdrant 是一个向量相似性搜索引擎。它提供了一个生产就绪的服务,有一个方便的API来存储、搜索和管理点(带有额外有效payload的向量)。Qdrant是为扩展过滤支持而定制的。这使得它对各种神经网络或基于语义的匹配、分面搜索和其他应用都很有用。基于 Rust 实现,性能也有保证。嵌入神经网络编码器可以变成成熟的应用程序,用于匹配、搜索、推荐等。

其他

还有一些在 2021 年 6月份统计过的依然活跃维护状态的机器学习框架:

  • tch-rs 是Pytorch的Cpp API的Rust绑定,目前正在活跃维护中。
  • ndarray 是一个由Rust官方团队中资深科学计算专家bluss开发的开源项目,实现了基于rust的矩阵和线性运算。目标是在Rust中建立类似于numpy和openblas的科学计算社区。它是机器视觉、数据挖掘、生物信息等多类科学计算库的基础,社区中的主要用户为一些相关技术的高校或者研究所。华为也在深度参与该库的开发。
  • nalgebra,是 Rust 的通用线性代数库,和 Rapier 一起都是 ,Dimforge 开源组织 开发的。
  • tvm-rs 是 TVM 的 Rust 绑定,TVM 是由华盛顿大学在读博士陈天奇等人提出的深度学习自动代码生成方法,去年 8 月机器之心曾对其进行过简要介绍
  • Neuronika 是一个用 Rust 编写的机器学习框架,与 PyTorch 类似,现已实现最常见的层组件(dense 层、dropout 层等),速度堪比 PyTorch。
  • Whatlang,基于 Rust 实现的 自然语言 识别项目。

GUI

2021 值得关注的 GUI 项目 : SixtyFPS

SixtyFPS 是一个工具包,可以有效地为任何显示器开发流畅的图形用户界面:嵌入式设备、桌面应用程序、移动端和 Web (目前可编译到 wasm,但仅作为演示,SixtyFPS 无意将 Web 作为主要竞争平台)。它支持多种编程语言,目前是Rust、C++ 或 JavaScript。核心库是 Rust 实现,其他语言的支持通过 C-ABI 来完成。

从2021年开始,就看到一些基于Rust和开源来创业的公司慢慢增加,这个专注于GUI的SixtyFPS也是其中一个,这个开源GUI工具库面向全平台,目标之一是取代Qt,换句话说,SixtyFPS 基本上是大多数 Qt 开发人员都在等待的下一代 QML。

SixtyFPS 两位创始人都对 Qt 开发有深入的经验。其中一位是 曾经在 Qt 公司担任 QtQml 引擎的主要开发人员和维护人员。

看他们的 2021 总结报告,发现他们在2021才注册了公司,和tQCS这样的咨询公司建立了合作关系,找到了第一个客户,招募了新成员。(感觉国外技术流创业跟国内还是有点区别)。tQCS 提供世界No.1的 Qt 咨询和UI/UX设计服务,选择和 SixtyFPS 合作,这意味着什么呢?见仁见智吧。

2022年他们可能要长足支持嵌入式,要有新品牌名字了。

Tauri

Tauri 被看作是 Electron 的替代者,它们都是使用 Web 技术创建桌面应用程序以开发应用程序用户界面的框架。虽然表面看这两者好像都一样,但其实存在很大差别。

下面有一个比较:

Bundle 大小 :tauri 比 electron 小大约 19 倍。

FrameworkOSBundle size (installer)Main executable size
Electron 15.3.0Windows 11 x6483 MB137 MB
Tauri 1.0.0-beta.10Windows 11 x647MB4MB
Electron 15.3.0Linux x64114 MB (deb)134 MB
Tauri 1.0.0-beta.10Linux x646.5 MB (deb)16 MB

内存消耗 : electron 比 tauri 高 9 倍。

FrameworkOSNumber of processesTotal RAM used
Electron 15.3.0Windows 114138 MB
Tauri 1.0.0-beta.10Windows 118110 MB
Electron 15.3.0Linux x6418224 MB
Tauri 1.0.0-beta.10Linux x64123 MB

性能 : tauri 更胜一筹

FrameworkOSFirst launch after buildSecond launch
Electron 15.3.0Windows 119940 ms1420 ms
Tauri 1.0.0-beta.10Windows 111230 ms1120 ms
Electron 15.3.0Linux x642570 ms1910 ms
Tauri 1.0.0-beta.10Linux x641560 ms1130 ms

但使用 tauri 的要求更高,tauri API 远不如 Node.JS 完整和充实,所以你在使用 tauri 的时候,有些 API 可能需要自己使用 Rust 去实现它们。

上面的比较来自于: githubhelp.com/Fournux/tau…

另外, Tauri 在 2021 年还孵化出另外两个 crate :

  • wry,一个跨平台的 WebView 库。
  • tao,一个跨平台的 Window 库。

Tauri 目前发布了 1.0 beta 版,距离正式稳定版已经不远。 Tauri 选择 Rust 的原因就是为了安全和性能。Tauri 承诺不管你是在 App 中内置 localhost 服务器,还是做其他事情,Tauri 都会为你提供一个安全的底线。将来 Go、Nim、Python、Csharp 等其他后端语言也会被支持,这些都会通过当前这个 Rust 内核提供 C-API 来实现。

Egui

egui 是一款纯 Rust 实现的使用立即模式(immediate mode)的 GUI 框架(在屏幕上实时绘制需要的ui)。在 egui 的 README 中说明了这种立即模式的优缺点,如果你要做选型的话,应该去了解一下。简而言之,立即模式是与保留模式做对比的。立即模式主要优点是应用程序代码变得非常简单,缺点是让布局更加困难,GUI也不能太复杂,否则会给 CPU 带来负担。

Reddit 一位网友 说他们正在使用 Bevy 和 Egui 来构建商业 CAD 软件。

截止目前,egui 发布了 0.16 版本。

其他
  • gtk4-rs,另一个比较活跃的 GUI 库是 GTK 的 Rust 绑定,2021 年发布了GTK4 的 Rust 绑定 gtk4-rs 0.3.1 版本,目前还在活跃维护中。
  • iced,一个被 Elm 架构影响的 GUI 框架,它基于 wgpu。也是跨平台的,包括 Web UI。2021 年一直在活跃开发中,但是距离2021年4月份发版的这八个月时间还没有发出新的版本。但它也是被人看好的一个框架。
  • druid,是一个实验性的 Rust 原生 UI 工具包,值得关注。Druid 目前的发展很大程度上是由它在 Runebender 中的使用而推动的,这是一种新的字体编辑器(处于很早期的阶段)。
  • azul,是一款跨平台桌面 GUI框架。它将函数式、反应式和面向数据的编程范式与适用于开发跨平台桌面应用程序的 API 混合在一起。Azul 的两个核心原则是不渲染不可见的对象,并使用 DOM 树的组合而不是继承。目前发布了 1.0-alpha版本,距离正式发布 1.0 也不远了。
  • lvgl-rs ,是 LittlevGL 的 Rust 绑定。Littlevgl是一种纯C语言编写的GUI,控件多且美,移植简单,只要对接一个显示接口,需要触摸的再加一个触摸控制接口。

网络与 Web 开发

网络服务

随着世界变得越来越紧密,网络基础设施软件的规模和复杂性正在急剧增加。然而,对该软件的要求与以往一样严格:它不仅必须快速,而且必须“安全”,即能够处理不受信任的数据而不会崩溃或容易受到安全漏洞的攻击。传统上,这两个要求是不一致的:网络程序员必须选择一种既能提供速度又能提供安全性的语言。所以,Rust 是下一代网络基础设施的必须语言。

Tokio

Tokio 是当前 Rust 生态中构建网络服务的中流砥柱,它是一个 Rust 异步运行时和网络应用框架。虽然目前 Rust 生态中也有其他异步运行时,比如 async-std,但 tokio 无疑是生态最成熟的一个。

Tokio 在安全性、性能和异步任务调度方面都做了很多工作,支持 epoll 和 io_uring (tokio_uring 刚发布 0.2 版本)。除此之外,还提供 tracing (链路追踪)console (异步调试,刚发布0.1版本)loom(并发测试) 工具。

虽然 Rust 异步特性还需要很大的改进,但是目前因为有 Tokio 的存在,完全可以在生产环境中应用 Rust 异步。

Lunatic

lunatic,是受 Erlang 影响的一个 WebAssembly 运行时。你可以使用它快速健壮可扩展的服务器端应用程序,但是你可以通过任意可以编译为 WebAssembly 的语言来使用它。

Lunatic 的并发是基于超轻量级进程,类似于绿色线程或 go-routines。Lunatic 的进程创建速度快,内存占用小,调度开销低。它们专为大规模并发而设计。在一般的应用程序中同时运行数十万个这样的进程并不少见。Lunatic 进程彼此完全隔离,它们有自己的栈、堆甚至系统调用。如果一个进程失败,它不会影响系统的其余部分。这允许开发者创建强大且容错的抽象。

在 Lunatic 上运行的所有进程都被抢占式异步执行 (基于 smol 实现)器调度和执行。这使开发者可以自由编写简单的阻塞代码,但运行时将确保它在等待 I/O 时实际上不会阻塞线程。

即使在代码中某处存在无限循环,调度也将始终是公平的,不会永久阻塞执行线程。最好的部分是开发者不需要做任何特别的事情来实现这一点,无论你使用哪种编程语言,运行时都会处理它。

这一切都是基于 Rust 和 WebAssembly ( wasmtime 和 wasmtime-wasi) 来实现的,目前只发布了 0.7.0 版本,还在不断高速迭代。

embassy,嵌入式异步运行时

在嵌入式中,通常使用中断、DMA 并利用多核来处理并发事件而不阻塞主循环。这些传统上是通过有意的寄存器写入来处理的。例如,向外围设备发送命令以启动任务,继续运行程序,当任务完成时,会触发一个中断,并立即运行处理完成的代码。Rust 中可以使用基于 Future 的 Async/Await 功能来抽象这些过程。

embassy 是一个旨在让 async/await 成为嵌入式开发的第一选择的项目。异步可以产生更好的性能和更低的功耗,因为执行器不必猜测未来何时准备好执行。但是,程序大小可能比其他替代方案大,这对于内存非常低的某些空间受限设备来说可能是个问题。在 Embassy 支持的设备上,例如 stm32 和 nrf,内存通常足够大,可以容纳适度增加的程序大小。

Embassy 是一个执行器和一个硬件访问层 (HAL)。executor 是一个调度程序,通常执行固定数量的任务,在启动时分配,但以后可以添加更多。HAL 是一种 API,可用于访问外围设备,例如 USART、UART、I2C、SPI、CAN 和 USB。Embassy 在有意义的地方提供异步和阻塞 API 的实现。DMA(直接内存访问)是一个非常适合异步的示例,而 GPIO 状态更适合阻塞 API。

Embassy 还可以提供一个系统计时器,可以将其用于异步和阻塞延迟。在不到一微秒的时间内,应该使用阻塞延迟,因为上下文切换的成本太高,执行器将无法提供准确的定时。

Embassy 目前为多个微控制器系列提供 HAL:

  • embassy-nrf 适用于 Nordic Semiconductor 的 nRF 微控制器
  • embassy-stm32 适用于 ST Microelectronics 的 STM32 微控制器
  • embassy-rp 适用于 Raspberry Pi RP2040 微控制器

Embassy 中的 异步 trait 支持,是未来官方要支持的 Rust async trait 的 MVP 实现案例:

pub trait I2c<A: AddressMode = SevenBitAddress> {
    /// Error type
    type Error;
		// 基于 GAT (nightly Rust)
    type ReadFuture<'a>: Future<Output = Result<(), Self::Error>> + 'a
    where
        Self: 'a;
		
    fn read<'a>(&'a mut self, addr: A, bs: &'a mut [u8]) -> Self::ReadFuture<'a>;
}

impl<A: AddressMode = SevenBitAddress> I2c<A> for u8{
      fn read<'a>(&'a mut self, addr: u8, bs: &'a mut [u8]) -> Self::ReadFuture<'a> {
          // 使用 async move
        	async move {
              // implementation
          }
      }
}

当 GAT 稳定之时(预计2022年Q1),Rust Embedded 异步生态系统就会马上丰富起来。

eBPF 稳定支持

eBPF 是一套通用执行引擎,可以在 Linux内核执行沙箱程序,提供了可基于系统或程序事件高效安全执行特定代码的通用能力,通用能力的使用者不再局限于内核开发者。

eBPF 也逐渐在观测(跟踪、性能调优等)、安全和网络等领域发挥重要的角色。Facebook、NetFlix 、CloudFlare 等知名互联网公司内部广泛采用基于 eBPF 技术的各种程序用于性能分析、排查问题、负载均衡、防范 DDoS 攻击,据相关信息显示在 Facebook 的机器上内置一系列 eBPF 的相关工具。

eBPF 技术在网络技术中的表现,更是让人眼前一亮,BPF 技术与 XDP(eXpress Data Path) 和 TC(Traffic Control) 组合可以实现功能更加强大的网络功能。

redbpf 是 Rust 实现的用于构建和运行 BPF/eBPF 模块的工具库集合,它内含很多组件可以让你更方便地使用 eBPF 功能。目前版本更新也非常活跃,一周前刚发布 2.3.0 版本。infinyon 用它路由流量

其他活跃维护的库和框架
  • 上篇介绍过 monoio,是字节跳动开源的一个基于 io-uring 的 Thread-per-core 模型的异步 Runtime,详细介绍参见:《Rust 异步运行时的设计与实现》
  • Glommio,是 DataDog 开源的另一款 基于 io-uring 的 Thread-per-core 模型的异步 Runtime ,目前该作者已经自己创业。
  • h3,http3 协议的 Rust 实现。
  • quinn, 异步友好的 QUIC 实现。
  • tonic,是 gRPC 客户端和服务器的异步实现。
  • quilkin,前面介绍过,是 Google Cloud 与 Embark工作室 合作开发的一个UDP代理,为高性能的实时多人游戏量身定做。
  • RedisJSON,RedisJSON 是一种高性能 JSON 文档存储,允许开发人员构建现代应用程序。它在内存中存储和处理 JSON,以亚毫秒级支持每秒数百万次操作响应时间。 JSON 文档的原生索引、查询和全文搜索允许开发人员创建二级索引,快速查询数据。
  • rust-rdkafka,一个全异步 Kafka 客户端实现。
  • smoltcp,一个独立的、事件驱动的 TCP/IP 堆栈,专为裸机实时系统而设计。
  • rust-libp2p,libp2p 网络栈。
Eclipse zenoh

随着连网设备的数量稳定增加,业界在计算、储存和通信能力方面遇到前所未有的异质性,并且在产生数据以及必须交付和使用数据的规模方面面临新的挑战。

此外,基于性能、效率和隐私考虑,人们越来越希望使数据处理尽可能靠近来源,同时方便存取远距离的应用程序。换句话说,我们正经历主流架构转换,从以云端为中心的模式(从云端到雾端储存、处理和采集数据)变成以边缘为中心的模式(在对性能、能源效率和安全性最有意义的位置储存和处理数据)。

zenoh,提供了零开销的Pub/Sub、Store/Query 和 计算。将动态数据、使用中数据、静态数据与计算整合。它巧妙地将传统的发布/订阅与地理上分散的储存、查询和计算融合,同时保有远胜任何主流堆栈的时间和空间效率。

zenoh 的目的在于满足必须以可扩展、高效率且位置透明化的数据方式处理动态数据、静态数据和计算的应用程序的需求。

目前,Zenon 发布了 代号为 Aithusa 的版本,提供了 DDS PluginROS2 的集成,可用于IoT、机器人和自动驾驶领域。

Web 后端

有些人说用 Rust 进行 Web 开发 是杀鸡用牛刀,这种观点其实是对「系统级语言」的刻板印象造成的。无论从性能、工程架构还是开发效率,Rust 其实都很出色,目前就是需要一套比较成熟的框架。无论如何,Rust 在 Web 开发领域的生态在逐步成型。

Poem : 将 Rust 带入 Web 生态

Poem 是 一款由国人开发的 Rust 异步 Web 框架,其中最令人兴奋的功能是:

  • 功能丰富,全面。
  • 使用起来非常简单,文档也很棒。在此处查看一些示例
  • 开箱即用的 OpenAPI 规范生成支持。这是一个非常重要的问题,因为 Rust 中没有一个流行的 Web 框架原生支持 OpenAPI 规范生成。 OpenAPI 的支持把 Rust 带入了 Web 生态中。
  • 支持中间件功能(类似于 Express.js)。这里的例子
  • 开箱即用地与 AWS Lambda 配合使用。
  • 兼容 Tower ServiceLayer. 这让你可以在这里做一些有趣的事情,比如这个例子

已知使用Poem的开源项目:

  • delicate,分布式任务调度平台。
  • databend,Rust 实现的数据云服务。

使用poem的闭源项目

SeaORM

SeaORM 是一款异步动态 ORM,要做 Rust 版本的 Active Record,它基于 sqlxSeaQuery 构建。

SeaQuery 是一个查询生成器,是 SeaORM的基础,用来在Rust中构建动态SQL查询,使用一个符合人体工程学的 API 将表达式、查询和模式构建为抽象语法树(AST)。在同一个 接口 后面,统一支持MySQL、Postgres和SQLite。它类似于 Rails 的 ActiveRecord ORM 框架的 Arel 组件。

目前 SeaORM 正在高速开发,已经发布 0.5 版本。 SeaORM 的开发体验看上去不错,具体对 SeaORM 的介绍可以参考 Rust 生态观察| SeaORM: 要做 Rust 版本的 ActiveRecord 这篇文章。

其他有意思的框架
  • axum,是 tokio 官方新发布的 Web 框架,它的特色是无宏(macro-free),并且基于 Tower 中间件抽象,充分利用 Tower 生态。缺点就是泛型用的太多。
  • perseus, 比如增加了plugin系统,支持i18n,i18n是基于fluent来做的。fluent之前帮rust官网翻译时候用过,非常方便。

大前端

前端基础设施
Deno

Deno 是一个现代且安全的 TypeScritp 和 JavaScript 运行时,基于 V8 和 Rust 实现。Promisesasync/awaitES模块异步迭代器等在Deno中都是一等公民。

为了确保JavaScript的未来发展将继续适用于Deno和服务器端JavaScript运行时,Deno公司已加入负责JavaScript标准(ECMA-262)的ECMA国际标准组织,并参与到TC39工作组的工作中,Luca Casonato(卢卡·卡索纳托)将是Deno在TC39的主要代表。

Deno 也与 gfx-rs 合作 ,支持了 wgpu,用于提供开箱即用的 GPU 加速机器学习功能。由于 Deno 的模块化架构,WebGPU 实现是可插拔组件之一。

Deno 目前在高速开发中,截止目前已经发布 1.17.3 版本。目前有13家公司在其技术堆栈中使用 Deno ,包括 Cloudless 、Appwrite 和 The Lonero Foundation。

parcel && swc

parcel ,是一个 Rust 实现的 Web 应用打包工具,适用于经验不同的开发者。它利用多核处理提供了极快的速度,并且不需要任何配置。它基于 swc 实现。最近 parcel 还开源了一个新的 CSS 解析、转换和压缩工具 parcel-css

swc,是 Speedy Web Compiler 缩写,是一款用 Rust 编写的超快 TypeScript / JavaScript 编译器。版本更新非常活跃,三天前刚发布 1.2.179 版本。

项目状态: parcel / swc (Rust)vs esbuild (Go)

  1. swc 作者 和 parcel 核心贡献者现在已经被 Next.js 雇佣;esbuild 是作者自己的业余项目;
  2. swc 目前至少有四个全职开发了。
  3. swc 的开源活跃度要高于 esbuild: swc 的 总 PR 数达到 1600多,而 esbuild 只有200多个。
  4. swc 的issues 和 esbuild 的issues 数相仿,但是 swc 的 issues 明显分类管理更加明确和细致,并且都和版本发布的里程碑进行了挂钩。
  5. swc 和 esbuild issues 频率非常高,响应都比较及时。
  6. parcel 项目 PR 总数超过 2000, issues 超过 4000,非常活跃。
抖音公司

目前抖音小程序业务端也在招幕 Rust 开发者,在一些前端基础设施(比如编译器)上考虑使用 Rust/C++ 来进行实践。

WebAssembly 前端框架
Yew

Yew 是一个设计先进的 Rust 框架,目的是使用 WebAssembly 来创建多线程的前端 web 应用。它基于组件,灵感来自于 React 和 Elm,高性能,且支持与 JavaScript 交互。目前还在活跃开发中。

Sycamore

sycamore 是一个响应式的无虚拟dom 的 前端库,同样是基于 Rust 和 WebAssembly 。它的特点是,不支持 JavaScript ,因为不需要。

其他框架
  • percy, 实验性的 Rust + wasm 前端框架。
  • seed ,基于 Elm 架构的 Rust 前端框架。
  • sauron, 一个多功能的 Web 框架和库,用于构建客户端和/或服务器端 Web 应用程序,非常注重简单性。它适用于开发使用渐进式渲染的 Web 应用程序。
  • MoonZoon,正在开发的一款全栈 Rust 框架,号称没有 JS/CSS/HTML等,开发进度较慢。

其他领域

音视频
音频处理
  • creek,用于音频的实时磁盘流 IO。
  • Symphonia,纯 Rust 多媒体格式解复用、标签读取和音频解码库。
  • cpal,纯 Rust 的跨平台音频 I/O 库。
  • dasp,用于数字音频信号处理。
  • Meadowlark,旨在成为适用于 Linux、Mac 和 Windows 的免费和开源 DAW(数字音频工作站)。
视频处理
  • rsmpeg,字节跳动开源的一款安全的FFmpeg Rust 绑定库。
  • gstreamer,GStreamer 的 Rust 绑定库。GStreamer 是一个基于管道的多媒体框架,基于GObject,以C语言写成。基于流水线设计,可以创建诸如视频编辑器、流媒体广播和媒体播放器等等的很多多媒体应用。
  • rav1e,最快最安全的 AV1 编码器。
音视频媒体服务
  • xiu,一个简单而安全的纯 rust (rtmp/httpflv/hls/relay) 实时媒体服务器。
  • Signal-Calling-Service,基于 WebRTC 的 SFU(Selective Forwarding Units),其中以流处理的形式实现了googcc和transport-cc 拥塞控制。这是由 Signal 公司(跨平台加密消息服务)开源的。
  • webrtc-rs, WebRTC 技术栈的纯 Rust 实现,它用 Rust 重写了Pion技术栈。2021 年该库的开发也非常活跃。路线图 中的大部分功能已经完成。
Rust 与 区块链
Rust 与 智能合约

许多区块链要么运行用 Rust 编写的智能合约,要么用 Rust 实现它们的智能合约运行时或语言。它们分为几类:

  1. 基于 WebAssembly 的智能合约,Rust 可以编译为 WASM ,如 ElrondHolochainNEARSecret NetworkSubstrate。这些基本都有 Rust SDK。
  2. 支持将 Rust 编译到其他 VM 的工具,例如Nervos (RISC-V) 和Solana (eBPF)。
    1. Nervos 合约是用 Rust 和他们的Capsule库编写的。除了作为唯一一个运行 RISC-V 的区块链之外,Nervos 还是一个罕见的智能合约区块链,它使用 UTXO 模型而不是账户模型。
    2. Solana 运行一个特别古怪的 VM:一个基于 eBPF 的用户空间 VM rbpf。Solana 已经将一个有效的 Rust->eBPF 工具链组合在一起,其中包括一个支持 eBPF 的 Rust 编译器的分支。当然,由于 eBPF 不支持循环,这里的 Rust 一定很有趣。
  3. Rust 实现智能合约语言的人,例如Solang(一种 Solidity 到 WASM 编译器)、Leo(一种零知识语言)和Move (Diem 的语言)。尽管许多链正在转向通用 VM,特别是转向 WASM,但不这样做的理由主要有两个:希望与以太坊 EVM 兼容,以及基于零知识证明。Move 是一个相对罕见的案例,因为它既是它自己的语言,又是它自己的 VM,但没有像零知识语言那样拥有自定义 VM 的明显原因。
一些值得关注的项目
  • solang,是一个用 Rust 实现的 Solidity 编译器,但它不针对以太坊 EVM。相反,它使用 LLVM 作为后端,这意味着它可以潜在地针对大多数运行 EVM 的区块链。目前包括 Substrate、Solana、ewasmSawtooth
  • rust-umbral,是一种代理重新加密方案,通过该方案,密文的所有者 Alice 可以指定第三方(代理)重新加密要由 Bob 解码的密文,而无需向代理透露明文。它是由NuCypher项目开发的。
  • noir,是一种用于构建零知识证明的语言和编译器。它旨在与多个生成证明的后端一起使用,其中第一个用于barretenberg,正如Aztec Network所使用的那样。
  • MASQ,是一个网状覆盖网络,有点像 TOR,但具有参与的加密经济激励措施。
  • TDN,可信分布式网络是构建分布式应用程序的框架,支持 p2p 通信、多个交叉通信区块链、多层区块链和多个帐户模型。它建立在一个新的 p2p 库 Chamomile 之上。
  • bip32这是BIP32分层确定性钱包和 BIP39 助记符的纯 Rust、通用、no_std友好的实现 。
  • jsonrpsee,来自 Parity的JSON-RPC的异步实现,它还创建了 jsonrpc crate。
  • stateright,是用于在 Rust 中实现分布式系统的模型检查器。与 TLA+ 等传统模型检查器不同,Stateright 是 Rust DSL,能够检查系统的 Rust 生产实现。它包括 Paxos 和其他简单算法的示例。
  • arti,是用 Rust 对Tor的官方重写,于 7 月首次宣布。Tor 是分布式基础设施的关键部分,通过该项目可以将 Tor 嵌入到我们的应用程序中。
  • openmls,是Messaging Layer Security 协议的 Rust 实现,这是 IETF MLS 工作组正在开发的一个正在进行的标准。该协议旨在解决安全消息传递中仍然普遍存在的问题:虽然现在可以对两方对话进行强大的端到端加密,但对于端到端加密群组通信,却很少有好的解决方案.。MLS 指定了“一种密钥建立协议,该协议为规模从 2 到数千的组提供高效的异步组密钥建立,具有前向保密和泄露后安全性”。
  • mina-rs,是由ChainSafe开发的 Rust 中 Mina 的实现。它的开发不仅考虑了移动环境,还考虑了 WASM,这表明我们将能够直接在浏览器中嵌入一个完整的节点。Mina是一个新的区块链网络,它使用零知识证明来验证链的状态,而无需访问完整的区块链,而只是一个很小的(~22k)证明。
  • arloader,是一个用于将文件上传到Arweave的命令行客户端。发布到 Arweave 的文件将永久存储。该平台通常用于存储 NFT 信息。可以使用 Arweave 原生代币或 SOL 支付费用。
区块链生态信息

2021 年区块链几大公链出镜比较多的是 Near / Solana/ Dfinity / NeverOS ,整年都有开发者激励计划和黑客松活动。

2021 年比较活跃的概念是 跨链、 DeFI、NFT 和 Web3 。

但区块链是一个很大的生态,如果要盘点的话,可以单独出一篇很长篇幅的文章了。但幸亏有 Rust in Blockchain ❤ rib.rs 这样的站点为我们记录每月区块链生态的动态。感兴趣可以自己翻一下。

元宇宙

元宇宙可以说是 2021 年最疯狂的概念了,但究其技术栈,和 图形学、人工智能、区块链、VR/AR、IoT 等领域非常相关。那么 Rust 在这些方面准备好了吗? 其中图形学、人工智能、区块链、音视频、IoT 领域前面都盘点过,具体状态已经清楚。

VR/AR 领域,目前 Rust 生态也有人做,但不是很丰富:

openxrs ,这是对 OpenXR 的 Rust 绑定。 OpenXR 是用于 XR 应用程序的 API(应用程序编程接口),是一个开源标准,开发者可以用OpenXR实现跨设备的应用构建与部署。

XR是指计算机通过人机交互产生的真实与虚拟组合环境的连续统一体,包括与虚拟现实(VR)、增强现实(AR)和混合现实(MR)相关的技术。OpenXR 是应用程序与进程内或进程外的“XR 运行时系统”之间的接口,或者简称为“运行时”。运行时可以处理帧合成、外围设备管理和原始跟踪信息等功能。

Rust 对 VR/AR 的支持,也许就从 OpenXR 这里起步了。

makepad,是一个 VR,Web和本机渲染UI框架 和 IDE,基于 Rust 和 WebAssembly (WebGL) 技术。 作者是 Cloud9 IDE 的创始人。该项目也包含白皮书,阐述了它的愿景。目前开发进度不是很频繁。

信息安全领域
  • rustscan,是一个现代化高性能的端口扫描器,并且提供脚本引擎来支持运行 Python,Lua,Shell。支持 自适应学习(Adaptive learning)。用的越多,RustScan 越智能,不是基于臃肿的机器学习,主要是基于基本数学。
  • feroxbuster,一款高性能的内容发现工具,用于渗透测试。feroxbuster 使用蛮力结合单词列表在目标目录中搜索未链接的内容,这是一种攻击行为。这些资源可能存储有关 Web 应用程序和操作系统的敏感信息,例如源代码,凭据,内部网络寻址等。此攻击也称为可预测资源位置,文件枚举,目录枚举和资源枚举。
  • Enarx,这是一个组织,由红帽公司牵头其他知名企业来做可信执行环境的应用部署系统。
  • sn0int, 半自动高级公开资源情报(OSINT)框架和程序包管理器,用于扫描目标IP地址、电子邮件、网站和组织信息,并从不同消息源收集各种情报信息。
  • sniffglue,多线程网络嗅探器。Kpcyrd 经常使用tcpdump,但他认为输出更友好的话会更好,并且 wireshark 也经常存在漏洞,tcpdump 有时也有漏洞,所以他用 Rust 实现了这个工具。
  • ripasso,一款密码管理工具。
  • rustpad,是经典 padbuster 的多线程继承者,用 Rust 编写。它利用 Padding Oracle 漏洞在不知道加密密钥的情况下解密任何密文或加密任意纯文本!
  • vaultwarden,非官方 Bitwarden (密码管理)兼容服务器,以前称为 bitwarden_rs。
  • innernet,一个在后台使用 WireGuard (下一代 VPN 技术)的专用网络系统。
  • moonwalk,在 Linux Exploitation 期间通过在系统日志和文件系统时间戳上留下零痕迹来掩盖踪迹。仅用于协助红队的操作。
  • CaptfEncoder,CaptfEncoder 是一款跨平台网络安全工具套件,提供网络安全相关编码转换、古典密码、密码学、公钥加密、聚合查询、杂项等多种实用工具。CaptfEncoder V3 版本使用Rust开发,可执行程序体积小,速度更快、性能更优、功能更强。其作者目测在阿里云。
科研艺术领域
  • nannou,旨在让艺术家创作自己的艺术。在德国 mindbuffer 公司就是基于 nannou 和 koto 来创建实体艺术项目:使用486步进电机,86,000个LED和5通道颗粒式合成引擎,创建可以变换形状绚丽多彩的电子艺术品
  • Glicol ,一个面向图的音乐实时编程语言。Glicol 可以帮助您使用代码制作音乐。您可以简单地连接不同的节点以形成循环,用 Rust 编写,得益于 WebAssembly,它可以在浏览器中丝滑运行。
  • 3photons-rust,一位物理科学研究员坚持使用 Rust ,来实现模拟 3 个光子构建了一种奇异形式的“分子”光。
  • varlociraptor,实现了一种新颖、统一的完全不确定性感知方法,用于在任意场景中调用基因组变异。该库是《为什么科学家转向 Rust》一文中提及的生物信息处理库。目前还在活跃维护。
  • eigenvalues,来自荷兰电子科技中心研究员实现的一个特征值求解库 ,详细可以参考这篇文章 《将 Rust 用于科学数值应用:从过去的经验中学习》

Rust 职业岗位

职业岗位分类

因为 Rust 的安全属性,目前在金融领域应用 Rust 的公司比较多,所以目前全球 Rust 工作岗位最多的分布就是 区块链 和 量化金融。

基本上按目前全球 Rust 岗位招聘,可以分为以下几类:

  1. 区块链/ 量化金融 / 银行业
  2. 基础设施(云原生平台开发): 数据库 / 存储 / 数据服务 / 操作系统 / 容器 / 分布式系统
  3. 平台工具类: 远程桌面 / 远程服务类产品 / SaaS / 远程工作类产品(比如Nexthink)
  4. AI / 机器学习 / 机器人
  5. 客户端跨平台组件开发
  6. 安全工程师 : 区块链安全/ 信息安全
  7. 嵌入式工程师
  8. 广告服务商类,比如 Adinmo
  9. 音视频实时通信工程师
  10. 电商平台
  11. 软件咨询

关于具体的 Rust 职位招聘,可以在 Rust Weekly / Reddit r/rust 频道 / Rust Magazine 社区月刊 / Rustcc 论坛 ,以及各大招聘网站中可以找到。

Rust 国内部分职位信息【均可内推】

  1. 字节跳动。字节跳动内部基础设施、飞书、抖音都在用 Rust。这里有很多 Rust 职位需求。
  2. 非凸科技。国内做量化的企业,面向期货/股票市场。
  3. 海致星图。用 Rust 做图数据,是海致集团旗下公司。可远程。
  4. 达坦科技。用 Rust 做分布式存储,连续创业者王璞博士带队的初创企业。可远程。
  5. databend。用 Rust 做数据云的初创公司。可远程。

还有很多其他招聘,其中区块链职位居多,这里就不一一列举了。

全球可完全 Remote Rust 职位盘点

请注意,一些号称完全远程的职位实际上只是考虑美国/加拿大,有时甚至是欧盟居民,能不能在中国找到这些职位,可能需要看你的运气和沟通水平!

  • RedHat ,有 Rust 职位,可远程。可以在 Reddit 私信用户 @sheepdog69了解详情 。
  • tangram,一家开发机器学习类工具的公司,可以发送邮件咨询远程工作,但该职位只考虑美国/加拿大/欧洲的人员。
  • Materialize,实时流数据库(前面介绍过)有远程职位,这个需要发邮件咨询。
  • toyotaconnected ,目前只允许在美国12州内进行远程,它们也是 Rust 基金会的成员之一。他们将 Rust 用于机器学习工作和设备上。供应商 C 和 CPP 代码中的大量互操作以及我们在丰田和雷克萨斯汽车内部解决的许多很酷、有趣的问题,因为 5G 变得越来越流行。
  • Era Software,远程(美国/加拿大/欧洲),与 Elasticsearch 竞争。所有数据库工程职位都是针对 Rust 的。
  • Qovery,远程(欧盟),Qovery 是一个平台,它为任何开发人员提供了在几秒钟内将他们的应用程序部署到云中的超能力。
  • estuary,远程 Rust 开发人员来开发我们的实时数据平台Flow,需要发邮件咨询。
  • infinyon,远程(美国),用于为实时数据流构建可靠且可扩展的基础架构,面向的产品是Fluvio 和 InfinyOn Cloud 。
  • Ockam,Ockam 正在构建开源、端到端加密和相互验证的通信协议和库,这些协议和库可以在资源受限、间歇性连接的物联网设备和连接机器中工作。
  • 1password,远程(加拿大、美国和英国),密码管理软件。
  • IOHK,远程,区块链,详细请点击链接申请工作。

上面列出的只是网络上可见的一部分,对于国内的小伙伴来说,这些职位可能无法申请。对于国外的小伙伴来说,也许是一个福音。

Rust 语言教育普及状态

国内外出版书籍

从 2018 年到 2022 年国内外出版的书排列。

国内

  • 《深入浅出Rust》
  • 《Rust 编程之道》
  • 《Rust 权威指南》
  • 《Rust编程:入门、实战与进阶》

国外:

这些书并非全部,还有很多国外的书没有罗列出来。

可以看出,国外的 Rust 书在陆续增多,国内也有这个趋势。

高校教育普及

国内

国外:

Reddit 讨论:你梦想中的 Rust 大学课程是什么样的?

波兰华沙(Warsaw)大学的一位助教在 Reddit 发起这样的讨论 ,一直在教授 C 语言中的内存管理和编程(第一年)和 Java 和 C 中的并发和并行编程(第二年)。目前该学校决定为二年级学生开设 Rust 课程,他被委托负责准备课程和授课。他想向 Rust 开发者寻求建议,你梦想中的 Rust 大学课程是什么样的呢?

他目前的教学计划大概如下:

  • 将官方的 the book 作为教材。作为教师,他会将 the book 中的知识浓缩为 PPT 进行教授。
  • 在学习语法的过程中,也掺杂一些 Rust 生态的最佳实践内容。
  • 在学习完 the book 之后,将以异步为主要侧重内容。
  • 设置五个不同等级的小任务,让学生完成,每个任务有十天时间来完成。

详细内容可以参考reddit贴。在评论中有人给出一些建议:

  • 一位本科生使用 Rust 完成强化学习库:github.com/ZuseZ4/Rust… Rust 用于机器学习的教学中,因为使用 Python 学习机器学习更加简单。(这样说也很有道理,学习的时候要讲究学习目标,学生的学习目标是学习机器学习领域知识,而非 Rust)。
  • 一位朋友说,在大学里应该教授学生如何解决问题。比如通过学习多线程生命游戏的实现,来学习解决多线程并发的问题。

你对此有何看法呢?

结语

对 Rust 做生态调研,是一件很累的事情,因为 Rust 作为一门真正的通用型语言,其生态信息量太大,涉及领域众多。但我也坚持把这篇报告做完了,因为我实在很喜欢 Rust 社区,Rust 社区在我眼里,就是充满了希望和蓬勃生机的社区。希望你也和我一样,可以喜欢 Rust 。