就是自己的编译器可以自行编译自己的编译器。 实现方法就是这个编译器的作者用这个语言的一些特性来编写编译器并在该编译器中支持这些自己使用到的特性。 首先,第一个编译器肯定是用别的语言写的(不论是C还是Go还是Lisp还是Python),后面的版本才能谈及自举。 至于先有鸡还是先有蛋,我可以举个这样的不太恰当的例子:比如我写了一个可以自举的C编译器叫作mycc,不论是编译器本身的执行效率还是生成的代码的质量都远远好于gcc(本故事纯属虚构),但我用的都是标准的C写的,那么我可以就直接用gcc编译mycc的源码,得到一份可以生成高质量代码但本身执行效率低下的mycc,然后当然如果我再用这个生成的mycc编译mycc的源码得到新的一份mycc,新的这份不光会产生和原来那份同等高质量的代码,而且还能拥有比先前版本更高的执行效率(因为前一份是gcc的编译产物,后一份是mycc的编译产物,而mycc生成的代码质量要远好于gcc的)。故事虽然是虚构的,但是道理差不多就是这么个道理。这也就是为什么如果从源码编译安装新版本的gcc的话,往往会“编译——安装”两到三遍的原因。
FreeBirdLjj仁兄说得很到位……其实这种事情经常发生。比如我有了一台电脑,就可以用这台电脑去做计算机辅助设计,造出更好的电脑来了。但是无论我用哪台电脑做的辅助设计,只要设计图纸是一样的,按照图纸做出的电脑理论上也应该是一样的。
就是自己的编译器可以自行编译自己的编译器。
实现方法就是这个编译器的作者用这个语言的一些特性来编写编译器并在该编译器中支持这些自己使用到的特性。
首先,第一个编译器肯定是用别的语言写的(不论是C还是Go还是Lisp还是Python),后面的版本才能谈及自举。
至于先有鸡还是先有蛋,我可以举个这样的不太恰当的例子:比如我写了一个可以自举的C编译器叫作
mycc
,不论是编译器本身的执行效率还是生成的代码的质量都远远好于gcc
(本故事纯属虚构),但我用的都是标准的C写的,那么我可以就直接用gcc
编译mycc
的源码,得到一份可以生成高质量代码但本身执行效率低下的mycc
,然后当然如果我再用这个生成的mycc
编译mycc
的源码得到新的一份mycc
,新的这份不光会产生和原来那份同等高质量的代码,而且还能拥有比先前版本更高的执行效率(因为前一份是gcc
的编译产物,后一份是mycc
的编译产物,而mycc
生成的代码质量要远好于gcc
的)。故事虽然是虚构的,但是道理差不多就是这么个道理。这也就是为什么如果从源码编译安装新版本的gcc
的话,往往会“编译——安装”两到三遍的原因。