实用工具

每个Unix机器上都安装着数目繁多的程序,不管是系统原生的还是厂商附加的。这其中包括编辑器,格式器,编译器。实用工具使得用户有一个字母列表跟踪程序或者文档的不同版本,去“伸手戳一下”其他用户。这章将用来讲述它们中的一部分:非常早期的——troffeqntblyaccmailmakeawk,还有最近出现的——UUCP,TCP/IP。最后两个又引发了其他的实用工具(Mike Muuss的ping和Earl Cohen的finger就是很好的例子),并且几乎立即就出现了一个世界范围的由各种不同用户组成的社区。这个社区对Unix来时及其重要。各种问题,解决方案,程序,抱怨,宣告等等都在社区里自由的交换传送。整个社区建立在大约3000万到3500万的网络用户之上——就像John Quarterman所说的,比加拿大的总人口都要多。

mail和roff以及ed一样,在Unix第一版时就存在了。Morris曾经将roff移植到635上,McIlroy用BCPL语言将它重写。Thompson将它移植到了Unix。但Joe Ossanna不久又将roff合并到了troff,一个真正针对电传打字机文档的格式器。Ossanna死于1977年11月28,McIlroy告诉我:

Joe是军需官,他游走于各个厂商,打探硬件的最新发展,和设备部门做交易,还做了很多很多其他的事。他是一个严厉而有吸引力的人。

eqn在第5版的时候加入进来。Brian Kernighan说这是他对Unix做出的第一个重大贡献。就像他向Collinson说的:

那个时候所有的程序都是用汇编语言写成的。troff的最早版本应该是在1972年晚期或者1973年写的,它是一个汇编语言程序并且只针对特定的图形排字机系统。在今天仍然有许多事情依然受到troff语言那古老机器语法的影响。

Joe Ossanna将它转换成C语言,我认为他受到了相当大的影响,他并不真的想将它转为C语言。他死于1977年,之后我接手了它的工作,事实上,虽然我花费了至少一年半的时间试着去编译它。我开始让它独立于图形排版系因为那时它的优势已经很明显了。我开始投入到图形中因为新型的默根瑟勒排版机可以做一些受限的图形操作,你可以非常精细的定位,你可以画直线和曲线。

Mike Lesk大概在1975年做了tbl,在Lorinda Cherry和我做出eqn不久之后(Cherry告诉我他开始着手项目的时候Kernighan就加入了,但Kernighan因为非常成功的语法而出名)。eqn是第一个文档预处理器。它是我们强行实现的一个好主意,需求是发明之母。troff几乎用尽了PDP-11/40s的所有地址空间,它用汇编语言写成。我从来没有学过PDP-11s的汇编,我想Honeywell是最后一个我知道汇编语言的机器。

Joe独自保持维护troff,他对于修改它使它工作有着难以置信的兴趣。但这是他的程序,他不想让其他人参加进来。这些事情加起来意味着Lorinda和我不得不去做一个分割程序。

几个事情合作的非常好。C语言变得非常具有可用性,yacc分析生成器刚刚出现,管道也刚被发明出来。所有这些事情一起使商用变得可能。

Kernighan和Cherry实现的“一个数学排版系统”发表在1975年3月的CACM上。1976年9月14日,M.E.Lesk实现的的“Tbl——一个格式化表格”发表在贝尔实验室计算机科学技术报告第49期上。和troff一起,这些预处理程序使得Unix用户可以排版各种各样的复杂文档。精心制作的宏包,增强了的-mm(memorandum)宏极大地扩展了功能。Mike Lesk写了-ms宏,Eric Allman写了-me宏。只有-ms出现在Unix的研究版本,-mm出现在第三第四版本。-me-ms出现在BSD(Lesk还写了refer,可以使用引用数据库提供引用和脚注)。

yacc(yet another compiler-compiler,有一个编译器的编译器),是Steve Johnson的作品。他在Unix出现之前很久就已经在贝尔实验室工作了:

我在1963年有了第一份工作。我总是对计算机感兴趣,当我拿到学士学位,我试着找一个研究生学校。只有很少的地方我可以去,这些地方大部分都属于电力工程部门,在那里我不得不学习发电站的建设以及其他那些我完全不感兴趣的课程,所以我决定去学数学。因此我在63年夏天去了贝尔实验室,Tom Growley是我的第一个老板...那里有一个基本的规矩,你不能连续两个夏天都在同一个组工作。因此下一个夏天我去了ALPAC的数学组。再之后的那个夏天,我依照流程去了人类信息处理组,那里有声音,语言,心理方面的人们设计实验和进行数据分析。他们需要做一些多维度的工作,这使得聚类成为我的第一篇论文,它在我所有的出版物种有着最多的引用——一共有700之多。

