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

Haskell GHC内部:是否有类型系统的C实现?,haskell,types,compiler-construction,ghc,Haskell,Types,Compiler Construction,Ghc,我正在研究的内部,我发现所有的解析和类型系统都是完全用Haskell编写的。该语言的底层核心由提供。问题是以下哪一项是正确的 RTS包含类型系统的C实现和Haskell的其他基本部分(我没有找到,RTS主要是GC和线程) 一切都是在Haskell本身中实现的。但这似乎相当棘手,因为构建GHC已经需要GHC 你能解释一下编译器的开发逻辑吗?例如,内部提供了C中所有内容的不透明实现。正如其他人在评论中所指出的,GHC几乎完全是编写的 在Haskell中(加上选择GHC扩展),并打算自行编译。事实

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

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

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

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

了解系统内部结构的最佳来源 编译器(以及如何实现)是 特别是“GHC评论”链接。如果你有一点空闲时间,从 波特兰2006 GHC Hackathon绝对迷人

请注意,编译器是用它所使用的语言编写的 编译并不罕见。许多编译器都是“自托管”的意思 它们是用它们编译的语言编写的,并且 编译它们自己。例如,请参见另一个堆栈上的这个问题 交换姐妹站点:,或者简单地用谷歌搜索 “自托管编译器”

正如您所说,这是“棘手的”,因为您需要一种方法来获得 进程已启动。有些办法是:

  • 您可以使用不同的语言编写第一个编译器 已经有编译器(或用汇编语言编写);那么, 一旦有了一个正在运行的编译器,就可以将它移植到同一个编译器 它编译的语言。据报道, 第一个C编译器就是这样编写的。它是用“新手”写的 谁的编译器是用“B”编写的,这是一个自托管编译器 最初是在汇编中编写的,然后在 本身

  • 如果该语言足够流行,可以使用另一个编译器,那么编写 首先,编译器使用自己的语言,并分阶段编译 使用另一个编译器,然后使用自身(由 另一个编译器),然后再次使用自身(由自身编译)。 最后两个编译器可执行文件可以作为一种 大规模测试编译器是否正确。GNUC编译器可以 以这种方式编译(这当然是从源代码处安装它的标准方式,使用供应商的[subsier!]C编译器开始)

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

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

据介绍,最初的GHC编译器于1989年用Lazy ML编写,同年晚些时候用Haskell重写。如今,GHC的新版本及其所有闪亮的新功能都是在GHC的旧版本上编译的

Python解释器的情况略有不同。一 当然,口译员可以用它所解释的语言书写, 在Lisp世界中,有很多编写Lisp的例子 口译员使用Lisp(为了好玩,或开发新的Lisp方言,或 因为你是),但不可能全是口译员 最终,您需要一个编译器或一个 用另一种语言实现的解释器。因此,大多数 口译员不是自我托管的:翻译的主流口译员 Python、Ruby和PHP都是用C语言编写的(尽管PyPy是另一种语言) 用Python编写的Python解释器的实现,
所以…

类型被编译删除。RTS对类型一无所知,它只实现了STG机器(现在是eval/apply样式),这是一种处理闭包、thunks等的有效技术。RTS还实现了GC和一些FFI,以与C级接口。除此之外,我认为一切都在Haskell中。没有以前的GHC就不能编译GHC,正如没有以前的GCC就不能编译GCC一样。我猜GHC的早期版本是可以从C或其他Haskell编译器/解释器引导的,而其他Haskell编译器/解释器又是可以引导的。因此,一切(例如类型推断)都是在Haskell中实现的。然后STG接收评估的低级表示,只执行评估而不进行任何类型检查,仅使用值进行操作?是的,STG不执行类型检查。在许多静态类型编程语言中,类型只在编译时检查,然后可以丢弃(擦除),这样在运行时就不会因为类型而产生开销。在GHC中,静态类型检查器是在Haskell中实现的。如果您真的想看到一个Haskell类型系统以C实现,不管出于什么原因,Hugs98中都有一个(请参见
src/type.C
)。GHC可以用标志来构建,标志告诉它创建非常未优化的C程序,而不是可执行文件。这就是它在新平台上的引导方式。