Haskell 监测温室气体活动

Haskell 监测温室气体活动,haskell,ghc,Haskell,Ghc,如果GHC需要很长时间来编译某些东西,有没有办法找出它在做什么 首先,如果我真的使编译器崩溃了(例如,不知何故把它放入某种无限循环中),或者它是否真的在进展,但进展非常缓慢,那就好了 其次,确切地知道GHC在编译过程中遇到了什么问题是很好的。是解析,还是去糖,还是类型检查,还是核心优化,还是代码生成,还是 有什么方法可以监控正在发生的事情吗?(请记住,如果GHC需要很长时间,这可能意味着它要做很多工作,因此如果你要求太多的输出,它将是巨大的!) GHC已经告诉您它正在尝试(重新)编译哪些模块。在

如果GHC需要很长时间来编译某些东西,有没有办法找出它在做什么

首先,如果我真的使编译器崩溃了(例如,不知何故把它放入某种无限循环中),或者它是否真的在进展,但进展非常缓慢,那就好了

其次,确切地知道GHC在编译过程中遇到了什么问题是很好的。是解析,还是去糖,还是类型检查,还是核心优化,还是代码生成,还是

有什么方法可以监控正在发生的事情吗?(请记住,如果GHC需要很长时间,这可能意味着它要做很多工作,因此如果你要求太多的输出,它将是巨大的!)


GHC已经告诉您它正在尝试(重新)编译哪些模块。在我的例子中,问题是一个独立的模块。我想知道GHC被困在哪里。

在Daniel Fischer的评论之后,我尝试使用不同的详细选项运行GHC

  • -v1
    :生成了更多的输出,但在主编译步骤中没有任何输出
  • -v2
    :告诉您步骤GHC当前正在执行的操作(解析器、desugar、类型检查、简化器等)。这正是我真正想要的
  • -v3
    :似乎使简化程序实际上将它正在做的事情转储到控制台-在编译8MB源代码时,这是个坏主意
因此,似乎从
-v2
开始


(在提出这个问题的程序的具体案例中,GHC似乎永远都在类型检查阶段。)

你可以构建一个GHC的分析版本,然后使用标准的分析工具来查看事件发生后它在做什么。你可以通过指定详细信息来让它变得健谈
-v4
告诉你很多事情发生了什么-是的,输出将是巨大的,但是如果你只想监视它,就让它去终端,通常,它只记得最后1000行左右。根据我的经验,GHC进入无限循环是可以识别的,因为它所做的任何有效率的事情都会缓慢地消耗大量内存……如果它是类型检查,它可能会被困在无限循环中,解决不可判定的实例。类型推断也可能是一个问题,因为H-M推断具有可怕的最坏情况时间复杂性。这些是我能想到的唯一合理的理由。你解决过这个问题吗?@C.A.McCann我只是想编译一个巨大的源文件。它没有任何特别不寻常的东西,只是非常非常大。我把问题“解决”了,把它缩小了很多。