当我完成我的论文,我去贝尔实验室。我可以选择我将要去到哪个组,最后我选了人类信息处理组,因为他们会用一些我很感兴趣的计算机音乐。我在那里做了很多事情。也在那个时候,Multics被认为是繁重计算工作的解决方案,但它是一场灾难。基本上,我们购买了7094并把它运送到印第安山实验室,并且除了645上的GECOS没有其他系统可用。GECOS可以支持1000个用户但是1个就会很勉强(McIlroy向我指出645“运行了大量的批处理”)。

因此,到了下一年,在极端努力之下这台几百万美元的机器可以运行FORTRAN程序了,我同意帮助他们的工作去介绍分时系统。因此在1969年我实际上在Comp中心和一个小组一起工作。在这些时间里,Comp中心分化出了计算机科学研究实验室。然后有了办事员,计算机操作员,打卡员等等这些向研究部门汇报的员工。我到那里一年之后,他们才姗姗来迟地设立了一个组织运营计算机中心。我决定宁愿留在研究中心,那样有个后门我可以去做Unix的组。

我最早是和Dennis Ritchie一起工作于另一个叫做Altran的计算机代数系统。Dennis写了Altran语言的编译器。它是一个用FORTRAN写的递归下降编译器,这绝对是一件杰作,就像用牙签建造了一幢摩天大楼。他曾经为B语言写过一个运行在Honeywell系统上的编译器,我们用它写一些系统程序。但当他和Ken开始为Unix工作时,他终止了他的B语言编译器,然后我领取了它。这个语言里面有一些我想要的东西,比如我添加了高级OR操作符。我从和Dennis一起工作中学到了很多编译器的知识,并且这是一个非常体面的工作。我变得相信你可以通过阅读其他人的代码学到非常多的东西。阅读那些杰出的名著。

当我想添加这个的时候,我向Al Aho请教,因为我听说他对处理表达式的新方法很有兴趣。这是一种非常有趣的情景。Al不停的点头说:“是的,我读了Knuth的这篇论文,这是一个非常好的方法”。所以我们用B语言做出一个非常简单的表达式语法,并且他还不断地说“我会给你做出解析表来”。但是它最后还是延期了一些时间。最后,他去仓库找到他们最大的一张纸,足有两平方英尺那么大。他把它平铺在桌子上,裁成小的方形纸,然后他边小声念叨着咒语一样的东西边在上面写下一些小符号。我看着他做了一会,他说:“你为什么不去做些其他的事情?我做完了会给你说的”。我就走开了,没过几个小时回来看时他仍然在念叨着咒语在纸上写写画画。在傍晚的时候他终于说:“我明天把它做完”。最后到了第二天,他说:“完成了!”,然后把它递给我。我说:“我能拿这个做什么?”。

他就向我展示怎么做一个解析器,我们一起将表格输入计算机。然后我们就试着解析一些表达式,结果完全正确。接着我们又解析了另一些,但是却出错了,表格里面有一些bug。Al说:“喔,天哪”,然后又花费2,3个小时擦除重写,最后我们把新的表格输入进去,终于解决了那个bug,但是却出现了另一个bug。于是我说:“Al,为什么你不告诉我你在做什么?”。他说:“好吧,这实际上并不难”,然后他交给我怎么制作表格。然后我说:“奥,我可以写个程序来做这个”,“真的?”。于是就诞生了yacc

Johnson同时也和Dennis Ritchie一起在向Interdata 8/32上移植的时候写了第一个可移植的C编译器,lint,spell。lint是一个C程序检测器,可以检测C代码文件是否有bug或者可移植之类的问题。spell是一个拼写检查器,它从文件搜集单词然后在一个拼写列表里面查找它们,单词既没有出现,也不能从拼写列表推导出来,就把它从标准输出打印出来。spell不是第一个拼写检查器,第一个拼写错误检查程是Bob Morris和Lorinda Cherry的typo。它包含在第三版到第七版。spell第一次出现在第五版。typo,用Steve Johnson的话说:

从来没有检查出我的拼写错误。我非常偏重通过发音拼写,经常弄混ible和able,以及ance和ence,但是typo从来没有发现这些。它是基于三角统计,我的错误全都出现了。但是typo非常擅长找出缺少e的th。它会将单词按最不可能出现的顺序排序。

