Skip to content

CEK 抽象机

CEK machine · Control Environment Kontinuation machine

以控制项、词法环境和续延帧执行传值 λ 演算的环境式抽象机器。

形式陈述

CEK 的名称来自 Control、Environment、Kontinuation。对左到右传值调用 λ 演算,机器配置写成 C,E,K。环境把变量映到值闭包 λx.e,E,续延为

K::=mtar(e,E,K)fn(v,K).

ar 保存尚未求值的参数及其环境,表示函数位置完成后再算参数;fn 保存已经得到的函数闭包,表示参数完成后进入函数体。核心转移为

x,E,Kλy.e,E,K若 E(x)=λy.e,E,e1e2,E,Ke1,E,ar(e2,E,K),λx.e,E,ar(e2,E2,K)e2,E2,fn(λx.e,E,K),λy.e2,E2,fn(λx.e,Ef,K)e,Ef[xλy.e2,E2],K.

最后一条用函数定义环境 Ef 扩展参数绑定,而不是使用调用点环境;这正是词法作用域。配置 λx.e,E,mt 是终止状态,其结果是闭包 λx.e,E。这里环境始终映到值闭包,不能一面保存任意未求值表达式,一面仍称其为本 CEK 的值环境。

CEK 是抽象机器的具体实例,其转移是运行语义。正确性可陈述为:闭合源项在 CBV 大步语义下求值到闭包,当且仅当从初始配置 e,,mt 出发的机器运行到表示同一函数值的终止配置。与源小步语义比较时,变量查找和帧管理可能对应零步或多步源归约,因此通常证明弱模拟,而非未经处理的逐步一一对应。

直觉

Control 保存当前要看的语法,Environment 负责把名字解析到定义时的函数值,Kontinuation 则把“算完之后做什么”拆成有限种帧。函数应用先压入 ar,函数位置完成后把帧换成 fn,参数完成后才进入函数体;两个帧的先后正好编码左到右 CBV。

直接替换语义在 β 步中复制实参值,CEK 不改写函数体文本,而是在环境中增加一条参数绑定。两种语义可证明产生相同观察结果,但变量解析机制和中间状态并不相同。

例子与边界

令初始环境 E0(z)=vz=λw.w,Ez。项 (λx.x)((λy.y)z) 的完整控制轨迹为

(λx.x)((λy.y)z),E0,mtλx.x,E0,ar((λy.y)z,E0,mt)(λy.y)z,E0,fn(λx.x,E0,mt)λy.y,E0,ar(z,E0,fn(λx.x,E0,mt))z,E0,fn(λy.y,E0,fn(λx.x,E0,mt))λw.w,Ez,fn(λy.y,E0,fn(λx.x,E0,mt))y,E0[yvz],fn(λx.x,E0,mt)λw.w,Ez,fn(λx.x,E0,mt)x,E0[xvz],mtλw.w,Ez,mt.

轨迹依次查找 z,用 yvz 进入内层恒等函数,再用 xvz 进入外层恒等函数;两个函数都从各自闭包环境扩展,最终返回 vz

基础 CEK 没有 store,因而不能直接表达可变引用或地址别名;加入地址分配和存储后得到 CESK 一类机器。call/cc 还要求把当前 K 变成可存储、可恢复的值,并补充相应转移。不能把这些扩展暗中塞回三元 CEK 定义。

推论与应用

CEK 把续延的高阶“剩余计算”重化成 ar/fn 数据帧,是从求值器经 CPS 与 defunctionalization 导出控制机器的代表例子。它也为控制流分析提供具体状态空间;进一步有限化地址和环境可得到静态抽象,但必须另证抽象转移覆盖具体运行。

机器可作为解释器蓝图,却不是实际 CPU 或性能模型。闭包分配、尾调用优化和环境裁剪可改变实现成本,只要仍保持本页状态转移所定义的可观察 CBV 行为。

参考资料
  • Matthias Felleisen and Daniel P. Friedman, “Control Operators, the SECD-Machine, and the λ-Calculus,” in Formal Description of Programming Concepts III, 1986,CEK-style control machines。
  • John C. Reynolds, “Definitional Interpreters for Higher-Order Programming Languages,” ACM Annual Conference, 1972。
  • David Van Horn and Matthew Might, “Abstracting Abstract Machines,” ICFP, 2010,CESK-style abstraction as a modern extension。