




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
UNIX 程序设计艺术1、 前言UNIX 系统与其说是一操作系统,不如说是一口述史。- Neal Stephenson在学问和专门技术之间存在天壤之别。学问让你推演去做正确的事情;专门技术构成正确的事情的一种习惯性思维,几乎根本不需要有意识的去思考。这本书里面有大量的学问,但是它主要是关于专门技术的。它将会设法教你 UNIX 专家所知道的关于 UNIX 开发的事情,而不是意识到他们所知道的。因此,比起大部分UNIX 书,它是较少关于技术的,并且更多的是关于共享的文化显示和隐式的文化,有意识和无意识的传统。它不是一本“怎样去做”的书,而是一本“为什么这样做”的书。为什么这样做有重大的实际的重要性,因为太多的软件被拙劣的设计。它们中的大部分遭受了膨胀,维护起来是极度地困难,并且太困难而不能移植到新的平台上或以最初的程序员没有预料到的方式扩展。这些问题是糟糕的设计的征召。我们希望这本书的读者将会学到 UNIX 必须教授的关于好的设计方面的东西。这本书被划分成四个部分:背景,设计,工具集,和社区。第一部分(背景) 是哲学和历史,帮助为接下来所述各种的东西提供基础和激励。第二部分(设计)展开 UNIX 哲学的原则进入到关于设计和实现的更细节的建议。第三部分(工具集)集中在 UNIX 为帮助你解决问题所提供的软件。第四部分(社区)是关于那些使 UNIX 文化在它所涉及的方面如此高效的人与人的交往和协定。因为这本书是关于共享文化的,我从未计划单独写它。你将会注意到这些文字包含了来自杰出的 UNIX 开发者,UNIX 传统的塑造者的特约发表。在我邀请这些权威者来评论和讨论这些文字的期间,这本书经受了一个长期的公开的审核过程。在这本书的最终版本中,不仅覆盖了那个审核过程的结果,这些佳宾也被鼓励用他们自己的语态说话,引申和衍变,甚至和这些文字的主线不一致。在这本书中,当我使用编辑上的“我们”的时候,这不是假装无所不知,而是反映了试图链接整个社区的专门技术的事实。因为这本书的宗旨是传播文化,它比一般的技术书籍包含了更多的关于历史和民间传说和一些题外话。享受它吧;这些东西,也是作为一个 UNIX 程序员,你的教育的一部分。这些历史上的细节,没有哪一个单独上是至关重要的,但是它们全部的整体形态是重要的。我们认为用这种方式,它构造了一个更加有趣的故事。更重要的,明白 UNIX 从那里来的和是怎样走上这条路的,它会帮助你发展出对于 UNIX 风格的直觉的感觉。出于同样的原因,我们拒绝写那些似乎结束的历史。你会发现异乎寻常地许许多多的对于我正在写这本书的时候的参考。我们不希望假装当前的实践反映了一些注定命运永恒的和完美的逻辑结果。写作时候的参考对于读者意味着警报,二年或三年或五年以后,这些相关的事实记录也许已经过时了,并且应该被仔细的检查。这本书的其它方面既不是 C 语言的教程,也不是 UNIX 命令和 API 的指南。它不是为sed 或 yacc 或 Perl 或 Python 的参考。它不是网络编程的初级读物,也不是对于神秘的X 的详尽的指南。它也不是 UNIX 的内核和结构的漫游。其它书籍更好的覆盖了这些细节,这本书会适时给你指出它们。超越了所有的这些技术细节,UNIX 文化拥有一个发展超过数百万人年的娴熟的努力这种字面意义上的非书面的工程传统。这本书是带着理解那个传统,和加入它的设计模式到你的工具箱中这样的信仰写的,它将会帮助你成为一个更好的程序员和设计师。文化由人构成,并且学习 UNIX 的传统方式是通过耳濡目染,从其它人那里和通过民间传说。这本书不是取代人与人之间的文化互渗,但是它通过允许你分接其他人的经验,能帮助加速这个过程。注:【1】在 1969 和 2003 年之间的 35 年是一段很长的时间。在那期间,由于历史趋势的弯曲,大量的 UNIX 站点都逝去了,或许在某处,超过 5 千万的人年的工作量已经干劲十足地投入到了遍及全球的 UNIX 开发之中。 适合的读者:如果你是一个经验丰富的 UNIX 程序员,经常处在要么指导初学编程的新手,要么和其他操作系统拥护者进行争论这样的场合。同时,你发现你很难把 UNIX 所带来的好处讲清楚。那么,这本书正在你所需要的。如果你是一个在其它操作系统上有编程经验的 C、C+或 JAVA 程序员,并且准备启动一个基于 UNIX 的项目。那么,你应该阅读此书。如果你是一个 UNIX 操作系统下,具有初级到中级水平的用户。但是,只有比较少的开发经验。并且,想学习怎样在 UNIX 下有效的设计软件。那么,你应该阅读此书。如果你是一个已经认识到 UNIX 传统也许有一些东西能让你从中受益的非 UNIX 程序员。那么,你应该阅读此书。我们确信你是对的,并且 UNIX 哲学同样适用其它操作系统。因此,比起其它的一般 UNIX 书籍,我们在这里更多关注非 UNIX 环境(特别是 micorsoft 操作系统) 。并且,我们可以说,这里的工具和学习例子在一定程度上都是可移植的。如果你是一个程序架构师,要为一个主流的通用市场或是纵向应用程序考虑平台的多样性或是各种不同的实现策略。那么,你应该阅读此书。它会让你明白 UNIX 作为一个开发平台的强大,和作为一种开发方式的开源的 unix 传统。如果你正在寻找关于 C 语言编程细节或是怎样使用 UNIX 内核编程接口方面的书籍,那么这本书不是你需要的。关于这方面已经有很多优秀的书籍:在展示 UNIX API 的书籍中, UNIX 高级环境编程是其中非常优秀的一部。 程序设计实践也推荐所有的 C 程序员阅读(事实上是使用任何语言的程序员) 。 怎样使用本书这本书是理论实践相结合的。一部分是至理名言和通用的,另一部分是检验细节的UNIX 下开发的例子学习。我们会在通用的原则和至理名言前面或是后面,用实例来描述它们:这些实例不是从玩具似的示范性程序中抽取出来的,而是每天都使用的真正的能工作的代码。我们故意避免了让书里充斥大量的代码和文件清单似的例子,即使这样做可能会让书好写一些(有些地方可能会容易读一些) 。很多编程书籍给出了太多的低层次的细节和例子,但是没有给读者对于说讲内容的一个更高层次上的认识。这这本书里,我们宁愿在反方向走向歧途。因此,当你经常被应邀阅读代码和规范文件的时候,事实上只有少量相关内容被包含在书里。相反,我们会在 web 给出完整的例子。有意思的是,这些例子能帮助巩固你所学到的原则变成近乎直觉的工作知识。理想情况下,你应该以近似于运行的 UNIX 系统上控制台的方式来阅读本书,手边在准备一个浏览器。任何 UNIX 系统都支持这样的方式,但是在 LINUX 系统上,为了对系统进行检查,这里用于例子学习的软件是预先安装的和立即可用的。该书中的各种指示物用来进行浏览和试验。这些指示器的介绍是按部就班的,因此,暂时的研究偏离主题不会打断那些必须连续的阐述。注意:尽管我们已经尽一切力量去引用稳定可用的 URL,但是我们办法来担保这一点。如果你发现引用连接已经失效了,使用你喜欢用的 WEB 搜索引擎,用经验常识和做短语搜索。这里我们建议你的方式和我们自己引用 URL 的方式差不多。这本书里的大部分缩略语在第一次使用的时候都是以完整的形式出现。为了方便起见,我们在附录里提供了术语表。参考资料通常按作者的名字。本应在书中正文出现的 URL 介绍或是我们怀疑的很容易失效的 URL,还包括一些题外话、战争故事、玩笑,这些我们都用标号的脚注的方式来表示。为了让这本书更容易被技术不是很强的人接受,我们邀请了一些非程序员人士进行阅读,并确定了那些有些模糊,但是对说明流程很重要的术语。我们还用脚注的方式给出了对于有经验程序员不需要的一些基本术语的定义。注【2】:这些特别脚注是献给 Terry Pratchett 的,他的脚注的使用是相当。 。 。令人鼓舞的。 相关参考资料以前,涉足这个领域的一些早期的 UNIX 开发者撰写了一些著名的论文和书籍。Kernighan 和 Pike 的unix 编程环境是其中比较优秀的,也是被认为很经典的。不过,现在看来,它有点过时了。它没有覆盖 internet、WWW 和象 Perl, Tcl, and Python这样的解释语言的新潮流。在我们写这本书的途中,我们学习了 Mike Gancarz 的unix 哲学 。这本书在阐述范围上十分优秀,但是依然没有尝试覆盖我们认为有必要阐述的所有领域。尽管这样,我们还是要感谢作者的暗示:非常简洁的 UNIX 设计模式是 UNIX 持久稳固和成功的非常重要的因素。和本书相比, 程序员修炼之道在有细微差别的各种不同的软件设计工艺(更多的是代码,较少关于高级别的问题划分)中,给出好的设计实践权衡方面,更像是一个幽默诙谐,并且明智的专题论文。作者的观点是 UNIX 下经验的产物,同时也是本书的有力补充。在 UNIX 传统里, 程序设计实践从一种更深入的角度覆盖了和程序员修炼之道部分相同的立场。最后(并且被认为有煽动倾向) ,我们推荐的是Zen Flesh Zen Bones ,它们是佛教原始来源的重要的收藏品。对佛教的参考散落在整个书籍里面。我们引用它是因为,佛教提供了对于表达软件设计被证明是重要的思想的词汇,而采用其它方式却很难记住。带有宗教信仰的读者会认为佛教不是信仰,而只是治疗学的一种智力训练的形式,从纯粹的无神论角度来看,佛教确实是这样的。 使用本书的约定俗成术语 UNIX 是开放组织技术上和法律上的商标,并且只有那些通过了开放组织精心制作的标准化测试而被鉴定的操作系统才能正式使用。在本书中,我们使用当前程序员群体中所认为的非严格的,更广泛意义上的 UNIX 含义,它是指或者是从共同祖先贝尔实验室的原始 UNIX 代码继承下来,或者是模仿它的后代进行编写的任何操作系统(无论是不是正式的 UNIX 商标) 。特别的,从这个意义上来讲,LINUX 就是UNIX。本书采用 UNIX 手册页的习惯,在工具名称后面用括起来的手册段进行标志,当我们想强调它是一个 UNIX 命令的时候,通常把它放到第一部分的介绍中。因此,例如,当读到 munger(1)时候,munger 作为一个程序,它的文档描述将会出现在 UNIX 手册页第一段中,当然如果你的系统提供它。第二段是系统调用,第三段是 C 库调用,段5 是文件格式和协议,段 8 是系统管理工具。其它段随着 UNIX 系统的不同而不同,但是本书没有给出相关引用。进一步,你可以在 SHELL 提示符下敲入 man 1 man 以得到更多相关内容(老的系统 V 版本 UNIX,可能要求敲入 man -s 1 man) 。有时候,我们提到一个 UNIX 程序的时候(例如,Emacs) ,没有手册段作为后缀,并且首字母大写。这是一个暗示,它的名字实践代表了本质上有相同功能的精心组织的UNIX 程序族。并且,我们正在讨论的是它们的共性,例如,Emaces,它包含了xemacs。在本书后面的不同知识点中,我们参照“守旧派”和“新学派”的方式。就像 RAP 音乐一样,新学派大约开始于 1990 年。在那个时代环境中,它和脚本语言的兴起,GUIs,开源 UNIX 和 WEB 联系在一起。守旧派指的是 1990 年以前(特别是 1985 年以前) ,昂贵的(共享的)计算机,专用的 UNIX,shell 脚本编程,C 语言几乎统制了一切的那个世界。这里的差别是值得指出的,因为廉价的和没有内存限制的机器促成了 UNIX 编程风格上的重大改变。 我们的学习例子为了证明一个观点,大部分编程方面的书籍都依赖于特殊构造起来的玩具似的例子。这本书不是这样的。我们的学习例子将是真实的,早就存在我们每天都使用的产品中的片断。下面是一些主要的产品:cdrtools/xcdroast这两个分开的工程经常在一起使用。cdrtools 包是刻录 CD-ROMs 的一套 CLI 工具。以“cdrtools”为关键字在 WEB 上搜索一下。xcdroast 程序是 cdrtools 的 GUI 前端。详见 xcdroast project site.fetchmail程序 fetchmail 采用 POP3 或 IMAP 邮件传输协议,从远程邮件服务器上获取邮件。详见 fetchmail home page(或在 WEB 上用“fetchmail”进行搜索) 。GIMPGIMP( GNU 的图像处理程序)是一款具有涂、绘、图像处理全方位功能的图像处理软件,它采用独特的方式能够处理种类繁多的图形格式。在 GIMP home page 上能够获得源码。mutt在当前种类繁多的基于文本的 UNIX 电子邮件代理中,mutt 邮件个人代理是其中最好的一款,它对 MIME (Multipurpose Internet Mail Extensions)有非常好的支持,并且 the use of privacy aids,例如 PGP (Pretty Good Privacy) 和 GPG (GNU Privacy Guard)。可以从 Mutt project 站点上获得源代码和可执行程序。xmltoxmlto 命令可以转换 DocBook 和其它 XML 文档为各种各样的输出格式,包括 html,text和 PostScript,可以在 xmlto project site.上获得源码和文档。为了降低读者理解这些例子所需要的代码数量,我们尽力选择了那些可以一例多用,可以阐述好几个不同的设计原则和惯例的学习例子。出于同样的原因,好多例子是从我的项目里挑选出来的。这里没有任何暗示说来自于我的项目的例子可能是最好的,我仅仅是十分熟悉它们,这对于例子的多用途说明是有好处的。 感谢特约的贡献者(Ken Arnold, Steven M. Bellovin, Stuart Feldman, Jim Gettys, Steve Johnson, Brian Kernighan, David Korn, Mike Lesk, Doug McIlroy, Marshall Kirk McKusick, Keith Packard, Henry Spencer, and Ken Thompson)为这本书加入了大量的价值。特别是 Doug McIlroy,在他的评论的透彻性和他贡献的深度上,远远超过了职责所求,显示出了和他 30 年前带给的为管理最初的 UNIX 科研小组的同样优秀的关注和奉献。特别感谢 Rob Landley 和我的妻子 Catherine Raymond,他们二个人对原稿的草稿作出了深入细致的逐行的审订。Rob 深刻的和专心的评论事实上比在最终稿中的一整章内容更令人鼓舞,并且他做了大量的关于它呈现的组织和范围的工作。如果他写了全部促进我去改善的文字,我将不得不称他为合著者。Cathy 是我的试验读者,代表了非技术用户。为了延伸这本书,让那些还不是程序员的读者所能理解,这些主要都是他做的。在我花费写这本书的超过 5 年的时间里,它从许多其他人的讨论那里获益。Mark M. Miller 帮助我完成了关于线程的启发。John Cowan 提供了一些关于接口设计模式的见识,wily 和 VM/CMS 的研究案的草稿,并且 Jef Raskin 给我展示了最小诧异原则是从那里来的。UIUC 系统架构组在早期的章节上贡献了有益的反馈。 UNIX 做错了什么和深入的伸缩性这样的节是由于他们审阅的直接灵感。Russell J. Nelson 贡献了在第七章中链系的关于 Bernstein 的材料。Jay Maynard 贡献了第三章中在 MVS 学习例子中的大部分材料。Les Hatton 在语言一章中提供了许多有益的评论和由此启发的第四章中关于最佳的模块大小中的部分。David A. Wheeler 贡献了很多观察入微的评论和一些例子研究材料,特别是在设计部分。俄国人 Cox 帮助改进了 9 张平面图的概观。Dennis Ritchie 在关于 C 的一些历史点上纠正了我。许许多多的 UNIX 程序员,比这里列出的多得多,在 2003 年的 1 月到 6 月之间的这本书的公开审核期间,贡献了建议和评论。一如既往,我发现在 WEB 上的开放的同行审查过程具有热情的挑战和热情的回报。也一如既往,对工作结果的任何错误的责任归我自己。这本书的说明风格和涉及的一些内容己经被设计模式运动所影响。事实上,我动摇过给这本书起名叫 UNIX 设计模式的想法。我没有那么做,因为我不赞同这个运动中的一些隐式的中心法则,并且没有感觉到使用它所有的正式的注解的需要或承担它文化的包袱。然而,我的方法无疑的受到了 Christopher 的影响。Alexander 的工作(尤其是永恒的建筑方式和一种模式语言) ,我欠“四人帮”和他们学派的其它成员的大量的人情,因为他们给我展示了怎样可能的去使用 Alexander 的见识站在一个高层次上,而不仅是全然含糊的和无意义的概率,去讨论软件的设计。留意的读者应该明白设计模式:可复用面向对象软件的基础,是对设计模式的入门介绍。当然,这本书的标题参考了 Donald Knuth 的计算机编程艺术。尽管和 UNIX 传统没有特定的关联,Knuth 己经对我们所有人到造成了影响。编辑具有的先见之明和想象力不是象他们看起来一样普通。Mark Taub 就是这样的一个。他在一个停顿的项目上开凿出价值,并且巧妙的把我推入完成它。文案编辑对于散文风格很会赏析,并且有足够的能力改善那些不像他们自己的风格,甚至是很少有共同点作品,但是 Mary Lou Nohr 就达到了那个水平。Jerry Votta 抓住了我对于封面的观点,并且使它看起来比我想象的更好。在 Addison-Wesley 出版社里的全体人员为使编辑的和生产的过程尽可能无痛苦达到了很高的水平,并且不仅仅在文字上愉快的接纳了我任性的控制倾向,而是深入到了这本书的视觉设计,艺术,和市场的这些细节上。注【3】:Alexander 的工作的正确评价,带有重要的部分的在线版本的链接,可以在Some Notes on Christopher Alexander上发现。2、 第一部分:背景21、哲学 文化?什么的文化?这是一本关于 UNIX 编程方面的书籍,但是在这本书里,我们将会大量使用文化、艺术、哲学这样的用词。如果你不是程序员,或者是和 UNIX 接触比较少的程序员,这些对于你来说,可能有点奇怪。但是,UNIX 有一种文化;它有独具特色的编程艺术;并且伴随着它有一种很强大的设计哲学。理解这些传统会帮助你构建好的软件,即使你正在非 UNIX 平台上开发。工程学和设计学的每一个分枝都有技术文化。在很多形形色色工程学中,对于从业者的教育,该领域的非成文的传统和正式的手册、教科书具有同等的重要性(并且,随着经验的增长,经常是比其更重要) 。高级的工程师把这些只通过(如同佛教徒所做的)“特殊的传播,而非手稿”方式传递给他们后辈的隐性知识显彰在大量的有形体上。软件工程是这些规则中一个普遍例外。技术变化的太快,软件环境日新月异,技术文化脆弱且短暂。当然,也不全是这样。较少数的软件技术被证明是有足够的生命力来发展出强大的技术文化、特色的艺术,和在工程师中代代相传的关联的设计哲学。UNIX 文化就是其中的一个。或者说,在 21 世纪的 INTERNET 文化是可被论证的另一个。自从 80 年代早期,随着这两者的成长,两者变得愈加难以分开,并且在本书中,我们也不会试着做这样的特殊努力。 UNIX 的生命力UNIX 诞生于 1969 年,从那时到现在它以被流水线式的生产使用。整个时间跨越了计算机工业标准的好几个地质时期比 PC 或工作站或微处理器,乃至视频显示终端,和具有同一时代的第一个半导体存储器的历史都要悠久。今天,在所有的分时系统中,只有 IBM 的 VM/CMS 可以声称能有较长时间存在下去,并且 UNIX 机器已经提供了几十万倍还多的运行时数。事实上,UNIX 可能提供了比所有的分时系统加在一起所提供的计算还要多。UNIX 已经被认为可以在各种各样的机器上使用,比起其它任何操作系统所声称的都多。从超级计算机到手持和嵌入式网络设备,从工作站到服务器和过程控制系统和微机,UNIX 大概预料到了的更多体系结构和更多零散的硬件,比任何 3 个其它操作系统加起来还要多。UNIX 已经支持压倒性的宽广使用领域。科研用工具、作为技术上的定制应用程序的友好主机,商业上畅销的商务软件的支撑平台,INTERNET 的关键构成技术,没有任何其它系统能够同时在这些领域取得辉煌。自从 UNIX 初期开始,每年都有这样自信的预言,UNIX 会消亡或是被其它操作系统所排挤。然而 UNIX,以它当今化身为 Linux ,BSD ,Solaris ,MacOS X 和半打其它形式的变体,在今天看起来,比以往任何时候都强大。Robert Metcalf(Ethernet 的发明者)说,如果有什么东西进步取代了 Ethernet,那么它将是所谓的“Ethernet” ,出于这个原因, Ethernet 不会消亡。 UNIX 已经经历了好几次这样的转变至少 UNIX 核心技术之一 C 语言已经广泛的移植到了其它地方。事实上,C 作为系统编程中普遍使用的通用语言,很难想象在做软件工程过程中而不被用到。为了连接应用程序,UNIX 也引入了现在以被广泛使用的带有目录节点的树型文件域名空间和为连接程序的管道。UNIX 的生命力和适应性简直是令人吃惊的。其它的技术象蜉蝣一样来来往往。机器在处理能力上增加了上千倍,语言在变异,工业惯例经历了数次的革命。然而,UNIX依然身处其中,依然在产出,依然在付帐,依然衷心的服务于这个行星上很多最优秀和聪明的的软件技术人员。在计算,和相应软件开发速度方面的指数摩尔曲线的推理之一就是:每过 18 个月,一个人已有知识的一半就会过时。UNIX 没有废止这种现象,而是在容纳它这方面做了很好的工作。UNIX 有基本不变的根底语言,系统调用,工具使用,事实上,这些能保持好多年不变,甚至是几十年。在其它方面很难预言什么将是稳定的。甚至整个操作系统周期性的废弃。在 UNIX 下,短暂的和持久性的知识之间有着清晰明显的区别,并且一个人提早知道的(有大约 90%的确定性)各类知识,当它去学的时候,这些知识很可能到期了。UNIX 命令是如此的忠诚。UNIX 的稳定性和成就的大部分毫无疑问是归功于其固有的强壮,归功于 Ken Thompson, Dennis Ritchie, Brian Kernighan, Doug McIlroy, Rob Pike 和其他一些早期UNIX 开发者在开始时候就为将来做打算的设计决策。归功于一遍又一遍的被证明是合理的决定。但正是同样的归功于在早期围绕 UNIX 发展起来的设计哲学,编程艺术和技术文化。自从那时候起,这个和 UNIX 共生的传统就在不断的,成功的进行自我繁殖,复制。注【4】:事实上,以太网已经被具有同样名字的不同技术取代了 2 次。一次是当同轴电缆被双绞线取代的时候,第二次是当千兆以太网流行起来的时候。 UNIX 文化反面学术例子对于那些已经喜欢上 UNIX,和或许已经喜欢上它技术历史学家,UNIX 的稳定性和它的技术文化无疑是最吸引人的地方。但是,作为多用途的分时系统的最初的 UNIX 程序,是为那些被个人工作站击败而迅速消失在历史烟河中的中型和大型计算机所开发的。于是,在被微软统制的主流商业桌面电脑市场领域中,有一定的怀疑余地认为它将不会不断的取得成功。外行者经常打发 UNIX 当作学术上的玩具或是黑客玩耍的沙盒。一个被众所周知的争论, UNIX 痛恨者手册 ,跟随的反对路线几乎和 UNIX 本身被记载的一样久,它的热爱者作为一群反常信仰的信徒和失败者而脱离出来。AT&T, Sun, Novell 和其它一些商业厂商和标准化组织在给 UNIX 定位和市场推广方面都接二连三的犯下了很多大的错误,当然,这些都已经成为传说了。UNIX 看起来一直在摇摇欲坠濒于普及性好久了,以至于甚至来自于 UNIX 世界的内部都产生了它决不会实际上达到那里的怀疑。一些生性好疑的局外评论员的结论认为:也许 UNIX 太有用了而不会走向消亡,但是也会因为太难以使用而无法逃出密室;一个永久的小生境的操作系统。LINUX 和其它开源 UNIX 的兴起(例如现代各种 BSD 变体) ,在挫败怀疑者方面,比其它任何方面都要重要。UNIX 的文化证明是太重要了,甚至 10 几年厂商的管理不善也不能将其扼杀。今天,UNIX 社区本身已经控制了 UNIX 的技术和市场,并正在迅速地、显著地解决着 UNIX 的各种问题(在这方面,我们将在第 20 章更详细的检查) 。 UNIX 做错了什么从 1969 年以来,就设计方面来说,认为 UNIX 中那一项设计是勿庸置疑的错误是非常困难的。到是也有一些普遍认为有问题的设计,但是它们中每一项在至今仍是倍受争议的,这些争议不仅仅是在 UNIX 爱好者之间,那些考虑和设计操作系统的广大社区的人们也加入其中。UNIX 上的文件在字节级别上没有进一步的结构。文件删除是不可以恢复的。UNIX 安全模型被论证认为太原始。作业控制也很糟糕。对一些东西有太多的不同命名方式。持有的文件系统从肯本上就可能是一个错误的选择。我们将在第 20 章讨论这些技术问题。但是,对于 UNIX 来说,大部分经久不衰的的争论多半是第一次被 X windowing 系统设计者显示提出来的哲学中最有特殊的一部分的推论。 X 力争提供一种机制,而不是策略,支持图形操作系统所提供的非常通用的装置,并且推迟关于工具包和所见即所得界面的决定到应用程序级。UNIX 的其它系统级别的服务显现出了类似的趋势。关于行为的最终的选择尽可能的向用户有利的方面推动。UNIX 用户可以在多种 SHELL中进行选择。UNIX 程序通常提供许多行为选项和令人喜欢的精心制作的偏爱便利。这种趋势反映了主要为技术用户所设计的操作系统的传统,并且随之而发生的信仰是:用户比操作系统设计者更了解他们自己真正需要的是什么。这个原则是被贝尔实验室的 Dick Hamming 稳固的建立的,当在计算机即稀有又昂贵的 50 年代的时候他就坚持这一点。那个年代开放式计算站是必要的,在那里顾客们自己写程序,因为:用错误的方法解决正确的问题总比用正确的方法去解决错误的问题要好。但是,这种非策略机制的方法的代价是,当用户能设置策略的时候,他必须设置策略。一些非技术性的终端用户发现 UNIX 丰富的选项和接口风格压倒性和倒退了系统,至少提供给了他们伪简单性。从段时期来看,UNIX 放入主义方式也许失去了一定数量的非技术用户。然而,从长期来看,它可能化劣势为优势,因为策略趋向于短生命线,而机制则相反。今天在界面所见即所得方面的风格太常见了,以至于堵死了将来的进化之路。 (就像使用过时的X 工具包的人所将要告诉你的感受的那样) 。在竞争对手更多的捆绑策略或界面选择淡出视线以后,于是反面的反面是:“机制,而不是策略”也许会让 UNIX 重新获得新生。注【5】:是的,Hamming 的“Hamming 距离”和“Hamming 码”注【6】:Jim Gettys,X 的架构师之一(也是这本书的贡献者) ,在The Two-Edged Sword 一文中,对于 X 的放任政策的风格向将来执行下去会有怎样的结果有很深的冥想。这篇短文,对于它的细节上的提议和对于 its expression of the Unix mindset,都是非常值得读的。 UNIX 做对了什么最近 LINUX 爆炸式的增长,和 INTERNET 渐增的重要性,给了我们很好的理由支持,那些怀疑论者的例子是错误的。但是,即使怀疑论者的估计是正确的,UNIX 文化也是值得学习的,UNIX 和它周围的文化中的一些东西,比起其它任何竞争对手有明显的优势。开源软件:尽管在 1998 年以前,术语“open source”和开源的定义没有被发明,但是,自从 UNIX诞生以来,具有同等意义的自由的共享源代码的开发就是 UNIX 文化的关键特性。对于 AT&T 的原始 UNIX 的,和主要变种的伯力克 UNIX 头十年中,通常是带着源码发布的。这就使大量的其它好的事情尾随而至。跨平台可移植性和开放标准:跨越不同种类的计算机、厂商和特殊用途的硬件,能提供一致的,文档支持的应用程序编程接口(API) ,在这方面,UNIX 仍然是唯一的操作系统。它是唯一的操作系统,能够支持从嵌入式芯片和手持设备,直到桌面机器,到服务器,对于特殊目的的大型数字计算设备和数据库后端更是自始至终的支持。在现存的 API 中,UNIX 的 API 是最接近写真正的可移植软件的硬件无关标准。不出意外的话,IEEE 原来称作的 Portable Operating System Standard,取了它们的首字母加上一个快速取得的后缀就形成了 POSIX。对于这样一个标准,和 UNIX 具有同等价值的 API 是唯一的可信模型。一些其它操作系统上,只有二进制的可执行程序和它们的出生环境一起消亡了,但是UNIX 原始资料是永远存在的。一个给定的 UNIX 技术的文化至少能闪光和维持它们数十年,或是永远。INTERNET 和 WWW:美国国防部签订了 TCP/IP 协议栈第一份产品的合同,这有助于 UNIX 开发组织,因为那个时候 UNIX 大量的开放源码正在遭到置疑。除了 TCP/IP,UNIX 已经成为INTERNET 服务提供商不可或缺的核心技术之一。自从 80 年代中期,家用操作系统TOPS 退出历史舞台后,大部分的 INTERNET 服务器都依赖于 UNIX。微软可怕的营销策略已经动摇了 UNIX 在 INTERNET 世界中的霸主地位。然后,从TOPS-10 进化而来的 TCP/IP 规范,在理论上是和 UNIX 背道而驰的,尝试使这样规范在其它操作系统上工作会遭受不兼容性、不稳定性和很多 bug 的困扰。这些理论和规范任何人都可以获得,但是工程习惯于仅在 UNIX 的世界中使它们稳固和真实运作。在 80 年代早期,INTERNET 技术上的文化和 UNIX 文化开始融合,并且现在已经是不可分割的共同体。INTERNET 最现代化的外观,WWW 的设计,应该象感谢它的祖先 ARPANET 一样感谢 UNIX。特别的,对于 WEB 如此重要的统一资源定位的概念(URL) ,是 UNIX 各处统一的文件命名思想的范化。开源组织:最初围绕着早期 UNIX 开源发布而形成的组织从来没有消失在 90 年代早期INTERNET 爆炸性大增长以后,它新吸引入了家用机器上整个新一代热心的黑客。今天,对于各种各样的软件开发来说,该组织都是强有力的支持团体。在 UNIX 世界里,有很多高质量的开源开发工具。开源 UNIX 程序通常等于,并且经常优于,他们自己拥有的具有同样意义的程序。带有完整工具包和基本应用程序套件的整个操作系统,可以在互联网上免费的获得。为什么抓来的代码,这时你能改编,重用,循环利用,并且节约你自己工作的 90%呢?代码共享的传统高度依赖于关于怎样协助开发和重用,这样难的的专业技术。并且不是依据抽象的理论,而是通过大量的工程实践不明显的设计规则,允许功能程序不尽是作为孤立的一次性解决办法,而是作为一个工具包的增强部分。这本书的主要目的是阐明这些规则。今天,萌芽开源运动正在带来新的活力,新的技术上的方法,和整个聪明年轻的一代程序员进入 UNIX 的传统。包括 LINUX 操作系统,和与之共生的象 APACHE 和Mozilla 这样的开源工程,使得 UNIX 传统的主流可见性和成功达到了一个空前的程度。开源运动似乎处在赢得将来计算基础结构定义的标书的边缘,并且该基础结构的核心将是正在 INTERNET 上运行的 UNIX 机器。自始至终的向下伸缩性:大多数被吹捧为比 UNIX 更现代或更用户友好的操作系统通过锁定用户和开发者进入一个界面的策略,和宁愿狭隘和刚性也煞费苦心提供的应用程序编程接口,达到了它们繁华的外表。在这样的系统上,设计者有预期的任务非常简单但是那些没有预期的任务通常是难以忍受的或是非常痛苦的。另一方面,UNIX 有深入的伸缩性。UNIX 提供许多种方式把程序胶合在一起,这意味着它的基本工具包的组件能够合并产生单独工具包部分的设计者从未预期到的非常有用的价值。UNIX 的编程接口的多种风格的支持(经常被看做是弱点,因为它增加了对于终端用户来说系统感觉上的复杂度)也有利于伸缩性。没有想成为数据管道中简单一片的程序被强制承担在精心制作的 GUI 之上的复杂性。UNIX 传统把重点放在强调保持程序接口相对较小、干净和正交上产生深入的可伸缩性的另一个特点。简单的事情是简单的和困难的事情至少尽可能简单,贯串这整个UNIX 系统。UNIX 是黑客的娱乐:忙于 UNIX 先机技术的具有教皇地位的那些人常常可能肯本不提它的非常有重要性的力量,这一类人放下了他们所有的浮名。UNIX 是黑客的娱乐。UNIX 的拥护者看起来不时的就对黑客的贡献而没有答谢表示惭愧,尽管承认他们的娱乐可能不知何故的损害了他们的合法性。但是和 UNIX 打交道和为其开发是一种娱乐,是一个事实,并且,永远都会是这样。没有多少任何人都永远用“乐趣”来形容的操作系统。事实上,在大部分其它环境下的开发被形象的比喻为摩擦和分娩。to kicking a dead whale down the beach。经常听到的亲切的形容词是 “可以忍受”或“不是非常痛苦”这样一类的。在 UNIX 的世界里,恰好相反,操作系统奖赏努力,而不是阻止它。在 UNIX 下经常编程的人达成共识,它不是作为一个用棍棒,使你通过全力的努力按照它的命令去做的敌手,而宁愿作为实践的积极的帮手。这有真正的经济意义。在 UNIX 历史的早期,娱乐因素发起了一个道德圈。人们喜欢UNIX,因此为它编写更多的程序,使它更好用。今天,人们把构建完整的,产品级质量的开源 UNIX 系统当作是一个业余爱好。为了明白这是多么有价值,当你最近听说任何人科隆了 OS/360 ,或是 VAX VMS 或是 Microsoft Windows 仅仅是为了娱乐,请扪心自问。或者,从设计的角度上来看,娱乐因素是微不足道的。作为程序员和开发者的类型的人,当他们不得不做出努力来做对于他们来说有挑战,但是刚好在他们能力之内的任务的时候,他们有“娱乐” 。 “娱乐”因此是高效率的象征。痛苦的开发环境浪费了努力和创造力。他们在时间,金钱,和机会上付出了巨大的隐式代价。如果 UNIX 在所有其它方面是一个失败者,在开发中保持娱乐的方面,UNIX 的工程文化将是值得研究的因为娱乐是开发者高效、有效、多产的象征。UNIX 教训能应用在其它地方:当倡导我们现在想当然的系统特征的时候,UNIX 程序员已经积累了数十年的经验。即使非 UNIX 程序员也能从 UNIX 的经历学习中受益。因为 UNIX 使得实施好的设计原则和好的开发方式相对要容易,它是学习它们的最佳场所。其它操作系统宁愿采用更困难的好的习惯做法,尽管虽然一些 UNIX 文化的教训是可以移植的。许多的 UNIX 代码能直接移植到任何支持 ANSI C 的操作系统上。注【7】:其它操作系统一般有拷贝的或克隆的 UNIX TCP/IP 实现。It is their loss that they have not generally adopted the robust tradition of peer review that goes with it, exemplified by documents like RFC 1025 (TCP and IP Bake Off).注【8】:这句话最初是由 Stephen C 对 IBM MVS TSO 设备的宣传,或许作为 YACC的作者更被广为人知。 UNIX 哲学要素UNIX 哲学起源于 Ken Thompson 的关于怎样设计一个具有清晰的服务接口的小型的,但是有能力的操作系统的早期思考。关于在 Thompson 的设计范围外,如何获得最大的杠杆作用已经成长为 UNIX 文化学问上的东西。它全神贯注于沿着这条路上的许多来源的教训。UNIX 哲学不是流于形式上的设计方法。它不是从那些号称可以产生理论上完美的软件的高深莫测的计算机科学理论上抄袭下来的。它既不是在非常短的一个最终期限内,可以从动机不明的、糟糕的管理,和待遇很低的程序员那里魔法般的榨取出有创新的,但是可靠的软件的方法,也不是行政管理人员长期的幻想。UNIX 哲学是从底向上的,而不是至顶向下的。它是注重时效的和以经验为基础的。它不出现在官方的方法和标准里,而是在隐式的半自悟式的知识里,这是 UNIX 文化传播的专门技术。它鼓励用一定比例理性的怀疑论和理性的(经常是具有破坏性的)幽默来表达。Doug McIlroy, UNIX 管道的发明者和 UNIX 传统的奠基人之一,曾经说过:1、是每一个程序只做好一件事情。如果要做新的工作,就构建新的程序,而不是通过增加新的特性而使老的程序变得复杂。2、预期每一个程序的输出都是另一个的输入,即使是未知的程序。不要把输出和额外的信息混和在一起。避免严格的列形的或是 2 进制的输入格式。不用坚决要求交互式输入。3、设计和构建软件,甚至是操作系统,应该是及早经过验证的,理想情况下是在几周之内完成这件事。毫不犹豫的抛弃笨拙的部分和重新构建它们。4、使用不需要什么技能的偏爱的工具来减轻任务的编写,即使你不得不饶弯路来构建这些工具,并且预计到当你使用完它们后就会抛弃它们。他最好这样总结:编写只做一件事情,并且要做好的程序;编写可以在一起工作的程序,编写处理文本流的程序,因为这是通用的接口。这就是 UNIX 哲学。Rob Pike,他是精通 C 语言的大师之一。在Notes on C Programming一书中提出了略微不同的观点:1、你无法判定你的程序那里将会耗时。瓶颈出现在令人吃惊的地方,因此直到你已经证实瓶颈在那里的时候,不要试图做第二次猜测和陷入盲目的提升速度之中。2、可度量的。直到你有一个标准之前,不要进行速度的调协,并且除非代码的一部分侵占了大部分资源,否则都不要这样做。3、Fancy 算法在 N 很小的时候速度较慢,并且 N 通常是小的。Fancy 算法有很大的常数。直到你知道 N 经常将是较大的之前,不要使用 Fancy 算法。4、Fancy 算法比简单的算法容易犯错误,并且它们是比较难实现的。使用简单的算法和数据结构。5、数据至上。如果你已经选择了正确的数据结构,并且组织的很好,那么算法将几乎经常是不言而喻的。数据结构,不是算法,是程序的核心。6、没有规则 6。Ken Thompson,他设计并实现了最初的 UNIX,用佛教创始人有价值的格言式的座右铭来加强了 Pike 的第四条规则:当拿不准的时候,使用蛮力。大部分隐式的 UNIX 哲学不是这些前辈所说的,而是他们所做的和 UNIX 自身建立的例子。从整体上看,我们能够抽象出下面这些观点:1、模块性原则:写简单的,通过干净的接口可被连接的部件;2、清楚原则:清楚要比小聪明好。3、合并原则:设计能被其它程序连接的程序。4、分离原则:从机制分离从策略,从实现分离出接口。5、简单原则:设计要简单;只有当你需要的时候,增加复杂性;6、节俭原则:只有当被证实是清晰,其它什么也不做的时候,才写大的程序7、透明原则:为使检查和调试明显更容易而设计8、健壮性原则:健壮性是透明和简单的追随者9、表现原则:把知识整理成资料,于是程序逻辑能变得易理解和精力充沛的。10、 最小意外原则:在接口设计中,总是做最小意外事情11、 沉默原则:当一个程序令人吃惊什么也不说的时候,他应该就是什么也不说12、 修补补救:当你必须失败的时候,尽可能快的吵闹地失败13、 经济原则:程序员的时间是宝贵的;优先机器时间节约它。14、 产生原则:避免手工堆砌;当你可能的时候,编写可以写程序的程序;15、 优化原则:在雕琢之前先有原型;在你优化它之前,先让他可以运行;16、 差异原则:怀疑所有声称的“唯一真理“17、 可扩展原则:为将来做设计,因为它可能比你认为来的要快如果你是 UNIX 新手,那么这些原则相当值得思考。软件工程课本里介绍了它们中的大部分。但是大部分操作系统缺乏正确的工具和传统来把它们转换成实践,因此大部分程序员不能带有任何的连贯性使用它们。他们已经接受了生硬的工具,糟糕的设计,过渡工作,和习以为常的代码膨胀这些另 UNIX 的爱好者所惊讶的烦恼。1、模块性原则:写简单的,通过干净的接口可被连接的部件;正如 Brian Kernighan 曾经说过:“控制复杂性是计算机编程的本质” 。调试比开发时间多,并且 getting a working system out the door is usually less a result of brilliant design than it is of managing not to trip over your own feet too many times.汇编,编译器,流程图,过程化编程,结构化编程, “人工智能” ,第四代语言,面向对象,不计其数的曾经当作可以做为解决该问题而被吹捧和销售的软件开发方法学。所有的这些都已经失败了,如果要说成功的话,那么它们逐步增加了程序负责的一般级别到了几乎超出了人类所能理解的范围,这是唯一的成功。正如 Fred Brooks 的那句经典的话:没有银弹。编写不流于形式的复杂程序的唯一方法是控制整体复杂度下降通过定义明确的接口进行连接的多个简单的部件进行构建,这些大部分问题是局部化的,并且你有一些希望在不破坏整体的情况下而浓缩其中的一部分。2、清楚原则:清楚要比小聪明好因为维护是如此的重要和如此的昂贵,写程序好像最重要的就是交流,但这里的交流不是执行它们的计算机,而是将来阅读和维护程序的人( 包括你自己) 。在 UNIX 传统里,超越这个建议的暗示就是给你的代码加上注释。好的 UNIX 实践也拥抱为将来的可维护性的算法和实现所做出的选择不仅仅是复杂的代码容易孳生 bug,也因为将来的维护者会很难理解这些复杂的代码。另一方面,优美而清晰的代码,较少可能出现问题并且更可能被下一个不得不修改它的人所立即理解。这是非常重要的,特别是当下一个人是比你晚出道好几年的。决不要努力的去译解晦涩的代码 3 次。一次可能侥幸成功了但是你发现你不得不第二次去理解它因为第一次已经是很久以前的事情了,并且你已经忘记了它那么是时候给代码加上注释了,以便第三次能相对来说少一点痛苦。3、合并原则:设计能被其它程序连接的程序。如果你的程序没有一个能互相交换的,那么编写成块的过于复杂的程序是很难避免的。UNIX 传统强烈建议编写那些编写那些读写简单的,文本的,面向流底,设备无关格式底程序。在经典的 UNIX 下,许多程序尽可能被编写做为一个简单的过滤器,它们以简单的文本流做为输入,并且以简单的文笔流作为输出。尽管象神话一样流行,这个实践被喜爱,不是因为 UNIX 程序员痛恨图形用户接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025涟水县事业单位招聘人员40人模拟试卷及答案详解(有一套)
- 大学课件园教学课件
- 邯郸市人民医院呼吸科呼吸治疗仪器维护与质控考核
- 2025湖北恩施州巴东县畜牧兽医服务中心招聘公益性岗位人员2人考前自测高频考点模拟试题及答案详解(新)
- 沧州市中医院疑难编码案例考核
- 2025黑龙江绥化市青冈县人民政府办公室选调5名模拟试卷及答案详解1套
- 衡水市人民医院儿科年度综合能力评估
- 2025呼伦贝尔莫旗消防救援大队招聘消防文员考前自测高频考点模拟试题及答案详解(夺冠)
- 2025儿童医院职业病与工作相关疾病的预防指导考核
- 大学电势课件
- 国务院便民服务管理办法
- 甘肃省医疗建设管理办法
- 胸痛的护理教学课件
- 《中国高血压防治指南(2024年修订版)》解读课件
- 2025年辅警招聘考试题库(+答案解析)
- DIEP乳房重建术后的护理指南
- 中信财务管理制度
- 2025至2030年中国硅烷气体行业发展现状调查及市场分析预测报告
- 2025贵阳银行笔试题库及答案
- GB/T 17643-2025土工合成材料聚乙烯土工膜
- 艺术漆涂料施工合同协议
评论
0/150
提交评论