1700436400
图4-5 K&R书第1版的封面,1978年
1700436401
1700436402
我只浅尝过B语言。为了自娱,我写了一本教程,帮助别人学习。丹尼斯创造出C语言后,我没花多少工夫就把那本B语言教程修改成了C语言教程。事实证明,C语言教程很受欢迎。随着Unix和C语言的传播,我觉得值得专门写一本关于C语言的书。我不假思索就去问丹尼斯是否愿意一起写。一开始他可能不太情愿,但我百般游说,最终他同意了。邀请丹尼斯一起写这本书是我在技术生涯中做过的最聪明或者说最幸运的事情——因为丹尼斯是合著者的缘故,该书尤显权威,而且我也就能在书里引用他的参考手册了。
1700436403
1700436404
我写了大部分教程章节的初稿,丹尼斯写了系统调用那章,当然他也提供了参考手册。我们互相帮忙审订,成品融合了两个人的写作风格,但参考手册几乎完全保持原状,充分体现了丹尼斯的写作风格。如比尔·普劳格所言,丹尼斯描述C语言时,“一针见血”。参考手册就像C语言本身一样:精准、优雅、紧凑。
1700436405
1700436406
1989年,ANSI和ISO完成了第一份C语言正式标准。这份标准对语言的描述直接基于丹尼斯的参考手册。丹尼斯在标准制定的早期阶段就介入了。作为C语言的创造者,他的意见举足轻重,足以否决个别太过糟糕的提案。
1700436407
1700436408
C语言很重要,但它对标准库的使用也很重要。标准库为程序员提供了进行格式化输入和输出、字符串处理和数学函数等操作所需的基础能力。C语言自带规模适中的函数库,这样程序员在编写新程序时就不需要重新发明每个例程。
1700436409
1700436410
其中,最大的库组件提供了格式化输出能力。今天,C语言的printf函数已经为许多其他语言所采用,每位程序员都对它耳熟能详。迈克尔·莱斯克的可移植I/O包写于1972年,目的是让程序能够很容易地移植到Unix,或从Unix移植到其他系统。它包含了printf的首个版本,以及用于解析格式化输入的scanf。这些程序包经过重新设计,放到了C语言编译器中。
1700436411
1700436412
虽然printf和scanf后来做了扩展,但核心转换功能和70年代初没有区别,库中的大部分其他函数也能正常工作。今天,标准库和语言规格说明本身一样,都是C语言标准的一部分。
1700436413
1700436414
将C语言与其他语言进行对比很有意思。例如,在Fortran和Pascal中,输入和输出是语言的一部分,有特殊的语法来读写数据。其他一些语言不包含输入或输出,同时也不提供标准库,这可能是最不令人满意的选择。
1700436415
1700436416
C语言一直非常成功,是有史以来使用最广泛的语言之一。虽然它最初在PDP-11 Unix上诞生,但已经传播到了差不多每一款计算机上。正如丹尼斯在1993年提交到第二届编程语言史(History of Programming Languages)大会的论文中所说:
1700436417
1700436418
“C语言既古怪又有缺点,却获得了巨大的成功。虽然历史上的意外事件肯定有帮助,但C语言显然满足了人们对一种系统实现语言的需求,这种语言需要足够高效,足以取代汇编语言,但又足够抽象和流畅,足以描述各种环境下的算法和交互。”
1700436419
1700436420
当然,编程语言为数甚多,各有各的支持者与抨击者。C语言也会受到批评。然而,它仍然是计算领域的核心语言。在流行度、影响力和重要性的榜单上,它几乎总是名列前两、三位。在我看来,没有任何一种其他语言能在优雅度、表现力、效率和简洁之间做到同样程度的平衡。C语言还启发了许多其他语言的基础语法,其中就有C++、Java、JavaScript、awk和Go。它做出了极具影响力的贡献。
1700436421
1700436422
1700436423
1700436424
1700436426
UNIX传奇:历史与回忆 4.8 软件工具和Ratfor
1700436427
1700436428
到1975年中至年末,Unix已在各种会议和期刊论文中公开露面,第6版在大约一百所高校和数量有限的商业机构中得到使用。不过,技术界仍主要使用Fortran,运行环境是硬件提供商的操作系统,如IBM的System/360。墨里山的大多数程序员使用GE 635,运行GE的批处理操作系统GECOS(1970年,GE将其计算机业务出售给霍尼韦尔,GECOS更名为GCOS)。
1700436429
1700436430
到1973年,我已经开始经常使用C语言编程,但仍在写Fortran代码。虽然Fortran用来做数值计算很方便,但几乎没有控制流语句,而且它源自20世纪50年代的穿孔卡语言,发展空间有限。相比之下,C语言的控制流程可以说是自然天成。
1700436431
1700436432
因此,我写了个简单的编译器,把一种看起来像C语言的Fortran变种代码翻译成合规的Fortran代码。我把它称为Ratfor,代表“rational Fortran”(意为“理性Fortran”)。Ratfor将C语言的控制流程,包括if-else、for、while和用于分组的括号,转换成Fortran的IF和GOTO语句,以及DO循环结构。该预处理器还提供许多便利,如自由格式输入(而不是按照Fortran的严格要求,格式化成 80列卡片式样)和方便的注释方式,摒弃了Fortran笨拙的.LT.和.GE.形式,采用更自然的逻辑和关系运算符,如 < 和 >=。
1700436433
1700436434
以第1章的Fortran程序为例,它可以用Ratfor编写成这个样子:
1700436435
1700436436
# make v an identity matrix do i = 1, n do j = 1, n if (i == j) v(i,j) = 1.0 else v(i,j) = 0.0
1700436437
1700436438
1700436439
1700436440
1700436441
1700436442
Ratfor是第一个以C语言为基础语法的语言。要我说的话,用Ratfor编写Fortran代码,比编写标准Fortran代码愉快得多。Ratfor并未改变Fortran的语义或数据类型——例如,它不具备处理字符的功能——但在用到Fortran的任何地方,改用Ratfor都是更佳选择。有了自由形式的输入和类似于C语言的控制流程,用Ratfor写代码感觉就像用C语言写代码一样。
1700436443
1700436444
布伦达·贝克(Brenda Baker)写了一个名为struct的程序,它能将任意Fortran程序翻译成Ratfor程序。布伦达的程序既有理论高度,又是实践力作,它证明了几乎任何Fortran程序都可以拥有良好的结构形式。借助Ratfor,就能以独一无二的最佳方式来呈现它。使用struct 的人发现,Ratfor版本几乎总是比他们最初编写的Fortran代码更有条理。
1700436445
1700436446
比尔·普劳格和我决定写一本书,向在非Unix系统上编写Fortran的程序员传播Unix工具理念,这个群体受众面更广。我们合写的Software Tools(软件工具)一书于1976年出版,书中介绍了标准Unix工具的Ratfor版本:文件比较、单词计数、grep、类似ed的编辑器、类似roff的文本格式化器,以及Ratfor预处理器本身,所有这些都是用Ratfor编写的。
1700436447
1700436448
时机刚刚好。书卖得还不错,软件工具用户组(Software Tools User Group)应运而生。用户组由劳伦斯伯克利实验室(Lawrence Berkeley Labs)的戴比·谢勒(Debbie Scherrer)、丹尼斯·霍尔(Dennis Hall)和乔·斯文泰克(Joe Sventek)牵头组建。他们打磨和改进程序,添加自己的新工具,发布代码,组织会议交流,如此顺畅运行多年。他们的代码被移植到50多个操作系统上。用户组于20世纪80年代末解散,在此之前一直很活跃,颇具影响力。
1700436449
[
上一页 ]
[ :1.7004364e+09 ]
[
下一页 ]