首页 > 编程笔记

C语言是什么(非常详细)

什么是 C语言?它是 20 世纪 70 年代初期在贝尔实验室开发出来的一种广为使用的编程语言。这一简单回答显然没能传达出 C 语言的特别之处。不过别急,本节让我们先来回顾一下 C语言的起源、设计目标和这么多年来的发展,我们还将讨论 C语言的优缺点。

C语言的历史

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

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

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)。

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语言的优缺点

与其他任何编程语言一样,C语言也有自己的优缺点。这些优缺点都源于该语言的最初用途(编写操作系统和其他系统软件)和它自身的基础理论体系。

C语言是一种底层语言。为了适应系统编程的需要,C语言提供了对机器级概念(例如,字节和地址)的访问,而这些是其他编程语言试图隐藏的内容。此外,C语言还提供了与计算机内置指令紧密协调的操作,使得程序可以快速执行。应用程序的输入/输出、存储管理以及其他众多服务都依赖于操作系统,因此操作系统一定不能运行得太慢。

C语言是一种小型语言。与其他许多编程语言相比,C语言提供了一套更有限的特性集合。(在K&R第 2 版的参考手册中仅用 49 页就描述了整个 C语言。)为了保持较少量的特性,C语言在很大程度上依赖一个标准函数的“库”(“函数”类似于其他编程语言中描述的“过程”“子例程”或“方法”)。

C语言是一种包容性语言。C语言假设用户知道自己在做什么,因此它提供了比其他许多语言更高的自由度。此外,C语言不像其他语言那样强制进行详细的错误检查。

C语言的优点

C语言的众多优点有助于解释为什么这种语言如此流行。

1) 高效

高效性是 C语言与生俱来的优点之一。

发明 C语言就是为了编写那些以往由汇编语言编写的应用程序,所以对 C语言来说,能够在有限的内存空间里快速运行就显得至关重要了。

2) 可移植

虽然程序的可移植性并不是 C语言的主要目标,但它还是成了 C语言的优点之一。当程序必须在多种机型(从个人计算机到超级计算机)上运行时,常常会用 C语言来编写。

C程序具有可移植性的一个原因是该语言没有分裂成不兼容的多种分支(这要归功于 C语言早期与 UNIX系统的结合以及后来的 ANSI/ISO标准)。另一个原因是 C语言编译器规模小且容易编写,这使得它们得以广泛应用。

3) 功能强大

C语言拥有一个庞大的数据类型和运算符集合,这个集合使得 C语言具有强大的表达能力,往往寥寥几行代码就可以实现许多功能。

4) 灵活

虽然 C语言最初设计是为了系统编程,但是没有固有的约束将它限制在此范围内。C语言现在可以用于编写从嵌入式系统到商业数据处理的各种应用程序。

此外,C语言在其特性使用上的限制非常少。在其他语言中认定为非法的操作在C语言中往往是允许的。例如,C语言允许一个字符与一个整数值相加(或者是与一个浮点数相加)。虽然灵活性可能会让某些错误溜掉,但是它使编程变得更加轻松。

5) 标准库

C语言的一个突出优点就是它具有标准库,该标准库包含了数百个可以用于输入/输出、字符串处理、存储分配以及其他实用操作的函数。

6) 与UNIX系统的集成

C语言在与 UNIX 系统(包括广为人知的 Linux)结合方面特别强大。事实上,一些 UNIX 工具甚至假定用户是了解 C语言的。

C语言的缺点

C语言的缺点和它的许多优点是同源的,均来自C语言与机器的紧密结合。下面是众所周知的几个问题。

1) C程序更容易隐藏错误

C语言的灵活性使得用它编程出错的概率较高。

在用其他语言编程时可以发现的错误,C语言编译器却无法检查出来。从这方面来说,C语言与汇编语言极为相似,后者直到程序运行时才能检查到大多数错误。

更糟的是,C语言还包含大量不易觉察的隐患,比如一个额外的分号可能导致无限循环,遗漏一个 & 可能引发程序崩溃。

2) C程序可能会难以理解

虽然大多数衡量标准认为 C语言是一种小型语言,但是它有许多其他通用语言没有的特性(并且常常被误解)。这些特性可以用多种方式结合使用,其中的一些结合方式尽管编程者心知肚明,但是其他人恐怕难以理解。

另一个问题就是 C程序简洁的本质。C语言产生的时候正是人机交互最为单调乏味的时期,因此设计者特意使 C语言简洁以便将输入和编辑程序的用时减到最少。

C语言的灵活性也可能是一个负面因素,过于聪明的程序员甚至可以编写出除了他们自己几乎没人可以读得懂的程序。

3) C程序可能会难以修改

如果在设计中没有考虑维护的问题,那么用 C语言编写的大规模程序将很难修改。

现代的编程语言通常都会提供“类”和“包”之类的语言特性,这样的特性可以把大的程序分解成许多更容易管理的模块。遗憾的是,C语言恰恰缺少这样的特性。

推荐阅读