作者|刘鑫
这篇文章获得了在码农转载的许可。(id: code rising)
这是来自我星球的问题。" C语言本身是用什么语言写的?"" "
换个角度问,C语言运行前要编译,C语言的编译器从哪里来?用什么语言写的?如果用C语言本身写的话,到底是先有蛋,还是先有鸡?
假设世界上没有编译器。先从机器语言开始,看该怎么办。
机器语言可以直接在CPU上运行,不需要编译器。
然后汇编语言,汇编语言只是机器语言的助记符,但要运行,必须编译成机器语言,不能只用机器语言写第一个编译器(以后不需要)。
汇编语言问题解决后,迈出了一大步。这时可以用汇编语言写C语言编译器。据说是c编译器的祖先。
通过这个祖先可以任意编译C语言程序。c语言本身可以写编译器吗?只要编译成祖先就行了。
OK,就这样层层往上爬,终于收到了用C语言写的编译器,真的很烦。
到这个时候,以前编写的C语言编译器可以放弃。(莎士比亚,C,语言,语言,语言,语言,语言,语言,语言,语言)
当然,如果C语言之前出现了其他高级语言,如Pascal,则可以使用Pascal来编写C语言编译器。
据说第一个Pascal的编译器是使用Fortran写的。第一种高级语言Fortran的编译器必须用汇编语言编写。
关于编译器有一个有趣的传说。
据说UNIX发明家之一Ken Thompson从贝尔实验室到任何UNIX机器都可以趾高气扬地输入自己的ID和密码,以ROT身份登录。(莎士比亚,Northern Exposure(美国电视剧))。
贝尔研究所的人才得救了,其他黄牛发誓要找出这个漏洞。他们通读了UNIX的C源代码,终于找到了登录的后门,整理了后门,然后编译了UNIX并运行了,但是汤普森仍然可以登录。(莎士比亚,坦普林,Northern Exposure)。
编译器好像有问题,编译UNIX的时候移植了后门,所以用C语言重写编译器,用新的编译器重新编译UNIX,最终天下太平。大卫亚设(David Assell),Northern Exposure(美国电视)。
但是仍然不起作用。汤普森仍然可以以root身份登录。真的可以崩溃!
后来汤普森本人解开了秘密。第一个C语言编译器有问题。该编译器在编译UNIX源代码时植入后门。那还不够。更大的是,如果用C语言写新编译器,就要编译成二进制代码。应该用什么编译。只能用汤普生写。
说到这里,我想起了几年前的XCode ghost事件,简而言之,在Xcode(非正式频道下载)中植入木马,导致Xcode上编译的IOs应用程序受到污染,可以被黑客做非法的事情。(威廉莎士比亚,《北方司法》前情提要)。
这款XCodeGhost离Thompson的后面很远,但提醒你下载软件时可以使用正规渠道,从官方网站下载,检查网站的HTTPS标准,检查checksum。
可能有人会问。我用剪辑写hello world很麻烦,谁能用它写复杂的编译器呢?有可能吗?
当然,开发第一代UNIX时也没有C语言,Ken Thompson和Dennis Ritchie用一排汇编敲UNIX。WPS第一版是Guber君用剪辑写的,Turbo Pascal的编译器也是Anders用剪辑写的,大神们的能力不是一般人能想象的。
对于编译器,也可以用“雪球”的方式开发。
或者,以C语言为例,第一个版本可以先选择C语言的子集。例如,仅支持基本数据类型、流程控制语句和函数调用。此子集称为C0。
然后用汇编语言编写编译器,只处理该语言的子集C0,这样写起来就容易多了。
C0这种语言可以工作。然后展开该子集。例如,struct,指针.新语言被称为C1。
那么C1这种语言的编译器是谁写的?自然是C0。
等到C1可以工作,再扩展语言功能,用C1编写编译器,得到C2。
然后是C3、C4.最后得到完整的C语言。
这个过程叫bootstraping,汉语叫主动。
作者简介:刘鑫,畅销书《码农翻身》作者,15年以上开发经验,前IBM架构师,领导着众多企业应用架构设计和开发工作。善于洞察技术的本质,用故事说明复杂的技术。
[结尾]
1.《关于csdn官网我想说C 语言这么厉害,它自身是用什么语言写的?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《关于csdn官网我想说C 语言这么厉害,它自身是用什么语言写的?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/1951882.html