Optimization 关于GHC实施的好的介绍性文本?

Optimization 关于GHC实施的好的介绍性文本?,optimization,compiler-construction,haskell,ghc,heap-memory,Optimization,Compiler Construction,Haskell,Ghc,Heap Memory,在Haskell中编程时(尤其是在解决Project Euler问题时,次优的解决方案往往会强调CPU或内存需求),我经常感到困惑,为什么程序的行为会如此。我看了一下配置文件,试图引入一些严格性,选择了另一种数据结构。。。但主要是在黑暗中摸索,因为我缺乏良好的直觉 另外,虽然我知道Lisp、Prolog和命令式语言通常是如何实现的,但我不知道如何实现惰性语言。我也有点好奇 因此,我想更多地了解从程序源到执行模型的整个链 我想知道的事情: 应用了哪些典型的优化 当有多个候选项进行评估时,执行顺序

在Haskell中编程时(尤其是在解决Project Euler问题时,次优的解决方案往往会强调CPU或内存需求),我经常感到困惑,为什么程序的行为会如此。我看了一下配置文件,试图引入一些严格性,选择了另一种数据结构。。。但主要是在黑暗中摸索,因为我缺乏良好的直觉

另外,虽然我知道Lisp、Prolog和命令式语言通常是如何实现的,但我不知道如何实现惰性语言。我也有点好奇

因此,我想更多地了解从程序源到执行模型的整个链

我想知道的事情:

  • 应用了哪些典型的优化

  • 当有多个候选项进行评估时,执行顺序是什么(虽然我知道它是由所需的输出驱动的,但在先评估A然后评估B,或者先评估B以检测您根本不需要A之间,可能仍然存在很大的性能差异)

  • thunks是如何代表的

  • 如何使用堆栈和堆

  • 什么是咖啡馆?(分析表明有时热点在那里,但我没有线索)


这可能不是你在介绍性文章中所想的,但Edward Yang正在撰写一系列博客文章,讨论Haskell堆、thunks是如何实现的等等

它很有趣,既有插图,也有解释事物的能力,对Haskell的新手来说,不需要钻研太多细节。本系列涵盖了您的许多问题:

  • -系列文章中的第一篇文章
在技术层面上,有许多论文(与其他内容一起)涵盖了你想知道的部分内容:

  • -我还没读过,但由于GC通常代表Haskell所做工作的一个很好的门户,所以它应该提供一些见解
  • -我相信你一定听说过,但这太好了,不能不链接到。可以在一些地方进行枯燥的阅读,但这是理解哈斯克尔的本质的最好方法之一,至少是我读过的部分
  • -比名称所暗示的更具技术性,并对Haskell的设计以及设计背后的决策提供了一些非常有趣的观点。在阅读Haskell的实现之后,您会情不自禁地更好地理解它

有关GHC系统架构和方法的大部分技术信息都在他们的wiki中。我将链接到关键部分,以及一些人们可能不知道的相关文件

应用了哪些典型的优化?

这方面的关键文件是:, SL Peyton Jones和A Santos,1998,描述了GHC应用核心Haskell类语言的类型保留转换(重构)来改进时间和内存使用的模型。这个过程称为“简化”

在Haskell编译器中执行的典型操作包括:

  • 内联线
  • β降低
  • 死码消除
  • 条件转换:案例案例,案例删除
  • 拆箱
  • 构建产品退货
  • 完全惰性转化
  • 专业化
  • Eta扩展
  • Lambda提升
  • 严格性分析
有时:

  • 静态变元变换
  • 构建/foldr或流融合
  • 共同子表达消除
  • 构造函数专门化
上面提到的文章是开始理解大多数这些优化的关键。在早期的书中,西蒙·佩顿·琼斯(Simon Peyton Jones)和大卫·莱斯特(David Lester)给出了一些简单的例子

当有多个候选评估时,执行顺序是什么

假设您使用的是单处理器,那么答案是“编译器根据启发式静态选择的一些顺序,以及程序的需求模式”。如果您使用的是通过sparks进行的推测性评估,那么“一些不确定、无序的执行模式”

一般来说,要了解执行顺序,请使用工具等查看核心。RWH关于优化的章节中有一篇文章

thunks是如何表示的?

thunk用代码指针表示为堆分配的数据

看。 具体而言,请参见

堆栈和堆是如何使用的?

具体地说,由确定,自该论文发表以来进行了许多修改。大体而言,执行模型:

  • (装箱)在全局堆上分配对象
  • 每个,由与堆对象具有相同布局的帧组成
  • 在进行函数调用时,将值推送到堆栈上并跳转到函数
  • 如果代码需要分配(例如构造函数),则该数据将放置在堆上
要深入了解堆栈使用模型,请参阅

什么是咖啡馆?

“恒定应用形式”。例如,程序中为程序执行生命周期分配的顶级常量。因为它们是静态分配的,所以它们必须是静态的


参考文献和进一步阅读:


不完全是我所说的介绍性的,但却是一本很好的读物。Uuhh。。对我来说,这是对GHC研究人员发表的一大堆论文的深入挖掘。如果您对数据表示感兴趣,Edward Z.Yang的这篇文章可能会让您感兴趣。熟悉报纸是一个好的开始。它们是可读的。您可能对垃圾收集感兴趣,因为它们揭示了大部分底层结构(闭包块是如何实现的)