偶然我知道Haskell的编译器是用Haskell编写的。这听起来很奇怪。我的意思是,这怎么可能自我编译?谁是编译编译器呢?机器接受的最终代码是什么?
考虑编程语言 first 有编译器。它的编译器的语言是什么?回到更远的时间,人们如何在编译器时代之前编程?
从广义上讲,我常常对软件(例如人们编写的程序)和硬件(例如物理机器上可执行的东西)之间的 border 感到困惑。
P.S。:我对编译器有基本知识,例如词法分析,解析和代码优化。但是,我对硬件(机器)知之甚少。
似乎相关帖子 Implementing a compiler in “itself”的答案并没有深入到软件和硬件之间的边界。
我想看一些具体的例子。
编辑:有些评论提到术语" bootstrapping"。似乎有一些语言的最小核心部分(如数学中的公理/基本定理)必须以较低级别的方式编译(而不是本身 )。这些是什么?它们在不同语言中基本相同吗?我想再看一些具体的例子。
答案 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 :(得分:0)
编辑:请注意,生成的编译器不会构建针对新平台的二进制文件,它只是在该平台上运行,并且是ghc已经有后端的目标的跨平台编译器。另一个注意事项是,我实际上是为了回应bennofs的回答而不是单独回答OP。