如果没有 Rust 风格的借用检查,Rust 风格的所有权和生命周期是否可能?

Is Rust-style ownership and lifetimes possible without Rust-style borrow checking?

是否有可能一种编程语言始终拥有 Rust 风格的所有权和生命周期(用于自动内存管理),同时放弃任何时候只能存在一个对数据的可变引用的要求(用于抑制数据竞争)?

换句话说,Rust风格的所有权和生命周期和Rust风格的借用检查是两个可分离的概念吗?或者,这两个想法是否在语义层面上固有地纠缠在一起?

Would it be possible for a programming language to consistently have Rust-style ownership and lifetimes (for automatic memory management) while dropping the requirement that only one mutable reference to a piece of data can exist at any time (used to suppress data races)?

语言无所不能。

问题是放弃这个要求将是像 Rust 这样的语言中的 UB 嵌套:如果你放弃可变引用是唯一的那么它们就没有用处所以你只有引用(总是可变的)和它们唯一的东西do 是词法范围的,这意味着您可以持有对对象子部分的引用,并让第二个引用改变对象,使子部分无效(例如,对 vec 项的引用并清除 vec [0]), 第一个引用现在是 dangling, 它指向垃圾。

解决这个问题的方法是……添加一个 GC?从那时起,“rust 风格的所有权和引用”的价值就变成了……限制为不存在,因为您需要 GC 非词法自动内存管理,并且您的引用可以使对象保持活动状态,因此默认情况下所有类型都是仿射的不是很有用。

现在有用的(以及某些语言探索的)是 sub-normal types 可以选择加入,因此默认情况下类型是正常的,但可以 选择加入 根据需要是仿射的、线性的,甚至是有序的。这将是唯一类型安全措施。

If so, are there any existing languages which achieve this?

据我所知。

If not, why not?

因为没人写过?默认情况下,仿射类型对 Rust 很有用,但它们通常不是超级有用,因此大部分研究和设计都集中在线性类型上,线性类型提供更多保证,因此如果只有一小部分类型要使用,则更有用低于正常水平。

[0] 这表明“数据竞争”不仅仅与并发有关,它是整个 class 顺序代码中常见的问题(例如迭代器失效)