【问题标题】:GHC pipeline: Core, STG - ASTs or text?GHC 管道:核心、STG - AST 还是文本?
【发布时间】:2015-02-05 13:46:27
【问题描述】:

在 GHC 的流程中,有一个阶段是将 Haskell 源代码翻译成 Core,然后(不一定是下一步)将 Core 翻译成 STG。 但是,我无法理解一个问题——我们什么时候有“正常”代码(即纯文本),什么时候真正存在于内存中,比如抽象语法树 (AST)?

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

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

2) 几乎相同的问题适用于 Core 到 STG 的转换(但在这种情况下,我想我可以假设我们拥有的是 Core 的 AST - 对吗?)

【问题讨论】:

    标签: haskell compiler-construction compilation ghc abstract-syntax-tree


    【解决方案1】:

    首先将 Haskell 源代码解析为完整的 Haskell AST,然后对其进行类型检查。

    从那时起,它被脱糖到 Core,翻译成 STG,从那里到 Cmm,再到汇编或 LLVM 代码。所有这些阶段都建立在 AST 之上,在汇编/llvm 代码之前没有任何这些阶段的文本表示,然后将其写入文件并使用外部工具编译。

    拥有完整的 Haskell AST 并不奇怪。实际上,要求根据用户编写的代码给出类型错误,而不是仅在 Core 级别检测类型错误。

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

    【讨论】:

    • 看看here,尤其是here,然后是here,和here
    • 修复了链接。这就是我尝试生成干净的https://www.haskell.org/ghc/ 链接而不是奇怪的https://downloads.haskell.org/~ghc/ 链接的结果。
    • 我会避免说编译器“deugars to Core”。首先,在 ghc 中,“脱糖”是在 Core 之前的一个单独的 Haskell 到 Haskell 阶段。其次,Core 是一种 System-F 派生语言,从 Haskell 到 Core 的翻译在恕我直言,不仅仅是脱糖。
    • 我相信 desugar 是 GHC 中用来从 Haskell 转换为 Core 的术语:“Desugarer (compiler/deSugar/Desugar.lhs) 从海量 HsSyn 类型转换为 GHC 的中间语言, CoreSyn。” (ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/HscMain)
    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多