最开始关注到 Rust ️,是因为 Atom 团队放弃维护 Atom,转身投入到一个新的轻量级、更快的编辑器 Zed 的开发,而这个编辑器最大的特点就是将全部基于 Rust 来构建。而为什么基于 Rust 来开发可以更快呢,这成功吸引了我的好奇心,也是写这篇文章的原因。
这两年 Rust 正在 JS 基建圈流行:Webpack、Babel、Terser、Prettier、ESLint 这些前些年才流行起来的工具都已有了 Rust 替代方案,且性能有着 10~100 倍的提升。亚马逊和微软都认可它是其系统中 C / C ++的最佳替代品,微软更是认为 Rust 作为工业级的开发语言,像 Figma 和 Discord 这样的公司现在也通过在客户端应用中使用 Rust 来引领潮流。
但是 Rust 并不止于此,在相关领域有更多的应用,让我们先看看 Rust 在相关领域的应用,再来关注为什么大家都不约而同的选择了 Rust。
Rust 在相关领域的应用
Rust 在前端领域的应用
- Deno:Deno 是一个简单、先进且安全的 JavaScript 和 TypeScript 运行时环境,其基于 V8 引擎并采用 Rust 编程语言构建。
- Swc: (Speedy Web Compiler) 基于 Rust 的前端构建工具,可以简单理解为 Rust 版的 Rollup 或 Webpack
- Parcel:零配置构建工具
- Rome:可以理解为 Babel 作者的新作品,代替 Babel
- 还有 dprint(Prettier 的重写)、Postcss-rs (Postcss 的重写)
Rust 在桌面领域的应用
- Tauri:Tauri 是 Electron 的代替品,现在 Tauri 试图去除 Chromium 转而使用 Rust 去和系统内置 Webview 进行绑定,简单来说就是在 Electon 时代你的应用永远使用 Chromium 内核,而在 Tauri 时代,你的应用在 Windows 上使用 Edge/Webview2,在 macOS 上使用 WebKit,在 Linux 上使用 WebKitGTK。基于 Rust 和 Webview 的好处很明显:包体积极小且内存占用极低,同时性能有很大提升
Rust 与 WebAssembly 结合的应用
- Yew: Yew 是一个设计先进的 Rust 框架,目的是使用 WebAssembly 来创建多线程的前端 web 应用。
- wasm-bindgen: Rust 与 JS 的结合
Rust 和 Node 的绑定
- NAPI-RS:用 Rust 和 N-API 开发高性能 Node.js 扩展,可以替代之前用 C++ 开发的 Node.js 扩展
Web3 领域
由于 Web3 协议在处理数千万个不可信输入时需要快速且强大的性能,Rust 具有明显的优势。它以闪电般的速度处理功能复杂的任务,同时还减少了与内存、边界、空变量、初始化变量或整数溢出相关的错误。
Rust 具有一定的学习难度,但仍有很多开发人员去学习。使用 Rust 可以创建更强大的 dApp,它可以减少许多常见的错误,使dApp 在发布后按预期运行。它的并发能力正是每秒处理数万甚至数十万笔交易所需要的,这使得 Rust 成为 Web3 应用程序和虚拟世界交易的理想选择。
Rust 作为汽车软件主语言探索
Rust 的硬实时性和完美的内存机制,同样适合汽车场景的软件开发,在 RustChinaConf 上就有国汽智控关于 Rust 在汽车软件开发的探索分享。
Rust 的优势
早在 2015 年,一名前 Mozilla 员工就首次发布了 Rust,它是一种专注于安全和性能的多范式编程语言,其构建考虑到了速度和效率,这意味着它可以提供零成本的抽象、继承和功能特性。
Rust 帮助开发者开发节约内存的快速软件。它是同样关注代码安全、简洁语法的 C++ 或者 C 的一种现代的替换选择。
Rust 和 JavaScript 非常不一样。JavaScript 会去找到不用的变量和对象,然后自动清除它们。这个机制叫做垃圾回收(Garbage Collection)。Rust 则希望开发者自己去规划手动的内存管理。
性能好
- 开发者自己分配和销毁: 比如 C、C++ 等,这种方式相当于把所有权力开放给开发者,管理不当容易内存泄漏。
- 编程语言提供自动垃圾回收机制: 比如 JavaScript、Java、Python 等,这种方式会产生运行时开销,对性能可能产生影响(注意这里是“可能”,没有办法证明性能一定比开发者自己管理要差)。
Rust 则另辟蹊径采用所有权、借用、生命周期机制在编译期自动插入内存释放逻辑来实现内存管理,由于没有了垃圾回收产生的运行时开销,Rust 整体表现的速度惊人且内存利用率极高。
fn main() {
let a = String::from("hello rust");
let b = a; // 所有权被转移
println!("{}", a); // 编译失败!a 已经被释放,无法再使用
}
可靠性
- 内存安全: 在具有内存安全性的编程语言中,所有内存访问都是明确定义的,通常内存不安全的情况包含:空指针、野指针、悬空指针、使用未初始化的指针、非法释放、缓冲区溢出、执行非法函数指针、数据竞争等。(据说微软 70% 的漏洞是内存安全问题)。 所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。在运行时,所有权系统的任何功能都不会减慢程序。
- 线程安全: 线程安全是程序设计中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。
Rust 陡峭的学习曲线
Rust 有一个陡峭的学习曲线,它的抽象程度比大多数 Web 开发者所习惯的要低。这也是目前 Rust 在大规模使用中面临的困难。
网上流传的一个段子,很形象的讲述了 Rust 的技术复杂度。
小王是一个大型项目下的C++ 工程师,今天他上班 trigger了一个全量编译便回家了,明天再来。
小张是一个深度神经网络的 Python 工程师,今天他上班改了一个参数开始训练便回家了,三天后再来。
小李是一名资深的 Rust 工程师,今天他上班只花了一小时就完成了需求的开发。
然后连续加班了三个晚上才使得编译通过。
图为 Rust 的学习曲线:
随着前端基础设施逐渐 Rust 化,预估如果 2年后,想从事前端基础设施的研发,Rust 将成为必选项。在前端工具的各项对比中,使用 Rust 改造都得到了 10-100 倍的性能提升。
Rust 成为前端研发的基础设施已经是不可阻挡的趋势,现在正是开始着手学习的时候,早一些吃螃蟹 ️
附录
- 微软关于云安全性的文章,最佳工业级应用产品:https://thenewstack.io/microsoft-rust-is-the-industrys-best-chance-at-safe-systems-programming/?spm=ata.21736010.0.0.d39550b8KKeE88
- Rust 是 JavaScript 基础设施的未来 https://mp.weixin.qq.com/s?__biz=MzkxNDIzNTg4MA==&mid=2247485792&idx=1&sn=682a4dee7ce4d3b47a81baf9ebd7a98a&chksm=c170c1e7f60748f17585d6bfca0cff6edbf71bab95f0a4a1ea0bcf2d43c16d1722666d9fadc1&token=1766743281&lang=zh_CN#rd