Rust 语言官方规范的制定进展


Rust 团队在几个月前接受了 RFC 3355 的提议,决定开始制定 Rust 语言的官方规范。由 Eric(Rust Reference 的维护者)、Felix(Rust 语言团队)、Joel(Rust 基金会)和 Mara(RFC 的作者)来共同推动这项工作的进行。

截至今日,Eric 四人代表规范团队发文介绍了这项工作的最新进展,以及后续的一些其他规划。

Editor

第一步是填补 RFC 中规定的“editor”角色。规范的协调和编辑职责被特意委托给 Rust 基金会,以确保工作的连续性。

由于没有面试到合适的人选,基金会选择考虑内部选择作为替代方案。作为其现有工作的一部分,该基金会的技术总监 Joel 表示愿意担任该职位的候选人。Eric、Felix 和 Mara 等也同意了这一提议,“因为他在行业标准和技术编辑方面拥有丰富的经验,并且与 Rust 项目关系密切”。

规范团队(Specification Team)

由于相关工作不可能只由 editor 单人完成,因此还在围绕规范工作组建一个团队,即规范团队(Specification Team),作为语言团队的一个子团队。

最初成员包括:

  • Felix Klock (team lead)
  • Mara Bos (team lead)
  • Joel Marcey (team member, editor)
  • Eric Huss (team member)

利益相关者Stakeholders

将挑选并维护一份利益相关者名单,他们将担任顾问和审阅者。最初名单包括:

  • Rust 语言团队全体成员
  • 来自 types team 的一名或多名代表
  • operational semantics team 的一名或多名代表
  • 来自 Ferrocene 的一名或多名代表(高可靠性/可用性,例如汽车行业。)
  • Formal Methods Research and Development 的一名或多名代表
  • Operating System Development的一名或多名代表 (Rust for Linux; Microsoft)

Authority and Approval

虽然规范团队负责撰写和编辑规范,但 Rust 语言的定义权仍属于相关团队,如语 language team 和 library API team。这些团队应在必要时让其他团队/子团队参与进来,例如提出问题、提名问题进行​​讨论以及请求 FCP 批准关键决策。

为了让规范团队能够在不受审批流程限制的情况下生成内容并进行迭代,我们将在工作存储库中制定规范草案。在一些工具的帮助下,我们将公开跟踪哪些项目仍需要团队批准,以及哪些项目受到利益相关者的公开关注。

我们将所有变更分类为次要变更或重大变更。较小的更改是对规范团队来说似乎没有争议或微不足道的项目。例如,语言团队已经通过 FCP 批准的更改、排版和语法修复、初衷明确的澄清,以及类似的令人兴奋的更改。重大变更是那些可能有问题、重要或有争议的变更。规范团队和相关权威团队的任何成员以及任何规范利益相关者都可以将更改标记为重大更改。对规范的重大更改必须经过通常的批准流程(例如语言 FCP)才能出现在规范的已发布(非草案)版本中。

语言和规范团队应努力拥有至少一名共同成员(例如 Felix)充当联络人,以帮助确保我们对次要变更与重大变更的理解保持同步。

目标

规范团队的目标是创建和维护 Rust 规范。Rust 规范的目的是提供权威资源来确定哪些源文本是有效的 Rust 程序以及此类程序的行为方式。

一个理想的规范既要:

  • 为当前和未来的 Rust 版本定义给定 Rust 程序的语义的规范边界
  • 提供与该规范实例相关的 Rust 版本特有的语义描述细节。

特定于版本的详细信息的规定可以直接在规范中提供,也可以通过委托给相关 Rust 团队拥有的其他文档来间接提供。

渐进式开发

既要为当前和未来的 Rust 版本提供规范性约束,又要描述当前 Rust 版本的细节。因此该团队决定将通过迭代和渐进的方式最大限度地提高其工作价值。

我们预计该规范的早期版本将重点关注提供当前 Rust 版本的详细描述。这样的规范可以从现有的工作成果(如 Ferrocene 规范)中衍生出来,因为该规范明确侧重于提供特定 Rust 版本的详细说明。对这些特定版本描述的反馈意见将帮助我们了解如何以最佳方式在规范中制定规范性约束。