Johnson的拼写检查器实际上引用了一个用户可以自行扩展的单词列表。他告诉我:

我在1973年的1月到9月去滑铁卢大学学术休假,和Morven Gentleman(现在在加拿大的国家科研委员会)一起做一些工作。Morven曾经在原始的ALPAC系统上工作过,他对计算机代数非常感兴趣。我们一起做成了一些工作,他是一个非常有趣的人。事实证明那时不是一个合适的时间。当我去那里时C语言刚被发明出来,当我离开时,yacc被一些人从B语言翻译到了C语言。同时MIT的合作学生Alan Snyder也开发了第一个可移植的C译言编译器。那是一个非常具有颠覆性的尝试,包含了很多非常好的点子在里面。但因为PDP-11内存太小的原因,它是一个四阶编译器。并且它还非常昂贵——每一阶段都将大部分时间花费在读取上一阶段的结果和为下一阶段输出结果,真正做事情的时间反而非常之少。

因此它非常的慢,就算老式的B语言编译器也要比它快很多。Al努力让它可以在Honeywell工作,但是仍然有许多的bug。正好,在我从加拿大返回的时候,他也回了MIT,因此我接手了这个项目。我的老板Elliott Pinson强烈建议我我应该接管它。我试着修正代码生成器里面的bug,发现很大部分都是Al做东西的风格。你知道,那时候的代码生成器使用一种我称之为“woopsie”的方式:你确信你有所有需要的寄存器,并且所有的东西都会在正确的位置,当有错误出现时就会发出“woopsie”,然后去找一些东西加载到内存里。大多数时候这都会是一个好的代码,但是当它出了错时那是相当可怕的...

好吧,我去向Al Aho解释这些,这些谈话导致了我认为我在理论方面最好的技术工作——一个为表达式生成代码的算法,它输出可选择的代码...Al和我,还有Jeff Ullman也做了一些,我们一起做了相当有趣的工作。对我来说最终的结果就是我更好的理解了代码生成。

后来,我们为PDP-11争取到了更多的内存,这使得我可以将一些Al Snyder的程序放在一起运行。不久之后我重写了所有的软件,保留了一点Al的语法,但是没有任何他的代码留存下来。我将这个可移植的C编译器叫做pcc。我原本是打算做Honeywell的编译器,但后来我们认为将它移植到IBM会非常美好。于是我将Honeywell版本做了一些hack,就成了360版本。再之后有一个叫做3A的交换机,我为他做了一个编译器。在这些过程中我意识到我为这三台机器做了相当多的重复工作,因此我开始认真检查,将这三个编译器放在一起发现它们90%的代码是相同的。于是,我在脑海里为其他的10%建立了一个程序...

lint是一个有趣的故事。当我决定我真的要去写一个可移植编译器,将这三个编译器打造成一个真正可移植的版本,我知道怎样去做前端,但是对于代码生成我依然不太了解...所以我需要将前端代码全部检测,但是却没办法去检测。我想或许我可以在前端做一些有用的事情,如果它真的有用,人们将会用它检测自己的代码,也就是帮我测试了。然后,怎么样才是有用的呢?前端是支持解析函数的...我说好吧,一个经常出现的编程错误就是使用了错误的参数个数调用函数。实际上,指出是哪个函数并不是很容易办到。于是我写了一个程序,它可以读取你的代码文件,最初它会告诉你是哪个函数出错了。然后我意识到它可以在函数调用间也做测试。因此lint真的成为我调试编译器前端代码的一个工具。一言以蔽之,它在各种组织中扮演公共品行守卫者的角色。

你知道,当1977年我们第一次移植Unix的的时候,我们有一个非常严重的问题,我们有许多代码是人们看着手册写的,他们直接复制了手册上的数据结构声明。当我们介绍头文件的时候,我们设想了机器之间的不同。我们想确认Unix程序都是使用了头文件,特别是操作系统使用的那些头文件。因此lint学着去做的第一件事就是检查头文件的一致性...这让我们可以检查大量的代码——第六版的Unix只用了短短几个星期就解决了一致性问题。它帮助我们将它们合并到第七版的使用工具(第七版是第一个可移植系统)。

克制住想谈论Unix没一件事情的冲动,在转移到通信前我们先专注于awk。Peter Collinson向Brian Kernighan请教关于awk的事情:

