zz from:http://www.cn-cuckoo.com/2010/09/12/rich-stevens-faq-2007.html
英文原文:http://www.kohala.com/start/rstevensfaq.html
问题TOC
你怎么想到要写UNIX Network Programming?
你为什么要写Advanced Programming in the UNIX Environment?
你为什么要写TCP/IP Illustrated, Volume 1: The Protocols?
你为什么要写TCP/IP Illustrated, Volume 2: The Implementation?
你为什么要写TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and the Unix Domain Protocols?
我应该看其中哪本书?
你跟Doug Comer合作写过书吗?
写一本书要花多长时间?
在写这些书的时候你是通过哪些方式来学习的?
你会回复读者的邮件吗?
我也想写一本书。我该从何做起呢?
能谈一谈UNIX Network Programming是怎么出版的吗?
你并没有使用troff写书,是吗?
你使用哪种Unix系统?
你喜欢哪些技术书?
你名字中的W.表示什么?
你为什么专门为MTS(Michigan Terminal System)写APUE呢?
你编写的程序里为什么会包含goto?
问:你怎么想到要写UNIX Network Programming?返回TOC
1980年代,我在Health Systems International工作,那时候我们先后为很多平台开发过Unix[1]软件。我们跟大多数同时代的创业公司一样,经历过一系列硬件的变迁:起先是VAX-11/750[2],运行4.2BSD[3],然后是个头稍大的VAX(785),接着又是多台VAX(又加了一台8500),有几台PC运行着一种风格的操作系统(Venix、Xenix[4]、DOS),另外还有一台IBM大型机运行VM。因为有多台VAX运行4.xBSD,所以我们就通过以太网把它们连接起来运行TCP/IP,当然装有Unix系列操作系统的PC和那台大型机也都可以运行TCP/IP。除了使用标准的实用工具(ftp、rlogin),我们还着手使用套接字自己开发工具。当时几乎没有文档可查(我从一堆4.3BSD手册中找到两本Leffler等人编写的文档,但非常破旧),因而在想解决某个问题时,就得查源代码。就这样查了一段时间的源代码之后,我意识到应该把自己发现的东西诉诸文字。1988年我开始写UNP,因为每天都要工作,所以这本书写了两年。
我相信UNP以及我的其他书之所以能够获得成功,是我的背景起了决定性的作用。换句话说,我既不是Berkeley也不是AT&T的开发人员,因此写作中就没有“内存转储”[5]的问题。书中的所有内容都是我自己经过深入钻研想明白的。在深入钻研和思考各种原理的过程中,我经常会绕很大的弯子,有时候甚至会走进死胡同。但这个过程对于理解新知识是极为必要的。有很多次我想在书中把某方面的工作原理写出来,自己也觉得很明白,但才刚写了几个测试程序,马上就又碰到了新的、不懂的问题。我在自己的几本书中也尽力传达了这种探索的盲目性,因为我觉得看到某个问题的错误解决方案(并理解它错在哪里),常常要比直接看到正确的解决方案收获更大。
问:你为什么要写Advanced Programming in the UNIX Environment?返回TOC
整个1980年代,我翻看最勤的就是Marc Rochkind的Advanced UNIX Programming。但那本书的内容只涵盖了System III[6],我也知道他没有升级那本书的打算。所以,我决定自己写一本高级的Unix图书。
问:你为什么要写TCP/IP Illustrated, Volume 1: The Protocols?返回TOC
我对TCP/IP产生兴趣始于1987年夏天在菲尼克斯(Phoenix,美国亚利桑纳州首府)召开的Summer Usenix[7]大会,当时我买了一本Doug Comer的Internetworking With Xinu[8]。(我是在Jim Joyce的书店买的这本书,这个书店开在酒店的一个套间里,他可能也是第一个尝试在Usenix大会上卖书的人。会场上是不允许卖书的。)在回康涅狄格的飞机上,我从头到尾看完了这本书。撰写UNP期间以及1990年代早几年,Doug Comer“卷I”的第1版和第2版先后都被我翻得书脊开了胶。我毕竟是一个业内人士,相对于理论阐述,我更关心对实际工作有指导意义的内容。在翻阅Doug这本教材的过程中,我不断提出一些非常实际但又在书中找不到答案的问题。与此同时,一位在IBM教TCP/IP的朋友也时不时地向我询问一些问题,而这些问题不管是在RFC规范还是其他任何教材中同样也找不到答案。我开始编写一些小测试程序,观察程序运行的结果(参见我这本书的“附录C:sock程序”的开头),冥冥之中感觉到以这种方式来写一本书倒是个不错的主意。我也知道有很多唾手可得的现成工具(大多数都是Van Jacobson写的,了不起!)可以帮我理解这两个协议,这些工具谁都可以拿来用。比如说Tcpdump吧,它不仅仅是一个诊断网络问题的工具,更是一个辅助理解协议原理的无价之宝。最终,在经历了数年的网络编程之后,我慢慢地认识到:80%的网络编程问题根本就不是编程问题,都是对协议运行原理理解不够造成的。
问:你为什么要写TCP/IP Illustrated, Volume 2: The Implementations?返回TOC
同样,我是Doug Comer的“卷II”(TCP/IP的Xinu实现)的忠实读者,但在遇到没有实现的功能时总会感到很无助,况且Xinu也不是标准。Berkeley的实现才是事实标准,而且其代码基也“小”(15000行C代码)到可以用1本书——尽管是一本“大”书——来讲完。
问:你为什么要写TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and the Unix Domain Protocols?返回TOC
这本书实际上是由3本更小的书构成的。第一部分“TCP for Transactions”是对Volume 1第24.7节的重要扩展。这一部分从两个方面讲解了T/TCP:一是通过实例讲解TCP协议扩展(第1至4章,延续了Volume 1的风格),二是分析了4.4BSD-Lite连网代码对T/TCP的实现(第5至13章,延续了Volume 2的风格)。第二部分“HTTP(Hypertext Transfer Protocol) and NNTP(Network News Transfer Protocol)”是对Volume 1的补充,因为这一部分讲解了构建于TCP之上的两个应用层协议。其中有一章详细地解释了繁忙的World Wide Web服务器上实际的数据包,展示了多变的、有时候完全不可思议的TCP行为及实现。这两部分的主题完全取材于Volume 1和Volume 2,而且都是相关领域中重要而流行的实际应用。第三部分“Unix Domain Protocols”是对Volume 2的补充,因为这一部分专注于这些协议在4.4BSD-Lite连网代码中的实现。所以说,最后这一卷其实是对前两卷的一个延伸。
问:我应该看其中哪本书?返回TOC
这取决于你对哪个领域感兴趣。UNP是一本网络编程教材:包含15000行C源代码和大量有关网络编程的详细解释。但是,UNP只介绍了基本的Unix和TCP/IP。相对而言,APUE则完全是一本Unix编程教材,没有涉及网络编程。事实上,可以将APUE看作是对UNP第2章的一个重要扩展。TCP/IPIv1纯粹讲协议:这些协议怎么运行,为什么那么运行(是对UNP第5.2节的一个重要扩展)。这本书里连一行C代码都没有。TCP/IPIv2讲的是TCP/IP的实际实现:包含15000行内核中的C源代码。TCP/IPIv3则是由协议(T/TCP、HTTP、NNTP)和实现(大约2200行内核C源代码)构成的。
我自己对网络编程非常感兴趣,但是我发现要做好网络编程,必须理解网络底层的运行系统(APUE)和底层的协议(TCP/IPIv[123])。
问:你跟Doug Comer合作写过书吗?返回TOC
没有,那个人是普渡大学的David L. Stevens。我们不是一个人。
问:写一本书要花多长时间?返回TOC
每一面大约要花2小时左右。这个时间包含了为出版商制作可供照排机使用的PostScript[9]文件的时间。这样算来,一本600页的书,大约要花1200小时。如果你不制作供照排机使用的文件(例如,让出版商自己排版和做索引),还可以节省一点时间,但我喜欢完全控制最终结果。
问:在写这些书的时候你是通过哪些方式来学习的?返回TOC
我阅读了大量源代码。实际上,阅读源代码的技能大学里通常都不会教,但其实要看懂代码也不是一件多难的事。(还记得John Lion在1977年出版的那本完整展示和分析UNIX Version 6源代码的A Commentary on the UNIX Operating System[10]吗?我很幸运,读研究生的时候,Dave Hanson就拿这本书当教材给我们上课。)虽然我看不到大多数Unix商业版的源代码,但好在仍有不少系统的源代码可以供我研究,例如:4.4BSD-Lite、FreeBSD、Linux、Minix、GNU,等等。
另外,我还会从一些有用的Usenet新闻组中学习。在新闻组里,可以看到解决相同问题的不同手段,可以学到从来没听说过的新知识,也可以目睹别人遇到的一些问题。我每天在Usenet上面阅读和发帖的时间大约是25分钟。
以下是我经常上的一些新闻组:news.admin.announce、comp.security.announce、comp.protocols.tcp-ip、comp.dcom.sys.cisco、comp.unix.bsd.bsdi.announce、comp.unix.bsd.bsdi.misc、info.bsdi.users、comp.unix.solaris、comp.unix.internals、comp.unix.programmer、comp.protocols.dns.bind、comp.protocols.dns.std、comp.protocols.dns.ops、comp.programming.threads、gnu.groff.bug、gnu.announce、gnu.gcc.announce、gnu.g++.announce、misc.books.technical、comp.protocols.time.ntp、comp.protocols.tcp-ip.domains、comp.org.usenix、comp.mail.mush、comp.protocols.nfs、comp.std.unix、comp.text、alt.sys.sun、comp.sys.sun.announce、comp.sys.sun.hardware、comp.std.announce、comp.os.linux.announce、comp.lang.java.announce和comp.lang.java.programmer。
问:你会回复读者的邮件吗?返回TOC
当然。我的电子邮件地址印在了这几本书前言的末尾,我会看收到的每一封邮件。不过,由于邮件的格式混乱,可读性差,这几年我还设计了几种推荐的标准格式。想知道这个标准格式的最简单快捷的方法,就是把你想让我帮你调试的源代码发给我(别笑,要是知道我收到过多少封包含这种请求的邮件,你就不会惊讶了)。其次,可以把构建书中某些源代码期间得到的make输出发给我,并问我怎么解决——出版商好心好意地提供了全部代码下载,但这些代码也只是提供下载而已,并不意味着他们配备了专人来答疑解惑。诸如此类的问题大多数都应该贴到相应Unix版本的新闻组中。
还有不少邮件询问我几年前写过的某篇文章中的某个具体的问题,信不信由你,这些细节我很难一下子都想起来。我的基本原则是,只要我能想出问题的答案,而且不必敲太多次键盘,我就会马上回复。可如果回答问题还需要翻箱倒柜地找书,乃至查阅相关资料,或者需要跟发件人来往通几次信以便了解问题的更多细节,我想我是没有这个时间的。
有很多读者通过邮件问我的编程问题,都应该发到某些Usenet新闻中去——特别是comp.unix.programmer。
问:我也想写一本书。我该从何做起呢?返回TOC
技术书市场跟小说市场完全不同。技术出版商无时无刻不在寻找好书,作者有没有名气都没有关系。我建议你先写出来一些东西(比如,书中比较主要的几章),然后再联系出版公司。联系出版公司的最佳途径是参加技术会议(Usenix、Interop,等等),到他们的展台前当面谈。正常情况下,他们都会对你非常热情的。
再给几个简单的建议:
不要在太细节的内容上花过多时间。我保证这样写出来的东西90%都要改。
不要在导言那一章(通常是第1章)花太多时间,等写完全书再回过头来写。一般来说,这一章是全书最重要的一章,因为它肩负着向读者介绍其他章节内容的重任。想想看,在写完全书之前,有些内容没准是会变的。
如果承受不了批评就不要写书。以下是UNP第1版征求意见稿反馈回来的一些评论,你听听:“啊!这家伙难道一点语法和表达都不懂吗?”“怎么这个人我从来都没听说过呢?”“把括号里那些废话都删了算了”“术语前后不统一。”UNP第2版也有一些难听的话:“整本书到处都是以……开头的句子,根本没法理解。”
另外,要做好重写、重写、再重写的心理准备。这是UNIX Network Programming, Second Edition, Volume 1中的一页(280K的GIF图),看了之后你就知道我说的重写是什么意思了。这是该书第92/93页定稿前的一张照片,愿意的话你可以比较一下。而且,这还只是我自己校正某些表述时所做的修改,是交给其他审稿人审读之前的样子。
问:能谈一谈UNIX Network Programming是怎么出版的吗?返回TOC
前面说过,我是1998年开始写UNP的,基本素材是我整理的一些记录Berkeley连网代码工作原理的内部笔记。至于为什么要写这方面的书,我现在好像也没办法说得很清楚,不过倒是有几个小理由。首先,我已经在一家创业公司(HSI)工作了6年,公司发展很快,编程人员也越来越多,我可以多腾出一点时间来去做些别的事情,不用成天写代码和补漏洞了。加之,我取得博士学位也已经有6个年头了,而我在技术方面的著述还是零纪录。最后,我在HSI又招聘到了这个新人(Gray Wright),刚刚走出校门,思维敏捷,我只有在技术上不断进取,才不至被他落下。(UNP的前言里面提到过Gary,他是第一个阅读我写的所有文字的人。)
在决定了写书之后,接着还得决定要写什么。我个人想写一本计算机图形和网络方面的书。1987年我到楠塔基特岛(Nantucket,位于美国马萨诸塞州东南沿海的岛屿,避暑胜地)过感恩节,我记得当时还带着Tanenbaum[11]的Computer Networks和Foley与Van Dam合著的Fundamentals of Interactive Computer Graphics。但在我回到家以后,我就决定写一本网络编程方面的书。说写就写,我最早给这本书起的名字叫Network Programming。跟大多数新作者一样,我白天上班,晚上利用“闲暇时间”写我的第一本书。
我至今还保存着1989年1月Usenet上的一个帖子:“我正在找一本关于Unix的好书(难道你们大家不想吗?)。我对Unix以及C和Shell编程都已经非常熟悉了。现在打算学习Unix通信方面的知识,例如:套接字、协议,等等。”一周后,另一个标题为“IPC的问题”的帖子询问了实现IPC(Internet Process Connection,进程间通信)的各种方法的细节,我看那些内容都是Marc Rochkind[12]的书里没有讲到的。这些提问让我感觉到自己的决定是正确的。还有一个帖子是Rick Adams在1988年11月23日发的:“终于等到这一天了,不含ATT代码的4.3BSD文件现在人人可用了。”这意味着我可以在这本书里使用Berkeley的代码了。
就这样埋头写了几个月之后,我觉得应该看一看自己写的这些东西有没有出版价值。我跟贝尔实验室一个在Prentice Hall出版社出过书的朋友联系,他给了我那里一位编辑John Wait的电话号码。1988年6月我打了电话,并给他的秘书留了言,然后他竟然给我回了电话!他说话很有意思,想看看我写的东西,告诉我他会参加那一年在旧金山举行的USENIX大会。我注册了这次会议,但最后是让Gary Wright替我去的;他戴我的胸牌。Gary把我的手稿(278页)交给了John。(Gray不久后又在Unix Expo大会上遇见了John,同样还是挂着写着我的名字胸牌。为此,John甚至怀疑书稿其实都是Gray写的,他只是假托是别人写的而已。如果你在哪一届Unix大会上遇见一个人,他的胸牌上写着“Rich Stevens”,你可以这么跟他打招呼:“噢,想必你一定是Gary Wright。”)John说他需要把我写的这几章发出去审校,然后他要么(1)立即开车到纽黑文跟我签合同,要么(2)把合同寄给我,否则(3)跟我说干脆死了这条心去干点别的吧,不要继续写了。随后,我就去夏威夷去度假了,一个月之后我回来了,发现有一条找John的电话留言。我提前并不知情,原来审稿人里面还有Brian Kernighan[13],Brian对书稿的评价是:“相当不错,值得出版。……总之,具备一本好书的潜质。……不管怎么说,都很有必要继续写下去。”John把合同寄给了我,于是我接着往下写。
问:你并没有使用troff写书,是吗?返回TOC
当然用了。还有其他软件吗?troff在业内是首屈一指的,我花了好几年功夫学习它。我在写书的时候用的是-ms宏的一个修改版。在通过troff格式化页面之前,我在输入中添加了很多“微调”指令,很难想象如果用Frame这些细节上的调整怎么做到。我还使用pic制作了所有插图。我用键盘比用鼠标熟练得多,所以使用依赖菜单的绘图软件很耽误时间,也很难受。之所以没有使用TeX,是因为那几年TeX和PostScript不能很好地协同。要是书里数学方面的东西多一些,可能会考虑TeX。
关于生成供照排机使用的文件,我想多说一点。1989年,在我写完UNP的时候,出版商还没有条件处理供照排机使用的文件,当时只有类似贝尔实验室这样的机构才有自己的排字机。因此在写完UNP之后,我又写了15页的PostScript文件,保存在6张1.2MB的MS-DOC磁盘里,并亲自开车把这几张盘从纽黑文送到罗得岛州府普罗维登斯[14]的Typesetting Service Corp.。两天后,他们通过联邦快递(FedEx)把排版后的页面送到Prentice Hall,排版费也是我刷的Visa卡(781页,每页4美元,共3124美元),Prentice Hall后来又把这些钱补给了我。今天,作者只要把最终的PostScript文件通过ftp传给出版商,出版商就可以排版了。
问:你使用哪种Unix系统?返回TOC
我每天都在使用的是运行在Sparc Ultra 5上的Solaris。原因很简单:1990年我在买第一台工作站时,只有SparcStation SLC的价格低于5000美元。那几年,大多数工作站厂商都瞧不上低端市场(有些厂商到现在还是如此)。后来我把SLC升级到ELC,然后又将ELC升级到SparcStation4,最后又换成了现在的Ultra 5。(我大约每3年就升级或更换一次硬件。)我的机器里也安装了很多可自由使用软件(GNU C、GNU troff,等等),而且我发现大多数这类软件都会率先被移植到Sun平台上来,因此感觉还是很舒服的。
运行我这个kohala.com域名的服务器中安装的是BSD/OS(HTTP、匿名FTP、电子邮件、DNS,等等)。BSD/OS是非常优秀的系统,非常可靠,它可以一直运行下去不出任何问题。我喜欢它还因为它的源代码是开放的,平常可以时不时地看一看,偶尔也会自己动手解决一点问题。不过我也买了他们的服务,让他们自己来发现和修复一些bug。(对Sun和BSDI的所有产品,我都是照单付钱的,因此以上所说都是非常客观的。)
我的办公室里还有很多其他计算机,运行着各种风格的Unix(在写UNP第2版时是9种;参见该书原版第21页)。我主要用它们来编译和测试我在其他系统上写的代码,同时也可以方便地在不同的主机环境下运行客户端和服务器。
这些系统和Cisco路由器的管理工作完全由我自己负责,要是连这些都做不了,还怎么写Unix网络和编程的书呢。
问:你喜欢哪些技术书?返回TOC
以下是一个书单,排名没有先后之分。
The C Programming Language(Kernighan与Ritchie合著)。我始终很纳闷,为什么有人说这本书太复杂或者太粗糙。这本书简洁、明确,还配有很多示例。
Software Tools(Kernighan与Plauger合著)。这本书展示了如何设计然后实现许多简单版的Unix工具:grep、sort、ed等。(没错,连ed都有,这可是每个系统管理员都应该知道怎么使用的编辑器啊。我自己每年都要用很多次,经常在单用户模式下使用,编辑一些基本的配置文件。)我最喜欢引用这本书第250页中的那句话:“同样,如果你打算构建一些东西,一定要保证它们概念上的完整性——不要把一堆无关的‘功能’撺在一起。而且要以增量方式来构建,不要一下子全弄出来。”
The UNIX Programming Environment(Kernighan与Pike合著)。经典,在我看来现在仍然“没有过时”。这本书介绍了一些标准Unix命令行工具的用途(以及一些C编程知识),而Software Tools则是一本讲编程的书。
The TeXbook(Knuth)。我不用TeX,但我在排版时经常参考这本书。
The AWK Programming Language(Aho、Kernighan和Weinberger)。我经常用AWK,主要是编写小程序。不,我不用Perl——我认为它是一种只适合写不适合读的语言。
The Elements of Programming Style(Kernighan与Plauger合著)。这本书仍然是所有程序员的必读。
On Writing Well(Zinsser)。教你写作的一本好书。
Webster’s New World Guide to Current American Usage(Randall)。告诉你怎么克服高中英语课上灌输给你的那些不良表达习惯。
时刻放在我桌子上的两本书分别是Merriam Webster’s Collegiate Dictionary和The Chicago Manual of Style。
你也知道,我不只看技术书,我喜欢的小说作者(或者说,他们书的精装本一上市我就出手的那些作者)有:David Baldacci、Patricia Cornwell、Michael Crichton、Patrick Davis、Nelson DeMille、Joseph Finder、Frederick Forsyth、Stephen Frey、John Grisham、Payne Harrison、Greg Isles、Douglas Kennedy、Phillip Margolin、Steve Martini、Douglas Preston和Lincoln Child, 以及Stuart Woods。不过,只有坐飞机的时候看这些书才是为了解闷的。
问:你名字中的W.表示什么?返回TOC
William。我父母想用我舅舅(叔叔)Bill的名字,但又想叫我Richard。他们觉得“William Richard”叫起来要比“Richard William”更顺口。
问:为什么专门为MTS(Michigan Terminal System)写APUE呢?返回TOC
我是1968~1973年在Michigan上的大学,我用的第一台计算机是运行MTS的IBM 360/67,作为未来的工程师,每个人都要上机学习Fortran编程语言。我们使用的课本是Brice Carnahan和James Wilkes自己编写的,Elliot Organick的那本Fortran IV是补充教材。MTS系统本身非常不可思议,包含了很多巧妙的想法,而且差不多是与Unix同时被开发出来的。与Unix一样,MTS蕴含的思想也领先于它的时代,这一点与其他IBM大型机操作系统相比尤其明显。只不过MTS运行在昂贵的IBM大型机上,而Unix则运行在便宜的PDP-11系列上。结果呢,也就不言自明了。
问:你编写的程序里为什么会包含goto?返回TOC
请参考高德纳1974年12月发表在ACM Computing Surveys, Vol. 6, No. 4上的论文,题目叫 Structured Programming with go to Statements。(事实上,那一期的Computing Surveys完全堪称经典。)我想给绝不使用goto的程序员出一道题,就是请在不使用任何goto语句的情况下重新编写tcp_input()(TCP/IPIv2第27章和第28章),注意不要造成任何性能损失(这道题看似简单,实际上可不好解)。
[1] Unix操作系统(官方商标是UNIX,有时候也写作Unix )最早是1969年由美国AT&T公司贝尔实验室的员工肯·汤普逊(Ken Thompson)、丹尼斯·里奇( Dennis Ritchie)、布赖恩·凯尔尼汗(Brian Kernighan)、道格拉斯·麦克伊罗(Douglas McIlroy)和 Joe Ossanna开发的。Unix是1971年最早在在PDP-11(PDP,Programmed Data Processor;PDP-11由DEC公司制造)上运行的操作系统,具有多用户、多任务的特点,支持多种处理器架构。AT&T公司以低廉甚至免费的许可将Unix源码授权给学术机构做研究或教学之用,许多机构在此源码基础上加以扩充和改进,形成了所谓的“Unix变体”,这些变体反过来也促进了Unix的发展,其中最著名的变体之一是由加州大学柏克利分校开发的BSD产品。后来AT&T意识到了Unix的商业价值,不再将Unix源码授权给学术机构,并对之前的Unix及其变体声明了版权权利。结果,导致了一场旷日持久的版权官司。这场官司一直打到AT&T将自己的Unix系统实验室卖掉——同时也为Linux的诞生创造了难得的条件,新接手的Novell公司采取了一种比较开明的做法,允许柏克利分校自由发布自己的BSD,但是前提是必须将来自于AT&T的代码完全删除,于是诞生了4.4 BSD Lite版,由于这个版本不存在法律问题,4.4BSD Lite成为了现代BSD系统的基础版本。要了解完整的Unix及其变体的时间线,请参考:http://www.levenez.com/unix/。——译者注
[2] VAX(Virtual Address eXtension)是一种可以支持机器语言和虚拟地址的32位小型计算机。VAX最初由DEC(Digital Equipment Corporation)公司在20世纪70年代初发明,是原来16位PDP-11的扩展产品。DEC公司1998年1月26日被Compaq(康柏)公司收购,后者2001年9月4日又被HP(惠普)公司收购。VAX被誉为最成功的小型机,其设计师、DEC技术灵魂、小型机之父戈登·贝尔(Gordon Bell)的个人主页为:http://research.microsoft.com/en-us/um/people/gbell/。——译者注
[3]]1974年,伯克利加州大学(University of California, Berkeley)从AT&T公司获得修改UNIX的许可,并在此基础上发布BSD(Berkeley Software Distribution,伯克利软件套件);换句话说,BSD是Unix的衍生系统。1BSD(first Berkeley Software Distribution)是1977年由伯克利的研究生比尔·乔伊(Bill Joy,Sun公司的联合创办人)整理开发出来的。1978年、1979年和1980年,Joy分别发布了2BSD、3BSD和4BSD。4BSD以后的版本由1980年成立的CSRG(Computer System Research Group,计算机系统研究小组)负责发行。该小组于1981年6月发行了称之为4.1BSD的新版本——不是5BSD。由于AT&T觉得5BSD会使用户将它和AT&T Unix System V混淆,Berkely同意改变BSD将来版本的命名规则,将版本号仅保留在4BSD上,以后只增加4后面的小版本号。到1995年CSRG解散时,BSD的最高版本是4.4。1990年代初、中期,NetBSD、FreeBSD以及OpenBSD(从NetBSD小组中分离出来)小组相继成立,它们努力的结晶成为BSD的三个主要变体。BSD的另外两个主要变体NeXTSTEP和Darwin(Mac OS X的核心, 由FreeBSD 4.5和NeXTSTEP混合派生)如今已经演变成苹果公司Mac OS X及iPhone OS的核心。BSD对Unix最重要的贡献之一是TCP/IP。BSD有8个主要的发行版中包含了TCP/IP:4.1c、4.2、4.3、4.3-Tahoe、4.3-Reno、Net2、4.4以及4.4-lite。这些发行版中的TCP/IP代码几乎是现在所有系统中TCP/IP实现的前身,包括AT&T System V 和Microsoft Windows。——译者注
[4] Xenix是微软为微型计算机推出的Unix版本。由于微软购买的授权无法直接让该操作系统以“UNIX”为名,便命名该系统为Xenix。微软在1979年从美国电话电报公司购买了 Version 7 Unix 的授权,并于1980年8月25日发布面向16位系统的版本,由SCO公司将该系统移植至英特尔8086/8088架构。在Unix V7的基础上,Xenix整合了BSD的技术,再加上当时x86处理器的价格低廉,很快便成为当时最受欢迎的Unix发行版。据The Design and Implementation of the 4.3BSD UNIX Operating System(Samuel J. Leffler、Marshall Kirk McKusick,Addison-Wesley,1991.3)称:“如果就运行它的机器数量而言,Xenix可能是发行量最大的一个Unix版本了。”——译者注
[5] “内存转储”原指把内存中的二进制数据以原来的表达方式转存成文件,用于对内存的运行状态进行事后分析。在这里指的是作者不会照搬开发文档,因此书的内容框架和语言表达自然更接近一般读者。——译者注
[6] UNIX System III (有时也称System 3)是由AT&T的Unix Support Group(USG)于1982年发布了一个Unix版本,也是第一个面向贝尔实验室之外发布的版本。UNIX System III综合了多个AT&T版本: PWB/UNIX 2.0、CB UNIX 3.0、UNIX/TS 3.0.1和UNIX/32V。System III支持DEC PDP-11和VAX计算机。之所以将这个版本称为System III,是因为它是UNIX/TS 3.0.1和CB UNIX 3这两个由贝尔实验室内部支持的Unix系统的对外发行版。这个版本的文档叫做UNIX Edition 3.0。之前,根本没有System I和System II这两个Unix版本。而且也没有官方发布的UNIX/TS 4.0(否则,就会有System IV了)。换句话说,System III之后就是基于UNIX/TS 5.0System V了。——译者注
[7] USENIX协会(USENIX Association)是一个高级计算技术协会。其前身是成立于1975年的Unix Users Group(Unix用户组),主要致力于Unix及类似系统的研发。1977年,AT&T的律师通知这个小组不能使用UNIX这个词,因为它是Western Electric(截止到1995年一直是AT&T的生产部门)的注册商标。于是,该小组遂更名为USENIX。这个协会受到了计算机操作系统领域的众多业内人士、开发人员和研究人员的推崇。这个协会每年都会举办一些会议和研讨会,最著名的是OSDI(USENIX Symposium on Operating Systems Design and Implementation ,USENIX操作系统设计与实现研讨会)、USENIX Annual Technical Conference(USENIX年度技术大会)、 USENIX Security Symposium(USENIX安全研讨会)、 FAST(USENIX Conference on File and Storage Technologies,USENIX文件及存储技术大会),以及SAGE(The USENIX Special Interest Group for Sysadmins,USENIX系统管理员特别兴趣小组——非盈利的专业系统管理员的国际性协会)主办的LISA(Large Installation System Administration Conference,大型系统管理员大会)。——译者注
[8] Xinu是一种类Unix操作系统,1980年代由Douglas Comer为教学在普渡大学(Purdue University)开发。Xinu这外名字既是递归缩写(Xinu Is Not Unix),又是“Unix”的反向拼写形式。这个系统曾被移植到很多硬件平台,包括DEC LSI-11和VAX系统、 Sun-2 and Sun-3工作站、Intel x86、PowerPC G3 和MIPS等。——译者注
[9] PostScript是1982年由John Warnock和Charles Geschke专门为打印图形和文字而设计的一种页面描述语言和编程语言,它与打印的介质无关,不管是在纸上、胶片上打印,还是在屏幕显示都没有问题。PostScript的主要目标是提供一种独立于设备的能够方便地描述图像的语言。独立于设备意味着,不需要借助任何具体设备的特性(例如,打印机的分辨率)来描述图像,因而这个描述不需要经过任何修改即可在其他的PostScript打印机上进行打印。PostScript作为一种语言,自己有语法和格式规范,这种语言描述的页面由PostScript文件表示。PostScript文件本身只是用PostScript语言描述了所要显示或者打印的文本及图像有哪些特征、参数,在显示或者打印PostScript文件的时候,再由PostScript解释器解释并打印或者显示。PostScript不仅与设备无关,而且与操作系统无关。无论是Windows操作系统,还是Unix操作系统,都可以阅读和打印PostScript文件。由于PostScript文件是以文本形式存储,因而文件比较小,适合在Internet上传输。(1982年12月,John Warnock和Charles Geschke离开施乐公司创建Adobe,以开发和销售PostScript为生。后来成就了Adobe“帝国”。)——译者注
[10] 完整的书名是Lions’ Commentary on UNIX 6th Edition, with Source Code,据说有中文版,暂时没找到。——译者注
[11]Andrew S.Tanenbaum获得过美国麻省理工学院的理学学士学位和加利福尼亚大学伯克利分校的哲学博士学位,目前是荷兰阿姆斯特丹Vrije大学的计算机科学系的教授。还出版过《分布式操作系统》(Distributed Operating Systems)、《分布式系统:原理与范型》(Distributed Systems: Principles and Paradigms)、《计算机组成:结构化方法》(Structured Computer Organization)、《现代操作系统》(Modern Operating Systems)和《操作系统:设计及实现》(Operating Systems: Design and Implementation)等计算机专著。其中,《操作系统:设计及实现》一书和书中示例的Minix操作系统(也是Tanenbaum领导开发的一个免费用于教学目的的类Unix操作系统)给予了林纳斯·托瓦兹创造Linux操作系统内核的灵感。在他的自传《Just For Fun》(英文意为“只是为了有趣”)中,托瓦兹把这本书描述为“引领我到达新高度的一本书籍”。Tanenbaum是ACM会员,IEEE资深会员,荷兰皇家艺术和科学学院院士,获得过1994年度ACM KarlV.Karlstrom杰出教育家奖。根据Pearson官方网站公布的信息(http://www.pearsonhighered.com/tanenbaum/),Computer Networks, Fifh Edition将于2010年10月出版。
[12]最早的Unix编程专著Advanced UNIX Programming(Addison-Wesley,1985)一书的作者,该书第1版出版19年后,作者推出了“升级版”——第2版,在自己的网站里(http://basepath.com/aup/),作者戏言:“说升级也许有点不恰当了。新版的篇幅达到750页,而旧版中差不多只有20段话没有改过,上一版介绍了70个系统调用,而这一版则达到了300个。”
[13]Brian W.Kernighan,贝尔实验室计算科学研究中心高级研究人员,著名的计算机科学家。他参加了UNIX系统、C语言、AWK语言和许多其他系统的开发,同时出版了许多在计算机领域具有影响的著作,包括The Elements of Programming Style、The Practice of Programming、The UNIX Programming Environment、The AWK Language、Software Tools等。
[14]从康涅狄格州纽黑文到罗得岛州府普罗维登斯大约105英里,约168公里。——译者注