← 最新论文
💻 computer science

Yarrow: Reconciling Effects Handlers and Region-Based Memory Management

本文介绍了 Yarrow,一种新的类 ML 语言,它通过开发 Yarrow 逻辑(YL)——一种在 Iris 框架内被证明是健全的正式程序逻辑——成功地将代数效应与基于区域的内存管理结合在一起,从而为诸如检查点恢复和异步计算等复杂应用实现安全、模块化的推理以及高效的、无需垃圾回收的执行。

原作者: Anders Alnor Mathiasen, Amin Timany, Lars Birkedal

发布于 2026-07-20
📖 1 分钟阅读☕ 轻松阅读

原作者: Anders Alnor Mathiasen, Amin Timany, Lars Birkedal

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

想象一下,你正试图构建一个超高效的计算机程序,但你却在两种截然不同的工具管理方式之间犹豫不决。一方面,你有一个虽然好用但动作缓慢的**垃圾回收(Garbage Collection)机器人,它不断地在你的工作空间里徘徊,捡起你掉落的旧工具并把它们扔掉,以免你耗尽空间。它是安全的,但它会占用你实际工作的时间。另一方面,你有一个严格的基于区域的内存(Region-Based Memory)**系统,你为一项任务构建一个特定的“盒子”(即区域),把所有的工具都放进去,当任务完成后,你瞬间粉碎整个盒子及其包含的一切。它速度极快,但它必须遵循一条严格的规则:你必须完成任务,收好工具,并离开盒子,然后才能开始下一个任务。

现在,想象一下你想把**代数效应(Algebraic Effects)**加入到这个组合中。把这想象成一个神奇的“暂停与恢复”按钮。它能让你在任务中途停下来,把问题交给别人处理,然后又能准确地从原地继续工作。问题在于,这个神奇的按钮打破了内存盒子那套严格的“完成并离开”规则。如果你暂停了一项任务,把它交给别人处理,而那个人又暂停了任务,你可能会尝试去拿取一个已经被粉碎的盒子里的工具。这会造成危险的混乱,导致你的程序崩溃或丢失数据。长期以来,计算机科学家们认为你无法在同一个程序中同时拥有内存盒子的速度和暂停按钮的灵活性。

这篇论文介绍了一种名为 Yarrow 的新编程语言,它终于让这两个朋友和睦相处了。作者 Anders Alnor Mathiasen、Amin Timany 和 Lars Birkedal 创造了一套规则(一种称为 Yarrow 逻辑的逻辑),充当一名安全检查员。这位检查员知道如何处理“暂停与恢复”这种魔法,而不破坏内存盒子。他们通过数学方法证明了这是可行的,展示了即使在程序因暂停按钮而在时间中跳跃时,你依然可以使用快速、即时清理的内存盒子。他们通过几个例子(如保存游戏状态和同时处理多个任务)测试了这一点,证明了程序可以在不需要缓慢的垃圾回收机器人的情况下,运行得更快且更安全。

Yarrow 的故事:驯服时间的记忆

让我们深入了解 Yarrow 是如何解决这个谜题的。为了理解这场胜利,我们首先需要看到反派:**栈式纪律(stack discipline)分隔续体(delimited continuations)**之间的冲突。

在计算机内存的世界里,想象一叠盘子。当你开始一项工作时,你在顶端放一个新的盘子(一个“区域”)。你完成工作后,就把盘子拿走。这就是“栈式纪律”。它简单、安全且快速。但随后,**效应处理器(Effect Handler)**出现了,它是那个神奇的暂停按钮。当你按下这个按钮时,计算机停止运行,保存当前状态,并跳转到程序的另一部分来处理问题。当它跳回时,就像是时间旅行。

危险之处在于:如果你暂停了一项任务,你正在工作的那个“盘子”(内存区域)可能会因为程序认为任务已结束而被粉碎。但当你跳回时间点恢复执行时,你却试图去拿取那个已被粉碎的盘子上的工具。在普通的程序中,这是一场灾难。在过去,为了避免这种情况,程序员必须使用缓慢的“垃圾回收”机器人,因为机器人足够聪明,即使盘子看起来空了,也能知道哪些工具仍在被使用。

本文作者提出了一个大胆的问题:我们能否在拥有这些“时间旅行式”暂停的同时,依然保留快速、即时粉碎的内存盒子?

