tom*_*598 5 memory-management lifetime object-lifetime rust borrow-checker
一种编程语言是否有可能始终具有 Rust 风格的所有权和生命周期(用于自动内存管理),同时放弃对一段数据在任何时间只能存在一个可变引用的要求(用于抑制数据竞争)?
换句话说,Rust 风格的所有权和生命周期以及 Rust 风格的借用检查是两个独立的概念吗?或者,这两个想法在语义层面上本质上是纠缠在一起的吗?
\n\n一种编程语言是否有可能始终具有 Rust 风格的所有权和生命周期(用于自动内存管理),同时放弃对一段数据在任何时间只能存在一个可变引用的要求(用于抑制数据竞争)?
\n
语言确实可以做任何事情。
\n问题是,在像 Rust 这样的语言中,放弃这个要求将是一个 UB 嵌套:如果你放弃唯一的可变引用,那么它们就没有任何用途,所以你只有引用(总是可变的),而它们唯一做的就是在词法范围内,这意味着您可以保存对对象子部分的引用,并让第二个引用改变对象,以使子部分无效(例如对 vec 项的引用并清除 vec[0]),第一个引用现在悬空,它指向垃圾。
\n解决这个问题的方法是给\xe2\x80\xa6添加一个GC?从那时起,“rust 式所有权和引用”的值就变得\xe2\x80\xa6 限制为不存在,因为您需要 GC 非词法自动内存管理,并且您的引用可以使对象保持活动状态,因此所有类型都可以默认情况下仿射不是很有用。
\n现在有用的(以及某些语言探索的)是选择加入次正规类型,因此默认情况下类型是正规的,但可以根据需要选择仿射、线性甚至有序。这只是一种类型安全措施。
\n\n\n如果是这样,是否有任何现有语言可以实现这一目标?
\n
据我所知。
\n\n\n如果没有,为什么不呢?
\n
因为没有人写过?默认情况下,仿射类型对 Rust 很有用,但一般来说它们并不是超级有用,因此大多数研究和设计都集中在线性类型上,线性类型提供了更多保证,因此如果只有一小部分类型会使用,则更有用低于正常水平。
\n[0] 这表明“数据竞争”不仅仅与并发有关,它是顺序代码中常见的一整类问题(例如迭代器失效)
\n