Last Updated: 2023-12-12 04:52:35 Tuesday
-- TOC --
本文追溯一下C语言的历史及其发展历程,以及一些关于C语言有趣的事情。
从图中时间线,可以明显的看出C语言的起源以及时间节点。
有时候不得不说时势造英雄,在1969~1971年之间,著名的操作系统Unix从Ken Thompson手中诞生,作为一种大型的系统性软件来说,极其需要一种可靠的高级语言的出现(当时的低级语言指的是汇编,因为之前的操作系统是用汇编写的)。这个时候的Dennis Ritchie也没闲着,在对B语言改良之后,就诞生了带有类型的C语言(据Ritchie自己说,有一段时间称这种改良的语言为NB。即:new B。不过,在我们这些吃瓜群众眼中看来也确实NB)。
不知道你有没有想过,大家都用C语言或基于C的语言来开发各种编译器,那么世界上第一个C语言编译器又是怎么编写的呢?这不是一个“鸡和蛋”的问题……
回顾一下C语言历史:Thompson在BCPL的基础上开发了B语言,Ritchie又在B语言的基础上成功开发出了现在的C语言。在C语言被用作系统编程语言之前,Thompson也用过B语言编写过操作系统。可见在C语言实现以前,B语言已经可以投入实用了。因此第一个C语言编译器的原型完全可能是用B语言或者混合B语言与PDP汇编语言编写的。
我们现在都知道,B语言的执行效率比较低,但是如果全部用汇编语言来编写,不仅开发周期长、维护难度大,更可怕的是失去了高级程序设计语言必需的可移植性。
汇编没有portability,它必然跟ISA绑定在一起。
所以早期的C语言编译器就采取了一个取巧的办法:先用汇编语言编写一个C语言的一个子集的编译器,再通过这个子集去递推,进而完成完整的C语言编译器。
详细的过程如下:
至于这里的N是多少,这取决于你的目标语言(这里是C语言)的复杂程度和程序员的编程能力。简单地说,如果到了某个子集阶段,可以很方便地利用现有功能实现C语言时,那么你就找到N了。
而这个过程也在Unix V2版本中找到了证据:
在C语言还没有被标准化之前,来自《C Programming Language》(First Edition, by Brian W. Kernighan, Dennis M. Ritchie. Prentice Hall PTR 1978)的C语言描述,可算作“正式”的标准,所以此时的C也称为K&R C
(也有说成它为Traditional C
)。这期间C语言一直不断地发生细微的变化,各编译器厂商也都有自己的扩展,这个过程一直持续到20世纪80年代末,ANSI C的出现。
我一直珍藏有一本《C Programming Language》(Second Edition)影印版!
1983年, 美国国家标准协会(ANSI)委任一个委员会X3J11对C语言进行标准化。 经过长期艰苦的过程, 该委员会的工作于1989年12月14日
正式被批准为ANSI X3.159
-1989,并于1990年春天颁布。因为这个标准出现在1989年,所以一般简称C89
标准。有些人也把C89标准叫做ANSI C,因为这个标准是美国国家标准协会(ANSI)发布的。
从C语言的诞生,到第一版标准出现,经过近20年的时间...
在1990年,ANSI C89标准被国际标准化组织(ISO)和国际电工委员会(IEC)采纳为国际标准,名叫ISO/IEC 9899:1990 - Programming languages -- C,有些人简称C90
标准。因此,C89和C90通常指同一个标准,一般更常用C89这种说法。
C语言的第一个标准是由ANSI发布的。虽然这份文档后来被国际标准化组织(ISO)采纳并且ISO发布的修订版也被ANSI采纳了,但名称ANSI C
(而不是 ISO C)仍被广泛使用。一些软件开发者使用ISO C,还有一些人使用 Standard C,但它们都一样,这是所用名称不同。
在2000年3月,国际标准化组织(ISO)和国际电工委员会(IEC)采纳了第二个C语言标准,名叫ISO/IEC 9899:1999 - Programming languages -- C,简称C99
标准。
在2011年12月,国际标准化组织(ISO)和国际电工委员会(IEC)采纳了第三个C语言标准,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C,简称C11
标准。
C语言的标准一直在发展,只是相对C++,C标准的变化非常缓慢和稳健!
C17
(也被称为为 C18
)是于2018年6月发布的 ISO/IEC 9899:2018 的非正式名称,被用来替代 C11标准。C17没有引入新的语言特性,只对 C11进行了补充和修正。
有许多人提出想为C语言添加面向对象的特性,包括增加类、继承、多态等已被 C++语言所广泛使用的语法特性,但是最终被委员会驳回了。因为这些复杂的语法特性并不符合C语言的设计理念以及设计哲学,况且C++已经有了这些特性,C语言无需再对它们进行支持。
本文链接:https://cs.pynote.net/sf/c/202110101/
-- EOF --
-- MORE --