“机器把控制、环境、存储或续延显式放进配置,并通过解码关系与源小步语义建立模拟。与大步语义比较时,通常先证明终止程序的结果对应,再单独处理错误与发散;小步额外保留中间行为。”
形式陈述
大步操作语义以归纳判断
有状态语言把判断扩展为
直觉
大步语义像一个递归解释器的规格:先求子表达式的结果,再组合成整体结果,中间小步骤不进入判断。它让“这个程序算出什么”非常直接,也使按语法结构证明性质较为简洁。代价是路径被压缩掉了:两个以相同值结束但求值顺序不同的程序可能得到同一个判断。更关键的是,在普通归纳大步语义中,发散和卡住都表现为“无法构造推导”,需要额外机制才能区分。
例子与边界
对
边界例子是无限循环与类型错误:在最朴素的大步语义中,while true do skip 与 1 true 都没有
推论与应用
大步语义常用于定义解释器、常量求值和表达式语言的参考规范。证明算法正确性时,可对求值推导树归纳;编译器正确性也常陈述为源程序与目标程序的大步结果一致。
与小步语义的对应关系是重要校验:对终止程序,通常证明
由于大步判断压掉中间配置,它适合证明输入—结果关系,却不能直接提供轨迹语义所需的逐步路径;检查中间安全状态、并发交错或时序性质时,通常先选小步转移系统,再运行模型检查或抽象解释算法。
参考资料
- Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016,Parts I–XVIII。
- Gordon D. Plotkin, A Structural Approach to Operational Semantics, DAIMI FN-19, 1981; reprinted 2004,Full report。