Content #
1.4 办公空间
贝尔实验室向来缺乏明确的管理层指示。1127中心的项目不由管理层指派,而是自下而上,由对某个课题感兴趣的人员自主成立项目组。贝尔实验室的其他部门也是如此:如果我参与了某个开发组,也许会“利诱”科研同事也来参加,不过他们得自愿加入。
2.2 CTSS和Multics 第二系统效应(second system effect)
第3章 初版(1971)
事后看来,在资源限制之下工作是件好事。如肯自己在1983年图灵奖颁奖仪式上所说:“随着中央主机向自主式小型机的变化席卷整个业界,Unix也突飞猛进。我猜想,如果丹尼尔·博布罗(Daniel Bobrow)当时买不起PDP-10、只能将就用PDP-11的话,恐怕今天站在这里的就是他而不是我。”(丹尼尔·博布罗是Tenex的主要作者。Tenex是在1969年为PDP-10编写的操作系统。)
3.2 Unix房间“乔·奥桑纳认为,我们得有家庭电话线和电传打字机。他做了一张订购单,复制多份,放到文具保管室。然后,他在组织结构中把自己调整为这张订购单的审批人,并替Unix的几位核心人员提交申请。几通询问电话后,乔填好表格,自己签名批准。就这么简单,他只是做了张表格,电话线就拉到我们家里了。”
3.4 存储略谈 磁芯转储(core dump)
4.5 grep命令
◆ grep这个名字来自ed文本编辑器中的命令g/re/p,它列出所有符合正则表达式模式re的行,《牛津英语词典》中grep的条目(图4-2)释义正确。(鉴于OED已经赐予grep合法英语单词之地位,所以我既不使用特殊字体也不大写。)
5.1 伯恩的shell
◆ 新shell的控制流语法基于史蒂夫喜欢的ALGOL 68语言,但1127中心并没有很多人喜欢ALGOL 68。例如,ALGOL 68使用单词的字符反转形式作为终止符,如fi终止if,esac终止case。但由于od已被占用(八进制转储命令),所以do的终止符是done。
5.2 Yacc,Lex,Make
◆ 但在20世纪70年代早期,它仍是活跃的研究领域,专注于创建程序,将一门语言的语法规则转换为该门语言的高效语法分析器。这种语法分析器生成程序也被称为“编译器-编译器”(compiler-compiler),因为有了它,就能为编译器自动生成语法分析器。编译器-编译器通常会生成语法分析器,还提供在解析过程中遇到特定语法结构时执行代码的能力。1. Yacc1973年,史蒂夫·约翰逊(图5-1)借鉴阿尔·阿霍的语言理论,创建了编译器-编译器YACC(下文写作Yacc)。这个名字源于杰夫·厄尔曼的评论意见,它代表“yet another compiler-compiler”(意为“又一个编译器-编译器”),说明它并不是第一个这种程序。
◆ 史蒂夫本人使用Yacc创建了一个新的“可移植C语言编译器”(portable C compiler,PCC),该编译器有用于解析语言的共用前端和用于生成不同计算机体系架构代码的独立后端。
◆ “PCC有个意想不到的副产品:Lint程序。它读取程序,标出不可移植或有错的地方,如调用函数时搞错参数数量、使用了与定义不一致的长度等。由于C语言编译器每次只能处理单个源文件,所以Lint很快就成为编写多文件程序时的有用工具。我们将第7版改写为可移植版本时,Lint也有助于强制执行标准,如寻找错误返回为-1 (第6版)而不是null (第7版)的系统调用。许多检查,甚至是可移植性检查,最终都为C语言所吸收。Lint是新功能的有用测试平台。”Lint这个名字来自从衣服上捡拾绒毛(lint)的情景。虽然其功能已多被纳入C语言编译器,但其概念体现到了其他语言的类似工具中。
◆ awk的第1版实现使用Yacc处理语法,使用Lex分解输入内容。然而,当我们试图将awk移植到非Unix环境时,Lex要么无法使用,要么虽然能用但生成了错误的词法分析器。几年后,我勉力用C语言重写了awk的词法部分,这样它就可以移植到所有环境中。但在之后的几年里,那段手工写出来的词法代码产生了许多缺陷和小问题,这些麻烦在Lex生成的版本中原本不存在。这证明了一个普遍规则:程序帮你写的代码会比你自己手写的更正确、更可靠。如果改进了生成器,例如能生成更好的代码,那么每个人都会受益;相反,对手写程序的改进并不能改善其他程序。像Yacc和Lex这样的工具是这一规则的极好例子,Unix也提供了许多其他工具。编写程序的程序总是值得尝试。就像道格·麦基尔罗伊所言,“任何你必须重复做的事都有待自动化。”
5.3 文档编制
◆ 作为编程环境的C语言和Unix,作为科研部门的文档编写,作为主要活动的计算机技术主题写作,三者之间存在共生关系。这是从道格·麦基尔罗伊的Roff、乔·奥桑纳的Nroff和Troff等文本格式化程序开始的,然后是Eqn、Tbl等预处理程序。有了这些工具,更加容易制作包含数学符号、表格、图片、图表、图等不易排版内容的文档。这反过来又催生了更好的写作,因为所有这些文档编制程序都有个重要特点:可以借助它们轻易地反复修改文档,并始终有一份整洁的副本,而不必经历将材料交给打字员然后等上好几天这种痛苦而缓慢的过程。
5.6 其他贡献
◆ 尽管CRISP本身并没有在商业上取得成功,但Unix和C语言在20世纪80年代和90年代对计算硬件产生了巨大影响。大多数成功的指令集架构都与C语言和Unix匹配良好。Unix和C语言的可移植性不仅使高校和公司能够创建新的体系架构,迅速移植软件,而且它要求指令集对C语言代码友好,同时倾向于消除C语言程序中难以编译的功能。约翰逊和迪策尔使用的那派CPU设计方法论会对程序进行统计分析,而对C语言代码的分析结果往往有利于那些让C语言跑得更快的东西。Unix和C语言被广泛采用,导致20世纪80年代和90年代的CPU设计围绕着它们运转,没人成功制造出为其他语言优化的CPU。
6.2 高校授权
我忘了当时给出何等评价(尽管今天vi是我最常用的两个编辑器之一),只记得我告诉比尔,他应该停止折腾编辑器,专心完成他的博士学位。他没有理会我的建议,这对大家都是一件幸事。几年后,他从研究生院退学,与人共同创办了工作站先驱Sun微系统(Sun Microsystems)公司,公司的工作站软件基于伯克利Unix,其中就包括比尔在系统、网络和工具方面的基础研发成果(以及他的vi编辑器)。当学生向我寻求职业建议时,我经常引用这个故事——有“智”不在年高。
7.2 USL和SVR4
◆ 从1984年开始,USL积极营销Unix,并努力将其改造为专业的商业产品,最终形成名为System V Release 4,或称SVR4的版本。
8.2 Unix战争
◆ 回过头来看,我想可以说,AT&T早期几乎是偶然地决定向高校提供Unix,导致了所有这些法律纠纷。随着Unix从免费使用的高校传播到愿意付费的公司,它在商业上变得可行,至少是可能可行。但时机已过,无法进行有效保护。即使AT&T的源代码受到保护,系统调用接口实际上也是在公共领域,而且社区中存在着大量的专业人士,创建不受AT&T许可约束的版本几乎是手到擒来。编译器、编辑器和所有工具等应用软件也是如此。皇冠上的珠宝不翼而飞后,AT&T才想起来去锁谷仓大门,为时已晚。
9.1 技术方面
Unix哲学是关于如何处理计算任务的编程风格。这是道格·麦基尔罗伊在《贝尔实验室技术杂志》(Bell Labs Technical Journal)Unix特刊的前言中总结出来的。
- 让每个程序做好一件事。要做一件新的工作,就构建新程序,而不是通过增
加新“特性”使旧程序复杂化。
- 预期每个程序的输出都能成为另一个未知程序的输入。不要用无关的信息来
干扰输出。避免使用严格的分栏对齐或二进制输入格式。不要执着于交互式输入。
- 设计和构建软件,甚至是操作系统,要尽早试用,最好是在几周内就用起
来。大刀阔斧砍掉笨拙的部件,重建它们。
- 宁可绕道构建用后即弃的工具来减轻编程负担,也别依赖经验欠奉的帮助。
9.4 历史能重演吗
◆ 贝尔实验室的管理层技术能力很强,在1127中心尤其如此。管理层可以鉴别出优秀工作,而且从不干涉,所以它不会强求特定的项目或方法。在实验室工作的30多年里,我从来没有被告知要做什么工作。接任比尔·贝克研究副总裁一职的布鲁斯·汉内(Bruce Hannay)1981年在《贝尔系统的工程与科学史》一书中说:“自由选择对研究科学家来说至为重要,因为研究是对未知的探索,没有路线图可以告诉你该怎么走。每一个发现都会影响未来的研究方向,没有人能够预测或规划发现。因此,贝尔实验室的研究管理人员在符合机构宗旨的前提下,为研究人员提供了尽可能大的自由度。研究人员都因其创造力而被选拔出来,公司鼓励他们充分地发挥这些能力。”
From #
《UNIX传奇:历史与回忆》 布莱恩·W.克尼汉