【发布时间】:2016-05-03 20:22:43
【问题描述】:
Haskell(使用GHC 编译器)是lot faster than you'd expect。正确使用,它可以接近低级语言。 (Haskellers 最喜欢做的事情是尝试将 C 的误差控制在 5% 以内(甚至超过它,但这意味着您使用的是效率低下的 C 程序,因为 GHC 将 Haskell 编译为 C)。)我的问题是,为什么?
Haskell 是声明式的并且基于 lambda 演算。机器架构显然是必不可少的,大致基于图灵机。事实上,Haskell 甚至没有具体的评估顺序。此外,您总是创建代数数据类型,而不是处理机器数据类型。
最奇怪的是高阶函数。您会认为动态创建函数并将它们扔掉会使程序变慢。 But using higher order functions actually makes Haskell faster. 确实,似乎要优化 Haskell 代码,您需要使其更优雅和抽象,而不是更像机器。 Haskell 更高级的功能似乎都影响它的性能,如果它们不改进它的话。
对不起,如果这听起来很粗鲁,但这是我的问题:考虑到 Haskell(用 GHC 编译)的抽象性质和与物理机器的区别,为什么这么快?
注意:我之所以说 C 和其他命令式语言与图灵机有些相似(但不是 Haskell 类似于 Lambda 演算),是因为在命令式语言中,您有有限数量的状态(又名行号)以及磁带(内存),以便状态和当前磁带确定对磁带执行的操作。请参阅 Wikipedia 条目Turing machine equivalents,了解从图灵机到计算机的过渡。
【问题讨论】:
-
“因为 GHC 将 Haskell 编译为 C” - 它没有。 GHC 有多个后端。最古老的(但不是默认的)是 C 生成器。它确实为 IR 生成 Cmm 代码,但这不是您通常期望的“编译为 C”。 (downloads.haskell.org/~ghc/latest/docs/html/users_guide/…)
-
我强烈推荐阅读 Simon Payton Jones(GHC 的主要实施者)的Implementation of Functional Programming Languages,它将回答您的很多问题。
-
为什么? 25 年的辛勤耕耘。
-
“即使有一个事实的答案,它也只会征求意见。” -- 这是结束问题的最糟糕的理由。因为它可能有一个好的答案,但它也可能会吸引低质量的答案。呸!我碰巧有一个关于学术研究和某些发展何时发生的好的、历史的、事实的答案。但我不能发布它,因为人们担心这个问题也可能会吸引低质量的答案。再一次,糟糕。
-
@cimmanon 我需要一个月或几篇博文来了解函数式编译器如何工作的详细信息的基础知识。我只需要一个 SO 答案就可以大致勾勒出如何在库存硬件上干净地实现图形机,并指向相关资源以供进一步阅读......
标签: performance haskell ghc higher-order-functions lambda-calculus