Questions tagged «compilers»

5
编译器正确性证明
我正在寻找涵盖编译器正确性证明的教程材料,最好是在初等研究生的水平上使用指称方法。 另外,您是否知道一些我可以用来说明问题的简单编译器示例?(我想到的第一个示例是从infix到postfix表达式的转换器。但是除了如何对语法进行归纳之外,它没有显示出任何有趣的东西。)

2
有人在模块化编译器中使用过Pottier和Gauthier的多态去功能化功能吗?
去功能化是一种程序转换,可将高阶程序转换为一阶程序。这个想法是,给定一个程序,只有有限的许多lambda抽象,因此您可以用id替换每个lambda,并使用对在该id上分支的apply过程的调用来替换每个函数应用程序。有时 在函数语言的编译器中使用此方法,但是它的适用性受到以下事实的限制:去功能化是整个程序的转换(您必须静态地了解程序中的所有功能),因此,只有整个程序的编译器才能使用它。 但是,Pottier和Gauthier使用了涉及GADT的更为复杂的类型化方法,从而为它提供了一种多态性类型的去功能化算法。现在,有了它们的编码,就可以向其lambda数据类型添加一个包罗万象的大小写,它不是标签,而是包含一个高阶函数。这意味着应该有可能使用它们的编码来逐模块地解除功能。 有没有人做过这个,并指出我使用这种想法的编译器?(玩具编译器还可以,实际上是首选。)


1
斯大林编译器进行了残酷的优化,但是如何呢?
JM Siskind的研究声明指出: 斯大林(Stalin)是Scheme的优化编译器,它执行全程序静态分析,并使用该分析结果生成非常高效的代码。斯大林利用了大量静态分析技术。它执行一种新形式的多变量流分析,该分析使用迭代的单变量流分析来执行流定向拆分:克隆过程的专用副本以及按目标在每个调用点分配此类克隆。它使用流分析的结果执行生命周期分析,逃逸分析,指向分析和必须别名分析。这些分析支持一种新颖形式的轻量级闭包转换,它使用可变的全球化和本地化等技术消除了大多数闭包插槽,压缩了静态反向链,并且通常从程序中消除了大多数闭包。它还使用以上分析来支持基于流定向的基于区域的存储管理,其中基于每个抽象值和每个程序点将运行时垃圾回收替换为静态分配和释放。它还使用Screamer率先推出的技术扩展功能,执行流定向的轻量级CPS转换,以支持极其高效的一流续航。最后,它支持流定向的内联和低级表示选择,以基于抽象值和每个程序点选择标记的实现(或不实现),标记检查和标记分发。这消除了大多数运行时标记,标记检查,标记,标记剥离,标记分派,装箱和从程序中取消装箱。在运行时垃圾回收中,根据抽象值和每个程序点将其替换为静态分配和释放。它还使用Screamer率先推出的技术扩展功能,执行流定向的轻量级CPS转换,以支持极其高效的一流续航。最后,它支持流定向的内联和低级表示选择,以基于抽象值和每个程序点选择标记的实现(或不实现),标记检查和标记分发。这消除了大多数运行时标记,标记检查,标记,标记剥离,标记分派,装箱和从程序中取消装箱。在运行时垃圾回收中,根据抽象值和每个程序点将其替换为静态分配和释放。它还使用Screamer率先推出的技术扩展功能,执行流定向的轻量级CPS转换,以支持极其高效的一流续航。最后,它支持流定向的内联和低级表示选择,以基于抽象值和每个程序点选择标记的实现(或不实现),标记检查和标记分发。这消除了大多数运行时标记,标记检查,标记,标记剥离,标记分派,装箱和从程序中取消装箱。使用Screamer首创的技术扩展,以支持极其有效的一流续航。最后,它支持流定向的内联和低级表示选择,以基于抽象值和每个程序点选择标记的实现(或不实现),标记检查和标记分发。这消除了大多数运行时标记,标记检查,标记,标记剥离,标记分派,装箱和从程序中取消装箱。使用Screamer首创的技术扩展,以支持极其有效的一流续航。最后,它支持流定向的内联和低级表示选择,以基于抽象值和每个程序点选择标记的实现(或不实现),标记检查和标记分发。这消除了大多数运行时标记,标记检查,标记,标记剥离,标记分派,装箱和从程序中取消装箱。这些分析和优化使Stalin可以生成非常有效的代码,其效率要比其他所有Scheme编译器高出2到100之间,尤其是对于数字密集型代码。斯大林经常生成的性能优于手写的c和Fortran代码。 我能够找到以下有关闭包/函数调用实现的非常有趣的论文:流定向轻量级闭包转换。我还通过电子邮件发送给作者,询问有关其他主题的论文,这些主题在闭包转换论文中被提及: Siskind,JM 2000a。流导向的轻量级CPS转换。在准备。 Siskind,JM 2000b。流定向多方差。在准备。 Siskind,JM 2000c。流导向表示选择。在准备。 Siskind,JM,2000年。流导向的存储管理。在准备 不幸的是,他从来没有写过那些论文。我对您的问题是:是否有涉及这些主题的替代或相关论文?我非常有兴趣了解斯大林(或其他编译器)如何编译诸如Scheme这样的高级语言,该方案可以进行垃圾回收,动态类型化,支持一流的功能,甚至一流的延续,也可以静态地编译为这种高效的代码。尽管有关流量分析的论文非常丰富,但没有关于使用这种分析的结果进行上述优化的论文。
14 compilers 


2
依赖类型的编译器比解释器难吗?
我一直在学习有关实现依赖类型的知识,例如本教程,但其中大多数是实现解释器。我的问题是,为依赖类型实现编译器似乎比编译器难得多,因为您可以真正评估依赖类型参数以进行类型检查。 所以 我的天真印象对吗? 如果是正确的话,关于实现支持依赖类型的静态检查语言的任何示例/资源?

1
程序最小化
电路最小化是最小化给定电路尺寸的问题。一般程序有什么类似的东西吗? 我的问题尤其是- 是否存在用于最小化给定程序的指令数量的算法。我知道这是一个无法确定的问题,但我不是在寻找能够返回最佳结果的解决方案。 虽然可以应用现有的编译器转换来完成此操作,但我正在寻找不需要定义一组非常狭窄的转换和算法来预先搜索它们的东西。 编辑:我还有另一个问题是,是否可以进行一个合理而完整的演算,以使我们能够探索这种语义上等效的程序的整个空间,或者这是不可能的。

1
别名分析文献
我正在用CS撰写硕士学位论文,并且正在使用别名分析。我感兴趣的是针对类Java语言的过程内,流量敏感的必须和可能混淆分析。 我正在搜索详细描述该主题基础知识的文本,但无法找到真正合适的内容。 我在许多关于编译器和静态分析的教科书中幸存下来,但在那儿什么也没找到。 我发现有许多使用别名分析的论文,但是大多数论文都集中在应用别名分析的问题上,并且没有详细描述别名分析算法。其他人则把重点放在C上,因为通用指针增加了复杂性,因此C不合适。 我发现的最好的文本是Whaley和Rinard撰写的论文Java程序的成分指针和转义分析。这是一篇很棒的论文,也是一个很好的起点,但是没有专门讨论别名分析。 这个问题似乎太普遍了,因此我希望可以使用一些规范的算法来解决。 是否有人对这个主题的文本有任何指示?

2
Coq / Agda中经过认证的编译器和优化
我对以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篇论文。但是我还没有专门研究他和他的合著者的作品。 我还没有找到从哪里开始,也没有找到关于优化编译器的论文。例如,在经过验证的编译器设置中,哪些优化最有趣。

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.