The Development of the C Language*
Dennis M. Ritchie
Bell Labs/Lucent Technologies
Murray Hill, NJ 07974 USA
不满足网上的译文,yqj2065自己翻译一下。备用。【】是译注、补充。
概要
在1970s早期,C编程语言是作为新生的Unix操作系统的系统实现语言而设计的。衍生于无类型(typeless)语言BCPL,它进化出了一个类型结构【类型系统】;在弱小的机器上,作为改善简陋编程环境工具的这一创新,它已然成为当今主流语言之一。本文研究它的进化。
NOTE: *Copyright 1993 Association for Computing Machinery, Inc. This electronic reprint made available by the author as a courtesy. For further publication rights contact ACM or the author. This article was presented at Second History of Programming Languages conference, Cambridge, Mass., April, 1993.
It was then collected in the conference proceedings: History of Programming Languages-II ed. Thomas J. Bergin, Jr. and Richard G. Gibson, Jr. ACM Press (New York) and Addison-Wesley (Reading, Mass), 1996; ISBN 0-201-89502-1.
简介
本文讲述C程序设计语言的发展、它所受到的影响以及它诞生的条件。简洁起见,我省略了对C自身、它的父亲B[Johnson 73]和祖父BCPL[Richards 79]的完整描述,而是关注每一种语言的特性要素和它们如何演化。
在1969-1973年间,C的出现,伴随着Unix操作系统早期的发展,最富创造性的时期是1972年。另一个一连串改变的高峰期是1977到1979年间,此时Unix系统的可移植性得以证实。第二个阶段期间,出现了第一份被广为传播的该语言的描述:The C Programming Language,通常被称为‘白皮书’或K&R[Kernighan 78]。最后,在1980年代中期,该语言被ANSI X3J11委员会正式标准化,并作出进一步修改。截止1980年代早期,尽管已有各种机器结构及操作系统的【C的各种】编译器,该语言几乎与Unix特别密切关联;更近一些,它的使用传播得更广,而今天它是整个计算机产业中最广泛使用的语言之一。
历史背景
1960s晚期,是Bell Telephone Laboratories(贝尔电话实验室)的计算机系统研究(中心)的动荡岁月[Ritchie 78] [Ritchie 84]。计算机被从Multics项目组拖走[Organick 78],该项目是MIT(麻省理工学院)、General Electric(通用电气公司)和贝尔实验室的合作项目。到1969年,贝尔实验室管理层、甚至研究人员认为,Multics项目不能按期完成并且代价高昂。甚至在GE-645 Multics机器被撤走之前,早期由Ken Thompson领导的一个非正式小组,已经着手一些其它的研究。
Thompson希望按照自己的设计、使用可用的任何方式,创造一个舒适的计算环境。事后诸葛亮地说,他的计划集成了Multics的许多创新方面,包括关于进程的清晰概念——控制块,树型结构的文件系统、作为用户级程序的命令解释器、文本文件的简单表示和访问设备的通用化。他们排除了其余特性,比如对内存和文件的统一访问。此外,
开始的时候,他与我们这些俗人遵循[推迟?]Multics的另一个先驱性(虽然不是原创)特性,即几乎仅用高级语言来编程。PL/I【Programming Language One,IBM公司在1950s发明的高级编程语言】——Multics的实现语言不太符合我们的口味,因而我们也使用其他语言,包括BCPL,我们担心【regretted?】失去使用在汇编程序的级别以上的语言进行编程的优势,即容易编写、易于理解。当时我们并未特别关注可移植性,到后来才有了这方面的兴趣。
Thompson面临的硬件环境,即使在那个时代也是又拥挤又简陋:他从1968年就开始使用的DEC PDP-7,只有8K的18bit字(长)的内存,并且没有对他有用的软件。虽然心想着使用高级语言,他还是用PDP-7汇编器编写了最初的Unix系统。刚开始的时候,他甚至并未在PDP-7上编程,而是在一台GE-635机器上使用GEMAP汇编器的一些宏。一个后处理器(postprocessor)生成PDP-7可读的纸带。
这些纸带从GE机器拿到PDP-7上进行测试,直到一个原始的Unix内核(kernel)、一个编辑器、汇编器、一个简单的外壳(shell)(命令解释器)和一些工具(像Unix rm, cat, cp命令)被完成。此后,这个操作系统可以自我支持:可以编写和测试程序,勿需借助纸带,并且程序开发可以在PDP-7上持续进行。
Thompson的PDP-7汇编器在简明性上甚至优于DEC的;它对表达式求值并得到对应的比特流【二进制源代码】。没有库、没有装载器或没有链接器:程序的全部源文件提交给汇编器,而其输出文件(the output file)——有一个固定名字——是可以直接执行的(这个名字,a.out,道出了一点Unix渊源;它是汇编器的输出。甚至在系统有了链接器和有了显式指定另一个名字的方式之后,它仍被保留作为编译器的默认可执行文件(名))。
Unix在PDP-7上首次运行后不久,1969年Doug McIlroy创造了这一新系统的第一个高级语言:一个McClure的TMG实现[McClure 65]。TMG是一种自顶而下,递归降解(top-down, recursive-descent)风格的编写编译器(更一般地,TransMoGrifiers)的语言,它将上下文无关的语法表示法与过程(式程序)元素相结合。McIlroy和Bob Morris使用TMG为Multics编写了早期的PL/I编译器。
受McIlroy重造TMG事迹的刺激,Thmopson认为Unix(当时可能还没有取这个名字)需要一种系统编程语言。经过用Fortran的短暂而受阻的尝试后,他创造了一门他自己的语言,他称之为B。B可被视为没有类型的C。更准确地,它是塞进8K字节内存,经过Thompson大脑过滤后的BCPL。它的名字最有可能表示为BCPL的缩写,尽管另一种理论认为它源自于Bon[Thompson 69],Thompson在Multics的那些日子创造的一门不相关的语言。Bon进而二中其一,可能是以他妻子Bonnie的名字,或者(根据它的操作手册中的一个百科全书般的引用)以一种宗教命名,该教仪式涉及咕隆咕隆的神奇咒语。【不知道是不是西藏的原始宗教:苯教(Bon)】【太难搞了】
起源:这些语言
BCPL是由Martin Richards于1960年代中期,在访问麻省理工学院时设计,在1970年代早期被用在几