我想awk是从1977年开始出现的,到目前为止它是我参与过的最大的软件项目。我们中有三个人参与进来,但却完全没法工作。不知为什么,两个人在一起工作要远比三个人容易。工作分割非常困难。大家在想法上有很多分歧,这有时是好的因为意味着更多的创意,但是有时却意味着大家并不团结。换句话说和Al Aho以及Peter Weinberger一起工作非常非常的棒,所以我并没有那些问题。

一共有三个单独的进度在同时进行。我的那部分是那时还在实验室的Mark Rochkind做的一个工具。这是一个非常基础的数据验证工具,它使用成对的正则表达式和消息,通过扫描输入文件查找是否有符合给出的正则表达式,如果有的话我就会打印出消息。当然,他是用C语言写的这个识别器。这是一个非常优雅的主意。

某种程度上说,那时awk的基本概念。有一大堆的模式,还有许多互相依赖的东西要完成。它不像已有的那些程序,它是他们中非常清晰的一个。我也在可编程编辑器方面混了很长一段时间,我们经历了qed非常流行的阶段。qed是一个非常糟糕的编程语言,但人们偏偏都在用它。

有一个行编辑器拥有与多个buffer和多个文件,非常像今天的emacs

我不停思考一定有更好的方式去操作文本。有些事情会像我想要的那样允许你清晰的同时操作文本和数字。

Al Aho在正则表达式方面是世界级的专家。Peter Weinberger在数据库相关的方面有着非常强的背景,并且对数据库之类的东西非常感兴趣。现在,awk绝对不是一个数据库,但是它有这方面的趋势,这来自Peter的数据库经验。因此,我们将这些混杂主意糅合到一起想做出一个东西。

它最初的想法是写一两行代码,真的是这样。我想它是非常迷人的因为它自动做了这么多事情。它流畅的处理字符串和数字。它是一个解释器并且没有包袱,没有中间文件。人们开始试着写一两行代码,然后代码越来越多,有一些大的难以置信,据说有人曾写出一万行的代码。

awk总是在慢慢变化。有一点可以追溯到我的那个想法,我真的希望有一个编程语言可以让我写程序操作文本就像操作数字一样方便。我想相比于B语言发展到C语言,我会去寻找另外一个方向。

我发明了一种我称之为A的语言,使用了awk的基本概念并且用编程语言将它们包装起来。它工作的并不太好。它有一些功能可以展示,但是它没有使用任何隐式的输入输出或其他类似的东西。我使用了它但是它始终都不够好。它的实现方式真的非常古怪,因此 我一直没怎么用它,也没有其他人用过它。

那时有一些awk的其他实现。特别是有一个GNU的版本叫做gawk。它和我们的实现非常接近。当他们做gawk的时候和我们有非常多的联系来试着确保他们的版本和我们的尽可能同步。还有DOS的版本,我最熟悉的是MKS版本,当然,它也和我们的非常类似。最后,还有一个POSIX版本。POSIX版本是标准化的awk,那个时候它还是草稿阶段。

我们多多少少将这些写到了书里,通常我认为是这样。关于标准过程我认为有些好的争论点是有必要的。有一些是和书上冲突的:比如从数字转换到字符串和从字符串转到数字时变量的状态是什么。这类事情可能他们并没有讲清楚。POSIX和我们在一些观点上有着不同的见解,对其其中的大多数,我想人们会同意主流意见。

Mail存在于Unix非常早期的版本中,man页中记载它的维护者是Ken。它允许Ken,dmr,doug,rhm和其他一些人互相通信。它在其他分时系统上也是可以使用的。但是,就像1940年夏天George Stibitz曾经在达特沃斯州通过远程电传打字机使用了位于新泽西州的计算器,对远程工作的憧憬导致了想和其他人分享数据和程序。

最早的网络是ARPANET(开始于1969年),它打算实现资源共享:高级研究项目代理(ARPA)认为将他们主办的几个项目连接起来会比给它们每一个都购买昂贵的计算机设备更能节省资金。组织成员可以登录到其他成员的机器并且传送文件。文件传输协议(ftp)和远程登录协议(telnet)实现的非常早。由于之前没有可以网络工作的计算机,所以虽然已经有了机器内通信的mail程序,但却没有机器间通信的mail。在1970年早期,计算机邮件已经比较常用。到1973年它已经足够流行以至于邮件头形成了一种事实上的标准。在1970年晚期,ARPANET标准被重写,包含了SMTP(简单邮件传送协议)。

