C语言发展简史【起源】C语言最早的原型是ALGOL601963年,剑桥大学将其发展成为CPL(CombinedProgramingLanguage)。1967年,剑桥大学的MatinRichards对CPL语言进行了简化,产生了BCPL语言。1970年,美国贝尔实验室(BellLabs)的KenThompson将BCPL进行了修改,并取名叫做B语言,意思是提取CPL的精华(BoilingCPLdowntoitsbasicgoodfeatures)。并用B语言写了第一个UNIX系统。1973年,AT&T贝尔实验室的DennisRitchie(D.M.RITCHIE)在BCPL和B语言的基础上设计出了一种新的语言,取BCPL中的第二个字母为名,这就是大名鼎鼎的C语言。随后不久,UNIX的内核(Kernel)和应用程序全部用C语言改写,从此,C语言成为UNIX环境下使用最广泛的主流编程语言。【K&RC】1978年,DennisRitchie和BrianKernighan合作推出了《TheCProgrammingLanguage》的第一版(按照惯例,经典著作一定有简称,该著作简称为K&R),书末的参考指南(ReferenceManual)一节给出了当时C语言的完整定义,成为那时C语言事实上的标准,人们称之为K&RC。从这一年以后,C语言被移植到了各种机型上,并受到了广泛的支持,使C语言在当时的软件开发中几乎一统天下。【C89(ANSIC)】随着C语言在多个领域的推广、应用,一些新的特性不断被各种编译器实现并添加进来。于是,建立一个新的“无歧义、于具体平台无关的C语言定义”成为越来越重要的事情。1983年,ASCX3(ANSI属下专门负责信息技术标准化的机构,现已改名为INCITS)成立了一个专门的技术委员会J11(J11是委员会编号,全称是X3J11),负责起草关于C语言的标准草案。1989年,草案被ANSI正式通过成为美国国家标准,被称为C89标准。【C90(ISOC)】随后,《TheCProgrammingLanguage》第二版开始出版发行,书中内容根据ANSIC(C89)进行了更新。1990年,在ISO/IECJTC1/SC22/WG14(ISO/IEC联合技术第I委员会第22分委员会第14工作组)的努力下,ISO批准了ANSIC成为国际标准。于是ISOC(又称为C90)诞生了。除了标准文档在印刷编排上的某些细节不同外,ISOC(C90)和ANSIC(C89)在技术上完全一样。【C95】之后,ISO在1994、1996年分别出版了C90的技术勘误文档,更正了一些印刷错误,并在1995年通过了一份C90的技术补充,对C90进行了微小的扩充,经过扩充后的ISOC被称为C95。【C99】1999年,ANSI和ISO又通过了最新版本的C语言标准和技术勘误文档,该标准被称为C99。这基本上是目前关于C语言的最新、最权威的定义了。现在,各种C编译器都提供了C89(C90)的完整支持,对C99还只提供了部分支持,还有一部分提供了对某些K&RC风格的支持。/////////////////////////////////////////////////////C语言的发展史DennisM.RitchieTjy平坦软件园BellLabs/LucentTechnologiesTjy平坦软件园MurrayHill,NJ07974USATjy平坦软件园dmr@bell-labs.com概要C语言作为最初的Unix操作系统的系统实现语言,在1970年早期诞生。它以无类型的B语言为基础,形成了一个类型结构;它在小型机上被发明,作为一个工具,以改进贫乏的编程环境。在今天,它已经成为一种占统治地位的语言。本文研究它的发展。Tjy平坦软件园简介版权提示:版权所有1993计算机协会公司。此电子版由作者授权发表。有关出版事宜,请联系ACM或作者。本文被用于一九九三年四月,在马萨诸塞州剑桥的第二次编程语言历史会议上的演讲。Tjy平坦软件园之后被收录进会议记录:编程语言历史,第二版。ThomasJ.Bergin,Jr.andRichardG.Gibson,Jr.ACMPress(NewYork)andAddison-Wesley(Reading,Mass),1996;ISBN0-201-89502-1.本文是关于C程序设计语言的发展、它所受到的影响以及它诞生的条件。为简洁起见,我略过了对C本身完整的描述、它的起源B[Johnson73]及更上一代BCPL[Richards79],相反集中关注每一种语言的典型特性,以及他们如何发展变化。Tjy平坦软件园C在1969——1973年间与Unix操作系统同时诞生;最富创造性的时期是1972年。另一次大的变化发生在1977到1979年间,当Unix系统的可移植性得到证明时。在后一段时期的中间,这个语言的第一个被广为传播的描述出现了:C程序设计语言,常常被称为白皮书或K&R[Kernighan78]。最后,在1980年代中期,它被ANSIX3J11委员会正式标准化,作了进一步修改。直到1980年代早期,尽管编译器已在多种机器结构及操作系统上出现,这个语言几乎与Unix特别密切关联;更近一些,它的使用传播得更广,并且在今天它几乎是计算机行业被使用最多的语言。Tjy平坦软件园历史:环境贝尔电话实验室的计算机系统研究在1960代年晚期是乱糟糟的[Ritchie78][Ritchie84]。贝尔电话实验室公司正从他和麻省理工学院、通用电气公司的合作项目Multics[Organick78]撤离。到1969年,贝尔实验室管理层和研究人员认为,Multics项目不能按期完成并且代价高昂。在GE-645Multics机器被撤走之前,KenThompson领导一个非正式小组,开始一些其它的研究。Tjy平坦软件园Thompson希望按自己的设计,使用一切有效的方式,创造一个适当的计算环境。他的计划,回想起来是清晰的。组合Multics中的许多创新特征,包括一个作为控制场所的进程的清晰概念、一个树结构文件系统、一个作为用户级程序的命令解释器、文本文件的简单表示和访问设备的通用化。他们排除其余特性,比如对内存和文件的统一访问。开始,他与我们其余人推迟了Multics中的另一个先锋性(但非原创)特征,即只使用高级语言来编写。我对Multics实现所用的语言PL/I,并无兴趣,但我们还使用其他语言,包括BCPL,我们对于不能利用汇编之上的高级语言进行编程的优点,比如容易编写、易于理解,感到遗憾。当时我们并未特别注重可移植性;到后来才有了这方面的兴趣。Tjy平坦软件园Thompson面临的是那个时代古怪和难缠的硬件:DECPDP-7,他在1968年开始使用时,只有8K容量的16位内存,并且没有可用的软件。当时他希望使用高级语言,但还是用PDP-7汇编编写了最初的Unix系统。开始,他并未在PDP-7上编码,相反使用一套GE-635机器上,用于GEMAP汇编器的宏。一个后期处理器生成PDP-7可读的纸带。Tjy平坦软件园这些纸带从GE机器传送到PDP-7进行测试,直到一个原始的Unix内核、一个编辑器、一个汇编器、一个简单的shell(命令解析器),和其它工具(像Unixrm,cat,cp命令)被完成。此后,这个操作系统可以自我支撑:可以编写、测试程序勿需借助纸带,并且程序开发可以在PDP-7上继续进行。Tjy平坦软件园Thompson的PDP-7汇编器在简明性上甚至优于DEC的;它对表达式求值并得到对应的数据位。没有库、装载器或链接器:程序的全部源文件被送给汇编器,输出文件——有一个固定名字——产生后被直接执行(这个名字,a.out,解释了一点Unix的渊源;它是汇编器的输出。甚至在系统有了链接器和显式指定另一个名字的方式之后,它仍被保留作为编译的默认可执行文件)。Tjy平坦软件园在Unix首次在PDP-7运行后不久,DougMcIlroy在1969年创造了新系统的第一个新语言:一个McClure的TMG[McClure65]实现。TMG是一种编写编译器(更普通来说,TransMoGrifiers)的语言,通过在一个混合过程元素,上下文无关的语法标记的自顶而下,递归降解的风格。McIlroy和BobMorris使用TMG为Multics编写了早期的PL/I编译器。Tjy平坦软件园为了挑战McIlroy重新生成TMG的技巧,Thmopson决定Unix——当时可能还没有取这个名字——需要一种系统编程语言。在很快用Fortran尝试一番后,相反,他创造了一种他自己的语言,他命名为B。B可以认为是没有类型的C。更准确,它是被挤进了8K字节内存,经过Thompson大脑过滤的BCPL。它的名字最有可能表示BCPL的缩写,尽管另一种理论认为它继承自Bon[Thompson69],一个Thompson在Multics的那些日子创造的不相关的语言。Bon可能是以他妻子Bonnie的名字,或者(根据它的手册中的一个encyclopedia引用)以一种具有咕隆咕隆发音的神奇仪式的宗教命名的。Tjy平坦软件园起源:语言BCPL由MartinRichards于1960年代中期在访问麻省理工学院时设计,在1970年代早期被用在几个有趣的项目中,其中包括牛津大学的OS6操作系统[Stoy72],和施乐公司PARC研究中心创造性的Alto上的部分工作[Thacker79]。因为Richards工作过的麻省理工学院的CTSS系统[Corbato62]被用于Multics开发,我们也熟悉该语言。最初的BCPL编译器被RuddCanaday和贝尔实验室的一些人们迁移到Multics和GE-635GECOS系统[Canaday69];在Multics的生命在贝尔实验室的最后痛苦挣扎中,它很快成了那些以后参与Unix的人们选择的语言。Tjy平坦软件园BCPL,B和C全都严格符合以Fortran和Algol60代表的传统过程类型语言。它们都面向系统编程、小、定义简洁,以及可被简单编译器翻译。它们接近机器,它们引入的抽象以传统计算机提供的具体数据类型和操作为基础,它们依赖于输入输出库例程,与操作系统的其它交互。尽管并未成功,它们还使用库程序指定其他有趣的控制结构,如协程和过程关闭。同时,它们的抽象层次足够高,足够用心的话,能达到机器间的可移植性。Tjy平坦软件园BCPL,B和C在语法上差异众多,粗略地说,它们是相似的。程序由全局声明和函数(过程)声明组成。BCPL中的过程能够嵌套,但不能引用包含过程中的非静态对象。B和C避免了这个限制,通过强加一个更严格限制:完全没有嵌套过程。每一种语言(除了早期版本B)都认可分离编译,以及提供了包含指定文件文本的方式。Tjy平坦软件园BCPL中的几个语法和词法机制是优雅和常见的,甚于B和C中的那些。例如,BCPL的过程和数据声明有更一致的结构,并且它提供了一套更完整的循环构造。尽管BCPL程序在概念上是由未被间隔的字符流,聪明的规则允许语句后的行分界处的大多数分号被忽略。B和C忽略了这种便利,并以分号来结束大多数语句。不管这些差异,BCPL的大多数语句和操作符直接对应B和C中的相应语句和操作符。Tjy平坦软件园BCPL和B之间的一些结构化的差异源于介质存储的限制。比如,BCPL声明采用这样的形式Tjy平坦软件园letP1becommandandP2becommandandP3becommand...此处的命令表示的程序文本包含完整过程。关联的子声明同时出现,所以名字P3在guochengP1内可见。相似地,BCPL能在一个求得一个值的表达式里包含一组声明和语句,例如Tjy平坦软件园E1:=valof(declarations;commands;resultisE2)+1BCPL编译器可以容易地处理此类构造,在产生输出前,通过存储和分析内存中一个完整程序解析过的表示。B编译器的存储限制要求一个一步技术,通过它尽可能快生成输出,语法上的重新设计,令这