Brian Kernighan访谈

作者:Aleksey Dolya

以下是Aleksey Dolya对Brian Kernighan的访谈,他是AWK和AMPL语言的创建者之一,并且见证了UNIX和C语言的诞生。

Interview with Brian Kernighan

Linux Journal: 能否简单介绍一下您自己?

Brian Kernighan: 我出生于多伦多,并在多伦多大学就读,专业是工程物理。基本上,这是为那些数学好并且认为自己可能是工程师但不知道具体类型的孩子准备的科学、数学和工程学的综合课程。这门课程很艰难,大约有三分之二的人最终退学了,但我设法活了下来,并且学到了很多东西(其中一小部分我仍然记得)。

我那时对电脑知之甚少——那是1960-64年——多伦多只有一台大型计算机,一台IBM 7090,以及电气工程系的一台小型1620。我在二年级后看到了我的第一台计算机,一台IBM 650,并且在三年级时学习了一点Fortran。之后,我花了一个夏天为一家大型石油公司编写Cobol程序(真的)。这足以让我迷上编程,尽管我肯定不知道自己在做什么,而且是个糟糕的程序员。

在多伦多,我还做了一篇毕业论文(实际上是一篇文献综述),主题是人工智能,1964年的人工智能展现出各种前景。因此我决定去读研究生,但我真的不知道那是什么。但它比找工作容易。我最终去了普林斯顿,因为他们提供的经济条件比其他任何学校都好。我有一个好朋友,Al Aho,他已经在那里了;他在多伦多比我高一年级,专业相同。

普林斯顿当时没有计算机科学系,只有一群在电气工程方面优秀的年轻人,但我很喜欢那里,并且在确定撰写论文之前在那里度过了美好的几年。那是一个非常适合研究生的地方。

LJ: 您的生活是如何与计算机联系在一起的?

BK: 我认为真正的转折点是1966年的夏天,我很幸运地在麻省理工学院的Project MAC找到了一份工作,为Fernando Corbato工作。这是一次非常棒的经历:我正在使用CTSS,这是第一个通用分时系统,并且仍然是最好用的系统之一。它比我当时使用的穿孔卡片效率高得多。我学会了用MAD编程,并编写程序来帮助收集Multics机器的信息;第一台GE 645在那年夏天抵达。这是一个非常适合生活和工作的地方,拥有像Corby这样伟大的人(他仍然活着并且活跃)。这绝对是我一生中最美好的时光之一。

第二年夏天,可能是因为在麻省理工学院的经历,我在贝尔实验室的计算科学研究中心找到了一份工作。这一次,我正确地学习了汇编语言,并且遇到了一群我在麻省理工学院时就听说过的人(他们也在从事Multics的工作)。又是一个美好的夏天。

在那之后的夏天,我又回到了贝尔实验室。这一次,我很幸运地与伟大的数学家和问题解决者沈林一起工作。沈对困难的组合优化问题感兴趣,例如旅行商问题。我一直在以一种随意的方式研究后来被称为图划分问题的我的普林斯顿论文。沈有一个解决一般情况的想法,我用Fortran程序实现了该算法。它成为了我论文的核心,以及其他一些特殊情况。无论如何,我在实验室度过了如此美好的两个夏天,以至于1969年初完成论文后,我甚至没有寻找其他工作——我直接去了实验室。我很幸运能够在UNIX和C以及随之而来的所有伟大事物中工作;这在我到达后不久就开始了。在许多方面,它是任何地方最好的计算机科学研究小组,是一个庞大而富有成效的研究组织的一部分,并且对世界产生了巨大的影响。我在那里待到了2000年,与一群了不起的人一起度过了30年美好的时光。

LJ: 您现在的工作是什么?您喜欢它吗?

BK: 在实验室工作期间,我花了几个学期教书,例如,在普林斯顿和哈佛。我真的很喜欢教学,并在1999-2000学年作为访问教授在普林斯顿的计算机科学系任教。普林斯顿为我提供了一个永久教职,经过几个月的灵魂拷问,本应该是一个简单的决定,但我决定从贝尔实验室退休,成为一名全职教授。这与我在贝尔实验室所做的工作和角色截然不同,但我同样喜欢它,并且过着我一生中最美好的时光。普林斯顿大学是世界上最好的大学之一;孩子们非常有趣且令人欣慰;我的同事非常杰出;而且这是一个很好的社区。我认为在我刚毕业后这样做是不合适的,但现在看来这真的很完美。

