【C语言这么厉害,它自身又是用什么语言写的?】C语言在运行之前,得编译才行,那C语言的编译器从哪里来? 用什么语言来写的?如果是用C语言本身来写的,到底是先有蛋还是先有鸡?

【C语言这么厉害,它自身又是用什么语言写的?】C语言在运行之前,得编译才行,那C语言的编译器从哪里来? 用什么语言来写的?如果是用C语言本身来写的,到底是先有蛋还是先有鸡?
我们假设世界上不存在任何编译器, 先从机器语言说起。 机器语言可以直接被CPU执行,不需要编译器。然后是汇编语言, 汇编语言虽然只是机器语言的助记符,但是也需要编译成机器语言才能执行,没办法只能用机器语言来写这第一个编译器了。 汇编语言的问题解决了,就往前迈进了一大步,这时候就可以用汇编语言去写C语言的编译器,我们说这是C编译器的老祖宗。 有了这个老祖宗,就可以编译任意的C语言程序了,那是不是可以用C语言本身写一个编译器?只要用老祖宗编译一下就可以了。OK, 这么一层层上来,终于得到了一个用C语言写的编译器。 到这个时候,之前那个汇编写的C语言编译器就可以抛弃了。 当然,如果在C语言之前,已经出现了别的高级语言,例如Pascal,那就可以用Pascal来写一个C语言的编译器。第一个Pascal的编译器据说使用Fortran写的。而做为第一个高级语言的Fortran,它的编译器应该是汇编语言写的。可能有人问:我用汇编写一段Hello World都很麻烦,居然有人可以用它写复杂的编译器?这可能吗?当然可能,在开发第一代Unix的时候,连C语言都没有, Ken Thompson和Dennis Ritchie可是用汇编一行行把Unix敲出来的。WPS第一版是求伯君用汇编写出来的, Turbo Pascal 的编译器也是Anders 用汇编写出来的,大神们的能力不是普通人能想象得到的。 对于编译器来说,还可以采用“滚雪球”的方式来开发:还是以C语言为例,第一个版本可以先选择C语言的一个子集,例如只支持基本的数据类型,流程控制语句,函数调用… 我们把这个子集称为C0。然后用汇编语言写个编译器,只搞定这个语言的子集C0,这样写起来就容易不少。C0这个语言可以工作了,然后我们扩展这个子集,例如添加struct,指针… ,把新的语言称为C1。 那C1这个语言的编译器由谁来写? 自然是C0。等到C1可以工作了,再次扩展语言特性,用C1写编译器,得到C2。 然后是C3, C4… 最后得到完整的C语言。这个过程被称为bootstraping , 中文叫做自举。

猜你喜欢

转载自blog.csdn.net/dianqicyuyan/article/details/123363983