由于我们前面提到的对当前 Rust 版本的关注,规范的早期版本可能会有一些空白,其中规定的界限比必要的更加不精确。例如,规定“不安全的 Rust 代码可能会导致未定义的行为”没有提供有关如何编写定义良好的不安全代码的指导。即使存在这种不精确性,规定的界限仍然可以提供有用的高级保证(例如“安全的 Rust 不会导致未定义的行为”)。规范的未来版本会添加更多说明性细节(例如“不安全的 Rust 代码在以下条件下不会导致未定义的行为:……”),直到我们达到所需的精度级别。

范围

规范应至少涵盖 Rust 语法和语义的以下领域某些部分可能与特定后端或目标实现技术(如 inline asm)有内在联系。

  • Rust 的语法,通过 Backus-Naur Form (BNF) 或 BNF 的一些合理扩展来指定。
  • Macro expansion
    • Macro-by-example (macro_rules) transcription; Hygiene
    • cfg 属性
    • Procedural macros; attributes 以及 derive
  • 路径和标识符解析
    • Modules
  • 静态语义
    • 类型定义;类型表达式;布局
    • 类型推断和类型检查;子类型化
    • 生命周期和借用检查
  • 泛型;关联项解析和 Trait solving
  • 安全 Rust 的操作语义
    • 绑定表格;匹配表达式;drop glue
    • 值的移动和复制;借用
    • field projection; method dispatch
      • operator overloading
  • 不安全 Rust 的操作语义
    • memory model
    • inline assembly
  • Const evaluation
  • Crates 和 crate linkage

此列表可随着时间的推移而扩展。

Presentation

Rust 规范将是一个可公开访问的文档,类似于所有其他 Rust 文档(并具有相同的许可条款)。文本将以英语编写,并且仅使用规范本身定义的技术术语或在免费在线词典中具有明确定义的技术术语。

规范中的各个项目都可以被引用和命名:不仅可以在超链接中,而且在文本中(例如“[syntax.patterns.arm.5]”)。在可能的情况下,这些名称/项目引用应在不同版本的规范中持续存在。

规范的迭代应包括突出显示版本之间差异的 renderings。(参见 Ada 参考手册等。)

Rust 规范将以鼓励志愿者贡献的格式进行维护,即使规范团队预计必须对每个贡献进行重新授权,以保持规范的一致性。

虽然完整性和正确性是首要任务,但团队将尽力使规范尽可能易于理解。理想情况下,任何 Rust 程序员都应该能够深入研究并找到他们可能遇到的任何语言问题的答案,而无需询问已经非常熟悉该文档的“language lawyer”。

发布节奏

Rust 发布将独立于规范审批流程进行。

如果给定版本的规范尚未获得批准,则该版本将在没有相关规范的情况下发布。(不过,该团队可能会在后续提供与给定版本相关的规范。)

这是设计使然。规范工作不得为项目增加需要克服的新障碍,以履行其现有义务,例如 6 周的发布周期。

团队愿景是最终能够达到自动交付更新规范的程度,并且能够按照项目的 6 周发布节奏完成。但是,从短期和中期来看,其希望能够自由地滞后于 6 周的发布节奏。当规范团队为以前未涉及的领域逐步添加新内容,或大幅缩小当前版本规范的规定范围时,滞后于 Rust 发布计划的能力可能会特别有用。

虽然规范开发过程不会阻止发布,但语言功能的更改应与规范的相关更新相结合。一旦开始发布与特定版本相关的规范,那么如果没有规范团队批准对当前草案规范的相应拉取请求,则对当前规范中记录的语言功能的更改就无法稳定。规范中未记录的语言功能的更改可以在不更新规范的情况下稳定下来,但需要规范团队成员确认相应的功能未记录。

通过强制执行新功能在稳定之前必须成为规范的一部分的规则,有望消除规范与 Rust 版本之间潜在滞后的主要根源。

下一步

  • 为团队制定定期会议时间表。
  • 确定利益相关者名单。
  • 制作第一个“demo product”,供利益相关者审查。

相關推薦

2023-04-07