LJ: 您教您的学生什么?

BK: 其中一门课程叫做“我们世界中的计算机”。它涵盖了计算机和通信如何工作,面向的是非常非技术性的受众;大多数学生主修文学、政治、历史和其他人文学科。这对我来说非常有趣,因为我可以谈论每天出现在报纸上的一些具有计算机组件的话题。(今年我没有使用的一个话题但本可以使用的:Dmitri Sklyarov和ElcomSoft。但我确实谈到了DMCA,这是一项绝对具有技术和政治成分的美国法律;Sklyarov就是被指控违反了这项法律。)

基本上,这门课程涵盖了硬件(计算机如何工作以及如何构建);软件(算法、编程、语言、系统、应用程序);以及通信(互联网、网络、密码学、压缩等)。还有实验室,他们可以在其中创建自己的网页,做一些简单的编程,并尝试使用声音、图形和电子表格。

另一门课程叫做“高级编程技术”。它是为计算机科学专业的学生开设的,涵盖了许多与软件实际编写方式相关的主题:脚本语言、C++和Java中的面向对象编程、用户界面、网络连接、数据库访问、组件、模式等等。学生可以定义和实施他们自己的多人项目,因此这也是一个小规模的软件工程体验,因为他们需要担心设计、接口、测试、文档,甚至进行演示和演讲。

LJ: 在当今的IT世界中,有很多不同的领域:平台、操作系统、语言、硬件。您认为自己在哪些领域是专家?

BK: 我曾经是文档准备系统方面的专家,例如troff(它在UNIX上运行)以及排版工具。我维护和增强了troff很长时间,并且编写了各种其他文本处理工具,包括用于排版数学公式的eqn。这是我长期以来研究的一个主要部分。我对编程风格也很了解,尤其是在C语言方面。但我现在不是任何方面的专家。需要了解的东西太多了,而且随着年龄的增长,人们更容易忘记。

LJ: 您在C语言的诞生和命运中扮演了什么角色?

BK: 我没有参与C语言的诞生,根本没有。这完全是Dennis Ritchie的工作。我为贝尔实验室的人们编写了一本关于如何使用C语言的教程,并且我劝说Dennis和我一起写一本书。但是,如果他有动力,他肯定可以在没有帮助的情况下完成它。他是一位出色的作家,从C语言参考手册中可以看出,那是他未经修改的散文。我很荣幸能够成为这本书的一部分,并且我珍惜Dennis作为朋友,但是我与C语言没有任何关系。

LJ: 您认为C是一种高级语言吗?

BK: C语言可能是编程语言中表达能力和效率的最佳平衡。在它开发的时候,效率非常重要:机器速度慢且内存小,因此必须尽可能接近汇编程序的效率。C语言为系统编程任务做到了这一点——编写编译器、操作系统和工具。它非常接近机器,以至于您可以看到代码会是什么样子(并且编写一个好的编译器并不难),但它仍然安全地高于指令级别,并且与所有机器都足够匹配,以至于人们不会考虑特定机器的特定技巧。一旦C语言出现,正常的程序员就没有理由再使用汇编语言了。它仍然是我最喜欢的语言;如果我被困在一个荒岛上,只能使用一个编译器,那一定是C语言的编译器。

LJ: 您称C语言为“表达能力和效率的最佳平衡”。那么Pascal呢?世界上有大量的Pascal程序员。它比C语言表达能力更弱还是效率更低?

BK: 我很久以前写过一篇名为“为什么Pascal不是我最喜欢的编程语言”的文章——这就是全部。Pascal可能作为一种教学语言还可以,但是它的官方标准形式不适合编写真正的程序。

LJ: AWK和AMPL语言的设计目的是什么?您在它们的设计中扮演了什么角色?

