对于哲学问题先有鸡还是先有蛋一直是人们争论的焦点,但是从语言学定义来说,没有鸡如何定义鸡蛋,然而不管是先有鸡蛋还是先有鸡,因为它们的循环依赖,导致了彼此的共生。
对于软件行业来说,编程语言和编译器就很类似鸡和鸡蛋的关系。
用编程语言写出了编译器,反过来用编译器对编程语言进行了编译。
表面上来看,编译器和编程语言是彼此依赖的,但是更高层面上来讲它们是不断进化的。一开始的编程语言不完善,写出的编译器也是不完整的,然后我们用不完整的编译器编译了编程语言,让它逐渐变得完整,同时我们又用变得完整的编程语言,写出了更加完整的编译器。
究竟谁是最先产生的?
对于这个问题,一定是现有的编程语言,因为最早的编程语言我们可以认为它们不需要编译,因为它们可以直接来操作硬件,所以应该是先有A编程语言,然后用A编程语言编写了一个编译器,这个编译器可以编译B语言,然后B编程语言可以自己编写出自己的编译器来编译自己。
自举
一个人再有力气也无法给自己举起来,但是在软件编程里面,编译语言却可以用自己编写的编译器编译自己,这就叫做自举。
完成自举的过程。
- 用X语言把那个Y语言编译器写出来。
- 用Y语言把编译器编写出来,用上面的编译器进行编译。
- Y编译出来的编译器对Y进行编译,得到新的编译器。
- 新的编译器进行用例测试,没问题的话,用Y语言写的新的编译器就可以对Y语言编译,实现编译器自举。
现实中的例子
做一个打铁工具,然后用这个打铁工具又可以做出打铁工具。
用编程语言写出编辑器,反过来再用编辑器去写编程语言。
有钱了去投资,投资之后有了钱再去投资。
总结
编译器本身是一种将一种语言翻译成另一种语言的工具,至于它本身是如何编写的,我们其实并不太关心,只要它可以准确快速地帮我们完成翻译的工作就可以了。
先有鸡还是先有蛋并不重要,重要的是我们既可以吃鸡,又可以吃鸡蛋。