世界上是否存在针对简单函数语言的强大优化编译器?

时间:2014-01-04 12:42:21

标签: javascript haskell optimization compiler-construction scheme

世界上是否存在任何简单函数语言的编译器,例如定义on this article,或者只是Scheme或甚至ML本身?也就是说,一个编译器将分析该简单函数语言的代码,执行复杂的优化,如流融合并返回优化代码?

我需要这个的原因是我正在尝试将我的简单玩具语言(几乎是lambda演算+数字和数组)编译成JavaScript,但实际上,由于天真的编译器,它非常慢完全没有优化。功能不受限制,(map f (map g h))之类的内容未融合到(map (f . g) h)中。实现优化编译器将构成much work。我曾想过利用GHC等现有编译器,但我还没有决定如何做到这一点。例如,我可以将我的语言编译为Haskell并将其编译回JavaScript,但大多数Haskell-> JS解决方案并不是最优的并且会产生大量的开销。这种现有的强大的优化编译器对于简单的函数式语言本身就会削减很多工作。世界上有没有?

2 个答案:

答案 0 :(得分:5)

GHC可以生成GHC-Core,这是一种类似Haskell的中间原始语言。它是在编译器的所有优化之后进行的,包括像流融合这样的高级内容。所以我想这可能是你完成任务的完美候选人。

来自the docs

  

Glasgow Haskell编译器(GHC)在编译器的简化阶段使用称为“Core”的中间语言作为其内部程序表示。核心类似于Haskell的一个子集,但具有多态lambda演算(Fω)风格的显式类型注释。

     

GHC的前端将完整的Haskell 98(加上一些扩展)转换为Core。然后GHC优化器反复转换核心程序,同时保留其含义。一个“Core Lint”在转换过程之间传递GHC typechecks Core(至少当用户通过设置编译器标志启用linting时),验证转换是否保留了类型正确性。最后,GHC的后端将Core转换为STG机器代码[stg-machine],然后转换为C或本机代码。

答案 1 :(得分:1)

如果你对书籍感兴趣,我可以推荐Christian Queinnec的书 Lisp In Small Pieces 和Andrew Appel关于编译器的系列丛书(一个叫做使用Continuations进行编译现在还有两三个关于现代编译器的名字让我逃脱了。我阅读它们已经有一段时间了,但我认为它们都提供了有关源到源编译的信息,当然它们都涵盖了各种优化。任何体面的编译器教科书应该有你想要的东西。