编程语言自举

什么是编程语言的自举?

自举,英文bootstrapping,意思就是自己可以启动或者编译自己,自己拽着自己的头发能把自己提起来,整个计算机系统从硬到软件最基础的部分都是自举的。听起来似乎哪儿不对,嗯...

以下是来自知乎轮子哥的解释,听起来更通俗易懂:

你想创造一门V语言而且用V语言来写V编译器的话,你得按照下面的方法做:
1、用C++把那个编译器(A)写出来,顺便留下很多测试用例。
2、用V语言把那个编译器写(B)出来,用A.exe来编译B,修改直到所有测试用例都通过为止。
3、B.exe来编译B自己得到B2.exe,修改直到B2.exe所有测试用例都通过为止。这是为了保证,就算B本身有很多bug,至少编译自己是没有bug的,从而你就可以走到第四步。
4、当你觉得有信心了,用A.exe把B编译一遍,就得到了B.exe。然后A的代码和A.exe都在也不需要存在了,删掉他们。以后你就不断的用B.exe来编译下一个版本的B就好了。就自举了。

那么为什么一定要完成自举,而不是使用最初始的编译器呢?可能当我们自己去设身处地地去想一下初始编译器的状态,就可以大致明白了:最初的编译器往往只在乎能正确工作,而不会考虑最优。举一个极端的例子,Donald Knuth即便再是大牛,如果要亲手编译每个WEB程序员编写的每个程序,那也是效率极其低下的。

一般来说,完成自举有如下的优点:

1. 这是一种对该语言的极好的测试;
2. 编译器的开发者只需掌握这一门语言即可,不需要再掌握其它语言;
3. 开发编译器的环境和使用这门语言开发的所有其它程序一致;
4. 对编译器后端的优化不仅会优化以后所有编译出来的其它程序的效率,也会优化编译器本身的效率。

实际上自举是有种哲学的思想在里面,是某种意义上的里程碑,一种语言能实现自举说明它已经可以摆脱其他语言实现自我迭代。正如道家所云:道生一,一生二,二生三,三生万物。自举最重要的节点就是完成那个道生一的过程,一门语言能自己编写自己的编译器,并用旧的编译器编译出新的编译器,实现自举才是该语言成熟的标志。

标签:自举