1973年最初邮件格式的模型是一个运行在流行的DEC-10s上面的TENEX操作系统。更多的成功发生在DEC-20s上面,他们的操作系统是TOPS-20或者TWENEX(TWENEX是由BBN开发的TENEX后续版本)。

但是Unix用户呢?

1976年之前,从一个机器向另一个机器发送文件几乎是不可能的。那年的末尾,AT&T研究室的Mike Lesk写了一个“更好的发行规划”(1977年1月,小型系统通讯),仅仅一个月之后它就被称之为UUCP(Unix到Unix的复制,一个程序从一个机器向另一个机器复制Unix文件)。它被设计为针对300波特率线路。uucp最终在1978年发布,它因广泛的使用而被证明为是Unix最重要的部分之一。Lesk的发明导致了改进的需求,因为原始程序如此流行以至于达到了它处理能力的上限。下个uucp版本由Lesk,Dave Nowitz和Greg Chesson重写,并出现在1978年10月的Unix第7版中。这个版本也被证明不足以胜任巨大的用户使用量(更多的系统,更多的软件,更多的需求),1983年七月Martin Levy请求一个新的uucp系统。基于1200波特率异步调制解调器的uucp设计上达到巅峰,但也不足以满足不断增长的Unix网路需求。

1983年1月中旬,在AT&T贝尔实验室召开了很多人参加的一个会议,会议的结果是由Peter Honeyman,Dave Nowitz,还有Brian Redman一起开发uucp的新版本。最终成果就是著名的HoneyDanBer,或者叫BasicNetworkingUtilities1。

我和Brian Redman聊他的工作:

我在亚利桑那州取得硕士学位,在1978年6月去了实验室。我在1977年取得了微生物学的学士学位,我妻子在下一年也去了。但是我为之工作的那个家伙离开了我没有留下任何资金。因此我去另一个生物学的家伙那得到一个维护计算机的工作。我在计算机科学部门学了一些计算机的课程,在亚利桑那那是非常新的知识。然后我意识到我可以在那年拿到计算机科学的学士学位。不管怎么说,我还沉浸在学业的时候,后来成为我引导者的David Hansen从实验室带着一些人来面试。他对学生们说:“如果你有手有脚,你就能在实验室赚大钱”。我猜他假设教室里每个人都有一个脑袋。

所以我去面试了。最初我面试的是西部电子在普林斯顿的一个工作,并且我会在DEC-10上工作,我印象非常深刻。我在维泊尼和霍姆德尔面试了贝尔实验室并且得到维泊尼的一份工作。因此我妻子刚一毕业我们就搬到了新泽西。

于是我开始在维泊尼的环路传输部门工作。我不能相信我可以拿钱做这个计算机工作。

我第一次见到Unix是在我的操作系统课程上,当我读论文的时候。我们在计算机科学中心有一个Unix,但是我一直都是使用DEC-10运行TOPS。因此我真正第一次接触Unix是在我到了贝尔实验室之后。我为Ratfor工作,那本软件工具对我来说真的是一本启蒙书。我非常欣赏简单,模块,重用的概念。

但我当我到贝尔实验室之后,他们说:“你将使用Unix系统,这有一个程序叫learn”。它会向你提供一些信息,并且会问你问题。我记得我输入我的答案,然后它说“不,错了”。但是我确信我是对的,于是我退出程序然后开始查找程序的位置。我找到那个程序,还有它的数据库,它的所有答案。我开始深入了解它,明白它是如何工作的(learn最初是由Lesk发起,由Kernighan和Lesk一起开发。它包含在第7版Unix中,并且也包含在BSD中。但是并没有在第3版和第5版中出现)。

你知道,如果它是一本书,我就会看它的背面。但是他是一台计算机,那么我就看它的文件系统。

我的老板Doug Cory成为Unix电话网络最早的用户之一。一个名为COSMOS的系统为我们布线,后来它叫做COSMIX。COSMOS一台11/70。实际上,我有这台机器的前面板,序列号5001,并且我被告知它是美国第一个卖出的11/70。无论如何,我们在一台名为wh5ess的11/45上使用mail。Sam Arnold和Lesk发起了新的工具uucp。我对它非常有兴趣并且成了管理员,因为我们有了越来越多的用户。我发现我能从莫里山使用uucp的用户那接收信息,有时我们会将11/45换成11/70,因此我们有了更强大的机器。

