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

时间:2017-05-10 11:16:53

标签: haskell types compiler-construction ghc

我正在研究GHC的内部结构,我发现所有的解析和类型系统都是在Haskell中完全编写的。该语言的低级核心由RTS提供。问题是以下哪一项是正确的?

  • RTS包含类型系统的C实现和Haskell的其他基本部分(我没有找到它,RTS主要是GC和线程)
  • 一切都在Haskell本身实现。但这似乎相当棘手,因为建立GHC已经需要GHC。

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

1 个答案:

答案 0 :(得分:1)

正如其他人在评论中指出的那样,GHC几乎全部写成 在Haskell中(加上选择GHC扩展)并且打算用它自己编译。事实上,世界上唯一可以编译GHC编译器的程序是GHC编译器!特别是, 解析和类型推断是在Haskell代码中实现的 不会在任何地方找到隐藏在其中的C实现。

理解内部结构的最佳来源 编译器(以及实现的方法)是GHC Developer Wiki 特别是“GHC评论”链接。如果你有相当多的业余时间,那么来自video series 波特兰2006 GHC黑客马拉松绝对令人着迷。

注意编译器的想法是用它的语言编写的 编译并不罕见。许多编译器都是“自托管”的含义 它们是用他们编译的语言编写的 编译自己。例如,请参阅另一个堆栈上的此问题 交换姊妹网站:Why are self-hosting compilers considered a rite of passage for new languages?,或只是Google for “自托管编译器”

正如你所说,这是“棘手的”,因为你需要一种方法来获得 过程开始了。一些方法是:

  • 您可以使用其他语言编写第一个编译器 已经有一个编译器(或用汇编语言编写);然后, 一旦你有一个正在运行的编译器,你可以将它移植到相同的 它汇编的语言。根据{{​​3}}, 第一个C编译器就是这样编写的。它写在“NewB”中 其编译器是用“B”编写的,这是一个自托管编译器 最初是用汇编写的,然后重写的 本身。

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

  • 如果用另一种语言编写的口译员已经存在或是 易于编写,编译器可以由解释器运行 编译自己的源代码,然后编译编译器 可以用来编译自己。 this Quora answer是 自称是第一个以这种方式引导自己的编译器。

通常可以通过将编译器(至少最初)写入语言的受限核心来简化引导过程,即使编译器本身能够编译完整语言也是如此。然后,一个低于现有的编译器或简化的自举编译器或解释器可以启动该过程。

根据The first LISP compiler,最初的GHC编译器于1989年在Lazy ML中编写,然后在同年晚些时候在Haskell中重写。目前,GHC的新版本及其所有闪亮的新功能都是在较旧版本的GHC上编译的。

Python解释器的情况有点不同。一个 解释器可以用它所解释的语言编写,当然, 在编写Lisp的Lisp世界中有很多例子 Lisp中的解释器(为了好玩,或者在开发一种新的Lisp方言,或者 因为你是the Wikipedia entry for GHC),但它不能全部是解释者 下来,所以最终你需要一个编译器或一个 口译员用另一种语言实施。因此,大多数 口译员不是自我托管:主流口译员 Python,Ruby和PHP都是用C语言编写的。(尽管如此,PyPy是另一种选择 用Python编写的Python解释器的实现, 所以...)