持C、C++、Java、Go、Fortran、Python、JavaScript等多种标准编程语言,涵盖编码、编译、调试、性能分析、软件交付等一整套开发流程,满足openKylin平台上软件开发需求。3月主要进展如下: kylin-code移除反馈报告,关闭自动更新,

2022-10-01

持C、C++、Java、Go、Fortran、Python、JavaScript等多种标准编程语言,涵盖编码、编译、调试、性能分析、软件交付等一整套开发流程,满足openKylin平台上软件开发需求。本月主要进展如下: 完善DEB打包配置界面; 测试插件基本

2022-04-02

本文转载自《Go+ 下个里程碑:超越 cgo,无缝对接 C 语言》,作者许式伟(@xushiwei)是七牛云创始人兼 CEO,创造了 Go+ 语言。 去年(2021年)Go+ 的 slogan 从 “面向数据科学” 的语言升级到了 “面向工程、STEM 教育与数据科学”

2022-11-17

持C、C++、Java、Go、Fortran、Python、JavaScript等多种标准编程语言,涵盖编码、编译、调试、性能分析、软件交付等一整套开发流程,满足openKylin平台上软件开发需求。本月主要进展如下: 按照计划一期功能已开发完成,主要支

2022-09-20

 Phoronix 指出,鉴于 Rust 的内存安全性,用该语言编写的媒体编码器/解码器一直是一个很有意义的领域,GStreamer 的开发人员也一直对这种现代编程语言的使用很感兴趣。目前,相关的 GStreamer 合并请求已落地,以

2022-12-23

Rust 不能停止创新,但也不能无限制地任由其发展。因为语言的复杂性和规模是有代价的,这与 Rust 让人们编写可靠和高性能软件的使命不一致(他认为需要让编程语言更简单、更小、更易于使用)。仅仅保持向后兼容性并不意

2023-06-22

e)团队主要负责监督其他 Rust 团队出现的问题。 但随着语言本身的发展和社区的壮大,Rust 核心团队的权限变得越来越高,因为他们对 Rust 语言的动态拥有最高决策权,其他团队无法影响他们。此前我们就报道过 Rust 审核

2023-04-27

things”,也不能使用常用的标准库。同样,对于 Rust 编程语言必不可少的更复杂的概念(如 borrow-checking)也尚未实现;如果没有这些功能, gccrs 将不会被认为是完整的。我们认为这会给不知情的用户带来很多困惑,他们可能会

2023-04-12

个核心目的是帮助确保当你遇到通过标记列出与 Rust 编程语言有关联的产品、项目或资源时,可以更好地确保其真实性以及与 Rust 基金会/Rust 项目的关联。“我们希望在 Rust 社区中灌输对该政策的信心,并使你能够将其用作有用

2022-09-17

开发往往是“闭门造车”。 而他们选择 Rust 作为项目的语言,是因为它可以在不影响性能的情况下以内存安全的方式完成 C 可以做的事情。Cloudflare 还为 Rust 实现了自己的 HTTP 库,以满足他们所有不同的需求。Pingora 采用多线程

2023-09-08

Packaging SIG Packaging SIG负责维护openKylin社区的软件包打包规范,维护公共软件包,以及协调和决策社区版本发布过程中的包依赖问题。8月主要进展如下: 处理RISC-V架构gcc安装时,cpp依赖版本号报错问题。 kwin安装编译依赖laye

2023-04-08

本,一直延长 Manifest V2 的使用日期。近日,谷歌又在官方邮件列表的帖子中宣布 Manifest V2 的使用期限延期到 2024 年,具体时间未知。 Chrome 开发者网站上的官方 Manifest V2 停用页面已经更新了最新的时间线。现在看来,移除

2023-01-03

bug,一些简单的新特性也会加入,比如: 支持Rust语言和Lua语言的代码高亮 我们在发布公开测试版beta1时,也会手动上传M1的安装包!   《墨子》电子书的制作 另外,在公开测试版的研发中,我们会将在

2022-10-15

复杂。许多人认为 Rust 是构建适合当今架构的工具的最佳语言。 Web 浏览器是需要大规模可扩展性的应用程序的一个很好的例子,因此 Rust 是由开发 Firefox 的非盈利公司 Mozilla 创建的也就不足为奇。Mozilla 的开发人员研究了他们