我们得到的第一台VAX是mothra。那时我们运行300波特率,之后得到了一个新的调制解调器,因此我们可以运行在1200波特率。然后是glass终端,再之后就是这台巨大的机器。于是我问为什么我们不能运行的更快些。他们告诉我你可以在50英尺的距离运行RS-232,但是现在是150英尺。因此我对自己说,好吧,我用不上9600,只能用慢一些的,但仍然要高于1200。于是我扯了一条线,我的到了9600的速度,之后又达到了19200。我的同事说“嘿,也给我来一条”。于是我将它成立了一个项目,我在楼下放了一个接线板,在它上面用上了最先进的技术。这非常有意思,那个时候,我有几百个用户,我花费整个周末让每件事都看起来非常漂亮。我们开始在线路上收到噪音和干扰,因为所有的东西都是并联运行。于是我将他们通通分离,然后把他们再弄成一团,所有事情就都工作的很好。

我开始和计算机中心一起工作。他们有一个排版机用来制作文档。我通过图像排版机放入man页。我试着让系统变得更有用()。不管怎么说,79年我第一次去了圣莫尼卡举办的USENIX会议。我听到了我所期望的事情并且见到很多人。我希望从维泊尼发送东西到计算机中心。因此我加入了uucp。1980年我在特拉华州见到了Peter Honeyman。那时我第一次和他在一起...

我去参加会议,在会上见到了很多人。我们大家交换电话号码,因为大家没法得到对方的邮件。Clem Cole是我记得的一个人,他有一些东西。我不知道是什么但是是一些我想要的东西。我们有8个调制解调器,这在今天非常普通,但是那时大多数员工只有一两个。他在泰克公司,因此我会给Clem打电话说“我们来发起一个连接”,接着我们就那么做。伯克利发出了第二个发行版。我记得他们说“我们可以向你发送磁带”,我说“我不能等了”,于是我们发起了uucp连接。

Clem Cole曾经是卡内基梅隆大学的一名学生,在哪里他和Ted Kowalski将Unix第6版从计算机中心的PDP-11移植到了电子工程部门的11/34(就如Cole和我说的,这件事请“绝非易事,因为卡内基梅隆大学为'e'机器做了非常多的hack,而Unix第6版不能支持34s”)。

Cole后来去了梅隆协会工作,他在那里和Dan Klein培育了Unix,并且当协会购买“第一个RK07's(我记得是#17系列),Dan和我一起用了一周时间为它写了第一个驱动。RK07给了我们2000万!——多到无穷!”。

Cole从卡内基梅隆拿到学位,在俄勒冈州的泰克公司得到一份工作。

我在1979年去了那里。在我到那之前的几个月,Steve Glaser发现了一台运行RSX的11/60,确认泰克会购买一个2万美金的Unix第6版授权,并在它上面运行Unix。由于60并不是一台真正的11/40(类似但不完全相同),我在俄勒冈的第一个周末就是和Steve一起拆开60把卡内基梅隆大学修改的地方还原回去...

我在俄勒冈州的第一个圣诞节是和Rick LeFaivre,Steve一起动手安装PDP-11/70。那台机器成为第二台主要的uucp工作站,“teklabs”运行V7,我们每天都和“Marxs”通信(Cole谈到了新泽西贝尔实验室的chico和harpo。1981年的USENET地图上标注了teklabs-chico的连接)。

我们为VMS写了第一个TCP,它在今天依然存在,被称为“CMU-Tek” TCP。我们用70帮助着建立了“Magnolia”,一个68000多处理器Unix工作站,它运行我和Steve基于Unix改写的操作系统Magix。我们得到一场爆炸!

Brian Redman和我每天都会通过uucp讨论一些重要的问题,例如用C语言编译器编译“冒险”游戏。事实上,我怀疑我们分享微处理器开发工具要比这些有趣的问题要少。当然我们也分享了11/70的改变和增强。我们有一个共同的敌人——Digital,它不乐意Unix是在他们的帮助下推广的。

Redman继续说着他的故事:

我发现我还会定期通过发送电子邮件联系,所以我们有了一个社区,这就是NETNEWS的由来(Usenet起源于1979年杜克大学毕业生Jim Ellis和Tom Truscott的一个主意。Usenet的第一个实现是Steve Bellovin写的,它是北卡罗莱纳州立大学的毕业生。USENET在1979年用于杜克大学(duke)和北卡罗莱纳州立大学(unc)交换信息。1980年phs加入进来。Armando Stettner和Bill Shannon组建了第一条东西部连接线路——dukeucbvax,同年也建立了到decvax的线路。USENET现在是一个包含5000多个组织和几百万用户的巨D大无中心分散系统)。

