“CEK 机器通常把待求值表达式、环境与续延作为状态,不必预先把整个表达式编译成这里的指令列表。SECD 的操作数栈与 Dump 则更直接地展示了值的暂存和调用现场恢复。”
形式陈述
CEK 的名称来自 Control、Environment、Kontinuation。对左到右传值调用 λ 演算,机器配置写成
最后一条用函数定义环境
CEK 是抽象机器的具体实例,其转移是运行语义。正确性可陈述为:闭合源项在 CBV 大步语义下求值到闭包,当且仅当从初始配置
直觉
Control 保存当前要看的语法,Environment 负责把名字解析到定义时的函数值,Kontinuation 则把“算完之后做什么”拆成有限种帧。函数应用先压入 ar,函数位置完成后把帧换成 fn,参数完成后才进入函数体;两个帧的先后正好编码左到右 CBV。
例子与边界
令初始环境
轨迹依次查找
基础 CEK 没有 store,因而不能直接表达可变引用或地址别名;加入地址分配和存储后得到 CESK 一类机器。call/cc 还要求把当前
一等续延与call/cc在同一纯模型中补充Cap捕获帧和Cont(K)值:捕获不立即跳走,调用Cont时才抛弃调用处续延并恢复保存的K。嵌套exit/inner例分别得到6与16,检验两份保存现场的差别。
推论与应用
CEK 把续延的高阶“剩余计算”重化成 ar/fn 数据帧,是从求值器经 CPS 与 defunctionalization 导出控制机器的代表例子。它也为控制流分析提供具体状态空间;进一步有限化地址和环境可得到静态抽象,但必须另证抽象转移覆盖具体运行。
与SECD 机器相比,CEK 直接把源项放在 Control 中,并用一个
机器可作为解释器蓝图,却不是实际 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。