Haskell GHC管道:核心、STG-ASTs还是文本?

Haskell GHC管道:核心、STG-ASTs还是文本?,haskell,compiler-construction,compilation,ghc,abstract-syntax-tree,Haskell,Compiler Construction,Compilation,Ghc,Abstract Syntax Tree,在GHC的管道中,有一个阶段是将Haskell源代码翻译成Core,然后(不一定是下一步)将Core翻译成STG。 然而,有一个问题让我无法理解——什么时候我们有一个“普通”代码(即纯文本),什么时候内存中有一些东西,比如抽象语法树(AST) 为了让我的问题更精确一点,我将它分为几个部分: 1) 在Haskell源文件解析阶段,我们是否立即构建核心语言的AST?如果没有,那么在我看来,我们必须构建完整Haskell的AST(这似乎很奇怪),然后要么将它们转换为核心的AST,要么首先在核心中对它们

在GHC的管道中,有一个阶段是将Haskell源代码翻译成Core,然后(不一定是下一步)将Core翻译成STG。 然而,有一个问题让我无法理解——什么时候我们有一个“普通”代码(即纯文本),什么时候内存中有一些东西,比如抽象语法树(AST)

为了让我的问题更精确一点,我将它分为几个部分:

1) 在Haskell源文件解析阶段,我们是否立即构建核心语言的AST?如果没有,那么在我看来,我们必须构建完整Haskell的AST(这似乎很奇怪),然后要么将它们转换为核心的AST,要么首先在核心中对它们进行文本表示,然后再次调用解析来获得核心的AST


2) 几乎同样的问题也适用于从Core到STG的转换(但在本例中,我认为我可以假设我们拥有的是Core的ASTs-正确吗?

Haskell源首先解析为完整Haskell的AST,然后进行类型检查

从那时起,它被分解成核心,转换成STG,再从那里转换成Cmm,再转换成汇编或LLVM代码。所有这些阶段都是在AST上构建的,在汇编/llvm代码之前,这些阶段中的任何一个都没有文本表示,然后将其写入文件并使用外部工具进行编译

有一个完整的Haskell的AST不是一件难事。事实上,要求根据用户编写的代码给出类型错误,而不是仅在核心级别检测类型错误


您可以在中的模块中找到Haskell的AST,在中可以找到Core的AST。

请特别查看,然后。修复了链接。这就是我尝试生成干净的
https://www.haskell.org/ghc/
链接而不是奇怪的
https://downloads.haskell.org/~ghc/
链接。我会避免说编译器“desugars to Core”。首先,在ghc中,“脱糖”是一个单独的Haskell到Haskell相,在堆芯之前。其次,Core是一种System-F派生语言,从Haskell到Core的翻译不仅仅是desugaring。我认为,
desugar
是GHC中用于从Haskell转换为Core的术语:“desugar(compiler/desugar/desugar.lhs)将大规模HsSyn类型转换为GHC的中间语言CoreSyn。” ()