• Rust 1.90:开发者们苦苦等待的更新终于来了
  • 发布于 1个月前
  • 506 热度
    0 评论
  • 久拥我i
  • 0 粉丝 65 篇博客
  •   
更短的链接时间,更快的编辑体验,更少的等待
还记得那种感觉吗?你刚改完一行代码,满怀期待地按下编译,然后...就开始等。等得可以去泡杯咖啡,刷会儿微博,甚至还能抽空打个盹。Rust的编译时间,特别是链接阶段,简直就像是在考验开发者的耐心极限。但好消息来了!Rust 1.90就像是个及时雨,专门来解决这个让人头疼的问题。这不是那种堆砌一堆花哨语言特性的更新,而是实实在在地优化了我们每天都要面对的编辑-编译-测试循环。

三个让你眼前一亮的改进
让我先给你划重点,这三个改进绝对能让你拍案叫绝:
1. rustc现在默认使用LLD链接器 - 在x86_64-unknown-linux-gnu平台上,链接速度大幅提升,增量构建快得飞起
2. cargo publish --workspace原生支持 - 再也不需要写那些脆弱的发布脚本了,按依赖顺序一键发布整个工作区
3. 平台支持策略调整 - x86_64-apple-darwin降级到二级支持,是时候考虑迁移到ARM架构了
如果用一句话总结这个版本:本地开发循环更快了,发布流程更顺了,平台支持更清晰了。

为什么这个版本让人如此兴奋?
语言特性固然重要,但开发效率才是王道。大多数团队花在链接、等待和发布上的时间,比写新功能的时间还要多。Rust 1.90就是专门针对这些痛点下手的。这个链接器的改进可不是纸上谈兵。对于某些大型项目来说,链接器就是个瓶颈,编译时间的一半都在等链接器完成。换成更快的默认链接器,就能显著减少日常开发和CI中的摩擦。Rust团队实测的结果足够改变你的开发习惯:ripgrep的增量链接时间减少了7倍,整体增量编译时间提升了约40%;全新调试构建也有约20%的端到端改进。

以前的Rust编译就像坐绿皮火车 - 你知道它能到达目的地,但那个速度实在让人着急。每次改代码都像是在等火车慢慢进站,然后还要等它把所有车厢都连接好。

现在有了Rust 1.90,就像是换乘了高铁。链接器这个"连接车厢"的步骤变得飞快,整个编译过程流畅得就像高铁加速一样。你改完代码,几乎立刻就能看到结果,这种体验上的提升,比任何新语法特性都来得实在。

具体改了啥?实用清单来了
• LLD成为默认链接器 - 在x86_64-unknown-linux-gnu上,大型二进制文件和调试构建的链接速度大幅提升。当然也支持回退
• 工作区发布功能 - cargo publish --workspace现在能按正确的依赖顺序发布crate,再也不用写那些脆弱的脚本了
• 目标平台等级调整 - x86_64-apple-darwin降到二级支持,带主机工具。该规划CI迁移了

• 常量上下文和小API改进 - 一堆小而美的稳定化改进,包括整数/浮点数辅助函数和trait实现


动手试试:体验链接器的神奇变化
问题:编译大型二进制文件或调试构建感觉太慢。每次编辑都要等很久,链接器经常成为编译时间的瓶颈。
改变:Rust 1.90默认使用rust-lld作为x86_64-unknown-linux-gnu的链接器。这为默认工具链带来了现代并行化和更快的对象处理能力。

快速测试方法:
1. 更新到1.90:
# 使用包含1.90的稳定工具链
rustup update stable
rustup default stable
2. 测量冷构建和增量重建。用中等或大型代码库效果更明显(比如ripgrep或类似的CLI工具):
# 测量完整构建
time cargo build --bin your_bin
# 做个小改动然后测量增量
time cargo build --bin your_bin
预期结果:在ripgrep的例子中,Rust团队报告增量重建的链接时间减少了7倍,端到端增量编译时间减少了约40%。完整调试构建显示约20%的端到端改进。

如何回退(如果遇到特殊情况):
# .cargo/config.toml
[target.x86_64-unknown-linux-gnu]
rustflags = ["-Clinker-features=-lld"]
或者设置RUSTFLAGS:
export RUSTFLAGS="-Clinker-features=-lld"
详细说明:回退的情况很少见;团队预计LLD在绝大多数情况下都是安全的直接替换。

代码示例:工作区发布(简洁明了的例子)
问题:发布多个相互依赖的crate需要手动排序或写脆弱的脚本。
改变:cargo publish --workspace会按正确的依赖顺序发布crate,并在整个工作区运行通常的发布检查。
示例工作区:

Cargo.toml在工作区根目录:
[workspace]
members = ["crate-a", "crate-b"]
crate-a/Cargo.toml:

[package]
name = "crate-a"
version = "0.1.0"
crate-b/Cargo.toml:

[package]
name = "crate-b"
version = "0.1.0"

[dependencies]
crate-a = { path = "../crate-a" }
发布命令:

# 这会先发布crate-a,然后crate-b
cargo publish --workspace
结果:Cargo将工作区发布作为一个单元进行验证,并按依赖顺序发布crate。发布验证会像它们已经发布一样在整个集合上运行构建。网络故障仍然可能导致部分发布的工作区(发布不是原子性的)。

给开发者的真心话
少慢点发布。编辑-构建-测试循环越快,你就越有勇气去重构、去测试、去迭代。用新的链接器回收每天的那几分钟。这些时间累积起来,就能做更多实验,做出更好的产品。更新工具链时,记得在本地和CI上都测试一下。如果遇到罕见的边缘情况,可以用前面展示的rustflags回退链接器更改,并在Rust跟踪器上开个issue。如果为苹果Intel机器构建,现在就该开始规划减少上游覆盖了。考虑添加aarch64 macOS构建,或者验证你真正需要的主机矩阵。

在Rust 1.90 之前
+-----------+      +-------------+      +---------+
 | rustc     | ---> | object files| ---> | system  |
 | (compile) |      | (.o/.rlib)  |      | linker  |
 +-----------+      +-------------+      +---------+
                              |
                              v
                         slow serial linker
Rust 1.9.0 (LLD)

+-----------+      +-------------+      +---------+
 | rustc     | ---> | object files| ---> | rust-lld|
 | (compile) |      | (.o/.rlib)  |      | (parallel) |
 +-----------+      +-------------+      +---------+
                              |
                              v
                    faster parallel linking -> binary
最后说两句
Rust 1.90是个实用的倍增器。它没有改变日常代码使用的语法,但它改变了思考和验证之间的时间。如果迭代速度对你的团队很重要,那么这个版本正好打在了需要的地方。在beta上测试一下,切换开关,测量效果,然后享受写更多代码、等更少时间的感觉吧。如果有什么问题,回退并报告。Rust社区从具体反馈中学得很快。
用户评论