前言
Rust使用量增长趋势&喜爱程度分析
Rust2022使用量增长趋势第一
O'Reilly 发布了一份《2022 年编程、运维、AI 和云计算的发展方向》报告,该报告基于 O'Reilly 在线学习平台产生的数据,就技术行业的趋势进行了一番分析。
O'Reilly 认为,Rust 的受欢迎程度会继续增长。不过他们也指出,"虽然我们相信 Rust 的受欢迎程度会继续增长,但不要太兴奋,当你从一个小基数开始时,增长 94% 是很容易的。Go 显然已经确立了自己的地位,尤其是作为一种并发编程语言。而 Rust 很可能确立自己在系统编程方面的地位:构建新的操作系统和云操作的工具。"
Rust 2021年喜爱程度排名第一
全球最大程序员在线社区 Stack Overflow 发布了最新一期全球开发者调查结果
Rust基金会成员分析和Rust业界应用
行业头部企业的加入,为Rust带来行业机会
Rust Core 团队宣布 由华为、Microsoft、Google、AWS 和 Mozilla 作为创始成员的 Rust 基金会(Rust Foundation)正式成立,并将于美国东部时间 2月 9 日下午 4 点举行第一次董事会会议。
Rust 基金会是一个独立的非营利组织,负责管理 Rust 编程语言和生态系统,并特别注重为治理和开发该项目的维护人员提供支持。其初始董事会成员共 10 人,5 位来自创始成员公司,另 5 位来自项目领导层。作为 Rust 项目的发源地,Mozilla 于去年 8 月宣布了成立 Rust 基金会的计划 ,而今已经将所有商标和基础设施资产转移到了新的 Rust 基金会。
在过去的 10 年里,Rust 是一款流行的系统编程语言,将对性能的低级(low-level)控制与现代语言功能结合在一起,语法上类似于 C ++,但是可以保证内存安全。并且,Rust 陆续提出了“没有数据争用的并发性”、“没有垃圾回收的内存安全性” 和 “无惧骇客” 等引人瞩目的概念。
此外,Rust 还代表了一种新的、激进的、开源项目的协作方式:Rust 项目中的决策权是唯一委派和分配的,核心团队拥有更多特权。
据悉,Rust 基金会的创始成员承诺在 2 年内,提供每年超过一百万美元的预算,用于 Rust 项目的维护、开发和推广。如欲了解有关 Rust 基金会的更多信息,可以访问其官方网站 :https://foundation.rust-lang.org/posts/2021-02-08-hello-world/
众多行业和企业加大对Rust的应用
见附录一
Rust概述
Rust诞生的初衷是作为一门可以替代c++的系统级语言,满足以下核心价值观:
Memory safety
所有权、借用规则
和c对比:空指针、野指针、内存泄漏、内存越界、内存二次释放、段错误、数据竞争、迭代器失效等都可以杜绝
Speed(Zero cost abstraction)
和c对比:Rust 和 C 都给出了对数据结构布局、整数大小、堆与堆内存分配、指针间接寻址控制,可以翻译成可理解的机器代码。
虽然 Rust 具有更高级别的结构,比如迭代器、特性(traits)和智能指针,但是这些结构被设计成可以预测的优化直接机器代码,不会引入额外的运行时开销(也就是“零成本抽象”)
Explicitness
使用者可以对他所写的代码做到完全了解和掌控
和c对比:C和Rust对程序员的态度是两个极端
C:充分相信程序员
Rust:十分不相信程序员;
C能在以前通用是因为以前的大牛愿意清楚所有的细节,现在的很多程序员不清楚而且也不打算清楚;
但Rust强制你清楚。
Rust语言特点对电信领域匹配情况
电信系统产品自身特点
Concurrent(高并发)
在电信系统,或在互联网webserver上,很多事情是同时发生的。当某人发起呼叫时,另一个人可能正在通话中,与此同时,还有其他人正试图建立一个四方电话会议。这就要求你能够同时处理所有这些正在发生的事情。
Realtime(低延时)
在指定时刻或指定时间内执行动作,对于电信系统,这是非常重要的。你的系统必须能够非常精确地进行定时响应。原则上,你的系统想具备硬实时的能力,但实际上,软实时通常就足够了。但请注意:这意味着相对于系统吞吐量来说,你更青睐低延迟。系统在规定时间内开始响应比它可以提供吉比特带宽的吞吐量更重要。通常,低延迟和高吞吐量是互斥的。降低延迟会降低吞吐量,反之亦然。这也意味着,你的系统必须能够立刻运行很多定时器并精确地处理它们。如果设定了一个200毫秒的定时器,就应该严格在200毫秒后进行超时处理,而不能提前。
Distribute(分布式)
这是一个系统的鲁棒性需求。这里值得注意且非常有趣的事情是,有两大类特性的分布式的系统:“无共享”系统和与之相反的“共享”系统。虽然“无共享”系统挺赞的,但其并非总能很容易做到。只要你需要在指定体系架构的系统之间共享状态,马上就会产生问题。许多开发人员试图避免使用“共享”系统,并为之提供了很好的理由。但对于某些特定问题,你不能避免共享数据。这是个支持无缝分布式特性编程语言的亮点。
在电信系统中,信息共享是非常重要的。一个配置变化最终必须被分发到所有的终端点。如果一个节点宕机了,另一个节点必须能够继续正常工作。所以电信系统必须快速共享一些信息,且不能完全基于“无共享”的架构来实现。
Interaction with hardware (硬件交互)
在电信领域,一些特定的操作是不可能只靠软件来实现的。部分3 G协议需要每毫秒就重新计算移动电话最优基站配置。这个需求不可能靠运行在通用处理器上的软件来实现。你需要动用多个FPGA甚至是专用芯片来处理。
Very large software systems (超大规模)
当然,“非常大”在不同年代有不同标准。但它确实催生出如何构建编程语言的一些思想。在非常大的软件项目中,有很多程序员在同一份代码库基础上工作。他们必须能够很容易使用彼此的代码。软件项目也必须支持在系统朝着某个目标方向演进代码而不影响其他目标。
注意其主要部分是与随时间推移而产生的软件变更做斗争,即软件的某部分代码在数年时间内被反复修改。修改后的部分必须能够很好的组合在一起并工作正常,这就要求编程语言要解决一系列相关的问题。
在大规模编程时,另一个重点是你需要有办法来将程序分割成多个软件包和软件模块。否则你无法真正管理程序的复杂性。你需要有办法来获取不同的模块,描述它们的依赖关系,然后将它们组装成一个可以工作的系统。你也希望最好能够无缝升级软件的某一部分,同时软件的其他部分保持不变。这就意味着你必须准备好在某个时间点替换某个软件包,且不需要回退并修改软件的其他部分。
Complex functionality(特性动态交叉)
在某些系统中,如电信和电脑游戏服务器,系统的众多不同功能以错综复杂的方式相互作用。你不能使用数据库来存储这些变化,而要把它们存储在主内存中,否则处理起来就太慢了。换句话说,编程语言的重要特性是允许你编写出精细复杂的解决方案,以便解决系统不同部分用各种非同寻常方式交互的问题。
Continuous operation (长期运行)
电信系统的生命周期很长。电信系统将运行很多年,不能停机来进行维护。因此你需要处理一个连续运转的系统。如果发生了一个故障,你必须能够在系统运行的同时检查故障。你不能让系统停止运行,仅仅为了查看系统停止时的状态。此外,并发约束意味着你不能让系统真的停机,因为系统的其他部分需要继续正常运行。
这还意味着必须有一个前进的升级路线。光是CPU就有MIPS、 Digital Alpha、x86、HP-PA RISC、Sun SPARC、 PowerPC等。还有许多不同的软件平台如:OS/2、Windows、不同方言的UNIX、VxWorks、 QNX、 NeXt等。方便移植比执行速度或硬件利用率更重要
Software maintenance without stopping the system(不停机维护)
这是互联网网络设备以及电信系统的共同需求。当你决定重新配置路由器时,你不能停止路由器运行。这也意味着配置并不总是某种静态的,可以保存在配置文件中的东西。某些配置可能是天生就是动态的,在系统运行过程中被设置。
Stringent quality and reliability requirements (严格的质量和可靠性)
要能杜绝内存问题
Fault tolerance both to hardware failures and software errors (软硬件容错)
系统必须能容错硬件和软件故障,这是核心重点。在某些情况下,硬件会部分失效,但仍然可以作为降级服务来使用。如果某个链路发生了故障,或者你不能使用某个指定的电话通道,这时你可以绕过这个特定的问题。
引用:
Joe Armstrong 《面对软件错误构建可靠的分布式系统》(Making reliable distributed systems in the presence of software errors)
Rust对电信产品特征匹配情况
高性能
Rust vs c(运行性能相同,有个别情况微量优于c)
通过10种密集计算算法的比较,相同情况下,从运行时长、内存、CPU负荷看,Rust运行性能基本和c相当,有个别情况优于c
Rust vs c++(微量优势胜于c++)
通过10种密集计算算法的比较,相同情况下,从运行时长、内存、CPU负荷看,Rust运行性能基本和c++相当,有个别情况优于c++
Rust vs go(同等条件下,性能优势优于go)
通过10种密集计算算法的比较,相同情况下,从运行时长、内存、CPU负荷看,Rust运行性能优于go
以上信息来自于benchmark
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/rust.html
编译后汇编指令Rust vs c++(如果达到相同安全性前提下,rust&c++汇编指令数量基本对齐)
不使用安全指令,汇编指令相同
增加安全指令,汇编增加
取消安全指令,汇编基本对齐
以上数据来自:(https://pvs-studio.com/en/blog/posts/0733/)
安全性
内存安全模型
1、通过所有权类型系统
使用空指针、使用未初始化内存、使用释放后内存、重复释放内存、缓冲区越界。
2、所有权系统
每个被分配的内存都有一个独占其所有权的指针。只有当该指针被销毁时,其对应的内存才能随之被释放。
3、借用和生命周期
每个变量都有其生命周期,一旦超出生命周期,变量就会被自动释放。如果是借用,则可以通过标记生命周期参数供编译器检查的方式,防止出现悬垂指针,也就是释放后使用的情况。
unsafe(划分安全边界)
Unsafe Rust :划分安全边界
为了和现有的生态系统良好地集成,Rust 支持非常方便且零成本的 FFI 机制,兼容 C-ABI,并且从语言架构层面上将 Rust 语言分成 Safe Rust 和 Unsafe Rust 两部分。
其中 Unsafe Rust 专门和外部系统打交道,比如操作系统内核。之所以这样划分,是因为 Rust 编译器的检查和跟踪是有能力范围的,它不可能检查到外部其他语言接口的安全状态,所以只能靠开发者自己来保证安全。
rust安全编码的结果数据分析(Rust与c/c++比较,c/c++中全部内存管理缺陷100%可以通过rust safe机制预防)
1、概述:
"谁是世界上最好的语言?"这是程序员聚在一起必定会讨论的问题。Rust作为最近的后起之秀,在出生后的短短6年时间内就登上了“2021年05月编程语言排行榜”的第24位,可以说成绩斐然。作为C/C++的有力替代者,Rust其中一个最引人注目的特点就是安全性,今天我们尝试通过一些数据分析来看看Rust能否在安全上完虐C/C++。
我们从两个维度上的数据来分析语言的安全性:
a、语言强相关的缺陷类型的数量
b、语言强相关的缺陷类型的缺陷数量
前者衡量的是由于语言特性导致的缺陷引入,后者衡量的是真实存在的缺陷。前者不受程序员技能的影响,而后者会受教育、工具等因素的影响。以C/C++中可以使用指针为例,由于这种机制天生就存在“引用空指针导致系统复位”的缺陷,这会使前者的统计值上升;但由于编码规范、Coverity等静态检查工具的应用,很少在开源代码中发现此类缺陷,这会体现在后者的统计值中。前者的数据从CWE(Common Weakness Enumeration) List中获取,其中每一类缺陷都明确标注了该缺陷是语言无关的,还是和某些语言相关的;后者的数据从CVE(Common Vulnerabilities and Exposures)库中获取,可以大致看出每一类CWE在软件开发中出现的比例。由于Rust才出生不到10年,因此在CWE中并没有收录Rust语言相关的缺陷,因此我们将通过梳理C/C++的这两项数据,然后再结合国外研究团队对Rust项目的缺陷分析数据来判断Rust是否比C/C++更安全。
2、语言特性带来的缺陷
言归正传,我们先来先看CWE的数据,截止到目前CWE List V4.4中共收录了941个缺陷,特定语言相关占比如下:
在CWE收录的941个缺陷类型中语言相关的缺陷占19.02%,这意味着一旦选择了某种开发语言,这些缺陷或多或少都会出现在你的程序中,当然你选择不同的语言,潜在的缺陷类型数量是不一样的,下图展示了不同语言潜在的缺陷类型数量比较:
可以看到C、C++、Java三种语言位列前三,并且遥遥领先。这里面固然有作为三大主流编程语言必然受到更多的关注,多方照顾的原因,但也不能忽视同样作为历史悠久的web开发语言PHP和广泛应用的语言python,两者的漏洞类型数量并不多,特别是python在5月荣登编程语言排行的第二位。另外在这里要注意一下,由于一种缺陷类型可能在多个语言中都存在,因此如果你采用了C和C++混合编程,漏洞类型的数量并不是85+81。
3、不同类型缺陷的漏洞数量分析
当然CWE的数据只能说明C/C++潜在缺陷类型较多,无法说明真实缺陷的情况,因此需要在分析一下CVE中的漏洞数据。当然CVE中肯定不包含所有漏洞,但至少可以看到大致的分布情况,以下数据分析来自154102个CVE漏洞的数据集,然后对漏洞成因进行分析,并关联到C/C++相关的CWE,以此来观察真实漏洞存在的情况,下图是C/C++相关CWE关联的漏洞数量分布(取前十):
上图中对应的CWE ID的内容和在全154102个漏洞集中的占比,如下表:
从上表中可以看到位列前三的漏洞都和内存操作有关系,前五加起来占到漏洞集的12.11%。
4、Rust在相应缺陷类型上的漏洞数量分析
由于Rust语言的历史还不够长,因此在CWE中并没有相关缺陷类型,因此我们退一步,通过一些研究团队的报告来识别缺陷情况。结合C/C++的缺陷类型集中在内存操作部分,因此选择了今年6月份ACM SIGPLAN国际会议上的一份报告。该研究对Rust实现的数个系统和库进行了调查研究,对缺陷进行了分类,具体的结果如下:
由于原始研究报告不是严格按照CWE分类,因此做了下二次分类并与上述C/C++
可以看到除了CWE-908和CWE-763由于与语言无关而未统计到数据外,在内存相关缺陷中Rust项目中发现的缺陷数量的排序与C/C++统计得到的缺陷排序完全一致。看到这里可能有人会说Rust在安全性上和C/C++没什么区别嘛。别急,我们不能忘记Rust提供了一些安全特性以避免类似安全问题的发生。因此下面我们将引入这些缺陷的代码所在分为两类:安全区域、非安全区域,再看一下数据情况:
从上面数据可以看到几乎所有内存缺陷都位于非安全区,另外根据研究报告分析,唯一一个位于安全区的缺陷是由于Rust早期版本安全机制不健全导致的,在V0.3后版本已经可以对此类问题进行拦截了。因此可以得出结论:Rust提供的安全机制可以有效避免内存安全问题,但是也不能忽视程序员仍然可能因为各种原因弃用安全机制而引入内存安全问题。这些原因可能是性能要求、项目改造必须混用C/C++、功能实现需要绕过Rust检查机制等。
同时研究报告中还对线程安全问题进行了相关的分类研究,由于此类缺陷不属于C/C++特有的缺陷类型,因此此处不做过多分析,仅给出结论:并发问题的解决依然需要依靠程序员的设计,Rust提供的安全机制还不够完善。
C/C++与Rut的对比,小结如下:
1. C/C++特有的CWE缺陷类型在公开的154102个CVE漏洞的数据集中占比为16.2%,而在这个16.2%的子集中,内存相关缺陷占比为86.95%,分别为:内存读、写越界,拷贝越界,重复释放,使用已释放的内存块,如果能够在语言层面解决这些问题则能够消除大部分C/C++特有缺陷。
2. 通过分析Rust编写的软件和库中的缺陷,按照C/C++特有的CWE进行分类,所有对应缺陷都可以通过Rust的safe机制拦截,即如果使用Rust替代C/C++实现并全部采用safe机制,理论上可以消除现有86.95%的缺陷。
总结:
1. 从数据分析上看Rust在解决内存问题上确实如它宣称的一样,通过safe机制可以很好的防止内存相关缺陷的发生;
2. 从数据分析上看Rust并没有如它所宣称的一样能够很好的解决多线程问题,甚至safe机制会引入更多的死锁问题;
3. 从数据上看C/C++语言相关缺陷中超过80%的缺陷与内存相关,并且这80%以上的缺陷在Rust中已经完全可以用safe机制防护;
综上,至少在内存安全方面Rust确实可以完虐C/C++。
硬件交互
Rust和C 给出了对数据结构布局、整数大小、堆与堆内存分配、指针间接寻址控制,可以翻译成可理解的机器代码。
Rust 和 C 都是直接对硬件的抽象,都可看作一种“可移植汇编程”
除了与C对齐的功能以外, Rust 中使用类型级编程可以使硬件抽象更加安全。
引用:
(https://opensource.com/article/20/1/c-vs-rust-abstractions)
Rust应用分析
学习曲线
学习曲线的高低,依个人水平不同而不同。
以下罗列了不同基础学习 Rust 应该注意的地方
1. 完全零基础的开发者:掌握计算机基础体系知识结构,理解Rust语言和硬件/OS层的抽象,理解Rust语言核心概念、以及它的抽象模式,选择Rust语言的某个适用领域进行实操训练,通过实践来提升Rust语言的熟练度和理解深度,同时掌握领域知识。
2. 有C语言基础:由于C语言开发者对高级语言的抽象不是很理解,所以着重了解掌握Rust所有权机制,包括所有权的语义,生命周期和借用检查。了解Rust语言的抽象模式,主要是类型和trait;以及Rust本身的的OOP和函数式语言特性。
3. 有C++基础:C++开发者对于Rust语言的泛型有很好的理解能力,主要精力放在Rust的抽象模式和函数式语言特性上。
4. 有Java/Python/Ruby基础:着重理解攻克Rust所有权机制、抽象模式、函数式编程语言特性。
5. 有Go基础:Go语言开发者比较容易理解Rust的类型和trait抽象模式,但Go也是GC语言,所以所有权机制和函数式语言特性是他们的学习重点。
6. 有Haskell基础:Haskell系的开发者对Rust语言函数式特性能很好的理解,主要攻克所有权机制和OOP语言特性。
rust学习路径
分层学习缩短RUST学习路径
Rust开发组中对Rust能力诉求也是分层的,一个Rust开发组能力梯队成一个梭型结构:
1、一名RUST精通级架构师,把握系统框架和编程规范,解决疑难问题
2、3-5名rust胜任级dev,进行日程rust顺序编程开发。
3、1-2名入门级dev,进行rust学习
这样在日常开发中逐步把Rust能力提升,每个层级人员的Rust能力也会递次提升。
开发效率
开发效率影响因素有很多,这里仅从软件开发快速集成,软件开发工具,纯算法下的代码工程量三个角度和C进行对比看。
可以快速集成软件库
跟C/C++相比,Rust软件库在某些类型上没有C/C++丰富,但是类型种类还是比较全面的,可以快速开发集成产品。
软件开发工具
跟C/C++相比,Rust开发工具比较丰富和完备,特别corgo统一了依赖管理和构建,全面支持Rust开始开发,详见下表:
Rust 和C++ 的 纯算法工程量对比 (数据来源于Benchmark Game)
Rust 和C++ 的 纯算法工程量对比 (数据来源于Benchmark Game),基本和C++相当
benchmark game参考:
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/rust-gpp.html
https://upload-images.jianshu.io/upload_images/13419219-67bcf82cbf3d4258.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
社区资源和生态
Rust社区资源和生态非常丰富,可以支持电信领域应用。
Rust 生态日趋丰富,很多基础库和框架都会以 包(crate) 的方式发布到 [crates.io](https://crates.io/crates) ,截止目前,[crates.io](http://crates.io/) 上面已经有62981个 crate,总下载量已经达到 7,654,973,261次。
按包的使用场景分类
按包的使用场景分类,[Crates.io](http://crates.io/) 最流行的几个场景依次如下:
* 命令行工具 (3133 crates)
* no-std 库 (2778 crates)
* 开发工具(测试/ debug/linting/性能检测等, 2652 crates)
* Web 编程 (1776 crates)
* API 绑定 (方便 Rust 使用的特定 api 包装,比如 http api、ffi 相关api等,1738 crates)
* 网络编程 (1615 crates)
* 数据结构 (1572 crates)
* 嵌入式开发 (1508 crates)
* 加密技术(1498 crates)
* 异步开发(1487 crates)
* 算法 (1200 crates)
* 科学计算(包括物理、生物、化学、地理、机器学习等,1100 crates)
除此之外,还有 WebAssembly 、编码、文本处理、并发、GUI、游戏引擎、可视化、模版引擎、解析器、操作系统绑定 等其他分类,也有不少库。
常用知名基础库和工具链
其中已经涌现出不少优秀的基础库,都可以在 [crates.io](http://crates.io/) 首页里看到。这里罗列出一些:
* 序列化/反序列化:[Serde](https://crates.io/crates/serde)
* 命令行开发:[clap ](https://crates.io/crates/clap)/ [structopt](https://crates.io/crates/structopt)
* 异步/Web/网络开发:[tokio ](https://crates.io/crates/tokio)/ [tracing ](https://crates.io/crates/tracing)/[async-trait ](https://crates.io/crates/async-trait)/ [tower ](https://crates.io/crates/tower)/ [async-std ](https://crates.io/crates/async-std)[tonic ](https://crates.io/crates/tonic)/ [actix-web ](https://crates.io/crates/actix-web)/[smol ](https://crates.io/crates/smol)/ [surf ](https://crates.io/crates/surf)/ [async-graphql ](https://crates.io/crates/async-graphql)/ [warp /](https://crates.io/crates/warp) [tungstenite ](https://crates.io/crates/tungstenite)/[encoding_rs ](https://crates.io/crates/encoding_rs)/ [loom ](https://crates.io/crates/loom)/ [Rocket](https://github.com/SergioBenitez/Rocket)
* FFi 开发:[libc ](https://crates.io/crates/libc)/ [winapi ](https://crates.io/crates/winapi)/ [bindgen ](https://crates.io/crates/bindgen)/ [pyo3 ](https://crates.io/crates/pyo3)/ [num_enum ](https://crates.io/crates/num_enum)/ [jni ](https://crates.io/crates/jni)/ [rustler_sys](https://crates.io/crates/rustler_sys)/ [cxx ](https://crates.io/crates/cxx)/ [cbindgen ](https://crates.io/crates/cbindgen)/ [autocxx-bindgen](https://crates.io/crates/autocxx-bindgen)
* API 开发: [jsonwebtoken ](https://crates.io/crates/jsonwebtoken)/ [validator ](https://crates.io/crates/validator)/ [tarpc ](https://crates.io/crates/tarpc)/ [nats ](https://crates.io/crates/nats)/ [tonic](https://crates.io/crates/tonic)/ [protobuf ](https://crates.io/crates/protobuf)/ [hyper ](https://crates.io/crates/hyper)/ [httparse ](https://crates.io/crates/httparse)/ [reqwest ](https://crates.io/crates/reqwest)/ [url](https://crates.io/crates/url)
* 解析器:[nom ](https://crates.io/crates/nom)/ [pest ](https://crates.io/crates/pest)/ [csv ](https://crates.io/crates/csv)/ [combine ](https://crates.io/crates/combine)/ [wasmparser ](https://crates.io/crates/wasmparser)/ [ron ](https://crates.io/crates/ron)/ [lalrpop](https://crates.io/crates/lalrpop)
* 密码学:[openssl ](https://crates.io/crates/openssl)/ [ring ](https://crates.io/crates/ring)/ [hmac ](https://crates.io/crates/hmac)/ [rustls](https://github.com/ctz/rustls) / [orion](https://github.com/orion-rs/orion) / [themis](https://github.com/cossacklabs/themis) / [RustCrypto](https://github.com/RustCrypto)
* WebAssembly: [wasm-bindgen](https://crates.io/crates/wasm-bindgen)/ [wasmer ](https://crates.io/crates/wasmer)/ [wasmtime ](https://crates.io/crates/wasmtime)/ [yew](https://crates.io/crates/yew)
* 数据库开发:[diesel ](https://crates.io/crates/diesel)/ [sqlx ](https://crates.io/crates/sqlx)/ [rocksdb ](https://crates.io/crates/rocksdb)/ [mysql ](https://crates.io/crates/mysql)/ [elasticsearch ](https://crates.io/crates/elasticsearch)/ [rbatis](https://crates.io/crates/rbatis)
* 并发:[crossbeam ](https://crates.io/crates/crossbeam)/ [parking_lot ](https://crates.io/crates/parking_lot)/ [crossbeam-channel ](https://crates.io/crates/crossbeam-channel)/ [rayon ](https://crates.io/crates/rayon)/ [concurrent-queue](https://crates.io/crates/concurrent-queue)/ [threadpool ](https://crates.io/crates/threadpool)/ [flume](https://crates.io/crates/flume)
* 嵌入式开发:[embedded-hal ](https://crates.io/crates/embedded-hal)/ [cortex-m ](https://crates.io/crates/cortex-m)/ [bitvec ](https://crates.io/crates/bitvec)/ [cortex-m-rtic ](https://crates.io/crates/cortex-m-rtic)/ [embedded-dma ](https://crates.io/crates/embedded-dma)/ [cross ](https://crates.io/crates/cross)/ [Knurling Tools](https://knurling.ferrous-systems.com/tools/)
* 测试:[static_assertions ](https://crates.io/crates/static_assertions)/ [difference ](https://crates.io/crates/difference)/ [quickcheck ](https://crates.io/crates/quickcheck)/ [arbitrary ](https://crates.io/crates/arbitrary)/ [mockall ](https://crates.io/crates/mockall)/ [criterion ](https://crates.io/crates/criterion)/ [proptest](https://crates.io/crates/proptest) / [tarpaulin](https://crates.io/crates/cargo-tarpaulin)/ [fake-rs](https://github.com/cksac/fake-rs)
* 多媒体开发:[rust-av](https://github.com/rust-av/rust-av)/ [image](https://crates.io/crates/image)/ [svg ](https://crates.io/crates/svg)/ [rusty_ffmpeg](https://github.com/CCExtractor/rusty_ffmpeg)/ [Symphonia](https://github.com/pdeljanov/Symphonia)/
* 游戏引擎和基础组件:[glam ](https://crates.io/crates/glam)/ [sdl2 ](https://crates.io/crates/sdl2)/ [bevy ](https://crates.io/crates/bevy)/ [amethyst](https://crates.io/crates/amethyst)/ [laminar](https://crates.io/crates/laminar)/ [ggez ](https://crates.io/crates/ggez)/ [tetra](https://crates.io/crates/tetra)/ [hecs](https://crates.io/crates/hecs)/ [simdeez](https://crates.io/crates/simdeez)/ [rg3d ](https://crates.io/crates/rg3d)/ [rapier]([https://github.com/dimforge/ra](https://github.com/dimforge/ra) pier) / [Rustcraft](https://github.com/dskart/rustcraft) [Nestadia](https://github.com/zer0x64/nestadia)/ [naga](https://github.com/gfx-rs/naga)/ [Bevy Retro](https://github.com/katharostech/bevy_retro)/ [Texture Generator](https://github.com/Orchaldir/texture_generator) / [building_blocks](https://crates.io/crates/building_blocks) / [rpg-cli ](https://github.com/facundoolano/rpg-cli)/ [macroquad](https://github.com/not-fl3/macroquad)
* TUI/GUI 开发:[winit ](https://crates.io/crates/winit)/ [gtk ](https://crates.io/crates/gtk)/ [egui ](https://crates.io/crates/egui)/ [imgui ](https://crates.io/crates/imgui)/ [yew ](https://crates.io/crates/yew)/ [cursive ](https://crates.io/crates/cursive)/ [iced ](https://crates.io/crates/iced)/ [fontdue ](https://crates.io/crates/fontdue)/ [tauri ](https://crates.io/crates/tauri)/ [druid](https://crates.io/crates/druid)
基本常用库资源都有开源参考案例
开发人员种群
Rust开发人员种群规模较小,但在高薪和需求推动下,种群数量逐步增多。
目前暂无数据,但是从招聘薪资(排名第一并且上半年一直排名第一)看,rust程序员人数相对较少。
数据来自51job2021年7月数据
请输入标题
| 2021月份 | 平均工资 | 招聘人数 | 比例(%) |
| 3 | 24659 | 637 | 0.17 |
| 4 | 21733 | 823 | 0.1 |
| 5 | 24293 | 1022 | 0.23 |
| 6 | 22141.7 | 877 | 0.14 |
| 7 | 22394.4 | 1088 | 0.155 |
2010年以来美国Rust公司所有招聘广告数量的增长情况。10年前几乎没有什么变化,但从2018年开始有了大幅的提升
2020年美国知名企业rust招聘数量
使用Rust供应链安全情况
2021年02月08号, Rust方案正式脱离Mozilla,Rust核心团队宣布成立新的Rust基金会,自Mozilla接手所有商标及资产,而10位董事会成员,有5位来自创始公司AWS、华为、Google、微软和Mozilla,以及5位来自方案高管层。各大巨头的加入, 也意味Rust不会像Java 或者 Go一样掌握在一家公司手里。
rust目前生态上略为欠缺, 但是rust有它独特的语言优势, 很多Linux下工具用rust写的或者重写的, 基本都成为神器一般的存在,经常在 awesome rust能发现惊喜.
Rust方案目前拥有100多个团队成员,领导方案设计和维护,而且在rust-lang/rust代码存储库中,拥有将近6,000名贡献者,而在意见请求(Request for Comments,RFC)程序中,已经有1,000人参与将近500个提案决策,官方提到,这些数据都代表著Rust方案是一个强大的社群,社群中包容多种声音,成员互相合作。
Rust当前的问题
Rust 语言的不足
Rust 虽然有很多优势,但肯定也存在一些缺点:
1、Rust 编译速度很慢。
虽然 Rust 官方也一直在改进 Rust 编译速度,包括增量编译支持,引入新的编译后端( cranelift ),并行编译等措施,但还是慢。而且 增量编译目前也有 Bug。
2、不支持分布式编译
3、语法糖多且相对随意,学习曲线陡峭。
4、IDE 支持不够完善。比如,对宏代码的支持不是很好。
5、缺乏针对 Rust 语言特有内存不安全问题的各种检测工具。
6、针对某些场景、架构和硬件生态支持不是很完善
这其实是需要投入人力和硬件成本来支持了,需要社区和生态的共同努
穿刺案例
选取电信系统产品核心网模块使用Rust重构
从穿刺数据看
重构情况简介
本次选取电信领域系统产品核心网某个模块,投入1名sa(架构师)和2名dev(普通开发)两类人员,其中
1、sa具备半年以上Rust经验
2、dev基本都是只有1年c语言经验,且没有任何Rust经验新员工。
重构小结
整个团队学习曲线可以适当平缓
Rust中涉及泛型、fp(函数式编程)、trait、强类型、多线程等,集合了c/c++、Haskell、erlang、go、python、java等各种主流语言的特征,而且语法糖衣特别多且相对比较随意,导致全部深入学习周期较长,学习曲线陡峭。但是如果打开看:
1、某种开发模式使用的Rust语法特性是有限的。除了框架部分和有限关键点外,其他都是单线程顺序编程(必须给普通开发人员限定编程范式,不允许随意使用之外的Rust特性)。
2、团队中Rust架构师负责架构和疑难问题攻关并形成开发范式,他需要掌握比较全面的Rust开发技能。
3、开发人员在既定框架上使用已有范式进行开发,仅需要掌握顺序编程+Rust内存安全模型即可
这样整个团队就形成了Rust能力的梯队,人员第次成长,所以Rust学习曲线从整个团队看并不陡峭。
内存安全得到保证
穿刺完成后的经过系统测试和上线运行一年多时间,没有发现任何内存安全问题。
开发效率
从两个方面看:
1、代码生产了基本和c/c++对齐(同等功能在相同开发人力的情况下)
2、Rust表达力相对较强,相对功能和性能情况下,Rust代码量小于c/c++
3、由于没有出现系统产品常见的各种内存问题,后续维护成本基本为零。
开发人员感受
参与Rust的新员工普遍感觉对代码安全性的自信心增强,且养成了安全编码习惯后,愿意继续使用Rust开发新的功能。
区别在于以往使用c/c++编码时,内存安全需要靠三方扫描工具+人工经验的保证,现在时Rust编译器帮你提前做了大部分的检查。
内存安全总是要保证的,不是开发期、编译期做,就是要在测试、线上定位解决(内存安全问题越往后拖解决的代价越大),无非时朝三暮四还是朝四暮三的问题。越是新员工,c/c++内存安全的经验越少,越是更加需要Rust这种安全编码语言,开发人员用过Rust后就会喜欢上Rust。
过程沉淀
对于Rust重构来说,总结出五步法:
1、划边界
高可用性的系统不二法门一定是基于进程的隔离,就像操作系统都是被分为内核态和用户态一样。
Rust适合系统中高安全性、高性能的场景(比如逻辑中间件,一般位于用户层以下基础设施层以上)
2、建团队
需要至少1名Rust的架构师(c/cc++/java/python/go至少一种的3年以上开发经验,至少6个月Rust经验)+多名开发人员(c/cc++/java/python/go一种语言1年以上开发经验,且学习Rust单线程顺序编程+内存安全模型两周以上)
3、定接口
定义重构的Rust模块和外部接口,一般通过FFI
4、设范式
对本业务领域常见解决思路总结提炼成编程规范、开发范式、公共组件,并由架构师持续维护和演进
5、守约束
要求所有开发人员遵守这些编程规范和开发范式,并对所有Rust代码(重点是含unsafe)进行100%代码走查。
只有遵守这些才能使Rust重构安全顺利的进行下去。
附录一 Rust 行业应用盘点
数据服务
TiKV(国内/开源/分布式数据库)
TensorBase (国内/开源/实时数据仓库)
Timely Dataflow (国外/开源/实时数据流)
Noria (国外/学术研究/开源/数据库)
Vector (国外/开源/数据管道)
Arrow-rs (国外/开源/大数据标准)
InfluxDB IOx (国外/ 开源/时序数据库)
CeresDB (国内/商业/时序数据库)
tantivy (国外/开源/全文检索)
Rucene (国内/开源/搜索引擎)
云原生
StratoVirt (国内/开源/容器)
Firecracker (国外/产品)
Krustlet (国外/产品)
linkerd2-proxy (国外/产品)
Lucet (国外/产品)
wasmcloud (国外/开源/产品)
Habitat (国外/开源/运维工具)
其他一些项目
操作系统
Rust for Linux (国外/ Rust 进入 Linux 支持项目 )
Coreutils
Occulum (国内/开源/TEE 库操作系统)
rCore 和 zCore (国内/ 教育/ 学术/ 开源/ 操作系统)
Redox (国外/ 开源/ 操作系统)
tockOS (国外/开源/嵌入式实时操作系统)
Theseus (国外/开源/高端嵌入式操作系统/研究项目)
工具软件
RustDesk (国内/部分开源/远程桌面软件)
spotify-tui (国外/终端音乐软件)
Ripgrep (国外/终端文本搜索)
nushell (国外/开源/shell工具)
alacritty (国外/开源/模拟终端)
Gitui (国外/开源/Git终端UI)
其他优秀的终端工具
机器学习
linfa (国外/开源/机器学习工具包)
tokenizers (国外/开源/自然语言处理分词库)
tch-rs (国外/开源/PyTorch 绑定)
ndarray (国外/开源/科学计算)
TVM-rs (国外/开源/ TVM rust 绑定)
Neuronika (国外/开源/机器学习框架)
游戏
veloren (国外/沙盒游戏/开源)
A / B Street (国外/开源/街景交通探索游戏)
Embark 公司 与 Rust 游戏生态
Bevy (国外/游戏引擎/开源)
其他动态
客户端开发
飞书 App (国内/商业)
区块链/数字货币
Diem (国外/开源/Libra/ 超主权货币)
Substrate (国外/ 开源/ 区块链框架)
Nervos CKB (国内/ 区块链公链)
其他区块链项目
二、盘点在生产环境使用 Rust 的公司
国内
华为
PingCAP 及其 客户
阿里/蚂蚁集团
字节跳动
知乎
收钱吧
吉利集团
上海息未信息科技
杭州秘猿科技
国内其他区块链公司
豆瓣
国外
微软
AWS
Mozilla
Apple
1Password
Cloudflare
Discord
IBM
Dropbox
npm
OneSignal
Qovery
Astropad
Coursera
三星
System76
Clever Cloud
Rapid7
Figma
Fly.io
Everlane
附录二 Rust相关资源
Rust演练环境:
https://play.rust-lang.org/
Rust标准文档库:
https://doc.rust-lang.org/stable/std/#modules
通过案例学习Rust:
https://rust-by-example.budshome.com/
感谢
感谢张先红、范璟玮、张汉东提供素材和宝贵的修改意见和建议。