【问题标题】:Is there in the world any strong optimizing compiler for a simple functional language to itself? [closed]世界上是否有针对简单函数式语言本身的强大优化编译器? [关闭]
【发布时间】:2014-01-04 12:42:21
【问题描述】:

世界上是否有针对简单函数式语言的编译器,例如定义 on this article 的编译器,或者可能只有 Scheme 甚至 ML 本身?也就是说,一个编译器会分析那个简单的函数式语言的代码,执行复杂的优化,比如流融合,然后返回优化后的代码?

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

【问题讨论】:

  • 旁注,因为您计划编译为 JavaScript:您听说过 Google 的 Closure compiler 吗?它似乎执行了从 JavaScript 到 JavaScript 的大量内联。
  • 是的,不,沉重不是你应该使用的形容词。它的优化是微不足道的。不过,这不是它的错,很多东西根本无法在纯 JS->JS 中进行优化。流融合是完全不可能的。
  • a case in point(您未来的编译器/优化器的测试用例)。纠结的基于列表的代码(在 Haskell 中),它实际上只表示一个嵌套循环,使用一个临时数组。 -- 说到循环,你熟悉thisthis。它可能是相关的(或者可能只是历史背景)。
  • 这些都非常有用,谢谢!

标签: javascript haskell optimization compiler-construction scheme


【解决方案1】:

GHC 可以产生 GHC-Core,它是一种中间原始的类 Haskell 语言。它是在编译器的所有优化之后上演的,包括流融合之类的高级东西。所以我想它可能是你的任务的完美候选人。

来自the docs

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

GHC 的前端将完整的 Haskell 98(以及一些扩展)转换为 Core。然后,GHC 优化器重复转换核心程序,同时保留它们的含义。 GHC 中的“Core Lint”传递在转换传递之间对 Core 进行类型检查(至少当用户通过设置编译器标志启用 linting 时),验证转换是否保持类型正确性。最后,GHC 的后端将 Core 翻译成 STG 机器代码 [stg-machine],然后再翻译成 C 或原生代码。

【讨论】:

  • 对不起,但如果这是真的,其他语言怎么从来没有使用它来从 Haskell 生成 JavaScript?我认为 Haskell->JS 天生就有缺陷,因为 Haskell 有很多特性和差异(例如惰性),这些特性和差异会转化为 MB 和 MB 的开销。
  • @Viclib 我不能代表 JS 编译器的实现者。您可能有兴趣联系流行的现代 Haskell-to-JS 项目的社区,例如 ElmFay。关于惰性,你应该知道,即使在 Haskell 中,它也不能总是被优化掉,这就是我们在运行时有“Thunk”的原因。
  • Haste 从 STG 编译​​为 Javascript。 STG 是 GHC 管道中 Core 的一个阶段。 github.com/valderman/haste-compiler
  • @TomEllis 在尝试了 3 个小时后非常糟糕,我无法编译 Haste。似乎它不适用于 OSX。
【解决方案2】:

如果你对书籍感兴趣,我可以推荐 Christian Queinnec 的书Lisp In Small Pieces 和 Andrew Appel 的编译器系列书籍(其中一本叫做 Compiling with Continuations ,并且还有两三个关于现代编译器的名称目前让我无法理解)。我已经有一段时间没有阅读它们了,但我认为它们都提供了有关源到源编译的信息,当然两者都涵盖了各种优化。任何体面的编译器教科书都应该有你感兴趣的内容。

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多