1.5 今日之ANSI C
到了20世纪80年代初,C语言被业界广泛使用,但存在许多不同的实现和差别。C语言在PC上的实现让人们发现了C语言优于BASIC的诸多长处,这一发现更是掀起了C语言的高潮。Mirosoft为IBM PC制作了一个C编译器,引入了几个新的关键字(far、near等)帮助指针处理Intel 80x86芯片不规则的架构。随着其他更多并非基于pcc的编译器的兴起,C语言受到了“重复BASIC老路”的威胁,也就是可能变成一种多个变体松散相关的语言。
形势渐渐明了,一个正式的语言标准是必需的。幸运的是,在这个领域已经有了相当多的先行者——所有成功的编程语言最终都作了标准化。然而,编写标准手册所存在的问题是,只有当你明白它们讲的是什么时,才是可行的。如果人们用日常语言来编写它们,则越想把它们写得精确,就越可能使它们变得冗长、乏味且晦涩。如果用数学概念来定义语言,那么标准手册对于大多数人而言不啻于天书。
多年以来,用于定义编程语言标准的手册变得越来越长,但也越来越容易理解。Algol-60就语言复杂性而言,与C语言不相上下,但它的标准手册——Algol-60 Reference Definition——只有18页。Pascal用了35页来描述。Kernighan和Ritchie最初所作的C语言报告用了40页,尽管漏掉了一些东西,但对于许多编译器设计者而言,这些已经足够了。定义ANSI C的手册超过了200页。它对C语言的实际应用作了部分描述,是对标准文档中晦涩文字的补充和说明。
1983年,美国国家标准化组织(ANSI)成立了C语言工作小组,开始了C语言的标准化工作。小组所处理的主要事务是确认C语言的常用特性,但对语言本身也作了一些修改,并引入了一些有意义的新特性。对于是否要接受near和far关键字,小组内部进行了旷日持久的争论。最终,它们还是没有被纳入以UNIX为中心的相对谨慎的ANSI C标准。尽管当时世界上大约有5000万台PC,而且它是当时应用范围最广的C语言实现平台,但标准仍然认为不应该通过修改语言来处理某个特定平台所存在的限制(我们认为这是对的)。
小 启 发
该用哪个版本的C语言呢?
就此而论,任何学习或使用C语言的人都应当使用ANSI C,而不是K&R C。
1989年12月,C语言标准草案最终被ANSI委员会接纳。随后,国际标准化组织(ISO)也接纳了ANSI C标准(令人不快的是,它删除了非常有用的“Rationale”一节,并作了个虽然很小却让人很恼火的修改,就是把文档的格式和段落编码作了改动)。ISO是一个国际性组织,从技术上讲它更权威一些。所以在1990年年初,ANSI重新采纳了ISO C(同样删除了Rationale),取代了原先的版本。因此从原则上说,ANSI所采纳的C语言标准是ISO C,我们日常所说的标准C也应该是ISO C。Rationale这一节是非常有用的,能极大地帮助人们理解标准,它后来作为独立的文档出版。
小 启 发
哪里能得到C语言标准的一份副本
C语言标准的官方名称是ISO/IEC 9899:1990。ISO/IEC是指国际标准化组织和国际电工委员会。标准组织将C语言标准的价格定为130美元。在美国,你可以通过给下面的地址写信来获取一份标准的副本:
American National Standards Institute
11 West 42nd Street
New York, NY 10036
Tel.(212)642-4900
在美国以外的地区,可以向下面的地址写信求购(要指明自己想要的是英语版本):
ISO Sales
Case postale 56
CH-1211 Genève 20
Switzerland
另一个办法是购买Herbert Schildt所著的The Annotated ANSI C Standard。这本书包含一个版面压缩但内容完整的C语言标准。Herbert Schildt的书有两个优势:首先是价格,39.95美元的定价不到标准定价的1/3,其次,不像ANSI或ISO,它可能在你当地的书店里就有售,你可以通过电话订购和信用卡支付。
实际上,在ISO成立第14工作小组(WG14)制定C标准之前,“ANSI C”这个称呼就已被广泛使用。这并没有什么不妥,因为ISO工作小组把最初标准的技术性完善工作留给了ANSI X3J11委员会。在工作接近尾声时,ISO WG14和X3J11一起通力协作,敲定技术细节并确保最终的标准能被两个组织共同接受。事实上,标准的最终形成又推迟了一年,主要是为了修改标准草案以覆盖一些国际化的问题(如宽字符和国际区域问题)。
这就使得几年来一直关心C语言标准的所有人将新的标准当成是ANSI C标准。当语言标准最终形成后,所有人都想支持C语言标准。ANSI C同时是一个欧洲标准(CEN 29899)和X/Open标准。ANSI C被采纳为Federal Information Processing Standard(联邦信息处理标准),取名为FIPS160,由美国国家标准和技术局于1991年3月发布,并于1992年8月24日更新。针对C语言的工作仍在继续——据说有可能在C语言中增加复数类型。