Featured image of post Rust项目2025年10月目标更新:Pin语义、字段投影与下一代求解器等进展

Rust项目2025年10月目标更新:Pin语义、字段投影与下一代求解器等进展

本文详细介绍了Rust项目在2025年10月对其41个目标(包括13个旗舰目标)的进展更新,涵盖了Pin语义改进、字段投影设计、下一代特质求解器、常量泛型、重借用特质以及内存安全检查等多个核心编译器与语言特性的技术开发状态。

项目目标更新 — 2025年10月 | Rust Blog

2025年11月19日 · Tomas Sedovic 代表目标团队

Rust项目目前正致力于实现总计41个项目目标,其中13个被指定为旗舰目标。本文提供了我们在这些目标上进展(或者在某些情况下,进展不足)的精选更新。任何特定目标的完整详情可在 rust-project-goals 代码库的相应跟踪问题中找到。

旗舰目标

“超越 &

继续试验Pin的易用性 (rust-lang/rust-project-goals#389)

  • 进度: 进行中
  • 联系人: Frank King
  • 负责人: Frank King

2025-10-22 @frank-king 的评论摘要: 状态更新:关于接下来6个月的TODO清单,当前状态如下:

  • 引入 &pin mut|const 位置借用语法
    • 解析: #135731,已合并。
    • 降级和借用检查: 尚未开始。
  • 模式匹配 &pin mut|const T 类型:关于 !Unpin 内容的设计方案达成新一致(方案B),相关PR #139751 正在审核中。
  • 支持结构体固定类型的 drop(&pin mut self):正在通过新的 Drop::pin_drop(&pin mut self) 方法实现(草案PR #144537)。
  • 引入 &pin pat 模式语法:尚未开始(倾向于在 &pin 类型模式匹配就绪后进行)。
  • 支持 &pin mut|const T -> &|&mut T 强制转换:尚未开始,较为独立,可能需要他人协助。
  • 支持带有 &pin mut|const self 接收器的方法调用中对 &pin mut|const 位置进行自动借用:似乎可通过自动借用特质处理。

设计语言特性以解决字段投影问题 (rust-lang/rust-project-goals#390)

  • 进度: 进行中
  • 联系人: Benno Lossin
  • 负责人: Benno Lossin

TL;DR:自上次更新以来内部有许多进展:

  1. 字段表示类型和链式投影进行了根本性重构:禁止字段路径,要求投影可分解。同时探索了如何使用常量泛型模拟FRT。
  2. 讨论了通过具有特殊借用检查器处理的“衰减”操作来实现单一投影操作符和特质的潜在方案。
  3. 简化了投影特质,将所表示字段的泛型参数移至 project 函数中。同时发现FRT对于字段投影可能并非根本必要,但它们在其他应用中仍非常有用。
  4. 讨论了通过引入一种新类型使 Project::project 成为安全函数。

下一步

  1. 计划在更新新FRT逻辑并审核后合并 PR #146307。
  2. 该PR落地后,计划更新库实验以使用实验性FRT。
  3. 随后即可在Linux内核和其他项目中使用该库开始测试。

详细更新(2025-10-23 @BennoLossin):

  • 分解投影:链式投影操作应自然分解,foo.[Bar][].[Baz][] 应等同于 (foo.[Bar]).[Baz]
  • 字段表示类型:由于投影现在可分解,从设计角度看不再需要多级FRT。因此决定将FRT限制为单个字段并去除路径。
  • 通过常量泛型实现FRT:近期不会实现,但可能作为 field_of! 宏未来的实现方式。
  • 通过独占衰减实现单一投影操作符和特质:探索通过“衰减”操作将独占引用转换为共享引用,以实现单一操作符。但隐式操作会导致借用检查反馈到类型检查,实现困难。
  • 简化投影特质:随着Pin语义“方案B”成为主要方法,Pin<&mut T> 具有线性投影,Pin 在实现 Project 时不再需要 where 子句。新的 Project 特质设计移除了泛型参数,强制所有支持投影的类型对所有字段都支持投影。
  • FRT是否必要?:改变后可以考虑完全去除FRT,但FRT在Rust-for-Linux等其他应用中非常有用(例如在侵入式数据结构中直接存储字段信息作为泛型),因此将继续实验。
  • 使 Project::project 安全:当前方案中该函数因接收原始指针而不安全。考虑引入“部分结构体类型”(如 Struct.F),但面临与 mem::swap 冲突等问题,仍在探索。

重借用特质 (rust-lang/rust-project-goals#399)

  • 进度: 进行中
  • 联系人: Aapo Alasuutari
  • 负责人: Aapo Alasuutari

2025-10-22 @aapoalas 的评论摘要: 仅支持生命周期的具有独占引用语义类型的重借用特质初始实现已完成,但尚未合并或进入审核。CoerceShared 实现尚未开始。适当的可组合实现可能需要与当前不同的策略,安全性和有效性检查也仍需完善。

“灵活、快速(er)的编译”

build-std (rust-lang/rust-project-goals#274)

  • 进度: 进行中
  • 联系人: David Wood
  • 负责人: Adam Gemmell, David Wood

2025-10-31 @davidtwco 的评论摘要:现已开放第一批RFC:rust-lang/rfcs#3873、rust-lang/rfcs#3874 和 rust-lang/rfcs#3875。

生产就绪的Cranelift后端 (rust-lang/rust-project-goals#397)

推广并行前端 (rust-lang/rust-project-goals#121)

重链接而非重建 (rust-lang/rust-project-goals#400)

  • 以上三个目标暂无详细更新。

“高级Rust”

易用的引用计数:RFC决策与预览 (rust-lang/rust-project-goals#107)

  • 进度: 进行中
  • 联系人: Niko Matsakis
  • 负责人: Niko Matsakis, Santiago Pastorino

详细更新摘要

  • 2025-10-07:提议将特质命名为 Handle,其 clone 方法产生一个“纠缠”值(即指向同一底层值的第二个句柄)。此前已有大量讨论。
  • 2025-10-09:总结了当前思路:
    1. 克隆/句柄在显式化程度上并非绝对不同,不同应用需求不同。
    2. 完全显式时,区分通用克隆和句柄是有用的。
    3. 许多在Rust“甜点区”的软件类别重视显式性,应确保其具有符合人体工程学的完全显式方案。
    4. 不排斥自动克隆/句柄,但应将显式和自动两种用例视为同等重要。
    5. 当前专注于显式方案,提议让句柄和克隆方法被编译器特殊处理以进行优化和脱糖。
    6. 还需要显式闭包捕获语法。
    7. 考虑通过配置文件(基于应用域的lint组)来实现自动插入克隆/句柄调用并发出警告。
  • 2025-10-22:更新与后续讨论:
    • 讨论了 Handle 名称的缺点(名词、通用性强),提出了替代名称如 Alias
    • 正在撰写一系列博客文章来梳理思路。核心论点:Rust应有一种既显式又符合人体工程学的方式来创建句柄/克隆(及操作它们的闭包)。
    • 当前思考方向:添加显式捕获子句语法;提出一个“随处使用”的变体,推荐使用方法调用语法并允许编译器省略句柄/克隆调用。这意味着 .clone().handle() 将变得非常特殊,并且模糊了代码执行时间的界限。

稳定 cargo-script (rust-lang/rust-project-goals#119)

  • 暂无详细更新。

“解锁休眠的特质”

演化特质层次结构 (rust-lang/rust-project-goals#393)

  • 暂无详细更新。

原地初始化 (rust-lang/rust-project-goals#395)

  • 进度: 进行中
  • 联系人: Alice Ryhl
  • 负责人: Benno Lossin, Alice Ryhl 等

2025-10-22 @Darksonn 的评论摘要: 首个更新。总体进展良好,活跃讨论在新设立的Zulip频道 #t-lang/in-place-init 进行。自7月底语言团队设计会议以来的亮点:

  • 创建了专门的Zulip频道。
  • Olivier FAURE 分享了受C++启发的“保证值安置”新版本提案。
  • 开始收集“罗塞塔石碑”代码示例以比较不同提案(例如“如何在 Box 内部原地构造 Box<Mutex<MyType>>”)。
  • Taylor Cramer 基于 outptr 的提案演化,讨论了替代表示输出指针的方式。
  • Yoshua Wuyts 开始将“放置函数”提案重构为基于其他提案的高层语法糖。
  • Alice Ryhl 发布了更新,展示如何使 Init 特质对所有 Try 类型泛化,而不仅限于 Result
  • Yoshua Wuyts 开始记录放置函数与其他函数转换效果(如async、try、gen)的预期交互。

下一代特质求解器 (rust-lang/rust-project-goals#113)

  • 进度: 进行中
  • 联系人: lcnr
  • 负责人: Boxy, Michael Goulet, lcnr

2025-10-23 @lcnr 的评论摘要: 自上次更新以来:

  • 修复了rayon中的挂起问题,涉及多个PR。
  • 不透明类型支持接近完成,需要大量复杂更改(涉及借用检查、HIR类型检查、项边界、函数调用、方法选择、回退等)。
  • 还修复了一些独立问题和性能改进。
  • rust-analyzer 已完全迁移至使用新求解器(替代chalk),这是由 Jack Huey、Chayim Refael Friedman 和 Shoyu Vanilla 主导的重大工作。
  • 仍在跟踪剩余问题(项目看板61),大多数问题相对简单,预计未来几个月解决大部分,从而接近稳定。

可在 nightly 上稳定化的 Polonius 支持 (rust-lang/rust-project-goals#118)

  • 进度: 进行中
  • 联系人: Rémy Rakic
  • 负责人: Amanda Stjerna, Rémy Rakic, Niko Matsakis

2025-10-22 @lqd 的评论摘要: 自上次更新以来最有趣的进展:

  • polonius alpha 版本经过审查和更新后已落地。
  • 最后两个无关紧要的诊断失败已修复。
  • 已完成性能测试、crater测试,收集了crates.io上CFG大小、局部变量、贷款和区域数量等的统计数据。
  • 致力于借用检查的数据流:无环CFG上的单次分析,有环CFG上SCC的数据流分析。
  • Amanda 的 SCC 重构部分已落地。
  • lcnr 的不透明类型重构、嵌套项的借用检查等也修复了之前更新中提到的成员约束问题。
  • 还研究了流敏感指针分析的最新论文。
  • 开始了“作用域内贷款”算法重构,并使用CFG SCCs进行可达性加速。
  • 最后两个UI测试中的实际失败是正确性问题,与不透明类型的被捕获区域活性有关。最简单的修复会导致现在接受的代码出现破坏,正在尝试实现 Niko、Jack 和 I 提出的另一种解决方案。

寻求帮助的目标及其他目标更新

(此处列出多个目标,部分有简要更新,大部分暂无详细更新)

部分有更新的目标摘要:

  • 常量泛型 (rust-lang/rust-project-goals#100):2025-09-10举行设计会议,对仅限ADTs的初始扩展进行“氛围检查”,团队对逐步推进并首先关注ADTs持开放态度。
  • 发出代码生成中的重标记 (rust-lang/rust-project-goals#392):实验了几种在代码生成中发出重标记的方法,已确定一组值得社区反馈的更改。已创建支持在微小单线程Rust程序中查找Tree Borrows违规的BorrowSanitizer初始原型。
  • 完成 std::offload 模块 (rust-lang/rust-project-goals#109):秋季进行了多项改进,包括重构autodiff前端为适当的rustc内部函数、实现“类型树”以将类型信息传递给Enzyme、支持f16/f128类型、修复offload代码生成中的bug、重构offload前端、尝试通过dlopen在运行时加载Enzyme等。
  • 将Rust for Linux引入稳定Rust:编译器特性 (rust-lang/rust-project-goals#407):讨论了添加类似GCC/Clang中 -funsigned-char-Cunsigned-char 选项,以设置 c_char 的符号。同时讨论了分组目标修饰符标志的提议。#![register_tool] 相关工作等待RFC #3808。
  • 将Rust for Linux引入稳定Rust:语言特性 (rust-lang/rust-project-goals#116):更新了多个子特性的状态,包括Deref/Receiver(PR持续更新)、任意Self类型、derive(CoercePointee)、内联汇编中指向常量的指针(RFC进入FCP)、字段投影、提供以\0结尾的文件名(已稳定)、超特质自动实现RFC等。近期会议还讨论了TypeId布局保证、rustfmt格式问题以及Deref/Receiver实验中的重叠实现问题。
  • 原型Cargo构建分析 (rust-lang/rust-project-goals#398):第一个实现已添加,可根据配置生成时序HTML,9月无新进展。
  • 反射和编译时 (rust-lang/rust-project-goals#406):实现了仅支持元组和基本类型的初始MVP,可获取元组字段偏移和大小。确定了两种库暴露方式,决定先采用最终用户体验较好的版本。MVP落地后,将指导贡献者逐步向 Type 结构体和 TypeKind 枚举添加字段。下一步是限制从模块或crate外部访问结构体的信息,以遵循可见性规则。
  • 重构Cargo构建目录布局 (rust-lang/rust-project-goals#401):build-dir 已从 target-dir 中分离,计划在Rust 1.91.0中稳定。改进了现有布局测试,初始布局重组PR已发布并处于讨论/审查中。
  • Rust愿景文档 (rust-lang/rust-project-goals#269):在RustConf 2025和RustChinaConf 2025上进行了演讲更新。已开始认真规划最终文档形态,在完成前希望覆盖一些“盲点”,但总体访谈工作接近尾声。
  • rustc-perf 改进 (rust-lang/rust-project-goals#275):新的作业队列系统已在单个测试PR中投入生产测试,大部分工作正常,仍需完善和性能剖析,预计几周内可完全在生产中切换。
  • SVE和SME在AArch64上 (rust-lang/rust-project-goals#270):当前专注于提案的“非const”部分(“const”部分被新一代特质求解器阻塞)。T-types团队的FCP已完成,现在可以推进落地实现PR。David Wood计划拆分RFC以便“非const”部分独立推进。有三个有趣的T-lang设计问题需考虑:特质命名(提议 SizedSizeOfValPointee)、语法选择(如 T: =Foo 表示禁用默认绑定)以及版本交互下的隐式特质超特质边界处理(对于Rust 2024及默认方法的影响)。同时需要放松相关类型边界(如 Deref),可能涉及版本化的默认值变更。

其他众多目标

包括:为rustdoc团队添加章程、在a-mir-formality中进行借用检查、C++/Rust互操作问题空间映射、全面的Rust利基检查、解决cargo-semver-checks的阻塞项以并入cargo、开发保持FLS最新的能力、扩展Rust参考手册以指定更多语言方面、完成libtest JSON输出实验、运行更多GCC后端测试、稳定MemorySanitizer和ThreadSanitizer支持、稳定公共/私有依赖项、稳定rustdoc的doc_cfg特性、MIR移动消除、原型化一组新的Cargo“管道”命令、实现开放API命名空间支持、类型系统文档、不安全字段等。这些目标大部分在本报告期内暂无详细更新,部分正在寻求帮助。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计