没有Rust风格的借用检查,是否可能实现类似Rust风格的所有权和生命周期?

5

一个编程语言是否能在保持 Rust 风格的所有权和生命周期(用于自动内存管理)的同时,放弃只允许同时存在一个可变引用以防止数据竞争的要求?

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


2
生命周期对代码生成没有任何影响,它只是静态分析。因此,它的价值在于安全性。Rust和C++都具有相同类型的所有权系统,通过拥有独立的值和引用类型来实现。它们使用RAII在值超出范围时销毁值。因此,如果没有借用检查器,我会说你得到了C ++。 - kmdreko
3
我投票关闭此问题,因为它不属于讨论范围。虽然语言设计问题可能是讨论范围内的,但是对具有不同特征的语言潜力的猜测只会引发观点。或者这就像在钓语言推荐一样,同样不在讨论范围之内。我建议在另一个论坛上提出这个问题。 - kmdreko
@turbodiesel4598 你所说的“无论它们在此期间传递到哪里”是什么意思?如果从函数返回std::unique_ptr或将其传递给线程,则当原始指针超出范围时,它不会被销毁 - 基本上与Rust中的Box相同。确实,如果您获取unique_ptr内容的原始指针,则不会延长unique_ptr的生命周期,但这不再是传递智能指针。 - trent
3
欢迎来到Stack Overflow!由于目前问题的形式似乎不适合在此讨论,您可能希望查看其他资源。更为开放的问题和讨论可以在 Rust用户论坛Rust subredditRust Discord服务器 或者 Stack Overflow Rust聊天室 上进行。 - Shepmaster
1
@turbodiesel4598 Stack Overflow 是一个针对具体代码相关问题的问答平台。开放性问题不适合在此讨论。Shepmaster 已经提供了一些更适合自由形式讨论的备选场所。 - Jared Smith
显示剩余13条评论
1个回答

5
编程语言是否能够像 Rust 一样在自动内存管理方面具有所有权和生命周期的一致性,同时放弃只允许同时存在一个可变数据引用的要求(用于防止数据竞争)?
一个编程语言可以做任何事情,所以当然可以。问题在于,在像 Rust 这样的语言中删除这个要求会导致 UB 嵌套:如果你放弃可变引用是唯一的,则它们就没有用处,因此你只剩下引用(始终可变),它们唯一的作用是词法作用域,这意味着你可以持有对象的子部分的引用,并且有第二个引用对对象进行修改,使得子部分无效(例如对 vec[0] 进行清除的引用与对 vec 子项的引用),第一个引用现在是悬空的,它指向垃圾。
解决方法是…添加一个 GC?从那时起,“Rust 风格的所有权和引用”的价值变得…有限到不存在,因为你需要一个 GC 非词法自动内存管理,并且你的引用可以使对象保持活动状态,因此默认情况下拥有所有类型并不是非常有用。
现在,一些语言正在探索的是什么可能有用的是 子结构类型 能够选择加入,因此类型默认情况下是正常的,但可以在需要时选择成为线性、按序或甚至有序。这将 仅仅 是一种类型安全措施。
那么,是否存在实现这一点的现有语言?
据我所知,没有。
如果没有,为什么没有?
因为还没有人写过这样的语言。默认情况下拥有亚线性类型对 Rust 很有用,但它们在一般情况下并不是非常有用,因此大部分研究和设计都集中在线性类型上,如果只有你的一小部分类型将是子结构类型,则提供更多保证,因此更有用。
[0] 表明“数据竞争”不仅与并发有关,它是一个通常在顺序代码中发生的问题类(例如迭代器无效)。

1
只是为了明确,我不关心由于能够从不同的地方突变对象而重新出现的问题(例如悬空指针、数据竞争等)。第一个问题仅涉及在不强制执行借用检查的情况下,能否一致地实现所有权和生命周期系统以处理编译时丢弃(无GC)。根据您的回答,我不确定您是否是肯定还是否定。 - tomdodd4598
如果你想要简短的回答,我的回答是“当然可以,但这有什么意义呢”。你所要求的基本上就是带有词法指针的C++。肯定不是不可能的,但我不确定它是否有用。 - Masklinn
因为使用这样的系统,您可能比C++的智能指针实现更多的编译时安全(在此基础上没有超出基本作用域的"生命周期语义")。 - tomdodd4598
当然,你确实比C ++获得更多的编译时安全性,但是你说你不关心语言仍然充满漏洞,所以收益似乎受到限制。你基本上正在解决UAF和一些悬垂指针的子集。因此,我无法想象它是否值得努力或建立一种与C ++或Rust竞争的语言:“比C ++更好,但实际上并不好”并不是一个很好的标语。当然,你可以自由地去探索这个领域,但是我不明白为什么你要这样做,这只是我的看法。 - Masklinn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接