我立即在chico搭建了NETNEWS。我记得花费了相当多的时间表达一个非常聪明的问题,因此我得到一个非常聪明的答案。这全部是出于一种渴望。甚至于好的目的,当一些人说“我会为你制作一盘磁带”和“我会寄一盘磁带给你”...这些都不够好。

那就是它开始的时候:当NETNEWS开始出现,uucp坏掉了。Lesk根本没有考虑uucp现在会用作什么用途,也没有考虑到传送的内容。我的问题是NETNEWS上创建了数量巨大的文件,当这些文件开始传送的时候,Unix会执行uuxqt命令。但是当磁盘负载很高的时候,连接就会偶尔死掉。并且在恢复之前,另一个uucp和几百个更多的文件又开始传送。而当你进到目录里看时系统就会超时,因为有太多东西需要列出来。所以我对uucp的第一个重要贡献是我让uucp可以为不同的站点使用不同的目录。

不管怎么说,我做了那些事情。Honeyman发出一封邮件说“让我们一起讨论下UUCP的事情。我们把所有的修改放在一起,然后将它提供给每一个用户,这样我们就都运行着同样的东西”。于是我们发出一个通知,并且在莫里山举办里一个会议。哥伦布的Mark Horton,Honeyman,我,Bellovin,以及实验室的所有运行系统的人都参加了会议。我想Honeyman有一个出席列表。根本上,Honeyman,Dave Nowitz和我一起将所有修改合并在一起。Steve Bellovin也做了很大的贡献。我们在那天晚上开始动手。事实大家分工非常好:我做目录相关的事情,Nowitz对于安全更感兴趣。所以我们一起分工合作并且做的非常棒。

Bellovin改进了他为NETNEWS写的代码,然后Steve Daniel和Truscott都做了改进。最后的结果是A News。1981年,毕业于伯克利大学的Mark Horton和高中生Matt Glickman将A News重写成为B News。1987年多伦多大学的Henry Spencer和Geoff Collyer做出另一个选择C News。还有另外很多有用的NETNEWS修改版本,Spencer Thomas,Rick Adams,Ray Essick,Bob Kolstad,以及其他很多人都做出了自己的版本。但是让我们返回到UUCP。

感谢Peter Honeyman,这是他在1983年会议上的部分会议记录(用他独特的文字):

uucp爱好者的第一次(也是最后一次)会议在1983年4月20号举办。邀请了allegra!honey,vax135!martin,eagle!karn,rabbit!ark,mhb5b!smb,harpo!ber,cbosgd!mark,floyd!trb,research!rtm和eagle!dan。另外还有USG的代表mhtsa!sc和mhtsa!brad,whuxlb!pep和gummo!mmp.下面是未删减的会议记录。

From: Honey Wed Apr 20 00:46:26 1983
To: uucplovers
Subject: minutes
Cc: dmr doug

原谅我下面的文字编辑,由Levy组织的一个讨论uucp问题的会议的记录。会上的记录人员有:

eagle!dan,vax135!martin,ihnp4!gjm,gummo!ber,mhtsa!lsc,mhb5b!smb,mhtsa!brad,eagle!karn,whuxlb!pep,allegra!honey。

第一个讨论话题是企业电子邮件项目和它的伴生项目网络功能中心。网络中心上有452个成员和774个设备与组织共同管理。Murakani给人的印象是这在实验室是固有设备的起始阶段,其他任何问题都是临时的。L.sys数据库正因为新的数据库和新的的标准不断出现而逐渐走向失败。每个月关于L.sys意义的讨论最后得到了一致意见,工作站应该继续维护一个本地的L.sys,并且那个本地文件应该首先被搜索。参与的人有la koenig,honeyman以及所有人。

关于修改uucp的活跃讨论占据了会议的大部分时间。就像有终端版本的uucp,工作站也有众多版本。其中最主要的竞争者是由Robert T. Morris最初写成后来又经Tom Truscott修改的usg 6.0。Cohen严肃谨慎地对待将优秀功能集成到6.0过程中的各种困难。虽然如此,商业公司也参与进来,我们对他们表示欢迎。并且我们同意以此组织为起点来开发一个满足每个人的版本(特别是我们自己)。

