C语言的历史
本文记述了C语言自20世纪70年代至今的历史及发展。
早期发展
[编辑]C语言最早由丹尼斯·里奇(Dennis Ritchie)为了在PDP-11电脑上运行的Unix系统所设计出来的编程语言,第一次发展在1969年到1973年之间。
C源于BCPL语言,后者由马丁·理察德(Martin Richards)于1967年左右设计实现。BCPL是一门"无类型"的编程语言:它仅能操作一种数据类型,即机器字(machine word)。1970年,肯·汤普逊为运行在PDP-7上的首个Unix系统设计了一个精简版的BCPL,这个语言被称为B语言,它也是无类型的。
Unix最早运行在PDP-7上,是以汇编语言写成。在PDP-11出现后,丹尼斯·里奇与肯·汤普逊着手将Unix移植到PDP-11上,无类型的语言在PDP-11上愈发显得不合适。PDP-11提供了多种不同规格大小的基本对象:一字节长的字符,两字节长的整型数以及四字节长的浮点数。B语言无法处理这些不同规格大小的对象,也没有提供单独的操作符去操作它们。
C语言最初尝试通过向B语言中增加数据类型的想法来处理那些不同类型的数据。和大多数语言一样,在C中,每个对象都有一个类型以及一个值;类型决定了可用于值的操作的含义,以及对象占用的存储空间大小。
1973年,Unix操作系统的核心正式用C语言改写,这是C语言第一次应用在操作系统的核心编写上。
1975年C语言开始移植到其他机器上使用。史蒂芬·强生实现了一套“可移植编译器”,这套编译器修改起来相对容易,并且可以为不同的机器生成代码。从那时起,C在大多数计算机上被使用,从最小的微型计算机到与CRAY-2超级计算机。C语言很规范,即使没有一份正式的标准,你也可以写出C程序,这些程序无须修改就可以运行在任何支持C语言和最小运行时环境的计算机上。
C最初在小型机器上实现,并且继承了一系列小语种编程语言的特点;与功能相比,C的设计者更倾向于简单和优雅。此外,从一开始,C语言就是为系统级编程而设计,程序的运行效率至关重要,因此,C语言与真实机器能力的良好匹配也就不足为奇。例如,C语言为典型硬件所直接支持的对象:字符,整数(也许有多种大小),以及浮点数(同样可能有多种大小)提供了相应的基本数据类型。[1]
K&R C
[编辑]1978年,丹尼斯·里奇和布莱恩·柯林汉合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程序员称作“K&R C”(柯里C),第二版的书中也包含了一些ANSI C的标准。
K&R C主要引入了以下语言特性:
- 标准I/O库
- 结构(
struct
)类型 - 长整数(
long int
)类型 - 无符号整数(
unsigned int
)类型 - 把运算符
=+
和=-
改为+=
和-=
。因为=+
和=-
会使得编译器不知道用户要处理i = -10
还是i =- 10
,使得处理上产生混淆。
即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最低标准要求,许多老旧的编译仍然运行K&R C的标准。[2]
ANSI C 和 ISO C
[编辑]1989年,C语言被美国国家标准协会(ANSI)标准化,编号为ANSI X3.159-1989。这个版本又称为C89。标准化的一个目的是扩展K&R C,增加了一些新特性。
- void 函数
- 函数可以返回 struct 或 union 类型
- void * 数据类型
1990年,国际标准化组织(ISO)成立 ISO/IEC JTC1/SC22/WG14 工作组,来规定国际标准的C语言,通过对ANSI标准的少量修改,最终制定了 ISO 9899:1990,又称为C90。随后,ANSI亦接受国际标准C,并不再发展新的C标准。[3]
K&R C语言到ANSI/ISO标准C语言的改进包括:
- 增加了真正的标准库
- 新的预处理命令与特性
- 函数原型允许在函数申明中指定参数类型
- 一些新的关键字,包括 const、volatile 与 signed
- 宽字符、宽字符串与多字节字符
- 对约定规则、声明和类型检查的许多小改动与澄清
WG14工作小组之后又于1994年,对1985年颁布的标准做了两处技术修订(缺陷修复)和一个补充(扩展)。下面是 1994 年做出的所有修改:
- 3 个新的标准库头文件 iso646.h、wctype.h 和 wchar.h
- 几个新的记号与预定义宏,用于对国际化提供更好的支持
- printf/sprintf 函数一系列新的格式代码
- 大量的函数和一些类型与常量,用于多字节字符和宽字节字符[4]
C99
[编辑]在ANSI的标准确立后,C语言的规范在一段时间内没有大的变动,然而C++在自己的标准化建立过程中继续发展壮大。《标准修正案一》在1994年为C语言建立了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广的国际字符集支持。不过,这个标准引出了1999年ISO 9899:1999的发表。它通常被称为C99。C99被ANSI于2000年3月采用。
C11
[编辑]2011年12月8日,ISO正式发布了新的C语言的新标准C11(之前被称为C1X),官方名称为ISO/IEC 9899:2011。新的标准提高了对C++的兼容性,并增加了一些新的特性。这些新特性包括泛型、多线程、带边界检查的函数、匿名结构等[5]。
C18
[编辑]C18没有引入新的语言特性,只对C11进行了补充和修正[6]。
C2x
[编辑]C2x引入了一些新特性。目前可以确定的是,C2x标准将加入符合IEEE标准的十进制浮点数,这使得计算机能够精确地储存浮点数[7]。
参考资料
[编辑]- ^ Stephen Prata. C Primer Plus(第5版). 北京: 人民邮电出版社. 2005年2月: 3-4 [2020-06-10]. ISBN 9787115130228 (中文).
- ^ Dennis M. Ritchie,Brian W. Kernighan. C程序设计语言. 北京: 机械工业出版社. 2004年1月 [2020-06-10]. ISBN 9787111128069 (中文).
- ^ Stephen Prata. C Primer Plus(第5版). 北京: 人民邮电出版社. 2005年2月: 12 [2020-06-10]. ISBN 9787115130228 (中文).
- ^ JTC1/SC22/WG14 - C. [2020-06-10]. (原始内容存档于2020-06-13).
- ^ ISO/IEC 9899:2011 (PDF). [2020-06-10]. (原始内容存档 (PDF)于2018-03-29).
- ^ ISO/IEC 9899:2018 (PDF). [2020-06-10]. (原始内容存档 (PDF)于2020-07-22).
- ^ ISO/IEC 9899:202x (PDF). [2020-06-10]. (原始内容存档 (PDF)于2020-06-10).