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
1700436450
1981年,比尔和我出版了这本工具书的Pascal版本。当时Pascal作为一种教学语言在高校里很受欢迎。Pascal有很好的特性,包括合理的控制流。
1700436451
1700436452
遗憾的是,它也有一些不太好的特性,如笨拙的输入和输出方式和几乎无法使用的字符串,我在一篇题为“Why Pascal is Not My Favorite Programming Language”(为什么Pascal不是我最喜欢的编程语言)的文章中讨论了这些特性。我把这篇文章投给一本杂志,但被拒稿了,因为这话题太有争议,内容也不够充实。它从未被正式发表过,但尽管如此,还是出人意料地经常被引用。
1700436453
1700436454
无论如何,随着C语言和Unix的普及,Pascal的严重局限性使其越来越不受欢迎,所以Software Tools in Pascal读者甚少。事后看来,无论从短期还是从长期而言,如果我们当年写一本C语言版的Software Tools的话,其影响都会大得多。
1700436455
1700436456
1700436457
1700436458
1700436460
UNIX传奇:历史与回忆 4.9 道格·麦基尔罗伊小传
1700436461
1700436462
罗布·派克称道格·麦基尔罗伊为“Unix的无名英雄”,我同意这个说法。肯·汤普森说道格比其他人都聪明,这似乎也对,不过道格自己说:“最好让别人来评价我的聪明程度,但我知道BTL有许多数学家比我聪明得多。”可以说,实验室里有很多优秀人士,常有人认为自己不过是“暴得大名”。想要力争上游,就得紧追不舍。
1700436463
1700436464
不管孰对孰错,没有道格的好品味和他对技术问题与人的准确判断,Unix可能根本不会存在,当然也不会如此成功。
1700436465
1700436466
道格1954年在康奈尔大学获得物理学本科学位,1959年在麻省理工学院获得应用数学博士学位。他曾在贝尔实验室工作过一个夏天,后于1958年全职加入,并于1965年成为计算技术研究部门的负责人——比我第一次见到他早两年。如前所述,1967年夏天我在道格的部门做实习生,名义上是研究他提出的存储分配器问题,实际上是做自己的事情。作为管理者,他有许多好品质,其中之一就是他根本不为这类情况烦心。
1700436467
1700436468
前文已经介绍过道格早期在PL/I和EPL上的语言方面工作。Unix一经问世,他就写出各种各样的基础软件。他写的存储分配器malloc用了很多年。他对分配器的研究影响深远。他还写了一堆Unix命令;他达特茅斯学院的网页上列出了spell、diff、sort、join、graph、speak、tr、tsort、calendar、echo和tee。
1700436469
1700436470
其中有些是小工具,如echo;而有些是大工具,如sort和diff。但大多数都是Unix计算的核心工具,其中很多沿用至今。当然管道也来自他的构想,不过最终版本采用了肯的语法。管道之所以能出现,全拜道格不遗余力地游说所赐。
1700436471
1700436472
他写的spell版本[12]有效地利用字典和启发式方法来拆分单词,耗费些微资源即可找出拼写错误。
1700436473
1700436474
道格版本的diff程序实现了哈罗德 · 斯通(Harold Stone)和汤姆·希曼斯基(Tom Szymanski)发明的高效算法,用于比较两个文本文件,尽可能少地修改其中之一,将其转换成另一个文件。这段代码是管理多个版本文件的源代码控制系统的核心。这类系统最常见的工作方式是存储单个版本和一组差异数据(diff),通过运行diff算法生成其他版本。它也被用在更新程序的补丁机制中——不发送整个新版本,而是发送一连串由diff程序算出的ed编辑命令,将旧版本转换成新版本。
[
上一页 ]
[ :1.700436425e+09 ]
[
下一页 ]