【发布时间】:2011-08-28 05:43:17
【问题描述】:
在 Haskell 中编程时(尤其是在解决 Project Euler 问题时,次优的解决方案往往会对 CPU 或内存需求造成压力),我经常对为什么程序的行为方式感到困惑。我查看配置文件,尝试引入一些严格性,选择另一种数据结构,......但大多是在黑暗中摸索,因为我缺乏良好的直觉。
另外,虽然我知道 Lisp、Prolog 和命令式语言的典型实现方式,但我不知道如何实现惰性语言。我也有点好奇。
因此,我想更多地了解从程序源到执行模型的整个链条。
我想知道的事情:
应用了哪些典型优化?
当有多个评估候选者时,执行顺序是什么(虽然我知道它是由所需的输出驱动的,但先评估 A 再评估 B 或先评估 B 以检测可能仍然存在很大的性能差异你根本不需要A)
thunk 是如何表示的?
栈和堆是如何使用的?
什么是 CAF? (分析有时表明热点在那里,但我不知道)
【问题讨论】:
-
不完全是我所说的介绍性,但SPJ's book on the implementation of functional languages 是一本好书。
-
Uuhh.. 对我来说,这是对 GHC 研究人员发表的大量论文的深入挖掘。如果您对数据表示感兴趣,Edward Z. Yang 的 series of blog posts 可能对您很感兴趣。
-
这是我一直想问的问题。熟悉论文是一个好的开始。它们是可读的。你可能对垃圾收集感兴趣,因为它们揭示了大部分底层结构(闭包块是如何实现的)。对于不同的编译器通道,我不知道。
-
关于第二项,如果A真的只用于B的某些值,那么A将在B之后评估或根本不评估,因为从未被评估过强迫?除非有其他东西造成了不必要的严格性,在这种情况下,即使 A 无论如何都不需要,也可能会被评估。
标签: optimization compiler-construction haskell ghc heap-memory