第一个C编译器是用C本身编写的吗?然后,它是如何执行和编译的?或者,这个编译器是用汇编语言编写的吗?
答案 0 :(得分:73)
在C语言历史的Dennis Ritchie's writeup中很好地描述了它。
仅仅总结他在那里写的内容,使用他的文章来获得更精细的细节。 C以BCPL语言开头,Ken Thomson可以访问在General Electrics 635主框架上运行的编译器。对该语言不满意,Thomson使用BCPL为B语言编写了一个编译器,这是BCPL之外的一个进化步骤,它消除了BCPL中的一些技术问题。
他们使用B在他们的PDP-7小型机上创建程序,虽然它们大多数只是玩具程序,但机器的硬件功能非常有限。 Thomson采取的一个重要步骤是在B本身中重写B编译器。一个常见的自举步骤。
然后通过称为NB(新B)的短暂中间步骤逐渐调整编译器以开始类似于C. PDP-11小型机在该步骤中发挥了作用,为他们提供了足够的空间来改进语言和编译器。
答案 1 :(得分:18)
第一个C编译器不是用C编写的,通常在编写编译器时我们使用汇编语言或其他编程语言,并且通常在第一次编译之后,编译器会用它的本地语言重写。
有很多编程语言都是用C语言编写的,然后用他们的母语重写:例如Java,Ada ......
答案 2 :(得分:4)
阅读丹尼斯·里奇关于primevalC的说明表明,与鸡和蛋一样,C通过引导从一种前体语言和它自己的编译器发展而来。物种形成的时间尺度比Gallus gallus domesticus快。
甚至可以看到编译器源代码在进化动荡中陷入困境。该注释链接到从磁带备份还原的两个快照。此代码还有been placed on github.这些快照构成了中间化石,比K& R语法早几年。丹尼斯'其中一个磁带的描述显示它是一个被引导的结构的冻结框架:
" prestruct-C"在我开始更改之前是编译器的副本 它使用结构本身。
换句话说,编译器已经扩充为支持结构,但还没有使用它们。是制作磁带备份的好时机......