🦀 Rust 1.94.0 效率革命:编译提速 6 倍、API 更简洁、跨平台更强

Photos provided by Unsplash OR Pexels

Rust 1.94.0 版本(预计 2026 年 3 月 5 日发布)带来了众多实质性改进,这些改进不仅提升了开发体验,还增强了语言的表达能力和性能。以下是对该版本关键改进的深入分析,重点关注对日常开发的实际影响。

一、语言层面的实质性改进

1. Unicode 17 支持与性能飞跃

从知识库中可以看到,PR #148321 将 Rust 升级到 Unicode 17 标准,并用更快的 unicode-ident 替代了原有的 unicode-xid 库:

“parser/lexer: bump to Unicode 17, use faster unicode-ident which is also 6 times faster.”

实际影响:

  • 编译速度提升unicode-identunicode-xid 快 6 倍,显著减少了涉及大量标识符的项目的编译时间
  • 最新 Unicode 支持:开发者可以使用 Unicode 17 中新增的字符作为变量名和函数名
  • 更准确的标识符验证:确保代码符合最新的 Unicode 标准

对于日常开发,这意味着更快的编译速度和对最新国际字符的原生支持,尤其对非英语开发者友好。

2. 闭包生命周期问题修复

PR #148329 解决了长期存在的闭包生命周期问题:

“Avoid incorrect lifetime errors for closures”

实际影响:

  • 减少困惑:修复了那些”不应该报错却报错”的闭包生命周期问题
  • 更符合预期的行为:闭包捕获现在有更一致和正确的行为
  • 减少工作区:开发者不再需要为绕过这些错误而编写复杂的代码

知识库中提到,这一改进修复了 #148289 和 #104477 等问题,解决了闭包需求传播中的错误。在日常开发中,这意味着更少的编译错误和更可预测的闭包行为,特别是在处理复杂嵌套闭包时。

3. const _ 声明的无用可见性警告

PR #147136 添加了对 const _ 声明上无用可见性修饰符的警告:

“Add warn-by-default unused_visibilities lint for visibility on const _ declarations”

实际影响:

  • 代码清理:当编写 pub const _: () = (); 这类代码时,编译器会发出警告,因为可见性修饰符对匿名常量无效
  • 更清晰的代码意图:帮助开发者识别和删除无意义的语法
  • 未来可能成为硬错误:根据知识库,这种模式相对罕见,未来可能会升级为硬错误

在日常开发中,这有助于保持代码库的整洁,避免不必要的语法污染。

二、标准库 API 稳定化

1. array_windows 方法

新稳定化的 array_windows 方法允许以数组形式遍历切片的重叠窗口:

let nums = [1, 2, 3, 4];
let windows: Vec<_> = nums.array_windows().collect();
// [(1,2), (2,3), (3,4)]

实用价值:

  • 简化窗口算法:无需手动管理索引即可实现滑动窗口
  • 类型安全:返回固定大小的数组而非切片,编译器可以验证窗口大小

2. LazyCellLazyLock API

LazyCell(非线程安全)和 LazyLock(线程安全)提供了更灵活的延迟初始化:

#![feature(lazy_cell)]
use std::cell::LazyCell;

let lazy: LazyCell<i32> = LazyCell::new(|| {
    println!("initializing");
    92
});
println!("ready");
println!("{}", *lazy);
println!("{}", *lazy);
// Prints:
// ready
// initializing
// 92
// 92

实用价值:

  • 更精细的控制:相比 OnceCell,提供了 get_mutforce_mut 等额外方法
  • 清晰的初始化语义:明确区分只读访问和可变访问
  • 减少样板代码:简化了需要延迟初始化的场景

3. Peekable::next_if_mapnext_if_map_mut

这些新方法允许根据条件从可预览迭代器中消费项目:

let mut iter = [1, 2, 3, 4].iter().peekable();
let next_even = iter.next_if_map(|&x| if x % 2 == 0 { Some(x) } else { None });

实用价值:

  • 减少样板代码:简化了条件性消费迭代器元素的常见模式
  • 更清晰的意图表达:代码直接表达了”如果满足条件则获取下一个元素”的意图

4. BinaryHeap 约束放宽

PR #149408 移除了 BinaryHeap 构造函数中不必要的 Ord 约束:

“Relax T: Ord bound for some BinaryHeap<T> methods.”

实用价值:

  • BTreeMap 保持一致BinaryHeap::new 现在不需要 T: Ord 约束
  • 更好的 Default 支持:使 #[derive(Default)] 能够正常工作
  • 减少 API 不一致性:使集合 API 更加统一

5. 数学常量与 FP16 支持

  • 新增数学常量EULER_GAMMA(欧拉 - 马歇罗尼常数)和 GOLDEN_RATIO(黄金比例)
  • FP16 支持:稳定化了 x86 的 avx512fp16 和 AArch64 的 NEON fp16 内联函数

