我是巨大的Haskell n00b试图了解更多。我想知道,鉴于Haskell是一种懒惰的评估语言,它可能需要分析函数调用的所有可能流程。鉴于此,如果任何函数调用的传递依赖性发生更改,那么它是否需要重新编译该函数?如果这么小的变化可以级联,需要完全重新编译。这是如何处理的?
答案 0 :(得分:2)
(我之所以回答CW是因为我不是专家,我希望能得到正确答案。)
有很多信息on the GHC wiki about how GHC handles this problem。
关于“分析函数调用的所有可能流程”的说明有点偏离目标 - 最好将大部分评估视为在运行时系统中发生,而不是在编译时。更大的担忧是,最重要的计划完全依赖于GHC的积极优化,特别是普遍的内联。内联的使用意味着在重新编译值时重新编译所有调用站点。
我认为,出于类似的原因,GHC也比其他语言更加保守“编译单位”。特别是,值的类型签名不以其在其他语言的调度或链接系统中的方式封装其接口。例如,除其他外,GHC records in a module's interface file“严格,准确和导出函数的展开。这对于跨模块优化至关重要;但只有在使用-O编译时才包含它。” (关于这种意义上的一点点,请参阅this page和paper on GHC function calls链接。)这些功能都不是函数的类型的一部分,但对于如何编译下游模块。