返回

文章详情

Valen 的内存安全:一种新型的借用检查

Hacker News2026年10月11日 12:06

2026年10月11日——这篇文章是关于 Valen 的新灵活借用检查器。欢迎大家!你们都知道我,我喜欢探索新的内存安全方法并以奇怪的方式将它们融合在一起。这是我永恒追寻内存安全圣杯的一部分:一种像 Rust 的借用检查一样强大,同时又像引用计数或垃圾回收一样简单灵活的东西。我早就怀疑,要找到这个圣杯,我们必须解决三个内存安全挑战:我们能否做一个更宽松的借用检查器?我们能否让借用检查器处理更复杂的数据?这两个系统是否可以同时工作?我知道这听起来模糊且艰深!在下面我会解释这些都意味着什么,以及 Valen 是如何找到它们的解决方案的。这篇文章主要集中在第一个方面:Valen 更加宽松的借用检查器。因此在这篇文章中,我将讨论它是什么,它能做什么,以及它是如何工作的。在本文中,为了清晰性,我稍微调整了一些语法糖:自动解除引用,直接索引结构体 (my_vec[0]),以及从组中推断类型 (entity in world.entities[]) 将在11月推出。这些语法调整之外,借用检查器适用于我们讨论的所有内容。并且在此过程中,我会解释一些奇怪的细节,例如:编译器如何记住引用指向何处。Valen 只有一种借用引用,而其他借用检查器有两种。Valen 的借用检查器是如何设计的,以便它可以调用 Rust 代码。此外,这篇文章非常长,并且包含大量上下文,所以我会告诉你什么时候可以跳过。让我们深入探讨!组借用:一个近乎错过的机会和巨大的潜力(这只是我喜欢讲述的背景故事,请随便跳过这一部分!)Valen 的方法是基于我的朋友 Nick Smith 提出的“组借用”提案。它围绕一个核心概念构建,即编译器记住引用指向的位置(我稍后会解释这一点),并利用这些信息检查程序是否是内存安全的。这个设计的生命起初并不顺利;它几乎被时间的洪流淹没。它最初是考虑 Mojo 而设计的,但遗憾的是,尽管我努力争取,我还是无法说服高层管理者我们应该使用它。组借用在成功之前就已经死了。但我知道它有巨大的潜力,如果它能够以某种方式进入世界。所以我们花了几个月时间来完善解释并找出它的好处,并在去年写了一篇关于它的文章,希望其他语言能够采纳。果然,它传播得很广!Google 的 Carbon 语言完全转向了组借用(甚至对我们的文章表示感谢,这真是太好了!)Ante 开始将其整合到他们的语言中,见“共享可变性和稳定性”。Plecra 的排除类型正在用组借用和 GhostCell 的概念重新设计 Rust 的借用检查器。Zeta 将组借用与不相交性结合起来,将运行时事实因素转化为编译时内存安全。Fang 正在将其整合到他们的设计中,见“Fang 中的循环引用”。而现在,我的 Valen 将组借用与 Vale 的方法结合,并使其能够与 Rust 代码互操作。这些语言都在围绕同样的挑战努力:如何使借用检查器更加灵活。例如,Valen 希望制作一个足够灵活的借用检查器,以便它可以与引用计数和代际引用一起工作,而 Carbon 希望制作一个足够灵活的借用检查器,以便它能够与 C++ 代码一起工作。这是困难的,因为在借用检查与其他方法之间存在根本的冲突。可以这样总结:借用检查拥有“共享-异或-可变”的限制:如果你持有一个对象的引用,则其他人不能更改该对象。而其他方法希望允许持有对象的引用,同时让其他人更改它。你可能会想,“肯定没有办法解决这个问题。”确实看起来是这样!但组借用实际上解决了这个冲突,它通过将“共享-异或-可变”放宽为“无使用后释放”来实现。这听起来很神秘,可能不会有任何意义,但在我解释组借用的工作原理时将会有所了解。那么,让我们看看组借用能做什么,然后我会解释它是如何工作的。组借用能做的事情组借用可以在不增加运行时成本的情况下提供程序内存安全。它在编译时捕获使用后释放问题,并以较少的限制捕获到问题。以下是一个在编译时捕获使用后释放错误的示例:struct Entity { hp int;} struct World { entities Vec < Entity >;} func main () int { let world = World ( Vec< Entity > . new ( ) );world . entities . push ( Entity ( 42 ) );let first_ref = &world . entities [ 0 ];world . entities = Vec< Entity > . new ( );// 编译错误:在无效化后使用了一个借用 return first_ref . hp;}

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

☕请我喝杯咖啡