GHC 内部:是否有类型系统的 C 实现?

GHC internals: is there C implementation of the type system?

我正在研究 GHC and I find all the parsing and type system written completely in Haskell. Low-level core of the language is provided by RTS 的内部结构。问题是以下哪一项是正确的?

能否解释一下编译器的开发逻辑?例如 Python 内部提供了 C 中所有内容的不透明实现。

正如其他人在评论中指出的那样,GHC 几乎完全是写的 在 Haskell 中(加上 select GHC 扩展)并且旨在与自身一起编译。事实上,世界上唯一可以编译GHC编译器的程序就是GHC编译器!特别是, 解析和类型推断在 Haskell 代码中实现,你 在任何地方都找不到隐藏的 C 实现。

了解内部结构的最佳来源 编译器(以及实现方式)是 GHC Developer Wiki 特别是 "GHC Commentary" link。如果您有足够的空闲时间,视频 系列 来自 波特兰 2006 GHC 黑客马拉松绝对精彩。

请注意,编译器的想法是用它所用的语言编写的 编译并不罕见。很多编译器都是"self-hosting"的意思 它们是用它们编译的语言编写的,并且旨在 自己编译。例如,参见另一个 Stack 上的这个问题 交流姊妹站点:为什么自托管编译器被认为是 新语言的通过仪式?,或者只是 Google "self-hosting compiler"

正如您所说,这是 "tricky",因为您需要一种方法来获取 过程开始了。一些方法是:

  • 你可以用不同的语言编写第一个编译器 已有编译器(或用汇编语言编写);然后, 一旦你有了 运行ning 编译器,你就可以把它移植到同一个 它编译的语言。根据 this Quora answer, 第一个 C 编译器就是这样写的。它写于 "NewB" 它的编译器是用 "B" 编写的,一个自托管编译器 最初是用汇编写的,然后用 本身。

  • 如果该语言流行到足以拥有另一个编译器,写 编译器使用自己的语言并分阶段编译,首先 与其他编译器,然后与自身(由 其他编译器),然后再次与自身(由自身编译)。 最后两个编译器可执行文件可以作为一种比较 大量测试编译器是否正确。 Gnu C 编译器可以 以这种方式编译(这肯定是从源代码安装它的标准方式,使用供应商的[劣质!] C编译器开始)。

  • 如果用另一种语言编写的解释器已经存在或正在使用 容易写,编译器可以被解释器运行 编译自己的源代码,然后编译编译 可以用来编译自己。 The first LISP compiler 是 自称是第一个以这种方式 bootstrap 本身的编译器。

通常可以通过在语言的受限核心中编写编译器(至少在最初)来简化 bootstrapping 过程,即使编译器本身能够编译完整的语言。然后,低于标准的现有编译器或简化的 bootstrapping 编译器或解释器可以启动该过程。

根据 the Wikipedia entry for GHC,最初的 GHC 编译器是在 1989 年用 Lazy ML 编写的,然后在同年晚些时候在 Haskell 中重写。如今,新版本的 GHC 及其所有闪亮的新功能都是在旧版本的 GHC 上编译的。

Python 解释器的情况有点不同。一个 解释器可以用它解释的语言编写,当然, 并且在 Lisp 世界中有很多写 Lisp 的例子 Lisp 解释器(为了好玩,或开发新的 Lisp 方言,或 因为你是 inventing Lisp),但不可能都是口译员 一路走下去,所以最终你需要一个编译器或一个 用另一种语言实现的解释器。结果,大多数 口译员不是自托管的:主流口译员 Python、Ruby 和 PHP 是用 C 编写的。(不过,PyPy 是替代 在 Python 中编写的 Python 解释器的实现, 所以...)