风格和工具
时间回到Ritchie和Thompson为他们为ACM讨论会准备论文的时候。Brian Kernighan和P.J. Plauger正在合作写编程风格的要素(Elements of Programming)。Kernighan说:“我们从1973年开始写,在74年早期结束”。Plauger强调:
Brian Kernighan和我在莫里山贝尔实验室的隔壁办公室几乎以事故收场...
我们怜悯计算机编程的糟糕状态,以商业创作结束。我们都是第一次写作,这一本小书花掉我们差不多4个月的时间。据我所知,它让“编程风格”作为成人间合法的讨论话题出现在书上。
当然,这本书现在已经过时的可怕了...
Kernighan告诉Peter Collinson:
Plauger和我写那本书,过程很有趣,结果也还很不错。那本书背后的思想是列出很多代码然后评论它们:那样做不对,应该有更好的做法。我们不说应该怎么做,而只是说应该不去做什么。我们的目标语言是那时社区的主要语言FORTRAN和PL/I。
编程风格引起了很大的轰动。但是不管是Plauger还是Kernighan都强调它只涉及了FORTRAN和PL/I。他们两人合作的下一件工作有着更加深远的影响。Collinson问Kernighan他是怎么开始写软件工具(Software Tools)的。他回答说:“这很难说”。
几年以后,我们决定是时候去告诉人们一点东西,让他们知道他们应该怎么做事情。那时候,我们清楚的知道一些Unix环境的好处:管道可以让程序在一起协同工作,还可以加上过滤器。还没有一本书清楚了讲解怎么用一个编程语言实现这些。当然,C语言在很多环境里是不存在的。我已经完成了Ratfor(Rational FORTRAN)。Ratfor简单的偷窃了C语言好的一面,但是除此之外并没有添加太多东西。它还算不错,将FORTRAN变成一个编程语言。
我们决定用Ratfor作为那本书的编程语言实在是违反传统,因为它只有很少的用户。小组里没有一个人,因为那时没人用FORTRAN语言,除了数值分析员。但他们担心可移植性所以他们不想用Ratfor语言写出无法月的的FORTRAN代码。
最初的版本使用C语言用一些yacc的语法写的(yacc是“yet another compiler-compiler”的简写,由Steve Johnson编写)。给出自举,它就能花费一些时间用Ratfor语言写出来。之后它能在一个只运行FROTRAN的机器上运行。为了软件工具包分发的一部分程序是用Ratfor实现的Ratfor,还有一部分是用FORTRAN实现的。纸带上开头就是FORTRAN实现的Ratfor,因此你可以简单的拿出纸带开始运行。
Collinson接着问:“那么你有了Ratfor,你是怎么从它们又做到软件包的”?
你坐在哪里,然后问Unix系统中有哪些有意思的事情。事实上有很多的小工具你可以将它们用有意思的方式组合在一起工作。书的前三章内容会让你看到:字符输入输出是最通用途径,文本就是一切,数据就是一行一行的流式文本,也许归档也可以算是。
然后我们介绍了正则表达式。这些是Unix中非常重要的基本概念。有了这个,接下来的事情就是模式搜索,grep家族,还有编辑器。事实上,排序也可以放在这些工具里面,关于算法有很多有趣的算法可以说。
我们做的另一件事情是文本格式,一次我们做了一个简单的格式化工具。最后,我们讲解了Ratfor,说这是你可以一直用下去的程序。这是用Ratfor实现的Ratfor。
软件工具这本书附带一个Ratfor纸带,Ratfor是为这本书而写。但书实现出版的,Kernighan评论说:
Ratfor是这本书的基础,但它成了这本书的媒介。书上描述的版本比之带上的版本要简单,因为将它的实现全部解释给你也不会学到更多新的东西。有一些像软件工具小组之类的小组开始出现,主要是在加利福尼亚的劳伦斯伯克利实验室。Debbie Scherrer,Joe Sventek,Dennis Hall还有其他很多人建立起了软件工具小组并且做了很多很棒的工作,比如建立“虚拟操作系统”以及很多其他各种事情。用干净利落的方式在多个平台上使用了优雅的技巧。
再回忆一下Unix的哲学:写一个程序,只做一件事并把事情做好。这就是这些工具背后的思想。并且这句话也激发了劳伦斯实验室的人们。
Debbie Scherrer告诉我:
如你所知我最初是在太平洋大学。但是他们只有一个计算机课程,所以我转学到了伯克利。大概在1968年我为我的硕士学位工作的时候,在贝尔实验室有一个工作机会,那时一个很棒的工作。Dennis Hall和Joe Sventek就在楼下,他们在另一个部门工作。他的学位是物理学位,并且做的是像武器测试这样的保密工作...我们给这些研究员维护系统,他们只要计算机工作就好,对计算机本书毫不关心。但是有一天来自阿姆斯特丹自由大学的Andy Tanenbaum在实验室的桌子上留下一本复印的软件工具,他说“你可能会对这个感兴趣”。所以我开始阅读,觉得这本书简直美妙无比。同时Andy Tanenbaum提到这本书,实验室的Dennis Hall发现了它。Dennis将我拉了进来(那时我在为另一个项目工作),Dennis是一切的起点,是他在我和Joe能接受的范围内指导我们。从那个周末开始我就坐下来开始完成整本书。这太棒了!Dennis,Joe和我都觉得,如果我们支持研究,那么这些工具也支持研究。我们最后完成了所有剩余部分。喔,还没说完。DOE的Jim Poolet一直非常支持我们,给我们资助。没有人曾经这么做过,独自用可怕的FORTRAN程序,扩展的DCL脚本,还有其他可笑的东西。
它就是那么快。
Mike O'Dell告诉我:“记着,Debbie知道Brian,他知道他们在做什么,所以他指出人们在向贝尔实验室询问什么工具。这些事情慢慢形成了用户组”。说起来,软件工具不是一本关于Unix的书,而是关于哲学和风格。Ritchie说:
工具的使用简单而强大,但是也需要一些想象力。相比起将更简单,更普通的工具组合在一起,建立一个专用的工具可能需要更加高昂的代价。
有趣的是,Scherrer和他的同事们意识到工具想法是如此强大,他们清楚的知道软件工具的方式会在所有平台上流行起来。所以Hall,Scherrer还有Svented写了一个虚拟操作系统(VOS),它能在软件工具(Ratfor)和任意的操作系统之间提供一个虚拟的接口。Scherrer谦虚的说:“VOS是Dennis的主意”。
我问Paula Hawthrn,关于软件同居,在贝尔实验室谁有成为O'Dell的主管的声誉。她说:
当我加入到贝尔实验室的计算机科学与数学部门,Debbie,Joe还有Dennis Hall已经完成软件工具的几个版本,但还困扰于“但这真的是科研吗”这个问题。
那个问题是因为贝尔实验室本应该是做科研的,我们能说发布软件工具就是在做研究吗?“但这真的是科研吗”,是真正想做为众人所用的研究的工程师的毒药,因为很多做出成果的事情不需要研究,但是科研如果没有这种基础根本就无从谈起。所以我那时的记忆完全充斥着和“这真的是科研吗”的纠缠,还有“如果你想用Unix,为什么不直接去用Unix”的对抗。大致上,软件工具似乎成了掩盖非Unix系统差异,使他们看起来都和Unix一样。这同样引起很多热烈的讨论...
1978年成立了一个软件工具用户组,用于和一些人讨论工具的问题。1980年9月VOS的文章发布在CACM上,不过一个STUG会议已经于6月16日,在瓦乌布日赫大学先于USENIX会议举办。Wally Wedel在会上报告了LBL主办的非定期通讯杂志软件工具社区(1980年10月4日)。在几个DEC操作系统,数据控制网络,TSO环境下的IBM系统,还有MPX 1.3(MPX是一个早期的操作系统,NASA的Ames研究中心虽然能够让每一个工具在它上面工作,却没能实现一个shell)上的SEL 32/77上软件工具都已经可以使用。在1981年9月的那期杂志上,Phil Scherrer(以前的独角兽系统个,现在在斯坦福大学)写文章说:
软件工具现在已经完全移植到一个微型计算机环境。运行在8080,Z80(zilog的商标),8085处理器上的CP/M(数字研究的商标)操作系统因为可以在众多硬件上运行,被选为目标系统。
那一期的软件工具社区列出了接近30个已经实现工具的硬件架构和移植者的地址。内容从Burroughs到Zilog的制造商(字母排序),从Z80/8080(64Kb内存)到IBM 730和DEC 20的机器(大小排序)。地理上看移植者来自全球各地:从日本的川崎到美国,到美国,到加拿大,到英国,再到荷兰的埃因霍温。
工具变得重要的站点之一是佐治亚州科技。在那里呆了很长时间(虽然不是在最开始)的Gene Spafford告诉我:
1970年的中后期,佐治亚州科技的人们有几个运行Unix的PDP11。这些机器既被用作科研,也是医学数据库研究程序的一部分。
几个实习生和员工们都被Unix迷住了,他们想把它放在部门的主要科研计算机Prime上。Prime在那时是很好的机器,它有虚拟内存,多用户环境,还有许多很好的特性。不幸的是,Prime的硬件架构使得在上面写一个操作系统并不容易,Unix并没有被移植到这台机器。
作为一个附加诱因,最后一台PDP-11被一个DEC驻场工程师“熔掉了”,他弄颠倒了电源,将110伏的电流接到了背板上。DEC再也没有让它恢复正常,所以我们没了Unix...
实习生们写了一个系统,但是佐治亚州科技不允许这个系统分发出去,所以它只授权给为它付了足够费用的大学和公司。同一时期,它在许多地方都在运行,Prime甚至订购了它。几年以后出现的三个事情杀死了它:
Prime的一些员工不希望顾客更喜欢软件工具接口,而不是他们自己的Primos,所以他们停止想软件工具小组提供特殊的支持。Prime工程师中的大多数拥护者都因此离开去组建了阿波罗。留下的人们返回到公司的开发团队,将一些软件工具的点子做到Primos里。
软件工具小组为系统写了一个非常棒的C语言编译器和运行库。它们想将所有的事情切换到C语言上,并且建立一个独立的公司来提供支持。不幸的是,佐治亚州科技的管理层贪图编译器和相关代码的所有权。结果是整个的团队退出,软件工具事实上没有了后续的支持。
VAX开始购销售大量的BSD Unix。之前在Preime上使用软件工具的人们现在可以用同样或者更少的花费用上Unix和虚拟内存。需求开始快速的下降。
主要的相关人员有Dan Forsyth,Paul manno,Perry Flinn,Allen Akin,Win Strickland。
在Spafford的建议下我去见了Manno和Forsyth。Forsyth在和前同事们为了准确性挤在一起后,告诉我:
佐治亚州信息与计算机科学技术学校的软件工具项目是以1976年几个独立的事件开始的。第一就是软件工具的出版。第二是军队对可移植COBOL的兴趣。最后,也是最贴近生活的,一个资深小组的困境,他们从暑假回来去找他们心爱的Burroughts B5500,但它因为缺少维护资金而损毁,并且所有的PDP-11都因为要保护医学研究数据而隔离起来。在他们原来田园式计算机环境的地方,使用全新的Prime 400建立了大型的军队研究项目。
移植一个Unix会出于很多原因,包括不能访问PDP-11,最初Prime内部缺乏文档,还有人们缺少兴趣。那时本地编程环境包括一台看起来介于GE-645和Intel 80286之间的机器,一个FORTRAN-66编译器,一个最好可以接收两个6字符文件名和10进制数字命令的分时操作系统。
Philip H. Enslow博士(军队科研项目的灵魂人物,马上成为许多学生的指导教授)建议的专业设计项目之一是移植Ratfor到Prime。很明显在我们了解之前Job Brian(Kernighan)和Bill(Plauger)就将有挑战的工作完成了。纸带从Addison-Wesley那里可以得到,在我们知道以前Ratfor就已经在运行了。
Allen Akin和Jack Waugh开始意识到工具应该怎么被放在一起使用。1977年早期的某些时候,Primos的命令行接口被认为不能优雅的将工具连接起来,因此一个简单的类Unix风格的shell被匆匆拼凑出来,不久之后Paul Manno和我就这份工作吸引住了。
虽然我们都强烈渴望着建立一个优雅的计算机环境,但是我们两人都在为其他项目工作。虽然如此,我们经常发现相比于每次都从头开始,我们在K&P的建议下扩展或增加新的工具可以让我们更有效的完成项目。在这种激励下,软件工具子系统开始迅速的成长。由于它是一个非常有效的环境,来自其他学生和员工的贡献也开始成长。我们接收到很多其他研究员的贡献,然后发现为了避免花费很多时间回答问题,需要建立文档标准并且写很多文档。当然,我们也扩展了文本格式化程序和为了完成它所需的其他程序。
到1978年的夏天,我们有了一个Primos命令行和编程环境的有效替代品。另外对于最初的软件工具,我们有了一个巨大的子例程库,basic命令行,扩展的Ratfor,电子邮件,公告板,全屏编辑器,以及许多其他的新工具。
通过Prime研究部门的领导Phil Enslow和David Nelson的努力,Prime计算机研究部门也对我们的工作成果有兴趣。在佐治亚州科技和Prime的帮助下,Allen,Perry和我在夏天去Prime的科研中心并且得到一个“高级”命令解释器的灵感。我们将Multics,UNIX V6,RDOS,还有其他系统的特点集成到一个单独的命令语言。软件工具,Unix以及Algol 68这些例子让我们确信我们应该以优雅,正交,可重用为目标。
1979年初,我们做出了“新命令行”。现在想起来,它看起起来非常像Bash(虽然那时我们从来没有见过它)。它包含几个有趣的概念:使用语法将多个标准输入和输出直接与图形工具连接,任意长度的命令行,通过外部命令控制流程,还有被视为对象的局部变量,它们可以在标准输出上打印他们的值。
Prime科研中心获得了一份这个子系统,就像它被亲切称呼的名字,因为它可以提高文本处理和研究程序,他们在内部使用了它。它可能在这段时间让我们和Prime的工程小组建立了不太令人满意的关系。看起来我们有能力做出和发布这些提高操作系统接口的特性,几乎就在同时Prime工程团队声明这样的任务是不可能做出来的。当然,我们奢侈的拥有一个不大的用户群,并且我们没有保证向后兼容。不管是什么原因,我们的工作间接的影响了Primos后续发布的版本。
随着获得更多的Prime系统和一种叫做“以太网”的连接中断的方式,软件工具子系统成为ICS学校的行政管理工具。它就像为部门处理文本一样在本地处理电子邮件,它没有宣传就获得了包括我在内众多毕业生的喜爱。相比于将我们的成果免费发布给公众,佐治亚州科技的当权者相信收取一点授权费更为合理。虽然授权费用高达3000美金,但全球仍然有几十个Prime工作站购买了授权,包括英国,法国和澳大利亚。
1980年劳伦斯伯克利实验室的Debbie Scherrer邀请我们出席一个软件工具用户组会议,这个会议是多伦多USENIX会议的一部分。佐治亚州科技帮助我们飞到多伦多,在那里我们发现我们被许多新主意包围着。这些会议相当的有趣,让我们看到了在我们孤立的部门环境下无法想象的观点。我们被允许贡献一些我们的软件给用户组,但是因为授权的原因,我们永远不能发布“新命令行”和更多有趣的工具。
在1981年Allen,Perry和我离开的时候,子系统已经像那几千页重写的文档一样,完全重写了Ratfor预处理器,一个解析生成器,一个语言独立的代码生成器,还有一个C语言编译器(用Ratfor写的!)。项目接下来由Jeanette Myers,Terry Countryman,Peter Man,Scott Lee,还有Arnold Robbins接手,他们做的都非常好。在那期间,AT&T开始提供低价的Unix二进制授权,不到一年,Unix盒子的只需Prime或者PDP-11价格的五分之一。不久,UNix,vi,还有troff就可以被大众使用,商业对子系统的需求开始减弱。
在佐治亚州科技周围,BSB4.1 Unix VAXen,AT&T 3Bs,还有Sun 3s开始像野草一样萌芽,让计算中心惊讶不已。CSNet,NSFnet,还有USENET让Unix用户们需要参与进不断增长的互联网社区。最后一个子系统在1985年发布,它的代码被发布给公众。不久之后,它和Prime退出市场,被那些弥补了其缺点的软件所代替。
软件工具引发了另一个平民运动。一部分热心用户将它叠加到系统来使用Unix。但是其哲学是可以移植的:写一个程序,只做一件事情,并且把事情做好。
STUG中的许多名字都被Unix用户所熟悉:Neil Groundwater,Mike O'Dell,Scherrer,Joe Svented,Dave Stoffel,还有Wally Wedel。
我上次说到O'Dell时他还是俄赫拉荷马州立大学的一个学生,现在他已经完成了他的硕士学位论文(“不久前我有看了一下它”,他告诉我,“它并不是难的可怕”),并且在找工作。用他的话说:
我在莫里山用了两个星期和1127(科研小组的代号)谈工作的事情,接受了面试。然后开始了死亡历程,那里有无穷无尽的书面工作,每天桌子上的文件就像你刚刚去度了两个星期的假期。因此一个需要两周的批准流程...变成两个月。所以在那段时间我去了博尔德举办的“USENIX”一月会议,参加了软件工具会。我被软件工具可以在IBM机器上运行迷住了,那时我们仍然在努力说服而克拉玛州立大学购买一台DEC机器。所以我去软件工具分场,Debbie Scherrer讲了他们杰出的工作,演讲的最后他说:“哦,另外说一句,我们正在在寻找为我们运行Unix系统的人”。我几乎是爬过众人,我清楚记得路上扔过来的每一把椅子,会议不得不中断。那里一共有来自实验室的6个人,Joe Svented,Peter Krebs,Debbie,Dennis Hall,Roland johnson可能也在那。面试程序是和6个人一起吃午饭,他们在你说话的时候吃中国菜。
不管怎么说,我讲了一些我的论文,他们了给我一个offer。因此我要在LBL和贝尔实验室之间选择一个。贝尔实验室一再的延期,最后LBL说他们必须要有一个结果。因此我打电话给Dennis Ritchie...他说我应该选择另一个工作。
所以O'Dell去了LBL,在那里他成了Unix领袖,ARPANET联络员(11/70是一个早期的ARPANET主机),和其他一些东西。Neil Groundwater也在那个博尔德会议,同样的他也受到了STUG的影响:
1980年的博尔德USENIX会议上我成了STUG的一员。那时看起来LBL(Sventek,Scherrer等)已经完成了90%的工具工作,其他的工具也开始着手。
我们被卷入美军的几个项目咨询,他们有不同的编程环境。我们建议将工具作为他们在多个平台上控制编译环境的一种形式,事后证明了他们主要将它使用在VAX/VMS上。
我最大的贡献是一个针对版本控制文本文件执行create,delete,get和edit功能的文本控制系统(SCCS)。它是基于贝尔实验室J.W. Hunt和Doug McIlroy发布在贝尔实验室技术备忘录上的的diff算法。
STUG是在博尔德会议上正式成立的,Groundwater被选为第一个委员会。O'Dell去了伯克利。
我在实验室的三年都是和Debbie分享一个办公室。她是世界上最可爱的人,拥有6个人才能拥有的能力。软件工具达到很高的水平。不好的是Unix社区从来没有真正的学习软件工具的人们给出的课程。软件工具的员工,我坚持认为他们对可移植性的理解无人能及,UNix社区这方面就太弱了。Unix的问题是它太容易去写代码,你找不到理由不去写。这不是救人于水火的方式。许多软件工具工作的更好因为他们真的做对了事情,5700个人不是这去重新发明一些事情。
工具的概念在Unix意外的领域开始繁荣昌盛。
![]() |
---|
译者注