证明程序的等效性

时间:2017-06-22 15:18:18

标签: proof formal-verification formal-methods proof-of-correctness

优化编译器的最终目标是在程序空间中搜索与原始程序相当但速度更快的程序。对于非常小的基本块,这已经在实践中完成:https://en.wikipedia.org/wiki/Superoptimization

听起来困难的部分是搜索空间的指数性质,但实际上并非如此;困难的是,假设你找到了你正在寻找的东西,你如何证明新的,更快的程序真的与原始程序相同?

上次我研究过,在某些情况下证明程序的某些属性已经取得了一些进展,特别是当你谈论标量变量或小的固定位向量时,特别是在非常小的范围内,但实际上并没有证明等价当您谈论复杂的数据结构时,程序规模更大。

有没有人想出办法来做到这一点,甚至'模拟解决这个我不知道如何解决的NP难搜索问题'

编辑:是的,我们都知道暂停问题。它是根据一般情况定义的。人类是一种存在证明,可以为许多感兴趣的实际案例做到这一点。

1 个答案:

答案 0 :(得分:1)

你提出了一个相当广泛的问题,但是让我看看我是否能帮助你。

John Regehr在调查一些关于超级优化者的相关论文方面做得非常好:https://blog.regehr.org/archives/923

问题是你真的不需要为这些类型的优化证明整个程序的等价性。相反,您只需要证明在CPU处于特定状态时,2个代码序列以相同的方式修改CPU状态。为了在许多优化(即按比例)中证明这一点,通常您可能首先在两个序列处抛出一些随机输入。如果他们不是等同的代码,那么你可能会很幸运,很快就会显示出来(通过矛盾证明),你可以继续前进。如果您还没有发现矛盾,现在可以尝试通过计算成本高昂的SAT求解器来证明等价。 (另外,如果您对超级优化器感兴趣,那么Regehr提到的STOKE论文特别有趣。)

现在看一下整个程序的语义等价,这里的一种方法是CompCert编译器使用的方法。基本上,编译器证明了这个定理:

如果CompCert能够将C代码X转换为汇编代码Y,则X和Y在语义上是等效的。

此外,CompCert确实应用了一些编译器优化,实际上这些优化通常是传统编译器出错的地方。也许像CompCert这样的东西就是你所追求的,在这种情况下,编译器通过一系列细化过程来处理事情,它证明如果每次传递成功,结果在语义上等同于前一次传递。