实用价值:

  • 科学计算更便捷:无需自己定义常见数学常量
  • 高性能计算:半精度浮点数支持对机器学习应用至关重要
  • 硬件加速:利用现代 CPU 的专用指令集提升数值计算性能

三、Cargo 的关键改进

1. 配置文件包含功能

稳定化了配置包含键,允许加载额外的配置文件:

“Stabilize the config include key. The top-level include config key allows loading additional config files, enabling better organization, sharing, and management of Cargo configurations across projects and environments.”

实用价值:

  • 配置复用:在多个项目间共享常见配置
  • 配置组织:将大型配置拆分为更小、更有针对性的文件
  • 环境特定配置:轻松管理开发、测试和生产环境的不同配置

2. 运行时可访问的二进制路径

现在可以在运行时访问当前可执行文件的路径:

“Make CARGO_BIN_EXE_<crate> available at runtime”

实用价值:

  • 自引用操作:程序可以轻松找到并重新启动自己
  • 资源定位:更容易定位与可执行文件相关的资源
  • 减少路径解析复杂性:无需复杂的代码来确定自己的位置

3. TOML 1.1 支持

Cargo 现在解析 TOML 1.1 格式的清单和配置文件:

“Cargo now parses TOML v1.1 for manifests and configuration files.”

实用价值:

  • 更丰富的配置语法:利用 TOML 1.1 的新特性组织配置
  • 向后兼容:发布的清单仍与旧解析器兼容
  • 更清晰的配置:新语法特性使复杂配置更易读写

四、平台支持的增强

1. RISC-V 支持的重大进展

PR #145948 稳定了 29 个 RISC-V 目标特性:

“Stabilize additional 29 RISC-V target features including large portions of the RVA22U64 / RVA23U64 profiles”

知识库中详细列出了这些特性:

  • b, za64rs (no-RT), za128rs (no-RT), zaamo, zabha, zacas
  • zalrsc, zama16b (no-RT), zawrs, zca, zcb, zcmop
  • zic64b (no-RT), zicbom, zicbop (no-RT), zicboz
  • ziccamoa (no-RT), ziccif (no-RT), zicclsm (no-RT)
  • ziccrse (no-RT), zicntr, zicond, zicsr, zifencei
  • zihintntl, zihintpause, zihpm, zimop, ztso

实用价值:

  • 硬件加速:利用 RISC-V 扩展指令集提升性能
  • 嵌入式开发:为 RISC-V 嵌入式系统提供更好的支持
  • 更广泛的兼容性:支持更多 RISC-V 配置文件

2. 新增 Tier 3 目标

添加了 riscv64im-unknown-none-elf 作为 Tier 3 目标:

“Add riscv64im-unknown-none-elf as a tier 3 target”

实用价值:

  • 裸机开发:为 RISC-V IM 架构提供裸机编程支持
  • 嵌入式系统:支持更多 RISC-V 嵌入式设备的开发
  • 实验性平台:虽然处于 Tier 3,但为未来支持打下基础

五、兼容性注意事项

Rust 1.94.0 包含一些可能影响现有代码的变更:

  1. 闭包捕获行为变更:某些情况下,闭包可能捕获变量的部分而非全部,这可能导致借用检查器报错

  2. 标准库宏导入方式变更:标准库宏现在通过预导入而非注入 #[macro_use],可能导致宏名称冲突

  3. Shebang 处理变更:在表达式上下文中的 include! 不再剥离 shebang,可能导致之前工作的代码不再编译

  4. 模糊 glob 重新导出:现在在跨 crate 情况下也可见,可能导致新的模糊错误

这些变更虽然可能需要调整现有代码,但总体上使语言行为更加一致和可靠。

六、总结:对日常开发的实际价值

Rust 1.94.0 版本带来的改进对日常开发具有显著价值:

  1. 提升开发效率:更快的编译速度(Unicode 改进)、更少的编译错误(闭包改进)直接节省开发时间

  2. 增强代码质量:新的 lint 规则和更一致的行为帮助编写更可靠的代码

  3. 简化常见任务:新稳定化的 API(如 array_windowsnext_if_map)减少了样板代码

  4. 扩展应用领域:RISC-V 支持和 FP16 内联函数使 Rust 更适合嵌入式和高性能计算场景

  5. 改善工具链体验:Cargo 的改进使项目配置和管理更加灵活和高效

总体而言,Rust 1.94.0 在保持语言核心原则(安全、并发、性能)的同时,通过一系列精心设计的改进,显著提升了开发体验和语言表达能力。这些变化虽然单独看可能不大,但累积起来对日常开发产生了实质性影响,使 Rust 成为更加高效和愉悦的开发选择。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)