被强烈提议的是spool目录的构成方案。当Truscott为C,D文件使用不同目录(我猜其他文件也一样),Redman和其他人都使用远程工作站的名字作为子目录。热烈的讨论持续不断,最后获得的一致意见是后者更为强健。Levy的关于目录构成应该包含机器名字简短前缀的提议受到大家的欢迎。当usg中使用setuid进程执行mkdir成为一个问题,Bellovin为了推翻这个特性耐心的解释技巧。经过三或四次跑题,会议再回到正轨,让人感觉cico或者其他的守护进程应该在spoll目录执行rmdir,最终没有得到大家都同意的目录构成方案,我想在信息时代这个问题应该在更合适的态度下讨论。

...

最终我们同意使用最新6.0版本的uucp,并对它进行大量的修改(比如修复bug,让它工作的更好)。Honeyman领取了conn.c,Redman会修改脱机部分,Levy愿意去写一个L.sys编辑器并且帮助Murakami标准化L.sys的行为。Bellovin接受将脱机目录的修改移植到uuxqt。当Nowitz反对对于ifdefs的依赖时,Cohen指出usg不可能欣赏在usg保护下的任何事情。感觉就像我们可以隐藏特性到一个单独文件并且将我们的努力成果掩饰成一个向着Unix第7版兼容性做出的手势 ,一个显而易见但是愚蠢的谎言。总之,这个问题并不重要。

议程上的最后一个话题是组织提高安全意识方面的尝试。随后就开始了争吵。在各种和各方面的名誉遭到破坏的过程中,无疑引起疯狂但并不危险的反应,最后名没有得出好的结果。Honeyman不赞成Mcilroy青睐的允许远程机器拉取文件的主张,转而支持在除本地集群意外的机器上禁止这种能力,继而建议可以从非uucppublic目录拉取一个许可文件(这样远程工作站就不能拉取其他工作站发送的文件)。Redman指出L.sys中唯一值得保护的信息是电话号码(当然是数据中最安全的一部分)。Redman请求大家对于即将到来的GEI规章的意见。

接下来是空空肠胃发出引人注意的巨大声音。人们一致做出一个决定,先暂时休会大家一起去附件的一家中国饭馆,这是那时候各地uucp黑客的传统。这个决定随后修改为去橡树屋(一个不好的前兆)。

橡树屋是莫里山贝尔实验室的咖啡厅,之前几年提供餐桌服务。

在uucp漫长的讨论之前,我提到了ARPANET,TCP,以及ping。由于Mike Muuss参与了TCP早期版本的开发,并且也是ping的作者,我想有必要说一说他的故事。

我毕业于霍普金斯大学,我有一个相当独特的职位:运行RSTS(DEC的资源共享分时系统)的PDP-11/45。我到的时候它每天只运行几个小时的Unix。部门说我们除非我们也能运行RSTS,否则我们不能运行Unix...因此我们把它实现了,它成为我们的第一个软件项目——在Unix上运行RSTS。我们真正开始工作是在75年后半年,我们在秋天开始转向第6版。

Muuss在1979年毕业于约翰霍普金斯大学,之后去了弹道研究实验室工作。那年的9月他的工作是于设计实现BRLNET本地高速网络的原型,这个项目是一个和美国军队签订的合约。1980年早期Muuss扩展了BRLNET协议,并且领导一个小组将伊利诺斯州立大学的NCP移植到PDP-11上的Unix。那个团队配备了一个11/34。1981年后期,Muuss定义了实验性的TCP/IP协议,并且着手在PDP-11上的BRL/JHU Unix上实现它,BRLNET则没有继续研究。可能更重要的是Muuss通过ARPANET和USENET向7000多名订阅者发布了TCP/IP摘要。最重要的是,Muuss的工作包含在两个MIL(军事)标准里面:1777和1778。几乎每个现在的TCP/IP实现都包含了Muuss在BRL开发的软件。Muuss告诉我:

我们甚至有段时间参与到通讯行业。Ron Natalie是我在那里的主要开发者。我们开发了一个小的操作系统并且将所有东西使用PDP-11通过ARPANET发送了出去。所以我们算是参与了通讯商业。然后,在1983年我们完成了下一个大步骤,争取到了光纤补助。AT&T展出了带状线光纤...我们一箱光纤,一共有145根。我们用他们立即组建了一个全光纤的局域网。

那是10年前的事情了。根据出版物资料,1984年BRL的网络是非并行的。TCP/IP协议到了BBN和伯克利。我会在第18章再次讲述协议的开发。

results matching ""

    No results matching ""