用户您好!请先登录!

C语言的标准版本演进

C语言的标准版本演进

还有多少人记得,对计算机语言的学习是从谭浩强的《C语言程序设计》开始的,在那个没有移动互联网甚至互联网的年代,这本书的出版量高居计算机出版类甚至所有排行榜的第一位。回到现在动不动大数据、分布式、人工智能,各种框架满天飞的今天,C语言失去了当初纵横江湖的霸气,但却一如隐世高手一样,从我们看不见的地方,从操作系统,从各种基础网络设施,硬件设备的驱动支撑着我们的江湖。

C语言最初由 Dennis Ritchie 于 1969 年到 1973 年在 AT&T 贝尔实验室里开发出来,主要用于重新实现 Unix 操作系统。此时,C语言又被称为 K&R C。其中,K 表示 Kernighan 的首字母,而 R 则是 Ritchie 的首字母。

1987年,Brian Kernighan 和 Dennis Ritchie合著的The C Programming Language 第1版是公认的C标准。它定义了c语言,但没有定义c库。它不是官方的标准,但被用了许多年,真应了那句话,“事实即标准”。

K&R C语言

它与后来标准化的C语言有很大差异,比如:

  • 如果函数返回类型为 int,则 int 可省:
  • int my_function(){ }
  • 也可以写成
  • my_function(){ }
  • 编译器不会有任何警告,更不会报错。
  • 还有现在看来比较奇葩的函数定义,像我们现在定义这么一个函数:
  • void my_function(int a, char*p) {}
  • 如果是用 K&R C 语法定义的话要写成:
  • void my_function(a,p)int a; char*p; {}
  • K&R 的C语法中,定义一个函数时,其形参列表先列出形参的标识符,然后在函数声明的后面紧跟着对形参标识符的完整声明,最后是函数体。这在现行标准中已经被逐步废弃使用了。

C90 标准 (C89)

由于C语言被各大公司所使用(包括当时处于鼎盛时期的 IBM PC),因此到了 1989 年,C语言由美国国家标准协会(ANSI)进行了标准化,此时C语言又被称为 ANSI C。该标准 定义了C语言和C标准库。 它的制定理念是:

  • 信任程序员;
  • 不要妨碍程序员做需要做的事;
  • 不要妨碍程序员做需要做的事;
  • 保持语言精练简单;保持语言精练简单;
  • 只提供一种方法执行一项操作;
  • 让程序运行更快, 即使不能保证其可移植性(具体目标系统具体实现)。

而仅过一年,ANSI C 就被国际标准化组织 ISO 给采纳了。此时,C语言在 ISO 中有了一个官方名称——ISO/IEC 9899: 1990。其中:

  • 9899 是C语言在 ISO 标准中的代号,像 C++ 在 ISO 标准中的代号是 14882;
  • 而冒号后面的 1990 表示当前修订好的版本是在 1990 年发布的。

对 于ISO/IEC 9899: 1990 的俗称或简称,有些地方称为 C89,有些地方称为 C90,或者 C89/90。不管怎么称呼,它们都指代这个最初的C语言国际标准。

这个版本的C语言标准作为 K&R C 的一个超集(即 K&R C 是此标准C的一个子集),把后来引入的许多非官方特性也一起整合了进去。其中包括了从 C++ 借鉴的函数原型(Function Prototypes),指向 void 的指针,对国际字符集以及本地语言环境的支持。在此标准中,尽管已经将函数定义的方式改为现在我们常用的那种方式,不过K&R的语法形式仍然兼容。

C99标准

在随后的几年里,C语言的标准化委员会又不断地对C语言进行改进,到了 1999 年,正式发布了 ISO/IEC 9899: 1999,简称为 C99 标准。

  • 遵循了最初C90标准的原则, 包括保持语言的精练简单。
  • 委员会的用意不是在C语言中添加新特性, 而是为了达到新的目标。
    • 第1个目标是, 支持国际化编程。 例如 提供多种方法处理国际字符集;
    • 第2个目标是, “调整现有实践致力于解决明显的缺陷”。因此, 在遇到需要将C移至64位处理器时, 委员会根据现实生活中处理问题的经验来添加标准;
    • 第3个目标是, 为适应科学和工程项目中的关键数值计算,提高C的适应性。

C99 标准引入了许多特性,包括内联函数(inline functions)、可变长度的数组、灵活的数组成员(用于结构体)、复合字面量、指定成员的初始化器、对IEEE754浮点数的改进、支持不定参数个数的宏定义,在数据类型上还增加了 long long int 以及复数类型。

毫不夸张地说,即便到目前为止,很少有C语言编译器是完整支持 C99 的。像主流的 GCC 以及 Clang 编译器都能支持高达90%以上,而微软的 Visual Studio 2015 中的C编译器只能支持到 70% 左右。

C11标准

2007 年,C语言标准委员会又重新开始修订C语言,到了 2011 年正式发布了 ISO/IEC 9899: 2011,简称为 C11 标准。此次, 委员会提出了一些新的指导原则:

  • 出于对当前编程安全的担忧, 不那么强调“信任程序员”目标了;
  • 修订标准的原因不是因为原标准不能用, 而是需要跟进新的技术;
  • 供应商并未像对C90那样很好地接受和支持C99,这使得C99的一些特性成为C11的可选项。

C11标准新引入的特征尽管没 C99 相对 C90 引入的那么多,但是这些也都十分有用,比如:字节对齐说明符、泛型机制(generic selection)、对多线程的支持、静态断言、原子操作以及对 Unicode 的支持。

更多关于C语言历史与演化进程的详细介绍,请参考维基百科:https://en.wikipedia.org/wiki/C_%28programming_language

行走的code
行走的code

要发表评论,您必须先登录