第一个C编译器是如何编写的?

Jas*_*S.P 50 c compiler-construction assembly

第一个C编译器是用C本身编写的吗?然后,它是如何执行和编译的?或者,这个编译器是用汇编语言编写的吗?

Han*_*ant 75

Dennis Ritchie撰写的C语言历史中,它描述得很好.

只给出他在那里写的内容的摘要,使用他的文章获得更精细的细节.C以BCPL语言开头,Ken Thomson可以访问在General Electrics 635主框架上运行的编译器.对该语言不满意,Thomson使用BCPL为B语言编写了一个编译器,这是BCPL之外的一个进化步骤,它消除了BCPL中的一些技术问题.

他们使用B在他们的PDP-7小型机上创建程序,虽然它们大多数只是玩具程序,但机器的硬件功能非常有限.Thomson采取的一个重要步骤是在B本身中重写B编译器.一个常见的自举步骤.

然后通过称为NB(新B)的短暂中间步骤逐渐调整该编译器以开始类似于C. PDP-11小型计算机在该步骤中发挥了作用,为他们提供了足够的空间来改进语言和编译器.

  • 有人将Dennis Ritchie的早期PDP-11版本之一放在github上作为后代:https://github.com/mortdeus/legacy-cc [source](http://thechangelog.com/explore-a-piece-of-unix -history-丹尼斯-ritchies的最早C编译器/) (23认同)
  • 上面的链接被打破了 - 对于后代,我相信这是相同的写作:https://www.bell-labs.com/usr/dmr/www/chist.html (4认同)

小智 21

第一个C编译器不是用C编写的,通常在编写编译器时我们使用汇编语言或其他编程语言,并且通常在第一次编译之后,编译器会用它的本地语言重写.

有很多编程语言都是用C编写的,然后用他们的母语重写:例如Java,Ada ......

  • 实际上我不知道最后一次编译器是用汇编编写的.我相信在20世纪60年代中期很快就会失去风格.虽然至少有几个20世纪50年代的编译器是用汇编编写的(Hopper着名的1952年A-0语言编译器,IBM(Backus et团队)FORTRAN于1957年编写.到1960年至少有一个编译器,即COBOL编译器UNIVAC-II是用FLOW-MATE编写的.Src:[编译器构建历史](https://en.wikipedia.org/wiki/History_of_compiler_construction)从那时起,大多数都是从现有的高级语言中引导的. (3认同)
  • 我也浏览了legacy-cc,我相信装配部分是必要的,因为它必须在某个时刻输出装配。我认为legacy-cc中的程序集主要是编译器将输出的模板。但我也想指出的是,组装并不一定像害虫一样需要避免,据说Chris Sawyer在组装中开发了过山车大亨!如果你掌握了这门语言,它也可以变得富有成效。 (2认同)
  • 最初的Ada编译器不是用C编写的。我工作过的(在TeleSoft)是用Pascal编写的,然后在Ada中重新实现。我相信第一个经过验证的Ada编译器是用SETL编写的。 (2认同)
  • 只是一个小小的挑剔:java语言有一个用java编写的编译器和一个用C++编写的虚拟机. (2认同)

egy*_*yik 7

阅读丹尼斯·里奇 (Dennis Ritchie) 关于原始C的笔记表明,就像先有鸡和先有蛋一样,C通过引导从前驱语言及其自己的编译器演变而来。物种形成时间尺度比 Gallus gallusdomesticus 快。

甚至可以看到编译器源代码陷入了进化的混乱之中。该笔记链接到从磁带备份恢复的两个快照。这段代码也放到了github上。这些快照构成了中间化石,比 K&R 语法早了几年。Dennis 对其中一个磁带的描述表明,它是一个自举结构的冻结帧:

“prestruct-c”是编译器的副本,就在我开始将其更改为使用结构本身之前。

换句话说,编译器已被扩充以支持结构,但尚未使用它们。进行磁带备份的好时机...