什么是超级编译?


71

简短而甜蜜:我看过一些有关“超级编译”的消息。但是我尚未在互联网上的任何地方找到一个描述这是什么的单一文档。大概是因为它对任何人来说似乎都很简单,甚至不值得解释。

有人知道这到底是什么吗?



3
简而言之,请参见Neil Mitchell的Supero页面上的演示,该程序是在编译时评估的。如果程序没有运行时数据依赖项,则可以对它进行完全评估,否则留下一个“残余”表达式,该表达式构成可执行文件的一部分。
斯蒂芬·泰特利2012年

Answers:


52

超级编译可以作为部分评估的概括。部分评估背后的想法是,程序的许多部分都可以在编译时进行评估,所以应该如此。Supercompilation扩展了这个,评估的事情,不能在编译时完全熟透,以及像转向map f (map g xs)map (f . g) xs没有任何东西,除了定义map(至少我认为我得到了偏右的评价-我只读过很多关于supercompilation)。

另一种看待它的方法是将许多其他优化组合在一起,例如森林砍伐,专业化和内联。通过好像已经知道函数的输入并进行评估一样,它可以得到一种更直接的计算结果的方法-通过查看中间数据结构的使用方式,它可以摆脱中间数据结构,或者可以插入所有可能的值,并且然后将结果包装在中case,或使用其伪装值进行其他处理。

Max Bolingbroke对此主题有许多有用的文章-我推荐第一篇文章“通过评估进行超级编译”作为简介。第2节通过示例介绍了该主题,其余部分虽然很难理解,但对过程很有帮助。尼尔·米切尔(Neil Mitchell)也有许多不错的演讲对此进行了描述。

希望对您有所帮助。


2
由此,我无法区分超级编译和部分评估。“超级编译扩展了这一点,可以评估在编译时也无法完全完成的事情,”-这也描述了部分评估。通常,部分评估程序会留下部分评估的剩余程序。理想情况下,部分评估应在部分评估程序时充分利用所有静态已知的输入/参数。
Guildenstern 2014年

它们肯定重叠,并且随着部分评估的扩展,它肯定会成为超级编译。我认为差异在于部分评估会预先确定要消除的位(例如,映射的第一个参数),然后去掉它们。超编译以相同的规则消除一切,并观察结果。
尼尔·米切尔

上面的链接已断开,在这里
Chris Hanson

1
@ChrisHanson谢谢!现在应该修复该链接。
gereeter

map f (map g xs)map (f . g) xs当您使用教堂编码的值时会变成……
MaiaVictor

2

来自维基百科的元编译

元编译是一种计算,涉及从计算机M到控制,分析和模仿M工作的元计算机M'的元系统转换(MST)。基于语义的程序转换(例如部分评估和超编译(SCP))是元计算。 。

有关Wikipedia上元系统的更多信息。

我对这个主题不了解,但是我会加深对描述的理解。假设我们有一个简单的程序,可以将stdin复制到stdout。这将是我们的计算机M。我们的元计算机M'是第二个程序,该程序将M的源作为输入(或者构造为固有地了解M),因此不仅能够理解M做什么,而且能够理解它是如何工作的。这样做。

如果我的理解是正确的,那么显而易见的问题是我们为什么要关心M'?我想到的是自动优化。如果我们既了解M的工作原理又了解M的目标,M'可能会解决在空间或时间上改善M运作的方法。而且,重要的是,M'可以替代M,因为M'可以完成M所做的任何事情。这意味着M''可以改进M'优化M的方式,随后替换M',依此类推。

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.