由编译语言本身编写的编程语言引起的混淆

时间:2014-07-12 02:33:27

标签: haskell compiler-construction programming-languages hardware

偶然我知道Haskell的编译器是用Haskell编写的。这听起来很奇怪。我的意思是,这怎么可能自我编译?谁是编译编译器呢?机器接受的最终代码是什么?

考虑编程语言 first 有编译器。它的编译器的语言是什么?回到更远的时间,人们如何在编译器时代之前编程?

从广义上讲,我常常对软件(例如人们编写的程序)和硬件(例如物理机器上可执行的东西)之间的 border 感到困惑。

P.S。:我对编译器有基本知识,例如词法分析,解析和代码优化。但是,我对硬件(机器)知之甚少。

似乎相关帖子 Implementing a compiler in “itself”的答案并没有深入到软件和硬件之间的边界。
我想看一些具体的例子。

编辑:有些评论提到术语" bootstrapping"。似乎有一些语言的最小核心部分(如数学中的公理/基本定理)必须以较低级别的方式编译(而不是本身 )。这些是什么?它们在不同语言中基本相同吗?我想再看一些具体的例子。

2 个答案:

答案 0 :(得分:4)

正如您在第28页的A history of Haskell中所读到的那样,第一个haskell编译器于1989年6月在Lazy ML中编写。它基本上实现了所有Haskell 1.0。

现在这个编译器已经存在,它可以用来编译GHC的Haskell版本。在Haskell编写的GHC的第一个测试版于1991年4月1日发布。完整版于1992年12月发布。

由于没有进一步开发基于Lazy ML的编译器,今天您使用以前版本的GHC来编译GHC。因此,如果你想构建GHC 7.8,你可以使用GHC 7.6来构建它(实际上,它有点复杂,因为有多个阶段,只有第一阶段,不支持GHCi或TemplateHaskell是用GHC 7.6构建的)

这意味着如果你今天没有工作的haskell编译器,你有两个选择:

  1. 尝试安装LML编译器并编译用Lazy ML编写的第一个GHC版本。然后使用此编译器编译用Haskell编写的下一个版本。然后再次使用该编译器构建下一个版本,并重复直到您有一个合理的最新编译器。有可能跳过几个版本,但我不知道有多少版本。你可以想象,这可能需要很长时间。
  2. (更容易)下载预建的GHC二进制文件。

答案 1 :(得分:0)

嗯......我没试过这个,但是另一条路线就是简单地编译成c并使用ac编译器来编译最新的ghc ... ghc本身是分阶段构建的,所以你甚至不需要转换整个代码库到c,只是第一个阶段,然后可以编译其余的。当然不需要挖掘Lazy ML。

编辑:请注意,生成的编译器不会构建针对新平台的二进制文件,它只是在该平台上运行,并且是ghc已经有后端的目标的跨平台编译器。另一个注意事项是,我实际上是为了回应bennofs的回答而不是单独回答OP。