【发布时间】:2017-10-09 00:14:29
【问题描述】:
我正在研究 GHC 的内部结构,我发现所有的解析和类型系统都完全用 Haskell 编写。语言的底层核心由RTS 提供。问题是下列哪一项是正确的?
- RTS包含类型系统的C实现和Haskell的其他基础部分(我没找到,RTS主要是GC和线程)
- 一切都在 Haskell 中实现。但这似乎很棘手,因为构建 GHC 已经需要 GHC。
你能解释一下编译器的开发逻辑吗?例如,Python internals 提供了 C 中所有内容的不透明实现。
【问题讨论】:
-
类型被编译删除。 RTS 对类型一无所知,它只实现了 STG 机器(现在采用 eval/apply 样式),这是一种处理闭包、thunk 等的有效技术。RTS 还实现了 GC,以及一些与 C 级别接口的 FFI。
-
除了以上内容,我认为一切都在 Haskell 中。没有以前的 GHC 就无法编译 GHC,就像没有以前的 GCC 就无法编译 GCC。我猜 GHC 的早期版本可以从 C 或其他一些 Haskell 编译器/解释器引导,而后者又可以引导。
-
所以,一切(例如类型推断)都是在 Haskell 中实现的。然后 STG 接收评估的低级表示并在没有任何类型检查的情况下执行它,仅使用值进行操作?
-
是的,STG 不执行类型检查。在许多静态类型的编程语言中,仅在编译时检查类型,然后可以丢弃(擦除),以便在运行时不会因类型而产生开销。在 GHC 中,静态类型检查器在 Haskell 中实现。
-
如果你真的想看到用 C 实现的 Haskell 类型系统,无论出于何种原因,Hugs98 中都有一个(参见
src/type.c)。
标签: haskell types compiler-construction ghc