“许多机械化后端按源语义规则建立编译器前向模拟:一条源运算可由目标数步匹配,选择阶段制造的中间状态由关系的阶段索引描述。最终的整体行为结论仍依赖所采用模拟转换定理的假设。”
形式陈述
设源、目标小步语义分别为
完整接口还包含三类端点责任:每个源初态
这一方法是证明编译阶段语义保持的常用构件,但方向要单独推导。对不含未定义行为的源程序,在上述终态、环境与进展条件下,每条源操作行为都可在目标中重现,即
直觉
前向模拟跟着源程序的录像向前播放。源每走一格,目标可以走一格、展开成数格,或在源格只是被优化掉的静默行政动作时暂时不走。关系
良基度量是一只不能无限下降的沙漏。它允许有限次零步匹配,又阻止证明者把真正的无限工作都藏成“目标无需行动”。度量必须随每次停顿严格下降;只说优化最终会赶上,或使用普通自然数但不证明下降,都没有完成进展责任。
例子与边界
源语言把 “skip; c” 先走一步化为
指令展开则给出正步例。取字宽
反例揭示包含方向:源初态只有一条标为
推论与应用
前向模拟易按源语义规则归纳:每种源指令只需展示目标生成代码怎样走到相关状态。多个阶段的前向模拟可在迹拼接与停顿度量兼容时复合;中间层若隐藏事件,复合前必须证明事件投影一致。
CompCert 的许多单个 pass 使用这种源步到目标多步的证明形状,再利用源的 receptiveness 与目标的 determinacy 等元性质取得整编译器需要的行为改进结论。编译器后向模拟直接从目标步出发,证明义务和处理非确定性的方式不同;两者互为对照,而非无条件同义词。
有限终止执行可对源步数归纳,连接每段目标
参考资料
- Xavier Leroy, “A Formally Verified Compiler Back-end,” Journal of Automated Reasoning 43(4), 2009, §§3–4.
- Sandrine Blazy and Xavier Leroy, “Mechanized Semantics for the Clight Subset of the C Language,” Journal of Automated Reasoning 43(3), 2009, pp. 263–288.
- Nancy A. Lynch and Frits W. Vaandrager, “Forward and Backward Simulations: I. Untimed Systems,” Information and Computation 121(2), 1995, pp. 214–233.