最开始关注到 Rust ?️,是因为 Atom 团队放弃维护 Atom,转身投入到一个新的轻量级、更快的编辑器 Zed 的开发,而这个编辑器最大的特点就是将全部基于 Rust 来构建。而为什么基于 Rust 来开发可以更快呢,这成功吸引了我的好奇心,也是写这篇文章的原因。
这两年 Rust 正在快速占领前端基础设施领域,Webpack、Babel、Prettier 这些热门工具都已有了 Rust 替代方案,且性能有着 10~100 倍的提升。亚马逊和 FaceBook 都认可它是其系统中 C / C++ 的最佳替代品,微软更是认为 Rust 作为工业级的开发语言,在云的基础设施领域应该是首选。Figma、Dropbox 也已经在客户端中使用 Rust。甚至有说法:任何能够用 Rust 实现的应用系统,最终都必将用 Rust 实现。
在今年的 StackOverflow 开发者调查中,Rust 连续 7 年成为最受开发者喜欢的语言。但是 Rust 并不止于此,在相关领域有更多的应用,让我们先看看 Rust 在相关领域的应用,再来关注为什么大家都不约而同的选择了 Rust。
Rust 在相关领域的应用
前端基础设施领域
- SWC: (Speedy Web Compiler) 基于 Rust 的前端构建工具,可以理解为 Rust 版本的 Babel,但是性能有 10 倍提升。目前被 Next.js、Deno 使用。
- Tauri:Tauri 是目前最流行的 Electron 替代方案,通过使用 Rust 和 Webview2 成功解决了 Electron 的包体积大和内存占用高的问题。具体可以参见底部参考文章,微软为什么最终放弃了 Electron。相信 Atom 团队也是看到了 Tauri 的成功,才决定基于 Rust 去做 Zed 编辑器。
- Rome:可以理解为 Babel 作者的新作品,Rome 旨在取代许多现有的 JavaScript 工具,集代码检测、打包、编译、测试等功能于一身。
- Parcel:零配置构建工具,特点是快速编译和不需要配置
数据可视化领域
- Wgpu:是 WebGPU API 标准的 Rust 实现。WebGPU 是由 W3C 发布的规范,目标是让网页代码能安全可靠地访问 GPU 功能。其实现方式借鉴了 Vulkan API,会翻译到宿主硬件所用的各式 API(如 DirectX、Metal、Vulkan 等)上执行。
- Bevy:基于 Rust 语言开发,数据驱动的游戏引擎。同时支持 2D 和 3D 图形渲染,以及图可视化的渲染。
- Cube.js: cube.js 是开源的 BI 分析工具框架,其中的 Cube Store 用于分析查询的性能优化以及通过跨数据库连接的数据联合等附加功能,就是由 Rust 来实现的。
Rust 的高性能以及与 WebAssembly 结合,是非常适合用在需要大数据量处理的数据可视化领域的。
Rust 和 Node 生态
- Deno:Deno 是一个简单、先进且安全的 JavaScript 和 TypeScript 运行时环境,其基于 V8 引擎并采用 Rust 编程语言构建。
- Napi-rs:用 Rust 和 N-API 开发高性能 Node.js 扩展,可以替代之前用 C++ 开发的 Node.js 扩展
Web3 领域
由于 Web3 协议在处理数千万个不可信输入时需要快速且强大的性能,Rust 具有明显的优势。可以以很好的性能处理功能复杂的任务,同时还减少了与内存、边界、空变量、初始化变量或整数溢出相关的错误。 使用 Rust 创建更强大的 DApp(分布式应用),它可以减少许多常见的错误,使 DApp 在发布后按预期运行。Rust 的性能优势和安全性,使得 Rust 成为 Web3 应用程序的理想选择。其中币安的撮合引擎就是以 Rust 作为主语言,Solana 社区更是有很多基于 Rust 开发的 DApp。
Rust 作为汽车软件主语言探索
Rust 的硬实时性和完美的内存机制,同样适合汽车场景的软件开发,在 RustChinaConf 上就有国汽智控关于 Rust 在汽车软件开发的探索分享。
Rust 的优势
早在 2015 年,Mozilla 员工就发布了 Rust,它是一种专注于安全和性能的多范式编程语言,其构建考虑到了速度和效率,这意味着它可以提供零成本的抽象、继承和功能特性。
Rust 帮助开发者开发节约内存的快速软件。它是同样关注代码安全、简洁语法的 C++ 或者 C 的一种现代的替换选择。 Rust 和 JavaScript 非常不一样。JavaScript 会去找到不用的变量和对象,然后自动清除它们。这个机制叫做垃圾回收,Rust 希望开发者自己去规划手动的内存管理。
高性能
所有程序都必须管理其运行时使用计算机内存的方式。一些语言(比如:JavaScript)中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存,在另一些语言中,程序员必须亲自分配和释放内存。 Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。正是这种内存管理机制,使得 Rust 有惊人的内存利用率。
rust
let s1 = String::from("hello");
let s2 = s1; // s2 借用了 s1, s1 不再有效
println!("{}, world!", s1); // 这里 Rust 会报错,s1 是无效的引用
可靠性
Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让你在编译期就能够消除各种各样的错误。
-
内存安全:通常内存不安全的情况包含:空指针、野指针、悬空指针、使用未初始化的指针、非法释放、缓冲区溢出、执行非法函数指针、数据竞争等。Rust 通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查,如果违反了任何这些规则,程序都不能编译。
-
线程安全:线程安全是程序设计中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。Rust 通过一整套基础设施和类型检查,强迫这些线程问题暴露在编译阶段,相比花费大量时间尝试重现运行时并发 bug 出现的特定情况,Rust 会拒绝编译不正确的代码并提供解释问题的错误信息。
Rust 陡峭的学习曲线
Rust 有一个陡峭的学习曲线,这也是目前 Rust 在大规模使用中面临的困难。很多朋友会开玩笑说 Rust 入门并不难,我已经入门亿次了。 网上流传的一个段子,很形象的讲述了 Rust 的技术复杂度。
小王是一个大型项目下的 C++ 工程师,今天他上班触发了一个全量编译便回家了,明天再来。
小张是一个深度神经网络的 Python 工程师,今天他上班改了一个参数开始训练便回家了,三天后再来。
小李是一名资深的 Rust 工程师,今天他上班只花了一小时就完成了需求的开发。
然后连续加班了三个晚上才使得编译通过。
图为 Rust 的学习曲线:
随着前端基础设施逐渐被Rust化,Rust在前端基础设施的研发工作中愈发重要,招聘时也会越来越看重 Rust。 在前端工具的各项对比中,使用 Rust 改造都得到了 10 倍以上的性能提升。Rust 成为前端研发的基础设施已经是不可阻挡的趋势,可以从现在开始学习,一起吃 Rust 这只螃蟹 ?️。
附录链接
- 微软关于云安全性的文章,最佳工业级应用产品:thenewstack.io/microsoft-r...
- Rust 是 JavaScript 基础设施的未来 mp.weixin.qq.com/s?__biz=Mzk...
- 仅仅过去 4 年,微软最终放弃了 Electron mp.weixin.qq.com/s/EeOd-Ln9R...
- Solidity、Go、Haskell、Rust,Web3 开发者掌握哪种编程语言更具优势?foresightnews.pro/article/det...
- Rust是未来前端基础设施:github.com/i5ting/rust...