BK: AWK是Al Aho、Peter Weinberger和我共同努力的成果;这个名字是我们的首字母。我认为公平地说,我们的贡献是相当的。Al了解所有关于正则表达式和模式-动作范例的知识;Peter了解报告生成和数据库问题;我非常清楚地希望能够尽可能轻松地处理字符串和数值以及它们之间的转换。我非常确定Peter完成了第一个实现(只花了几天时间),除了Al所做的正则表达式;自1980年左右以来,我一直独自维护和修改它。我们在1987年共同编写了AWK书籍。

AMPL 是一种用于指定优化问题的语言,例如线性规划。它就像一种编译器,将自然且方便的数学符号转换为特定求解器程序所需的任何格式。AMPL 是与 Bob Fourer 和 David Gay 共同完成的。Bob 是西北大学工业工程和管理科学系的;Dave 在贝尔实验室的计算机科学部门担任同事,直到一两年前退休。Bob 长期以来一直对用于指定优化问题的建模语言感兴趣。他在 1984 年左右在贝尔实验室度过了一个学术休假年。因为我对专用语言(如 AWK)感兴趣,所以他、Dave 和我一起制定了 AMPL 的初始设计,我编写了原型实现。这是我的第一个 C++ 程序,所以虽然它具有指导意义,但可能并不好。无论如何,它确实表明该语言对很多人有用。Dave 接管了实现,并且从那以后完全拥有了它。他和 Bob 是优化方面的专家;我不是。AMPL 的当前形式基本上都是他们的工作;长期以来,我只是出于礼貌才成为团队成员。(几个月前,我们确实出版了 AMPL 书籍的第二版;我和他们一起完成了那本书。)

LJ: Brian,您如何看待 UNIX?它是一个良好且可靠的开发平台吗?

BK: 我习惯于运行数月甚至数年而不会崩溃的 UNIX 系统。如果我开发 UNIX 软件,那就别无选择。如果我开发 Windows 软件,那么如果有图形组件或者它关心操作系统,我无疑会使用 Windows;否则我会使用 UNIX 并移植程序。当我使用 Java 时,我经常混合使用,因为我更喜欢使用的工具在 Unix 上运行,但图形界面在 Windows 上比通过 X 界面更灵敏。

LJ: 您喜欢哪些 UNIX 操作系统?Linux?BSD?

BK: 就我使用它们的方式而言,作为一个休闲程序员,这无关紧要——它们都是一样的。如果我遇到一些差异,只会让我生气,因为大多数时候事情没有理由不同。我在普林斯顿使用 Solaris,在访问贝尔实验室时使用 Irix,在我的 Mac 上使用 FreeBSD;我还在几台 PC 上安装了 Cygwin,以便可以轻松使用标准工具。

LJ: 您是否真的建议将 "UNIX" 这个名字用于很久以前的操作系统 Multics?这个词是什么意思?

BK: 是的,很久以前。Multics 是 Multiplexed Information and Computing Service 之类的首字母缩写,它很大且复杂,因为它拥有很多东西。我建议将 Unics 用于 Ken 的新系统,因为它很小并且最多只有一个东西。(Multi 和 uni 都是拉丁语词根,所以这是一个非常弱的双关语。)其他人用字母 X 拼写它;没人能记住是谁了。

LJ: 您如何看待当前 IT 垄断者的世界?您对微软的政治和产品有什么看法?

BK: 像很多人一样,我对微软的感情很复杂。他们为世界做了很多好事,创造了一个共同的环境,使许多有创造力的人能够构建新的软件和硬件并以合理的价格出售。微软的工作使计算能够为大量原本无法使用计算机的人所用。与此同时,我对他们的一些产品感到不满意。操作系统不应该经常崩溃,甚至根本不应该崩溃,并且使用和编程 Windows 环境的复杂性令人望而却步。

LJ: 您是实用编程方面著名的专家。它与理论和研究编程有何不同?

BK: 正如伟大的美国哲学家 Yogi Berra 据说说过的那样,“在理论上,理论和实践之间没有区别。在实践中,存在区别。” 我不确定理论编程可能是什么,但是无法在计算机上执行的代码不太可能工作,因此除了作为一种思维练习之外,没有多大用处。

