访谈:Doug McIlroy
摘要
与计算机先驱Doug McIlroy的访谈,讨论他对Unix和C的贡献,包括早期程序如echo和sort,以及他在Bell Labs的工作。
<p><a href="https://lobste.rs/s/hett40/interview_doug_mcilroy">评论</a></p>
查看缓存全文
缓存时间: 2026/08/28 11:36
# Doug McIlroy ~ tmp.0ut Staff
来源:https://tmpout.sh/5/2.html
┌───────────────────────┐
▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄
│ │
█ █ █ █
│ │
█ █ ▀▀▀▀▀
│ │
█ █ ▄
│ │
▄▄▄▄▄ ▄▄▄▄▄
│ │
█ █
│ │
█ █
│ │
█▄▄▄█ ▄▄▄▄▄
│ │
▄ ▄ █ █
│ │
█ █
│ │
█▄▄▄█ ▄▄▄▄▄
│ │
█ Interview: Doug McIlroy
│ │
█ ~ tmp.0ut Staff
└───────────────────█ ──┘
2025年10月,tmp.0ut Staff 有机会与 Doug McIlroy 交谈。Doug 出生于1932年,是一位计算机先驱,亲历了 Unix 和 C 语言的创建,并为我们日常使用的许多核心工具和语言做出了贡献。他的设计方法和理念建立在深入研究代码及其文档的基础之上。自始至终,Doug 都致力于从基本层面理解计算机。跨越多代计算技术,Doug 一直在思考如何提升整个领域,同时用更少的资源做更多的事。Doug 被认为有句名言:“编程的真正英雄是编写‘负代码’的人”。
tmp.0ut staff 和其他人受邀前往达特茅斯学院,参加为期一周的名为“二进制趣味周”的系列讲座,内容涵盖文件格式、恶意软件、逆向工程、漏洞利用开发和二进制高尔夫等所有方面。我们的访谈在达特茅斯计算机科学实验室进行,多位演讲者和一些学生在场,他们也向 Doug 提问,这些问题也包含在这次访谈中。
┌──────────────────────────────────────────────────────────────────────────────┘
▄▄▄▄▄
█ [ 那么 echo 是你写的吗? ]
█▀▀▀▀
█▄▄▄▄ ▄▄▄▄▄
那是我写过的第一个 C 程序。
█ █ █▀▀▀█
█ [ 哇哦 ]
▄▄▄▄▄
█ █ █▀▀█▀
我当时完全不知道它后来会成为一个知名的程序。
█ █ ▄
█ [ echo 是你的程序? ]
█ █▄▄▄▄ ▄ ▄
第一个 C 程序。就在 C 语言刚被发明的时候。
█ █ ▀▀▀▀█ ▄▄▄▄█
[ 那是哪一年? ]
<<<<< <<<<< <<<<<
大约是 72 年。
<<<<<
▄ ▄
█ █
█ [ 你写过很多程序,diff、sort。sort 也是你写的吗? ]
█ █ █▄▄▄█ ▄▄ ▄
第一个 sort 不是我写的,但我为 sort 添加了大部分选项。
█▀▄ █
不过我反对像 ls 这样的程序提供过多选项,因为那些
█ ▀▄█
选项需要通过大小写字母标志来执行。
█ ▀█
▄▄▄▄▄
█ sort 最初是由 Ken Thompson 写的。手册里有一句有趣的说明
█ “提供广泛选项”,但并没有说那些选项具体是什么。
▄▄█▄▄
▄ ▄
█ █
▄▀▀▀▄
我问 Ken,“那么,它们是什么?”他说,“嗯,你所要做的
█ █
就是去把它们放到源代码里。”于是,我就这么做了。
█ █
\>编者注:$ ls -transubstantiationalist
█
[ 和 Ken Thompson 以及 Dennis Ritchie 一起工作是什么感觉? ]
他们非常棒。Ken 无疑是我所认识的最伟大的编程天才之一。他简直不可思议。我的意思是,他不仅创造了 Unix,还创造了第一个达到大师级水平的国际象棋机器。他的国际象棋机器架构后来被深蓝模仿并制成了硅芯片。
[ IBM。被深蓝击败的是加里·卡斯帕罗夫,对吧? ]
是的。在 IBM。
[ 所以 Ken Thompson 写了最早的国际象棋程序之一 ]
是的,还制造了一台机器,他用它进行了一些伟大的冒险。他曾被世界冠军或前世界冠军博特温尼克邀请带着那台机器去俄罗斯。
[ 你关注国际象棋新闻吗? ]
不关注。
└──────────────────────────────────────────────────────────────────────────────┐
▄▄▄▄▄
[ 你在贝尔实验室之前的教育背景是什么? ]
█ █▀▀▀▀
█▄▄▄▄
我在康奈尔大学读的是工程物理本科。那还是
▄▄▄▄
在那个年代,康奈尔以为它会开创新潮流,
█ █
让本科工程师学习五年制课程。这个政策持续了
█ █
大约十年,我想。康奈尔意识到其他大学并不
█▄▄▄█
跟进。如果你能去麻省理工读四年,你就能获得
▄ ▄
更便宜的学位。
█ █
█ █ █▄▄▄█
[ 你也去了麻省理工,不是吗? ]
▄▄▄▄▄
█ ▀ █
我确实去了麻省理工,因为他们有旋风2型计算机,
█▄▄▄█
那是一台巨大的机器。
▄▄▄▄▄
█ █ █▀▀▀█
[ 旋风2型? ]
█ █
▄▄▄▄▄
█ 旋风2型\[1\]。建于1952年。它在1954年建在那里。
█ 这台机器占据了三层楼。地下室是将交流电转换为
█ 直流电的旋转设备。一楼是电子电源。二楼是
▄▄▄▄▄
█ 计算机本身。你可以走进主机内部。累加器有
█ 16位,每一位都是一个八英尺高的继电器机架。
▄▄█▄▄
▄▄▄▄▄
█ █
[ 每一位都是一个八英尺高的继电器机架? ]
█ █ █▄▄▄█
▄▄ ▄
是的。在远端是它的两大创新之一,磁芯
█▀▄ █
存储器。那只是一个继电器机架。存储器本身大概这么大。
█ ▀▄█
**双手张开示意**
█ ▀█
它绝对是巨大的。康奈尔的那台,CQC,有24字的内存。它不是存储程序计算机。小一点的那些有一千个16位字,2K。寄存器有八英尺高。累加器里的每一个位。在中央处理器里。
[ 所以你说每个寄存器有八英尺高?那太疯狂了,伙计。 ]
是的。项目经理 Jay Forrester 曾经告诉我,他认为他最伟大的发明是边际测试。
[ 边际测试? ]
你知道那是什么吗?
[ 不知道。 ]
所以每天早上工作开始之前,他们会关闭机器进行一小时的预防性维护。在那一个小时里,他们会调高调低电压。其理念是,如果你要弄坏什么,就在测试时弄坏,而不是在白天工作时。
[ 好的,所以几乎像压力测试。 ]
是的。我可能把机器搞混了。我见过贝尔实验室的继电器计算机,但我从未用过。
[ 你在麻省理工学习时,读的是数学学位? ]
我读的是数学学位。
[ 听起来你的论文挺有意思的,关于圆锥壳? ]
非常无聊。
[ 听起来很有意思。圆锥壳?比如鹦鹉螺壳? ]
是的。就是……你有一个金属薄板制成的圆锥,你把它弯曲,它会如何弯曲?那是……非常古典的问题……
[ 我确定你把它简化了。 ]
这个概念就是,它能让你获得学位。尽管,我当初在那里是因为计算机。很早的时候,大概1948或1949年,冯·诺依曼和戈德斯坦写了一篇论文\[2\],关于矩阵求逆需要多少位数。他们的估计非常悲观。做10x10矩阵,你可能需要40位十进制数。当时每个人都在用8位数做10x10矩阵求逆。如果连冯·诺依曼和戈德斯坦都做不出好的估计,我还有什么机会?所以我就没做这个。在数值分析上不成功。直到1979年,英国的威尔金森发明了向后误差分析。人们才终于开始能够真正对数值计算的精度进行良好的估计。我那时做这个太早了。
┌──────────────────────────────────────────────────────────────────────────────┘
▄▄▄▄
█ █
[ 你是怎么到贝尔实验室的? ]
█▀▀▀▄
█▄▄▄▀
▄▄▄▄▄
在加入实验室之前,我有两份暑期工作,大概在
█
1953年和1957年。当招聘人员来到麻省理工时,我已经
█▀▀▀▀
准备充分,渴望加入。
█▄▄▄▄
▄ █
[ 是什么契机让你开始参与 Multics 和 Unix 的工作? ]
█ █▄▄▄▄
▄ 哦,通常的情况是,如果你是来贝尔实验室读博士,他们会
█
让你自己找出要做什么。起初,我研究整数线性规划,证明了一个错误的定理。IBM的Gomory证明了正确的定理,有一天打电话告诉了我。
█▄▄▄▄
<<<<< <<<<< <<<<<
然后我研究宏。宏处理变得非常流行。事实上,
<<<<<
宏在贝尔实验室变得如此重要,以至于做交换机系统的
▄
人发明了一种编程语言,它只是一套宏。
█
他们大量使用这个。
█
█ █▄▄▄▄
▄▄▄▄▄
我记得那个部门的主任曾告诉我:“我们是
█
贝尔实验室计算资源的最大用户。我们使用的时间
█▀▀▀█
比任何人都多。我们对此依赖得多。”
█
这是因为他们在使用宏处理器,它比常规编译器
▄▄▄▄▄
慢大约一百倍。他完全没有意识到宏虽然
█
非常适合定义语言,但一旦定义了,他们就应该
█▀▀▀▄
构建一个编译器。
█▄▄▄▀
▄▄▄▄▄
█
[ 那么在你1958年开始工作和他们创建 Unix 之间…… ]
▀▀▀▀█
▄▄▄▄█
哦是的,那是十一年。
[ 你还在做什么其他工作? ]
嗯……除了宏,我还做了什么?大量的咨询。我和迪克·汉明一起工作,汉明校验码那个汉明。
[ 汉明?你保持距离了吗? ]
是的。他们在那里写了几篇关于宏的论文,但还有什么,我还做了什么?哦,搞清楚。Multics,对,就是它。是的。
[ Multics,好的。 ]
Multics 始于1964年,从选择硬件开始。同时,我加入了PL1设计委员会。当Multics选择用什么语言编写时,有几个候选者,而且……所有这些,几乎都是空头支票。PL1才刚开始编写它的第一个编译器。我负责确保PL1有足够的设施,使其看起来像一门值得使用的体面语言。我负责把这件事落实。然后我和加州一家叫做Digitech的公司签订了合同,他们有制作Fortran编译器的绝佳业务。他们真的非常优秀。这些Fortran编译器甚至可以在非常小的机器上运行。动态分配内部表。它们可以增长和移动,因此可以充分利用每一台机器。他们接下这个合同,想着能参与一门新语言的起步。但他们雇佣了一个新员工,没有监督他,而那些知道如何使用他们编译器的人并没有太关注这件事,结果他搞得一团糟。于是,一年后,我们没有编译器,而Multics正等着一个。Bob Morris和我,当Bob Morris开始时,决定我们用TMG编写一个编译器。你知道TMG是什么吗?
[ 不知道。TMG是什么? ]
那是Bob McClure在德州仪器开发的一种编译器编写语言。他把它寄给了我。它是为CDC 1620(一台36位机器)编写的,他手动将其转录到绿色编码纸上,成为IBM 704、那时是7090的机器语言。那是一次有趣的调试经历。我知道程序逻辑是正确的,但像CAL和CLA(清除并加法,清除并逻辑加法)这样的操作码,如果你手动翻译,可能会弄错。所以调试就是找出抄写错误。而我正是这样做的。我们用TMG在几个月内编写了第一个Multics编译器。它一直支持Multics到大约1970年,直到GE最终为我们做了一个真正好的编译器。所以那段时间我就是做这个。TMG,Multics,我们阁楼里有那台巨大的GE 645。我们三个人拼命工作。MIT是Multics的主要发起者。他们在剑桥有一台,并允许我们使用他们的剑桥分时系统。我们通过运行一个用TMG编写的编译器,真的、真的给那个分时系统施加了很大压力,这个编译器的编译时间很长。它们是为短时间优化的。它们的整个调度策略是,总是优先处理短程序。一个真正长的程序实际上在故障间隔时间内运行,这意味着你需要运行两次长程序。我们真的搞乱了MIT的计算中心。Multics项目进展缓慢,一直没取得什么成果。最后,贝尔实验室的高层管理人员说:“让我们及时止损吧”。我们每年支付大约一百万美元的租金来租用这台机器。它只支持三个人。哦,关于Multics我想说的差不多就这些了。
[ 然后 Unix 就出现了? ]
Ken Thompson 一直在后台研究这些关于小型机器的想法。Thompson、Richie 和 Joe Ossanna 强烈游说继续操作系统的工作。我们管理层,曾受过挫折,不喜欢这个主意。他们觉得有一台 PDP-10 不错。最终 Thompson 找到了这台被淘汰的 PDP-7,在三周内构建了整个操作系统。
[ 太疯狂了。三周?? ]
包括汇编器和操作系统。他妻子当时外出度假。他给自己分配了一周时间构建汇编器,一周时间构建操作系统,一周时间构建文件系统。
[ 太疯狂了。 ]
他们之前已经考虑过文件系统了。设计已经准备就绪。他是如何想出操作系统API的,我实际上不知道。如此简洁。他丢弃了很多东西。他从Multics中得到了一些好点子,比如层次化文件系统。虽然他用完全不同的方式实现了它。来自Multics的独立shell,他也让它运行起来了。
[ 你说的来自Multics的“独立shell”是什么意思? ]
在那之前,操作系统的命令语言是内置在操作系统里的。用户空间的shell是Multics的一个新想法。不完全是一个全新的想法。达特茅斯分时系统就有类似的东西,他们的想法是把shell放在用户空间,但他们没有想过它可以被替换。每个人都使用同一个shell,但它是在用户空间。几乎像今天的动态链接器。在Unix中,确实有几个不同的shell被编写出来。尽管如今每个人都使用同一个。
[ 是哪个shell?它有名字吗? ]
它是Bourne shell的前身。
[ 他们开始将Unix机器联网是在多久之后? ]
嗯,同时我们计算机科学系的Sandy Fraser,他是一个真正的网络布道者、设计师和构建者。不幸的是,尽管他认为网络和数字数据是未来,但AT&T的大人物们说:“数字数据只占我们业务的4%,我们为什么要担心那个?”Sandy没有得到他应得的支持。但无论如何,他创建了这些网络,我们实验室里的机器大概从1972或73年开始使用它们。我们经历了大约三代这样的网络。最终接入了CSNet,计算机科学网,一个当时不对工业界开放的ARPANET版本。
[ CSNet是什么? ]
CSNet算是介于ARPANET和互联网之间的一种过渡。
[ 是在大学之间吗? ]
是的。计算机科学系之间。
[ 通信介质是什么? ]
是两者兼有……它有拨号上网和……我甚至忘了那个协议的名字。但它几乎就叫拨号上网。它有一点点。还有一个到ARPANET的桥接。到ARPANET的桥接。
[ 速度是多少? ]
哦,我记得我们升级到1200波特的时候。那快得惊人。
[ 那是什么时期?还是70年代初吗? ]
那应该是……我努力想想……当cu实用程序被加入Unix时。cu是call up(呼叫)另一个Unix系统的意思。
[ 我不熟悉那个。我从没用过。 ]
你知道我的……所谓的Unix阅读器\[3\]吗?你可以在我的网站上找到。总之,它有一份非常有用的目录,涵盖了Unix所有研究版本。当需要知道这些事情时,我参考它。我可以从那个目录表上告诉你网络开始的时间。
└──────────────────────────────────────────────────────────────────────────────┐
▄▄▄▄▄
[ 学生:我还在想贝尔实验室那个交换系统团队使用宏作为
█ █
编程语言,而不是自己编写语言和编译器的事情。为什么会
█▀▀▀▀
这样? ]
▄▄▄▄▄
█ █ █▀▀█▀
我想不出什么特别的原因。
█ █
▄▄▄▄▄
█ █
他们怎么只用机器语言编写大型系统?
█ █ █▄▄▄█
▄▄▄▄▄
人们通常怎么编写大型系统?
█ █ ▀█
█▄▄▄█
我们做得到,但就像你说的,它们往往是调试出来的,
▄▄▄▄▄
而不是清晰设计出来的。
└──────────────────────────────────────────────────────────────────────────────┘
相似文章
贝尔实验室枯燥的一面(2025)
对一位前贝尔实验室员工的回顾性访谈,探讨了应用部门那些平淡无奇却至关重要的工作,并将其与默里山(Murray Hill)著名的研究成果形成对比。
Andy Hertzfeld 口述史
这篇口述史记录了 Andy Hertzfeld 的职业生涯,重点介绍了他在为 Apple Macintosh 开发软件过程中的关键角色,以及他对早期个人计算的贡献。
乡村电脑编程 (1984)
一篇1984年的专题文章,讲述了被称为“Oregon Hermit”的保罗·卢特斯(Paul Lutus)的故事。他在偏远小屋中离网生活,编写了文字处理程序 Apple Writer,并详细描述了他早期使用 Apple II 电脑的经历。
Unix中的古怪注释和奇怪行为
丹尼斯·里奇讲述了早期Unix源代码中一些古怪的错误信息和注释,包括著名的“values of β will give rise to dom!”以及那句不可思议的注释“You are not expected to understand this.”
一次一台Lisp机器,创造未来
Larry Masinter和Frank Halasz回顾了他们在Xerox PARC的经历,讲述了Interlisp和NoteCards的开发,以及当前Medley/Interlisp的重生计划,反思了研究文化以及早期计算环境的持久价值。