“CEK 机器直接以源项为 Control,并把“待算实参”“已有函数”等细粒度工作统一放进 $K$ 帧。这里的 SECD 先编译为指令,普通中间值进入 $S$,函数边界才把调用者 $S,E,…”
形式陈述 ​
CEK 的名称来自 Control、Environment、Kontinuation。对左到右传值调用 λ 演算,机器配置写成
最后一条用函数定义环境
CEK 是抽象机器的具体实例,其转移是运行语义。正确性可陈述为:闭合源项在 CBV 大步语义下求值到闭包,当且仅当从初始配置
直觉 ​
Control 保存当前要看的语法,Environment 负责把名字解析到定义时的函数值,Kontinuation 则把“算完之后做什么”拆成有限种帧。函数应用先压入 ar,函数位置完成后把帧换成 fn,参数完成后才进入函数体;两个帧的先后正好编码左到右 CBV。
直接替换语义在 β 步中复制实参值,CEK 不改写函数体文本,而是在环境中增加一条参数绑定。两种语义可证明产生相同观察结果,但变量解析机制和中间状态并不相同。
例子与边界 ​
令初始环境
轨迹依次查找
基础 CEK 没有 store,因而不能直接表达可变引用或地址别名;加入地址分配和存储后得到 CESK 一类机器。call/cc 还要求把当前
推论与应用 ​
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。