他们说可以,但前提是我们必须非常小心地控制如何进行暂停。他们发现了两种暂停类型之间的关键区别:

  1. 单次效应(One-Shot Effects,即“仅一次”的暂停): 想象你暂停了一项任务,把任务交给一位朋友,他们只做一次工作,然后就把任务还给你。在这种情况下,内存盒子是安全的。作者展示了当你暂停时,内存盒子会随任务一起被“捕获”。当你恢复时,盒子会完全恢复到原样。这就像冻结电影中的一个场景;当电影重新播放时,道具依然在那里。
  2. 多重效应(Multi-Shot Effects,即“重复”的暂停): 现在想象你暂停了一项任务,而你的朋友可以多次使用这个暂停按钮,反复重启该任务。这变得棘手了。如果你暂停,内存盒子会被捕获。但如果你的朋友再次使用暂停按钮,他们本质上是在尝试两次使用同一个盒子。作者解释说,在这种情况下,在第一次使用后,内存盒子必须被视为“已粉碎”。如果你尝试第二次使用该盒子里的工具,是不安全的。论文证明了你仍然可以使用这些多重暂停,但你必须严格遵守规则:你只能使用盒子内的工具一次

为了实现这一点,团队构建了 Yarrow 逻辑 (YL)。把这种逻辑想象成一个高级的游戏规则手册。它不仅检查代码编写是否正确,还会实时追踪内存栈的“形状”。它确切知道哪些内存盒子当前处于活跃状态,以及哪些盒子已被暂停按钮捕获。

作者不仅仅是靠直觉,他们证明了其有效性。他们使用了强大的数学工具 Iris(一种分离逻辑框架)和 Rocq Prover(一个检查数学证明的计算机)来验证每一个步骤。他们证明了,只要你遵循 Yarrow 逻辑的规则,即使程序在时间中跳跃,你的程序也永远不会因为内存错误而崩溃。

案例研究:让 Yarrow 接受测试

为了证明 Yarrow 不仅仅是一个理论,作者构建了几个现实世界的例子来测试它。

  • LIFO 数据结构(栈): 他们构建了一个“后进先出”的栈(就像一叠煎饼)。通常,这些栈是用缓慢的垃圾回收内存构建的。在 Yarrow 中,他们使用快速的基于区域的内存构建了它。结果如何?这个栈更安全、更快,因为它不需要垃圾回收器来清理那些“煎饼”。
  • 检查点(存档游戏): 想象你在玩一款可以保存进度并在稍后重新加载的视频游戏。作者创建了一个系统,让你能够“保存”程序的当前状态(检查点)并“重新加载”它。他们证明了即使程序在时间中前后跳跃,用于检查点的内存也会得到安全管理。如果你尝试使用一个已经被使用过的检查点(多重效应),系统会识别出这是不安全的,并阻止你使用旧的、已粉碎的内存。
  • 异步计算(多任务处理者): 他们展示了如何处理同时发生的多个任务,比如处理多个用户的 Web 服务器。通过使用区域,他们避开了缓慢的垃圾回收器,使服务器更加高效。

结论:我们已知与未知

论文非常明确地阐述了它所取得的成就。它正式证明了你可以将代数效应(暂停按钮)与基于区域的内存(快速盒子)结合起来,而不会破坏安全性。他们创建了一种新语言 Yarrow 以及一种逻辑 YL,使得这一切成为可能。他们使用计算机证明助手进行了验证,因此我们可以非常确信该逻辑是成立的。

然而,论文也划定了一条界限。它明确反对在多次使用同一个内存盒子的情况下使用多重暂停(重复暂停)的想法。如果尝试多次使用一个已被“捕获”的内存区域,论文证明这是不安全的。作者拒绝了通过“复制”内存盒子来使其适用于多次使用的想法;相反,他们强制执行一条规则,即内存会在第一次使用后被回收。

他们还提到,虽然他们拥有数学和逻辑,但目前还没有构建出一个完整的、运行中的计算机程序(原型运行时)来测量其在现实世界中到底有多快。他们建议构建一个原型将是下一步极佳的研究方向,以观察现实世界中的速度提升。他们也指出,这种方法适用于特定类型的内存管理,并且将其与其它复杂系统(如 Java 虚拟机)结合可能会很困难,目前属于未定义行为。

简而言之,Yarrow 是一个巨大的进步。它表明我们不必在垃圾回收的安全性与手动内存管理的快速之间做出选择。只要我们遵守时间旅行式暂停的限制,通过正确的规则,我们可以兼得两者的优点。作者们奠定了数学基础,证明了这种复杂的内存与时间的舞蹈可以安全地进行,为未来的工程师构建快速、安全的程序留下了大门。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →