一句话:提出内建支持浅层与深层效应处理器的分离逻辑,实现局部推理并基于 Iris 完成模块化验证。
用户自定义效应与效应处理器为定界控制提供了一种模块化方法,但如何在同时存在效应处理器与堆可变状态等原始效应时模块化地规约和验证程序,至今仍缺乏答案。本文提出一个内建支持浅层与深层效应处理器的分离逻辑。程序片段的规约包含一个协议,描述该程序可能执行的效应以及可期望收到的回复;逻辑支持通过 frame 规则和 bind 规则进行局部推理,并建立在 Iris 之上,继承其高阶函数、用户自定义 ghost state 与不变式等特性。作者通过若干案例研究展示其表达力,包括:(1)控制反转的通用表述,将“推送”元素的生产者转为可按需“拉取”元素的生产者;(2)一个简单的协作并发系统,其中多个线程并发执行、可生成新线程并通过 promise 通信。
User-defined effects and effect handlers are advertised and advocated as a relatively easy-to-understand and modular approach to delimited control. They offer the ability of suspending and resuming a computation and allow information to be transmitted both ways between the computation, which requests a certain service, and the handler, which provides this service. Yet, a key question remains, to this day, largely unanswered: how does one modularly specify and verify programs in the presence of both user-defined effect handlers and primitive effects, such as heap-allocated mutable state? We answer this question by presenting a Separation Logic with built-in support for effect handlers, both shallow and deep. The specification of a program fragment includes a protocol that describes the effects that the program may perform as well as the replies that it can expect to receive. The logic allows local reasoning via a frame rule and a bind rule. It is based on Iris and inherits all of its advanced features, including support for higher-order functions, user-defined ghost state, and invariants. We illustrate its power via several case studies, including (1) a generic formulation of control inversion, which turns a producer that ``pushes'' elements towards a consumer into a producer from which one can ``pull'' elements on demand, and (2) a simple system for cooperative concurrency, where several threads execute concurrently, can spawn new threads, and communicate via promises.