Coq / Agda中经过认证的编译器和优化


9

我对以Martin-Löf类型理论(即Coq / Agda)形式化的经过验证的编译器感兴趣。目前,我已经写了一个小玩具示例。因此,我可以证明我的优化是正确的。例如,可以消除具有零的加法运算,即“ x + 0”之类的表达式。

有没有用常规编译器难以执行的优化,可以作为一个很好的例子?是否可以证明程序的某些属性,这些属性允许使用常规编译器无法执行的优化?(即没有定理证明者可能的推论)

我将对这个想法或示例以及该主题的参考感兴趣。

一个相关问题: 编译器正确性证明

编辑:正如Tsuyoshi在评论中很好地指出的那样:我正在寻找优化技术,如果使用(例如)C编写编译器,则难以实现,但是如果使用(例如)Coq编写编译器,则更容易实现。随着Agda编译为C(通过haskell),有可能在Agda中也可以在C中完成所有可能的工作。定理证明如Coq / Agda的唯一好处可能是可以验证编译器和优化。

edit2:按照Vijay DI的建议,写我到目前为止所读的内容。我主要关注INRIA的Xavier Leroy和CompCert项目(我认为有80页的论文很好阅读)。第二个兴趣是Anton Setzer在交互式程序上的工作。尽管我也许他的工作可以用来证明有关IO程序和IO程序的双重仿真的特性。感谢您提及Sewell。我在ICFP听到了他的演讲“丛林传说”,并阅读了2-3篇论文。但是我还没有专门研究他和他的合著者的作品。
我还没有找到从哪里开始,也没有找到关于优化编译器的论文。例如,在经过验证的编译器设置中,哪些优化最有趣。


1
“有没有使用常规编译器难以执行的优化”:这是不可能的吗?如果从经过验证的编译器中删除正确性证明,则将获得常规编译器。因此,经过验证的编译器可以执行的任何操作也可以由常规编译器完成。经过验证的编译器的要点是,它无法执行不正确的优化。(我对编译器和程序验证的知识很少。如果我遗漏了这一点,请原谅。)
伊藤刚(Tsuyoshi Ito

@Tsuyoshi谢谢您的评论。我的意思是:我可以证明程序的某些属性(保证可以保留)(例如,子例程是不可进入的,并且永远不能调用其自身),这些属性可以执行通常无法实现的优化。一些不变量可能难以验证程序,也许这些优化不是由常用的编译器执行的。但是也许我是完全错误的。
mrsteve

1
您是在谈论 Coq / Agda 编写的编译器还是针对 Coq / Agda 的编译器?我觉得你的问题是关于写在勒柯克/阿格达一个编译器,但我不认为写在勒柯克/阿格达编译器可以证明关于比C语言编写的一个编译器目标程序的任何更多的属性
刚伊藤

2
最好将您已阅读的内容添加到问题中。您是否熟悉经过验证的编译工作-例如Xavier Leroy的工作?还是Peter Sewell和合作者的观点?
维杰·D

1
没有这样的优化,除非您进一步限制您的问题。在极端情况下,C编译器可以在其肠子中秘密地实现一个定理证明者(并且实际上实际上是在有限的方式下进行的)。我认为您不清楚“常规编译器”的含义。
Andrej Bauer

Answers:


5

Yves Bertot,Benjamin Gr´egoire和Xavier Leroy撰写的这篇论文完全基于Coq规范为类C语言构建了优化的编译器。CompCert C编译器显然利用了其中的某些技术。

基于数据流分析的证明编译器优化的结构化方法

它考虑了两个优化的正确性,即恒定传播(CP)和公共子表达式消除(CSE),第4节。与针对同一语言的非基于Coq的编译器相关联的优化相比,这些优化更为先进。请参阅此基准图与gcc的比较。(尽管很少提及,但基于Coq的编译器的编译速度可能较慢!)

ConCert的原始方面是,大多数编译器都是以Coq规范语言直接编写的,并且是纯函数式的。可执行编译器是通过从该规范中自动提取Caml代码获得的。

但是,在本文结尾处,他们确实注意到,实际的编译器中存在一些无法在其框架中建模的编译器优化。

改进的优化不是这里要考虑的唯一元素,另一方面是,编译器优化逻辑由于其复杂的性质而可能会受到细微的缺陷,尤其是。多年以来,人们发现gcc在其众多优化逻辑例程中均存在错误。例如gcc错误?


3

我可以证明某个程序的某些属性(保证可以保留)(例如,子例程是不可进入的,并且永远不能调用其自身),这些属性可以执行通常无法实现的优化。

这等效于扩展类型检查器以向优化器提供程序的某些属性。我相信伊藤刚(Tsuyoshi Ito)是对的,您可能会对Coq误入歧途。它是提供无错误编译器的绝佳工具,但在您描述的情况下,它不能为静态分析提供更多功能。

对于用Coq加强静态分析,我唯一能想到的就是为您的语言配备包含一些用户编写的证明的断言。-如果将编译器本身翻译成包括用于动态类型检查的方法的语言,并且如果用户编写的证明可以转换为函数,则可以将这些函数用作某些子类型或优化的必需属性。-实际上,这将为编译器提供更多功能。

但是,据我所知,这对于加强子类型化非常有用。-很难让程序员知道什么位置的属性对优化器有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.