C 语言的历史

目录汇总:C 语言零基础入门教程

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

一、起源

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 系统也运行在那些机器上。

二、标准化

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 国际标准 1。我们把这一 C 语言版本称为 C89 或 C90,以区别于原始的 C 语言版本(经典 C)。

1995 年,C 语言发生了一些改变。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 的变化,仅限于技术修正和澄清,总体上没有显著的改变,也没有引入新的语言特性。

三、基于 C 的语言

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

  • C++:包括了所有 C 特性,但增加了类和其他特性以支持面向对象编程。
  • Java:基于 C++,因此也继承了 C 的许多特性。
  • C#:由 C++ 和 Java 发展起来的一种较新的语言。
  • Perl:最初是一种非常简单的脚本语言,在发展过程中采用了 C 的许多特性。

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

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

请参阅

(完)


  1. 该标准对应的中国国家标准是 GB/T 15272—1994。C 语言目前的最新标准是 2018 年修订的 ISO 9899:2018(称为 C18)。 ↩︎

comments powered by Disqus