购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 C语言的历史

本节对C语言的历史做一个简单的回顾,从它的起源到它成为一种标准化语言,再到它对近代编程语言的影响。

1.1.1 起源

C语言是贝尔实验室的Ken Thompson、Dennis Ritchie等人开发的UNIX操作系统的“副产品”。Thompson独自编写出UNIX操作系统的最初版本,这套系统运行在DEC PDP-7计算机上。这款早期的小型计算机仅有8KB内存(毕竟那是在1969年)。

与同时代的其他操作系统一样,UNIX系统最初也是用汇编语言编写的。用汇编语言编写的程序往往难以调试和改进,UNIX系统也不例外。Thompson意识到需要用一种更加高级的编程语言来完成UNIX系统未来的开发,于是他设计了一种小型的B语言。Thompson的B语言是在BCPL语言(20世纪60年代中期产生的一种系统编程语言)的基础上开发的,而BCPL语言又可以追溯到最早(且影响最深远)的语言之一 ——Algol 60语言。

不久,Ritchie也加入到UNIX项目中,并且开始着手用B语言编写程序。1970年,贝尔实验室为UNIX项目争取到一台PDP-11计算机。当B语言经过改进并能够在PDP-11计算机上成功运行后,Thompson用B语言重新编写了部分UNIX代码。到了1971年,B语言已经明显不适合PDP-11计算机了,于是Ritchie着手开发B语言的升级版。最初,他将新开发的语言命名为NB语言(意为“New B”),但是后来新语言越来越偏离B语言,于是他将其改名为C语言。到了1973年,C语言已经足够稳定,可以用来重新编写UNIX系统了。改用C语言编写程序有一个非常重要的好处:可移植性。只要为贝尔实验室的其他计算机编写C语言编译器,他们的团队就能让UNIX系统也运行在那些机器上。

1.1.2 标准化

C语言在20世纪70年代(特别是1977年到1979年之间)持续发展。这一时期出现了第一本有关C语言的书。Brian Kernighan和Dennis Ritchie合作编写的《C程序设计语言》一书于1978年出版,并迅速成为C程序员必读的“圣经”。因为当时没有C语言的正式标准,所以这本书就成了事实上的标准,编程爱好者把它称为 K&R 或者“白皮书”。

在20世纪70年代,C程序员相对较少,而且他们中的大多数人是UNIX系统的用户。然而,到了20世纪80年代,C语言已不再局限于UNIX领域。运行在不同操作系统下的多种类型的计算机都开始使用C语言编译器,特别是迅速壮大的IBM PC平台也开始使用C语言。

随着C语言的迅速普及,一系列问题接踵而至。编写新的C语言编译器的程序员都用 K&R 作为参考。但遗憾的是, K&R 对一些语言特性的描述非常模糊,以至于不同的编译器常常会对这些特性做出不同的处理。而且, K&R 也没有对属于C语言的特性和属于UNIX系统的特性进行明确的区分。更糟糕的是, K&R 出版以后C语言仍在不断变化,增加了新特性并且去除了一些旧的特性。很快,C语言需要一个全面、准确的最新描述开始成为共识。如果没有这样一种标准,就会出现各种“方言”,这势必威胁到C语言的主要优势——程序的可移植性。

1983年,在美国国家标准学会(ANSI)的推动下,美国开始制订本国的C语言标准。经过多次修订,C语言标准于1988年完成并在1989年12月正式通过,成为ANSI标准X3.159-1989。1990年,国际标准化组织(ISO)通过了此项标准,将其作为ISO/IEC 9899:1990国际标准 。我们把这一C语言版本称为C89或C90,以区别于原始的C语言版本(经典C)。附录D总结了C89和经典C之间的主要差异。

1995年,C语言发生了一些改变(相关描述参见Amendment 1文档)。1999年通过的ISO/IEC 9899:1999新标准中包含了一些更重要的改变,这一标准所描述的语言通常称为C99。由于存在两种标准,以前用于描述C89的ANSI C、ANSI/ISO C和ISO C等术语现在就有了二义性。

C语言的最近两次改变分别发生在2011年和2018年。国际标准化组织在2011年通过的C语言标准是ISO/IEC 9899:2011,这一标准所描述的C语言通常称为C11;在2018年通过的C语言标准是ISO/IEC 9899:2018,这一标准所描述的C语言通常称为C18。

从C99到C11再到C18的变化,没有从C89到C99那么显著。尤其是从C11到C18的变化,仅限于技术修正和澄清,总体上没有显著的改变,也没有引入新的语言特性。

在本书第1版发行的时候,C99还没有得到普遍使用,并且我们需要维护数百万(甚至数十亿)行的旧版本C代码,因此本书中我将用一个特殊图标 来标记对C99新增特性的讨论。不能识别这些新增特性的编译器就不是“C99兼容的”。附录C列出了C99和C89的主要区别。因为从C11到C18的变化不大,所以没有将它们分开单独讨论,并且用一个特殊的图标 来标记从C11开始引入的新特性。附录B列出了C1 X 和C99的主要区别。

1.1.3 基于C的语言

C语言对现代编程语言有着巨大的影响,许多现代编程语言都借鉴了大量C语言的特性。在众多基于C的语言中,以下几种非常具有代表性。

考虑到这些新语言的普及程度,人们自然会问:“C语言还值得学习吗?”我想答案是肯定的,原因如下:第一,学习C有助于更好地理解C++、Java、C#、Perl以及其他基于C的语言的特性,而一开始就学习其他语言的程序员往往不能很好地掌握继承自C语言的基本特性;第二,目前仍有许多C程序,我们需要读懂并维护这些代码;第三,C语言仍然广泛用于新软件开发,特别是在内存或处理能力受限的情况下以及需要使用C语言简单特性的地方。

如果读者还没有学习上述任何一种基于C的语言,那么本书是一本非常好的预备教材。本书强调了数据抽象、信息隐藏和其他在面向对象编程中非常重要的原理。C++语言包含了C语言的全部特性,因此读者今后在使用C++语言时可以用到从本书中学到的所有知识。在其他基于C的语言中也能发现许多C语言的特性。 0aL4g768km5aOOd10BCFR48VngJaw3Qcd0XIwCXDntPY4q2NhAfCbWkS9KZM1Tt7

点击中间区域
呼出菜单
上一章
目录
下一章
×