研究编程可能意味着作为原型编写的软件,或者[用于]验证某个概念是否可以实现。在这里,区别在于人们可以偷工减料:不用担心错误,忽略潜在的危险,不提供用户界面,跳过文档,当然也不进行维护。从这个意义上讲,研究编程比编写将由许多人在很长一段时间内使用的程序要容易得多。有人(也许是 Fred Brooks,在《人月神话》中)曾经说过,制作生产软件比制作原型要花费至少一个数量级的精力。我认为他至少错了一个数量级。

LJ: 在过去的几年里,您多久编写一次代码?

BK: 不幸的是,除了小型实验、课程示例和偶尔维护 AWK 之外,频率太低了。我确实花了不少时间为 AMPL 语言构建各种用户界面——用 Java、Tcl/Tk 和 Visual Basic——但这些都不是很大,而且没有一个是令人满意的。去年夏天,我大部分时间都花在了完成我们关于 AMPL 的书的第二版上,这也不涉及任何编程。所以我希望重新开始做更多的事情。

LJ: 您的爱好是什么?阅读?运动?

BK: 主要是阅读;我读很多书,主要是历史,有时是侦探小说,偶尔是传记。我过去滑过雪,打过壁球和室内网球,并且曾经获得过空手道黑带。但这已经是很久以前的事了。今天,我的运动仅限于散步。

LJ: 您能说您热爱计算机(IT)吗?

BK: 不。曾经有一段时间,使用它们是非常有趣的,我真的很喜欢编程并让机器做事情,但这从来都不是我的全部生活。而且现代系统如此混乱和复杂,以至于它们在大多数时候带来的挫败感多于回报。尽管如此,仍然很容易完全沉迷于尝试编写程序;那将永远是有趣的。

LJ: 您曾在贝尔实验室与 Bjarne Stroustrup、Ken Thompson 和 Dennis Ritchie 一起工作。您与他们有什么样的关系?你们像一个庞大而智慧的家庭吗?

BK: 我们多年来一直是朋友和亲密的同事,都在贝尔实验室的同一个小团队中。Ken、Dennis 和我的年龄都差不多,我们几乎在同一时间来到实验室;Bjarne 晚来了 10 年。我不会称之为家庭,但它绝对是好朋友,我怀念每天都能见到他们的日子,多年来一直如此。

LJ: 您能对未来的 IT 做出任何预测吗?我们将使用哪些编程语言?

BK: 计算中只有两个真正的问题:计算机太难使用,而且太难编程。在过去的五十年里,我们在这两方面都取得了巨大的进步,但它们仍然是真正的问题。我预测 50 年后它们仍然会是问题。当然,我们将使用比今天更强大的机器,我们的语言无疑将更具表现力。但是我们将承担更复杂的任务,因此进步不会完全明显。

我希望真正的进步主要体现在机械化方面:让机器为我们做更多的工作。今天有很多例子——编译器、解析器生成器、特定于应用程序的语言、向导、界面构建器——所有这些都比我们手动创建代码更容易。这将继续变得更好:当我们对某个领域了解得如此之深,以至于对它进行编程几乎成为一种机械过程时,我们将机械化该过程。当然,语言级别将继续提高,因为语言将变得更具声明性(“做我想做的事情”,而不是“执行这些特定步骤”),并且效率对于计算的任何特定方面都不那么重要了。

但是,我不太确定“更容易使用”方面会发生什么。过去 10 或 15 年的趋势令人不满意。即使使用表面上友好的 GUI 和助手等等,计算机也很难使用。这是一个真正的问题,因为计算机无处不在,而且我们越来越多的人不得不在各种设置中处理它们,其中一些是关键的(想想驾驶飞机,其中“蓝屏死机”具有全新的含义)。我们必须为机器制造更好的界面。

LJ: Brian,非常感谢您。祝您好运!

Aleksey Dolya 是一位俄罗斯 C/C++ 程序员,对网络安全和软件保护感兴趣。

电子邮件:tanat@hotmail.ru

加载 Disqus 评论