C语言的发展历史与特性 (段育凯 译)

C语言的发展历史与特性

段育凯 译

学号:20144569

东北大学软件学院软件工程1401班

http://www.duanduan.co/362.html

说明:本文英文原文来自维基百科(链接在文末),本人用时约3小时做了纯手工翻译,由于本人英语水平极其有限,可能会有非常多错误与不当之处,希望谅解并指出。

本文为计算机编程引论(C语言)课程第一课作业。

C语言的早期发展

最初C语言的发展与UNIX操作系统的发展有着紧密的联系,起初由Ritchie和Thompson整合了来自同事们的各种思想在PDP-7电脑上用汇编语言实现,最终他们决定转移操作系统到PDP-11机上。最原始的PDP-11机版本的UNIX是用汇编语言开发的。开发者们考虑用B语言重写系统。但是B语言无法驾驭某些PDP-11的特性——尤其是字节寻址,这便使C语言得到了发展。

1969年到1973年间,C语言在AT&T Bell实验室开始了最初的发展。据Ritchie说,最有创意的时段是1972年——在那年,C语言完成了UNIX系统大部分的代码。1973年,借结构体之力,C语言更加强大——大部分UNIX内核是C来完成的。这种新语言被命名为“C”是因为它的很多特性继承自B语言——据Ken Thompson说B语言是BCPL编程语言的精简版。

UNIX是第一个内核由非汇编语言完成的操作系统之一。(更早的包括Multics system (使用PL/I编写),和 MCP (Master Control Program) for the Burroughs B5000(使用ALGOL编写于1961)。)大约1977年时,Ritchie and Stephen C. Johnson提高了UNIX系统的可移植性,对C的进一步发展做出了贡献。Johnson的便携式C语言编译器为各种新平台上的C的实现奠定了基础。

K&R C

1978年,Brian Kernighan和Dennis Ritchie出版了“The C Programming Language”的第一版。这本书被C语言程序员熟知为“K&R”,充当非正式的该语言的规范多年。它所描述的C语言便通常指K&R C。第二版的该书涵盖了最新的ANSI C语言标准。

K&R 介绍了该语言多种特性:

标准输入输出库

长整型数据类型

无符号型整型数据类型

以=op为格式的复合赋值运算符(比如=-)被改为op=形式来避免由i=-10之类的结构引起的语义混淆。(该例子会被解析为i=i-10而不是i赋值为-10)

甚至在1989年C语言标准发布以后,多年来K&R仍一直被视为共同标准——很多老的编译器仍在被使用,因此C语言程序员限制自己以最大兼容性为目的,谨慎地写兼容C标准的K&R C代码。

在最初的C语言版本中,只有返回值不为整型的函数才需要在调用前声明。一个没有生命的函数被默认为返回整型数据。

例如:

long some_function();

/* int */ other_function();

/* int */ calling_function()

{

long test1;

register /* int */ test2;

test1 = some_function();

if (test1 > 0)

test2 = 0;

else

test2 = other_function();

return test2;

}

整型说明符在K&R C语言中可被忽略,但在后期标准中不可忽略。

由于K&R C的函数声明不包含任何有关函数参数的信息,便没有函数参数类型检测,尽管一些编译器会在函数被以错误的参数个数或是以不同的值或类型的参数重复调用外部函数时弹出警告。如UNIX的lint utility这类独立工具可以检测多个源文件中函数的一致性。

在K&R C发布后几年中,各种特性被一些如AT&T(特别是PCC)等的编译器加入到C语言中,包括:

无返回值函数

返回结构体的类型(而不是指针)

结构体类型的声明

枚举类型

在标准库上的大量的拓展和一致性的缺失,与该语言的流行程度、甚至没有UNIX编译器对K&R的严格实现,导致了对标准的需要。

ANSI C and ISO C

在1970年代末到1980年代间,C语言在从大型计算机、小型机到微机、IBM PC间广泛应用,这使其流行度大大增加。

1983年,美国国家标准协会(ANSI)成立了一个委员会——X3J11,来建立一个C的标准规范。X3J11以UNIX版为基础。但是,UNIX C的库的不可移植的部分被IEEE工作组1003推掉,因而成了1988年POSIX 标准的基础。1989年,C 标准被批准为ANSI X3.159-1989 “Programming Language C”。这个版本常被称为ANSI C、Standard C或有时是C89。

1990年,ANSI C标准(格式有变化)被国际标准化组织(ISO)为ISO/IEC 9899:1990所采用(常被称为C90)。因此,C89和C90指的是同一个编程语言。

ANSI,如其他国家标准机构一样,不再独立地更新C标准,但尊由由ISO/IEC JTC1/SC22/WG14工作组维护国际C标准。全国性的国际C标准升级工作在ISO发布后一年内明显有效。

C标准化的目标之一是规划一个K&R C的超集——结合众多随后引入的非官方的特性。标准化组织还引入了几个附加特性,比如函数原型(从C++借鉴)、空指针、对多语言文字集的支持与本地化、预处理改进等等。尽管参数声明的语法因引入C++的风格而增强,K&R的风格为了兼容现有源码仍被认可。

C89被目前的C编译器所支持,并且现在大多数C源码是基于它写的。任何程序若是只在C标准范围中并且没有任何硬件依赖的话,将在资源限制内在任何平台上正确运行。没有这样的先决条件,程序可能只能在一个特定的操作系统或编译器中编译,因为比如使用了非标准的库,比如GUI库或编译器、特定平台的属性(如数据类型的实际大小和字节序)。

为了预防代码必须在符合标准与K&R 编译器中可编译的情况,__STDC__宏可以用来分割代码为标准和K&R两部分来防止在K&R的编译器上使用那些只在标准C中可用的特性。

在ANSI/ISO标准化进程中,C语言规范保持相对静止多年。在1995年对1990年的 C 标准(ISO/IEC 9899/AMD1:1995,习惯上称为 C95)规范修订1被发布来更正一些细节并增强了对多语言字符集的支持。

1 条评论

欢迎留言