关于GHC实施的良好介绍文字?

| 当在Haskell中进行编程时(尤其是在解决Project Euler问题时,次优解决方案往往会导致CPU或内存需求紧张),我常常感到困惑,为什么程序会按原样运行。我查看配置文件,尝试引入一些严格性,选择了另一个数据结构,但是主要是因为我缺乏良好的直觉,所以它在黑暗中摸索着。 另外,虽然我知道Lisp,Prolog和命令式语言通常是如何实现的,但我不知道实现惰性语言。我也很好奇。 因此,我想更多地了解从程序源到执行模型的整个链。 我想知道的事情: 应用了哪些典型的优化? 当有多个候选评估对象时,执行顺序是什么(虽然我知道它是由所需的输出驱动的,但首先评估A和B之间,或者先评估B以检测到您没有这样做,仍然可能会有很大的性能差异) (根本不需要A) 笨蛋如何代表? 堆栈和堆如何使用? 什么是CAF? (分析表明有时热点在那儿,但我没有头绪)     
已邀请:
有关GHC系统的体系结构和方法的大多数技术信息都在其Wiki中。我将链接到关键片段以及一些人们可能不了解的相关文章。 应用了哪些典型的优化? 关键论文是:Haskell的基于变换的优化器, SL Peyton Jones和A Santos,1998年,描述了GHC使用模型的方法,该模型使用了类似Haskell的核心语言的类型保留转换(重构)来改善时间和内存使用。此过程称为“简化”。 在Haskell编译器中完成的典型操作包括: 内联; Beta减少; 消除死代码; 条件的转换:逐案,逐案消除。 拆箱; 预期产品退货; 完全懒惰转换; 专业化; 埃塔扩展; Lambda提升; 严格度分析。 有时: 静态参数转换; 构建/文件夹或流融合; 常见子表达式消除; 构造器专业化。 上述论文是开始了解大多数这些优化的关键所在。在较早的书《实现功能语言》,Simon Peyton Jones和David Lester中给出了一些更简单的方法。 有多个评估对象时执行顺序是什么 假设您使用的是单处理器,那么答案是“编译器根据启发式方法和程序的需求模式静态选择的某种顺序”。如果您通过火花使用投机评估,那么请使用“一些不确定的,无序的执行模式”。 通常,要查看执行顺序是什么,请查看内核,例如ghc-core工具。 RWH中有关优化的章节介绍了Core。 笨蛋如何表示? Thunk用代码指针表示为堆分配的数据。 请参见堆对象的布局。 具体来说,请参阅如何表示重击。 堆栈和堆如何使用? 由无脊椎无标签G机的设计决定,特别是自从该论文发布以来进行了许多修改。大致来说,执行模型: (装箱的)对象分配在全局堆上; 每个线程对象都有一个堆栈,该堆栈由与堆对象具有相同布局的框架组成; 进行函数调用时,将值压入堆栈并跳转到该函数; 如果代码需要分配,例如构造函数,将数据放在堆上。 要深入了解堆栈使用模型,请参见\“ Push / Enter与Eval / Apply \”。 什么是CAF? \“常量申请表\”。例如。为执行程序的整个生命周期分配的程序中的顶级常量。由于它们是静态分配的,因此必须由垃圾收集器对其进行特殊处理。 参考资料和进一步阅读: GHC评论 无旋转无标签G机 通过转换进行编译 推/输入vs评估/应用 未装箱价值作为一等公民 内线的秘密 多核Haskell的运行时支持     
就介绍性文本而言,这可能不是您想的,但Edward Yang正在进行一系列博客,讨论Haskell堆,如何实现重击等。 它既有趣又有趣,既有插图,又有说明性的内容,而不必为Haskell的新手研究过多的细节。该系列涵盖了您的许多问题: Haskell堆以及thunk的存储方式-系列中的第一篇文章 绑定和CAF IO monad如何转换为原语 从更高的技术层面上讲,有很多论文涵盖(与其他内容结合使用),是您想知道的部分内容: SPJ,Simon Marlow等人在Haskell上关于GC的论文-我还没有读过,但是由于GC通常代表Haskell所做的工作的很好的体现,因此它应该提供见识。 Haskell 2010报告-我确定您已经听说过,但是很好,无法链接。可以在某些地方进行枯燥的阅读,但这是理解Haskell是什么的最好方法之一,至少是我阅读过的部分。 Haskell的历史-比名称所暗示的更具技术性,并提供了一些关于Haskell的设计以及设计背后的决策的非常有趣的观点。阅读后,您会情不自禁地更好地了解Haskell的实现。     

要回复问题请先登录注册