📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Brian Kernighan: UNIX, C, AWK, AMPL, and Go Programming | Lex Fridman Podcast #109

Lex Fridman1:43:10

Transcription

以下是与布莱恩·克尼汉(Brian Kernighan)的对话,他是普林斯顿大学的计算机科学教授。在早期 UNIX 时代,他与 UNIX 的创造者肯·汤普森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)一起,是计算机科学界的重要人物。他与 C 语言的创造者丹尼斯·里奇(Dennis Ritchie)合著了 C 编程语言,并撰写了大量关于编程、计算机和生活的书籍,包括《编程实践》(The Practice of Programming)、《目标编程语言》(The Go Programming Language)以及他最新的《UNIX:一部历史和回忆录》(UNIX: A History and a Memoir)。他共同创建了 awk,一个被像我这样的 Linux 用户广泛使用的文本处理语言。他还共同设计了代数建模语言 ample,我个人非常喜欢它,并且在我的一生中,我曾多次使用它来进行大规模优化。我认为我可以继续很长时间地谈论他的创作和成就,这很有趣,因为考虑到他所做的一切,他是我在这档播客中交谈过的最谦逊、最善良的人之一。

广告快速摘要——新赞助商:令人惊叹的自冷却 8 Sleep 床垫和 Raycon 耳塞。请考虑通过访问 8sleep.com/flex 和 buyraycon.com/flex 来支持这个播客。点击链接,购买商品,这是支持这个播客和我正在进行的旅程的最佳方式。如果你喜欢这个节目,请在 YouTube 上订阅,在 Apple Podcasts 上给它五星好评,在 Patreon 上支持它,或者在 Twitter 上与我联系,我的用户名是 @lexfriedman。一如既往,我现在会做几分钟的广告,中间绝不会有任何广告打断对话的流畅性。

本节目由 8 Sleep 及其令人难以置信的 Pod Pro 床垫赞助。您可以在 8sleep.com/flex 查看,可享受 200 美元的折扣。这款床垫通过应用程序控制温度,并能冷却到低至 65 华氏度。研究表明,温度对睡眠质量有很大影响。就我个人而言,它对我来说改变了游戏规则,我非常喜欢它。Pod Pro 床垫装满了传感器,可以跟踪您的心率、心率变异性和呼吸频率,并在您醒来后在应用程序上显示所有这些数据。此外,如果您有伴侣,您可以控制床的每一侧的温度。我碰巧没有伴侣,但 8 Sleep 应用程序提醒我,我可能应该考虑一下。所以,女士们,如果一张可控温的床垫不是一个很好的理由,我也不知道还有什么了。应用程序的健康指标令人惊叹,但仅仅是冷却功能就值回票价。正如你们中的一些人所知,我并不总是睡得很好,但当我睡的时候,我选择 8 Sleep Pod Pro 床垫。在 8sleep.com/flex 查看,可享受 200 美元的折扣。

本节目还由 Raycon 耳塞赞助。在 buyraycon.com/flex 购买。它们很快就成为了我听播客、有声读物和音乐的主要方式,当我跑步、做俯卧撑和引体向上(我现在已经开始讨厌它们了)或者只是生活的时候。事实上,当我深入思考某事时,我经常戴着它们听白噪音,这有助于我集中注意力。它们非常舒适,易于配对,音质极佳,低音强劲,续航时间长达六小时。事实上,为了好玩,我现在戴着一只耳塞,听着 Santana 的《Europa》,这可能是我最喜欢的吉他歌曲之一。这让我感觉自己像是在音乐视频里。他们告诉我,很多名人使用这些耳塞,比如 Snoop Dogg、Melissa Etheridge 和 Cardi B。我甚至不知道 Cardi B 是谁,但她的耳塞游戏很棒。提到名人,我敢肯定,如果理查德·费曼(Richard Feynman)还在世,他会戴着 Raycon 耳塞听乔·罗根(Joe Rogan)的播客。在 buyraycon.com/flex 购买,这样他们就知道是我推荐的,并增加了他们未来支持这个播客的可能性。所以,对于所有赞助商,请点击所有链接,这真的对这个播客很有帮助。

现在,开始我与布莱恩·克尼汉的对话。

大约在 50 年前,甚至 50 多年前,它就开始开发了。你能像描述你的新书一样,讲述一下 UNIX 是如何被创造出来的吗?

如果我记不起那么久以前的事情了,嗯,那已经是很久以前了。所以,我认为它的要点是,在贝尔实验室,在 1969 年,有一群人刚刚完成了 Multics 项目,而 Multics 项目本身也遇到了困难。所以,我们可以追溯到无限的回归时间,但 CTSS 是一个非常非常非常好的分时系统,使用起来非常方便。我实际上在 1966 年夏天在剑桥工作时就用过它。

硬件在那里,对吧?那么操作系统是什么?硬件是什么?CTSS 看起来是什么样的?

CTSS 在当时看起来就像一个标准的分时系统。当然,在当时,它是唯一的分时系统。不,让我们回到基本原理。起初是话语,而话语是分时系统。是的,如果我们回到 1950 年代和 1960 年代初,大多数计算都是在非常大的计算机上完成的,物理上很大,尽管与今天的标准相比功能并不强大,它们被放置在非常大的房间里,您使用像打孔卡这样的东西来编写程序。所以,您会拿一叠卡片,在上面写下您的程序,然后将其交给操作员,过了一段时间,您会收到一个说“哦,您犯了一个错误”的回复,然后您就得重新开始。所以,这非常非常慢。

因此,分时系统的想法是,您基本上可以使用同一台计算机,但通过看起来像电打字机的设备连接到它。它可以很远,也可以很近,但从根本上说,操作系统所做的就是为每个连接到它并希望做某事的人提供一小部分时间来完成一个特定的任务。所以,我可能正在编辑一个文件,我正在打字,每次我敲击一个键,操作系统就会唤醒并说:“哦,他打了一个字符,让我记下来”,然后它会回去做其他事情。它会围绕着一群试图完成某事的人来回进行,给每个人一小部分时间,并给他们每个人一种错觉,让他们觉得自己几乎拥有了整台机器,因此,分时系统就是将计算机的计算时间资源在许多人之间共享,而个人用户却不知道有其他人。在某种意义上,这种错觉,这种感觉是,这台机器几乎是您自己的。

就是这个想法,是的。如果做得好,如果足够快,而且其他人做得太多,您就会产生拥有整台机器的错觉,而且这比打孔卡模型要好得多。所以,CTSS,兼容分时系统,我认为可以说是第一个。它是在 64 年左右完成的,我猜。它运行在 IBM 7090 上,略微修改,使其内存是标准的两倍,而不是一个,它有两个 32k 字的内存组,所以,是的,32k 字。

36 位,所以称之为,你知道,大约 150 千字节乘以 2。所以,按今天的标准来看,这已经微不足道了。当时那是很多内存,而且内存很贵。所以,CTSS 是一个很棒的工作环境。它是由麻省理工学院的人们完成的,由费尔南多·科尔贝特(Fernando Corbató)领导,他今年早些时候去世了,还有很多其他人。然后,我在 66 年夏天在那里工作,度过了愉快的时光,认识了很多很棒的人,并且间接认识了贝尔实验室的一些人,他们也在研究 CTSS 的后续产品,叫做 Multics。

所以,Multics 是为了做 CTSS 所做的一切,但为更多用户做得更好。就是所有这些常规的东西。那么,实际的分时,调度,调度算法是什么样的?有多少魔法?指标是什么?它最初是如何工作的?

我不知道。我认为基本想法就是谁想做点什么。假设在深夜,我得到了我想要的所有时间。假设您和我中午都在争夺某样东西。那么,最简单的算法可能就是轮询,它给您一点时间,给我一点时间,然后我们可以根据您正在做什么进行调整,例如,您是在进行文本编辑还是编译,或者其他什么,我们可能会根据这些因素调整调度程序。

所以,好的,Multics 试图清理一下?

它比那要多得多。Multics 是多路复用信息和计算服务,它旨在成为一个非常庞大的项目。我们将提供计算服务,一种您可以将其视为墙上插座的服务,就像今天的云计算一样。是的,同样的想法,但早了 50 多年。

那么,Multics 提供了一个更丰富的操作系统环境,一个为共享资源而设计的更好硬件,以及可能还有很多其他东西。您认为当时的人们是否梦想着今天的云计算,即计算无处不在,您可以插入任何东西,您永远不知道魔法是如何工作的,您只需插入,添加您需要执行的计算,它就能完成。那是梦想吗?

我不知道那是不是梦想。当时我并不在其中。记住,我当时是实习生,我的第一个夏天。但我的感觉是,考虑到那已经是 50 多年前了,是的,他们有那个想法,认为它是一种信息服务,一种您可以在那里完成计算任务的东西。现在,我敢打赌,他们并没有像今天这样看待大众计算。称之为,你知道,您的祖母会在亚马逊上购物。我不认为那是其中的一部分。但如果您的祖母是程序员,她可能会很容易地使用这种服务。

您当时对计算机的梦想是什么?您看到了计算机的未来是什么?您能预测到今天的计算机吗?

简短的回答是,绝对不行。我不知道。我不确定我有什么梦想。这是一个梦想工作,因为我真的很喜欢我所做的,我被非常非常棒的人们包围着。剑桥是一个非常好的城市,夏天很适合居住,冬天就没那么好了,因为会下雪。但夏天是一段愉快的时光,所以我真的很喜欢所有这些。我学到了东西,我认为在那里度过夏天的好运气让我获得了贝尔实验室的下一个夏天的工作,这对未来很有用。

所以,这个贝尔实验室是一个神奇的传奇之地。首先,贝尔实验室在哪里?您能开始谈谈通往贝尔实验室的 UNIX 之旅吗?

是的,贝尔实验室当时分散在新泽西州各地。主要地点是在一个叫默里希尔(Murray Hill)的地方。默里希尔实际上位于新泽西州两个小镇的边界之间,叫做新普罗维登斯(New Providence)和伯克利高地(Berkeley Heights)。想想它离纽约市大约 15-20 英里,然后往北一个小时。当时那里有三四千人,其中许多人拥有博士学位,主要从事物理科学、化学、物理、材料等领域的工作,但数学非常强大,并且对计算的兴趣迅速增长,因为人们意识到您可以用计算机做以前做不到的事情。您可以将实验室替换为计算机,这些计算机可以对正在发生的事情进行建模。

所以,这就是贝尔实验室的本质。再说一遍,我不是那里的常驻人员,那是另一个实习机会。我在实习方面运气很好。我的意思是,如果您能稍微停留一下,那里的空气中有什么?因为有些是诺贝尔奖的数量,图灵奖的数量,以及来自那里的传奇计算机科学家,包括 UNIX 的发明,这简直令人难以置信。所以,那个地方有什么特别之处吗?

我认为那里绝对有特别之处。我提到了人数,非常多高技能的人在一个总是有有趣的事情可做的工作环境中。因为贝尔实验室的目标,它是 AT&T 的一小部分,AT&T 主要提供全国的电话服务,AT&T 的目标是为所有人提供服务,而贝尔实验室的目标是努力让这项服务不断进步。所以,改进服务意味着对许多不同的事情进行研究,比如晶体管、光纤电缆或微波系统。所有这些东西实验室都研究过。而且,当我 1966 年去那里时,计算也正处于真正的蓬勃发展时期。计算当时还很年轻,所以人们发现您可以做很多事情。

那么,UNIX 是如何诞生的?

Multics,尽管有大量非常好的想法和许多优秀的人在工作,但从根本上说,至少在短期内,它并没有实现其成为信息服务的宏伟目标,而且我认为最终也从未实现。它太昂贵了,而且承诺交付的时间太晚了。所以,大约在 1969 年初,贝尔实验室退出了该项目。该项目当时包括麻省理工学院、贝尔实验室和通用电气。通用电气制造计算机,所以通用电气是硬件部门。贝尔实验室意识到这个项目在他们关心的时间尺度上不会有结果,于是退出了。这使得几个人对非常非常好的计算环境产生了浓厚的兴趣,但却没有计算环境。所以,他们开始思考,如果您要设计一个新的操作系统,提供与 CTSS 相同的舒适计算环境,同时又具备 Multics 的功能,会怎么样?

所以,他们做了很多纸面设计。与此同时,肯·汤普森(Ken Thompson)发现了一台很少使用的 PDP-7,他开始在那里进行文件系统实验,如何有效地存储信息。然后,有一个著名的故事,他的妻子去了加州三周,带着他们一岁的儿子,三周后,他坐下来写了一个操作系统,最终成为了 UNIX。所以,当时的软件生产力很高。

PDP 是什么?PDP-7 是什么?

这是一台硬件。是的,这是一台硬件。它是数字设备公司(DEC)制造的领先机器之一。它是一台小型计算机,我必须查找确切的数字,但它的内存非常小,可能是 16k 个 16 位字左右。相对较慢,可能不是非常昂贵,也许,我得查一下,大约 10 万美元左右。这并不算非常昂贵,在那个时代。是的,它很贵。它足够贵,您和我可能买不起,但一群人可以凑钱。但无论如何,它是在 1964 年左右发布的。所以,到 1969 年,它已经有点过时了,这就是为什么它很少被使用。

如果您能评论一下,您认为像那样编写操作系统是什么感觉?肯在三周内完成的过程,因为您参与了这个过程,您为 UNIX 的早期发展做出了很多贡献。您认为完成第一步,从设计到 PDP 上的现实,需要什么?

嗯,让我纠正一件事。我对此毫无贡献。我没有写它。我从未写过操作系统代码。所以我不知道。操作系统就是代码,而第一个操作系统并不大。但它允许您运行进程,执行一些已编写的代码。它允许您在一段时间内存储信息,这样当您关闭电源或重新启动时,信息就不会丢失。还有一套核心工具,技术上不是操作系统的一部分,但您可能需要它们。在这种情况下,肯为 PDP-7 编写了一个汇编器,它能工作。他需要一个文本编辑器,这样他就可以实际创建文本。他有他一直在研究的文件系统。然后,其余的只是将可执行代码从文件系统加载到内存中,将控制权交给它,并在它完成或以其他方式退出时收回控制权。

代码是用什么语言编写的?主要是汇编语言吗?肯创建的 PDP-7 汇编器?

这些都是汇编语言,直到大约 1973 年或 74 年左右。是的。

如果这是一个愚蠢的问题,请原谅我,但感觉用汇编语言编写任何复杂的系统都是一项艰巨的任务。

绝对。感觉用汇编语言进行任何我们认为是软件工程的事情都是不可能的。我认为这很难。我写汇编语言已经很久了。绝对正确的是,在其他语言中,如果您犯了错误,没有人会告诉您。没有任何辅助措施。所以,东西就不能工作。现在,有什么调试器吗?嗯,可能有调试器,但问题是一样的,对吧?您如何实际获得可以帮助您调试它的东西?所以,一部分是能够看到大局。现在,这些系统在今天的规模上并不大。所以,大局在某种意义上更易于管理。我的意思是,现实地说,程序员的能力存在巨大的差异。肯·汤普森,他写了第一个,在我看来,他是一个编程的奇点。恕我直言,即使是对我,他也要差好几档。我知道有等级之分。这是一个迷人的事情,在编程领域,尤其是在特定时期,存在独特的明星。你知道,时机很重要,一个人出现的时间。而妻子必须离开,你看,这种奇怪的时机发生了,然后突然,一些美丽的东西被创造出来了。我的意思是,你觉得有一个系统,它在三周内被创造出来,或者也许你可以说,一时兴起,但并非如此,但当然很快,它现在,你可以认为世界上大多数计算机都运行在类 UNIX 系统上,对吧?那么,你如何确保,如果你从外星人的角度来看,如果你只是观察地球,这些计算机突然接管了世界,它们从 UNIX 的这个小小的初始种子开始,这让你感觉如何?

这很令人惊讶。而且,您之前问过预测,答案是,不,您无法预测这种演变。我不知道这是否是必然的,还是只是一连串的运气。我怀疑是后者。所以我看着它,觉得“哇,这真不错”。我认为真正的问题是,他对此有什么看法,因为他可以说是那个真正创造它的人。丹尼斯·里奇(Dennis Ritchie)做出了巨大的贡献,然后是贝尔实验室环境中的其他人。但是,你知道,如果你必须选择一个人,那就是肯。

在你的书《UNIX:一部历史和回忆录》中,有没有一些令人难忘的、有趣的或深刻的人类故事,让你印象深刻?

嗯,有很多。在某种意义上,再次,这是一个问题,你能否重现它们?记忆会衰退。但我认为,贝尔实验室当时是一个非常特殊的工作场所,因为那里有很多有趣的人,而且环境非常开放和自由。这是一个非常合作的环境,非常……嗯,非常……是的,绝对。我认为大多数人都不太喜欢官僚主义,而且我敢肯定,官僚主义容忍了他们真正不想要的很多事情。

所以,也许稍微深入一点,你是否觉得有一种哲学特征化了 UNIX 的设计,不仅仅是最初的设计,而是贯穿多年的设计?只是在那里,在那里,这个系统的基本哲学是什么?

我认为一个方面是基本哲学是提供一个环境,使编写程序更容易,更具生产力。所以,作为一个程序员环境,它并不是专门为做其他类型的工作而设计的。例如,它被广泛用于文字处理,但它并不是一个文字处理系统。它被广泛用于实验室控制,但它并不是为此而设计的。它被广泛用作大型其他系统的前端,大型笨拙的系统,但它并不是为此而设计的。它旨在成为一个环境,在那里编写程序真的很容易,所以程序员可以非常高效。其中一部分是成为一个社区。丹尼斯·里奇(Dennis Ritchie)在书的结尾有一些观察,从他的角度来看,真正的目标是创建一个社区,人们可以在其中作为程序员在一个系统上工作。我认为在那个意义上,当然,很多年来,它在这方面相当成功。其中一部分是技术方面,因为它使编写程序变得非常容易,人们确实编写了有趣的程序,这些程序往往被其他程序员使用,所以这是一个良性循环,越来越多的好东西出现,对程序员来说非常好。

所以,你也是那个程序员社区的一员。那么,在早期的 UNIX 上编写程序是什么样的?

真是太棒了,真的。你知道,我喜欢编程。我不是一个非常好的程序员,但写代码很有趣。在早期,有大量的,你今天可能会称之为“低垂的果实”。人们以前没有做过的事情,这是一个新的环境,一套很好的工具,一个响应迅速的系统,以及出色的同事,使编写代码成为可能。你可以在早上有一个想法,你可以实现它,你知道,尝试一下。你可以在晚上或第二天得到一些东西,人们会对此做出反应。他们会说:“哦,太棒了,但你在这里搞砸了。”反馈循环非常短而紧密。所以,很多东西都相当快地开发出来了,在许多情况下至今仍然存在。我认为这就是它的乐趣所在,因为编程本身很有趣,它以各种方式解决谜题。但我认为,当您做一些别人会使用的事情时,即使他们抱怨它不起作用,它会更有趣。他们使用了它,这是奖励机制的一部分。

那么,互动和沟通的方式是什么?我们需要那个反馈循环。我的意思是,这是在互联网之前,当然是在互联网之前。

嗯,那主要是物理上的,对吧?有人会走进你的办公室说些什么。所以,这些地方都关门了,但办公室很近,互动非常活跃。是的,是的。贝尔实验室基本上是一个巨大的建筑,大多数参与这个独特项目的人都在两个或三个季度。有一个房间,有多大?大概 50x50 英尺,我猜。那里有一些计算机,办公室里也有。人们在那里闲逛,有一个咖啡机。所以,主要是非常物理的。我们当然也使用电子邮件,但从根本上说,很长一段时间以来,所有东西都在一台机器上。所以,不需要互联网。

想到没有贝尔实验室,今天的计算会是什么样子,这很有趣。似乎有那么多人在彼此的附近,那种快速的反馈,一起工作,有那么多聪明的人。我不知道世界上还有哪里能做到这一点,考虑到它的出现方式。

是的,嗯,这让你感觉如何?这是历史的一个小元素。

嗯,我认为这很好。但在某种意义上,这是幸存者偏差。如果它没有发生在贝尔实验室,还有其他地方也在做非常有趣的工作。施乐 PARC 可能是最明显的。施乐 PARC 贡献了大量的优秀材料,以及我们今天认为理所当然的任何东西,都来自施乐 PARC 的经验。我认为他们从长远来看并没有充分利用。他们的母公司可能在利用这一点方面运气不佳。谁知道呢?但那绝对是另一个地方,那里有巨大的影响力。有很多很好的大学活动,麻省理工学院在这方面显然不是弱者,还有其他学校。

所以,UNIX 最终是开源的,因为 AT&T 的各种运营方式,以及他们不得不这样做。重点是电话。

嗯,我认为这是一个错误的描述。它绝对不是开源的。它绝对是专有的许可。但多年来,它被免费许可给大学,并以源代码形式提供。因为这个原因,几代大学生和他们的教职员工都在学习 UNIX。社区中有足够的专业知识,这使得人们可以走自己的路,建立一些看起来像 UNIX 的东西。伯克利版本的 UNIX 就是从那种许可代码开始的,并逐渐积累了足够多的自己的代码贡献,特别是来自比尔·乔伊(Bill Joy)这样的人,最终它能够完全摆脱 AT&T 的任何代码。

所以,在 80 年代末到 90 年代初,有大量的法律纠纷。然后,我想开源运动可能始于理查德·斯托曼(Richard Stallman)在 80 年代末开始考虑这个问题。到了 1991 年,当托瓦尔兹(Torvalds)决定要开发一个类 UNIX 的操作系统时,社区中已经有了足够的专业知识。首先,他有一个目标,他知道该怎么做,因为 UNIX 的系统调用接口和工具等等都存在。所以,他能够开发一个操作系统,现在,当你提到 UNIX 时,在很多情况下,你实际上想到的是 Linux。

Linux。是的。但从我遥远的视角来看,我觉得 UNIX 是开源的,尽管我实际上并不知道。但你实际上说的是它只是免费许可的。

所以,它是免费许可的。在某种意义上,它感觉像是开源的,因为大学并不试图赚钱。所以,在某种意义上,它感觉像是开源的,因为如果你想要,你就可以获得访问权限。是的,非常非常多的大学拥有许可证,并且能够与其他拥有许可证的大学交流。所以,技术上不是开源的,技术上属于 AT&T。实际上,非常开放。所以,有一个连锁反应,所有的教职员工和学生都成长起来了,然后他们走向了世界,以那种方式渗透。

那么,您认为哪些功能造就了一个好的操作系统?如果您吸取了 UNIX 的教训,您说,比如,让程序员更容易,这似乎很重要。但 UNIX 也非常健壮和高效,对吧?所以,这是偶然的,当你专注于程序员时,还是自然的结果?

我认为效率的一个原因是它始于极其适度的硬件,非常非常非常小。所以,你不能得意忘形,你不能做很多复杂的事情,因为你没有资源,无论是处理器速度还是内存。所以,这强制执行了某种程度的机制的最小化,也许是寻求泛化,这样你就会找到一种机制,可以用于许多不同的事情,而不是有很多不同的特殊情况。我认为 UNIX 中的文件系统是一个很好的例子。文件系统的基本形式非常直接,这意味着您可以非常有效地为文件系统编写代码。然后,其中一个想法和其中一个泛化是,嘿,这个文件系统接口也适用于所有其他事情。所以,特别是将设备读写为与读取和写入具有文件系统的磁盘相同。然后,这在世界的其他部分得到了进一步发展。进程实际上成为文件系统中的文件。而 Plan 9 操作系统,它大概是在 80 年代末出现的,它借鉴了原始 UNIX 的许多想法,并试图将泛化推得更远。所以在 Plan 9 中,许多不同的资源都是文件系统,它们都共享该接口。所以,这将是一个例子。找到正确的模型意味着很多事情会变得更简单,这意味着更多的人可以利用它们做有用的有趣的事情,而无需过多思考。

你说你不是一个很好的程序员。你是一个非常谦虚的人。好吧,但我明白这是怎么回事,但你散发出一种对编程的热爱。所以,让我问一下,你认为编程更像是一门艺术还是科学?有创造力还是严谨性?

我认为两者兼有。它是某种组合。艺术的一部分是弄清楚你真正想做什么,那个程序应该是什么,什么会是一个好的程序。这是对任务的理解,对可能使用该程序的人的需求的理解。我认为这在很多方面都是艺术。科学部分是试图弄清楚如何做好。其中一些是真正的计算机科学的东西,比如我们应该使用什么算法。在大多数情况下,是谨慎地使用实际上能正常工作或正确扩展的算法,避免二次算法,而线性算法应该是正确的。这是一种更正式的观点。数据结构也是如此。但它也是一个工程领域。工程与科学不完全相同,因为在工程中,您要处理约束。您不仅要弄清楚,那么,对于这类事情,什么是一个好的算法?但考虑到我们有多少时间来计算,有多少时间来编程,未来维护可能会发生什么,谁将在未来接管?所有这些事情,如果你是一名工程师,你就会担心。而如果你认为自己是一名科学家,那么你也许可以把它们推到极限。如果你是艺术家呢?

所以,就您个人而言,您的编程过程是怎样的?比如,一个小程序和一个大程序?只是开始编码,然后迭代地演变,有一个模糊的概念?还是先在纸上计划,然后设计,你知道,你在本科软件工程课程中学到的那种?你的过程是怎样的?

肯定更偏向于非正式的、渐进式的。我不再写大型程序了。我写一个程序已经很久了,它有几百行甚至更多。我写的很多程序都是我好奇的东西,或者我经常想在课堂上谈论的东西。所以,这些程序通常相对较小。我今天写的很多代码都用于探索性数据分析,我有一些数据集合,我想弄清楚到底发生了什么。对于这些程序,它们通常很小。有时你甚至不编程,你只是使用现有的工具,比如计数。有时你写 awk 脚本,因为两三行就能告诉你一些关于数据的信息。然后,当它变大时,我可能会用 Python 写点东西,因为它能更好地扩展到几百行左右。我写程序已经很久了,但很少超过这个长度。

说到数据探索,首先,awk 是什么?

awk 是一个脚本语言,由我和埃尔·霍恩(Al Aho)、彼得·温伯格(Peter Weinberger)在 70 年代末创建。它是一种语言,旨在让计数或从文本文件中提取有趣信息、重新排列或汇总等快速粗糙的任务变得非常容易。它在文件的每一行上运行命令。我的意思是,它至今仍然被广泛使用。

哦,绝对是的。它是一种如此简单而优雅的数据探索方式。事实证明,你只需要写一个脚本,它就能完成看似微不足道的事情,在一行上,它就能让你看到数据的一部分,这似乎揭示了关于数据的一些基本信息。你知道,这似乎仍然有效。

是的,它在这方面做得很好,这正是它最初的用途。我认为我们没有意识到的是,这个模型实际上对许多数据处理任务都非常有用,而且它一直存在,因为它现在已经超过 40 年了,但我认为它仍然是一个有用的工具。而且,这可能是出于父爱,但我认为在编程语言方面,学习 awk 的性价比最高。它不能扩展到大型程序,但在你只想看到一些东西中的所有东西时,它在这些小事情上做得相当不错。所以,是的,我发现我可能比其他任何东西都写更多的 awk。

那么,你喜欢 awk 的哪些方面呢?比如,有没有什么让你感到快乐的事情,当你能够在一个简单的程序中揭示一些东西时?有没有什么特别突出的功能?

我认为主要是默认行为的选择,就像你刚才暗示的那样。awk 的作用是逐行读取一组文件,然后在每个文件中,它逐行读取。然后在每一行上,它有一组模式,它会查找,这就是你的 awk 程序。如果其中一个模式匹配,就会有一个相应的操作,你可能会执行。所以,它有点像一个四重嵌套循环,或者类似的东西。而这一切都是自动的,你不需要考虑它。你只需要写模式和操作,然后运行数据。所以,这种编程范式非常自然和有效。我认为我们在 awk 中相当好地捕捉到了这一点。它还免费提供了其他功能。它将数据分成字段,这样每一行都有由空格或其他东西分隔的字段。所以,它免费完成了这一切,你不需要说任何话。它收集信息,就像我们在处理哪一行,有多少个字段,这一行有多少个字段。所以,很多事情使得一个程序,在另一种语言,比如 Python 中,可能需要 5、10、20 行,而在 awk 中只需要一两行。所以,因为它是一两行,你可以在 shell 中完成它,你不需要打开另一个东西,你可以在那里完成。而且与 awk 的交互非常完美。

你有没有喜欢过的其他 shell 命令?你真的很喜欢使用它们?

嗯,grep 基本上是 awk 的一个更简单的版本,我认为在某些方面是的。是的,对吧?那么,grep 是什么?

grep 基本上是在输入中搜索特定的模式,技术上是正则表达式,属于某一类。它具有与 awk 相同的范式。它是一个模式-动作的东西。它逐行读取所有文件,然后逐行读取每个文件。但它有一个单一的模式,就是你正在寻找的正则表达式,以及一个单一的动作:如果匹配就打印。所以,从这个意义上说,它是一个更简单的版本。你可以在 awk 中写一个 grep 作为单行命令。而且,我现在可能比任何其他东西都更常用 grep,因为它非常方便和自然。

你认为它为什么会成为如此强大的工具?grep。为什么像 Windows 这样的操作系统没有它?

我不知道。它并非完全独有,但它肯定集中在那里。我认为这部分是历史的重量。Windows 来自 MS-DOS。MS-DOS 是一个相当糟糕的操作系统,尽管很普遍,而且在无数台机器上。所以,在大约 90 年代,Windows 成为了一个图形系统。我认为微软投入了大量的精力来打造那个图形界面,这是一个不同的计算模型。这是一个计算模型,你点击鼠标,然后通过菜单进行实验。这是一个对非程序员来说相当不错的计算模型,他们只想完成某件事。而教非程序员使用命令行有时会很困难。所以,我认为微软的做法是正确的。

你提到了 WSL,或者 whatever 它叫什么名字。Windows for Linux。我不知道它叫什么名字。我从来没有真正发音过。但我喜欢它。我不知道。但一直有像 Cygwin 这样的东西,它是一个很棒的集合,可以让你在 Windows 上完美地使用你最喜欢的 UNIX 和 Linux 工具。所以,这已经持续了至少 20 年,如果不是更长的话。而且,我在我仅剩的一台 Windows 机器上经常使用它,因为如果你要做一些批处理计算,命令行,这是正确的方式。因为 Windows 的等价物,如果不是别的,对我来说都不熟悉。但我应该,我绝对会推荐人们,如果他们不使用 Cygwin,就试试 WSL。

是的,我说,我一直很兴奋,我可以在 Windows 中使用 bash,快速编写脚本。这改变了我的生活。

好的,你完美的编程设置是什么?什么电脑?什么操作系统?什么键盘?什么编辑器?

“完美”这个词太强了。这是……嗯,默认情况下,我有一台 13 英寸的 MacBook Air。我使用它是因为它在各种我需要的方面取得了合理的平衡。我可以随身携带它,它的计算能力足够,屏幕足够大,键盘也还可以。所以,我基本上所有的计算都在上面完成。我在办公室里有一台大 iMac,我偶尔也会使用它,尤其是在需要大屏幕的时候。但否则,它就不那么常用了。

编辑器。我主要使用 Sam,这是一个很久以前在贝尔实验室由 Rob Pike 编写的编辑器。

它比 VI 和 Emacs 都早吗?

它比 VI 和 Emacs 都晚。它源于 Rob 在 DED 上使用 Ed 和 VI 的经验。那是原始的 UNIX 编辑器。

哦,比你出生可能还要早。那么,编辑器的历史是什么?你能简要地介绍一下吗?这是你的粉丝。我用 Emacs,很抱歉。我很抱歉说出来。那么,那是什么样的互动呢?

是的,在古老的古老时代,比如我们正在谈论的第一个分时系统。有编辑器。CTSS 上有一个编辑器,我甚至不记得它叫什么名字了。也许是 edit,你可以输入文本程序文本,它会做一些事情,或者文档文本。如果它保存了,然后我保存了它,你可以编辑它,你知道,你在编辑器中通常会得到的东西。肯·汤普森编写了一个叫做 QED 的编辑器,它非常强大。但这些都是完全基于命令的。它们不是大多数基于光标的,因为它们是在鼠标甚至光标出现之前,因为它们运行在打印纸上的终端上。好的,没有 CRT 显示器,更不用说 LED 了。

所以,当 UNIX 出现时,肯 took QED,并把它大大地简化了。这变成了一个他叫做 ed 的编辑器。它非常简单,但它是一个面向行的编辑器。所以,你可以加载一个文件,然后你可以谈论从第一行到最后一行。你可以,你知道,打印行范围,你可以添加文本,你可以删除文本,你可以更改文本,或者你可以使用 substitute 命令来更改行内或行组中的内容。

基本上可以在文件的部分工作,是的。你可以处理任何部分,整个文件, whatever。但它完全是基于命令行,而且完全是纸质的。

好的,是的,真正的纸。所以,如果你改变了一行,你必须打印那一行,用另一行纸来查看变化。

好的。所以,当 CRT 显示器出现时。是的,然后你就可以开始使用光标控制了。你可以在屏幕上移动,而无需重新打印。有许多编辑器。我最熟悉的,而且仍然使用的,是 VI,它是由比尔·乔伊(Bill Joy)完成的。所以,我猜那可以追溯到 70 年代末。它充分利用了光标控制。我怀疑 Emacs 大约在同一时间,但我不知道。我从来没有真正掌握过 Emacs。

所以,我现在,我停止使用 ed。我有时使用 VI,有时使用 Sam,只要我能用。Sam 在大多数系统上都可以使用。它可用。你必须自己从通常的 Plan 9 操作系统发行版下载它。它由那里的开发人员维护。所以,我今晚回家,我会试试。

这很酷,它是一种声音,听起来很快。虽然我的爱是 Lisp 和 Emacs,但它们已经进入了那个嬉皮士世界,我认为它就像宗教一样,你从小就被灌输“是的,先生,没错”。我实际做的编程大部分是 C、C++ 和 Python,但我的怪异的、是的,我的宗教式的成长经历是,除非你能承担不可能的任务,并从你的角度简要介绍编程语言的历史。所以,我想你可以说编程语言大概始于 40 年代末或类似的时候。人们过去通过基本上输入零和一,使用类似控制台上的开关来编程计算机,然后,或者可能是纸带上的孔,类似的东西。所以极其乏味,糟糕,无论如何。因此,我认为第一批编程语言是相对粗糙的汇编语言,人们基本上会编写一个程序,将助记符(如 add)转换为与 add 指令对应的位模式,他们会做文书工作,弄清楚东西在哪里。所以你可以给程序中的一个位置命名,汇编器会弄清楚当所有东西组合在一起并放入内存时,它对应于什么。它们很早,这大概是 40 年代末和 50 年代初,人们使用的各种机器都有汇编器。你可能几天前在报纸上看到托尼·伯克特去世了,他在曼彻斯特做了一件叫做自动代码的事情,这是一个只有名字才知道的语言,但听起来它是一种汇编语言的变体,在某些方面稍微高一些,嗯,它取代了艾伦·图灵写的一种语言,你输入零和一,但你以相反的顺序输入,因为那是硬件工作的非常紧张,是的,是的,没错,反向的。所以汇编语言,让我们称之为 50 年代初。因此,每种不同类型的计算机都有自己的汇编语言,所以 EDSAC 有它的,曼彻斯特有它的,IBM 7090 或 704 或任何东西都有它的,等等。所以每个人都有自己的汇编语言。当汇编语言有几个命令时,加法、减法,然后某种形式的分支,如果那么这种情况,对吧?它们至少有一个指令对应于机器指令集中的一个指令,在其最简单的形式下。所以你必须非常了解机器才能编写程序。如果你为一种机器编写了汇编语言程序,然后你说“天哪,真好,我想要另一台机器”,重新开始,好的,所以非常糟糕。因此,50 年代末发生的事情是,人们意识到你可以再次玩这个游戏,你可以在编写或创建更接近人们实际思考如何编写代码的语言的水平上提升一个层次。我猜那个时期大概有三四种语言。有 Fortran,来自 IBM,它是公式翻译,为了方便科学和工程计算,不是公式翻译,我就是这么理解的,是的,有 COBOL,它是通用商业导向语言,由 Grace Hopper 和其他人开发,它被命名为商业任务。有一个叫做 Algol 的,它主要是用来描述算法计算的,我猜你可以说 Basic 也在其中,我认为它只是晚了一点。所以所有这些都提高了水平,所以它们更接近你和我写程序时可能想到的,它们专注于不同的领域。Fortran 用于公式翻译,工程计算,我们这么说吧。COBOL 用于商业,这类事情,至今仍在使用。Fortran 可能,哦,是的,COBOL 也是。但关键是,一旦你提升了那个水平,那么我们就称之为 Fortran,你就有了一种不与特定硬件绑定的语言,因为不同的编译器会为不同的硬件编译。这意味着两件事:它意味着你只需要编写一次程序,这非常重要;它意味着你实际上可以,如果你是一个随机的工程师、物理学家或其他什么,你可以自己编写那个程序,你不必雇佣一个程序员为你做。可能不如你从程序员那里得到的那么好,但它相当不错。因此,它使编写代码的能力民主化并使其更广泛可用。因此,它将编程的力量交到了像你这样的人手中,是的,任何想花时间学习编程语言的人,并且不与特定类型的计算机绑定。然后,在 70 年代,你得到了系统编程语言,其中 C 是幸存者。什么是系统编程语言?学习编写系统程序所需的编程语言,例如文本编辑器、汇编器、编译器或操作系统本身,这类东西。而且它们功能丰富,它们必须能够做很多事情,很多内存管理,访问进程等等。它们是不同的风味,它们在做的事情,它们与实际机器的接触更多,但以积极的方式,也就是说,你可以更可控地谈论内存,你可以谈论机器支持的不同数据类型,以及在那里,以及更多组织和组织数据的方式。因此,系统编程语言付出了很多努力,称之为 60 年代末、70 年代初。C 是我我认为唯一真正的幸存者。然后之后发生了什么?你得到了面向对象编程语言,因为当你用 C 这样的语言编写程序时,在某个规模上,它会变得太难跟踪各个部分,而且没有护栏或辅助轮之类的东西可以阻止你做坏事。所以 C++ 就诞生于这种传统,然后它就起飞了。我的意思是,还有一条平行的、稍微平行的轨道,有一些函数式的东西,比如 Lisp 等等。但我想从那时起,语言就爆炸了。有 Java 的故事,有 JavaScript,有所有酷孩子现在正在使用的 Rust 等等。他们不。所以,你写了一本关于 C 编程语言的书,而 C 可能是编程语言历史上最重要的语言之一。如果你看看影响,你认为 C 最优雅或最强大的部分是什么?它为什么能生存下来?它为什么有如此持久的影响?我认为它找到了一个表达力的最佳点,所以你可以以一种相当自然的方式重写东西,以及效率,这在今天的计算机远不如今天强大时尤其重要。再次想象一下,在 50 年前,就计算机能做什么而言,那就是大约四五代,几十年的摩尔定律,对吧?所以表达力和效率,我不知道,也许它附带的环境,也就是 Unix。所以这意味着如果你编写了一个程序,它可以在所有运行 Unix 的计算机上使用,而那些都是 Unix 计算机,因为它们都是用 C 编写的。这样,操作系统本身就是可移植的,所有工具也是如此。所以它们都再次协同工作,这些东西以积极的循环相互契合。写一本权威的书需要什么?可能是一本关于所有程序的权威书,就像它比任何其他语言的任何其他书都更权威。它做了两件非常有力的事:一是普及了这门语言,至少从我的角度来看,也许你可以纠正我,二是创造了一个关于这门语言应该如何使用和应用的标准。那么,它需要什么?你当时有这样的雄心壮志吗?开玩笑,当然没有。这是时机、技能和运气的巧合。很多时候,这显然是我的时机很好。丹尼斯写了这本书,在 1977 年。我是里奇,是的,没错。那时 Unix 已经开始传播了。我不知道有多少,但会有几十到几百个 Unix 系统。C 也可以在其他与 Unix 无关的计算机上使用。所以这门语言有一些潜力,而且没有其他关于 C 的书。贝尔实验室当然是唯一的来源。福特和丹尼斯当然是权威的,因为这是他的语言,他写了参考手册,这是一个关于如何编写参考手册的绝佳范例,真的,真的做得非常好。所以我扭着他的胳膊,直到他同意写一本书,然后我们写了一本书。我们的优势,至少我认为,是先发优势,那么其他人就必须跟着你,如果他们要做什么的话。我认为它效果很好,因为丹尼斯是一位出色的作家,我是说他真的,真的做到了。那本书里的参考手册就是他的,我对此毫无贡献。所以,只是水晶般清晰的散文,表达得非常好。然后我和他,我写了大部分的阐述性材料,然后我和他进行了通常的来回乒乓球比赛,精炼它。但我花了很多时间试图找到能够联系起来的例子,它们会告诉人们他们可能需要知道的,在他们应该考虑需要它的时间。我不确定它是否完全成功,但它大部分都相当不错。你认为例子的力量是什么?我是说,你是创造者,至少是第一个写“Hello World”程序的人之一,就像这个例子一样。如果外星人在几百年后发现我们的文明,他们可能会说“你好”,还有其他程序,就像一个半坏的机器人与他们用“Hello World”交流一样。所以,那是一个代表性的例子。那么,你认为例子有什么力量?我认为一个好的例子会告诉你如何做某事,它将是代表性的。你可能不想完全做那件事,但你会想做一些至少在同一大方向上的事情。所以 C 书中的很多例子都是为了这些非常非常简单、直接的文本处理问题而挑选的,这些问题是 Unix 的典型。我想读取输入并再次写入。有一个 copy 命令。我想读取输入并对其进行一些处理然后写出。有一个 grep。所以这类事情是人们想要做的代表,并把它们说清楚,这样他们就可以拿走它们,看到核心部分,并根据自己的喜好修改它们。我认为很多编程书籍,我现在不怎么看编程书籍,但当我这样做时,很多都不这样做。它们不给你既现实又可能你想做的例子。有些是纯粹的语法,这里是如何将三个数字相加。好吧,拜托,我可以弄清楚。它会告诉我如何将这三个数字输入计算机,以及我将如何用它们做一些有用的事情,然后如何将它们整齐地格式化并写出来。特别是如果你跟着那个例子,做一些感觉有用的事情,那是有魔力的。是的,没错。我认为这是尝试,而且它绝不完美,但所有情况下的尝试都是要得到一些直接有用或非常有代表性的有用事情,程序员可能想要做的事情,但在这个根本上是文本处理的范畴内,读取文本,做一些事情,写文本。所以你也写了一本关于 Go 语言的书。我必须承认,我曾在 Google 工作过一段时间,我从未用过 Go。你错过了什么?嗯,我肯定错过了什么。我是说,是的,所以 Go 和 Rust,我听到的关于这两种语言的评价都很高,我想尝试一下。嗯,有很多,有 Julia,有所有这些令人难以置信的现代语言。但如果你能评论一下,或者也许评论一下,你认为 Go 在这个广泛的语言范围内处于什么位置?以及你个人对你可能永远无法尝试和探索的如此广泛的强大有趣的语言有什么感受?所以,我认为,所以 Go,嗯,Go 首先来自同样的贝尔实验室传统,部分原因不是唯一的,但三位创造者中的两位,Ken Thompson 和 Rob Pike,是的,就是那些人。然后,来自欧洲学派,特别是 Robert Griesemer 的俱乐部精神的影响,他大概是苏黎世联邦理工学院的第二代学生。所以这是一个有趣的组合。所以,在某些方面,Go 捕捉了 C 的优点。它看起来有点像 C。它有时被描述为 21 世纪的 C。表面上看,它看起来非常像 C,但同时它有一些有趣的数据结构能力。然后我认为我可以说特别有用的一部分,再次,我不是 Go 专家,尽管我合著了这本书,大约 90% 的工作是由 Alan Donovan 完成的,他是 Go 专家。但 Go 提供了一个非常好的并发模型。它基本上是 Tony Hoare 在 40 多年前提出的合作通信顺序进程。在我看来,goroutine 是谈论并行计算的一种非常自然的方式,在我做的一些实验中,它们很容易编写,而且通常会奏效,而且效率也很高。所以,我认为这是 Go 脱颖而出的一点,即并行计算模型。它非常非常容易和好。只是评论一下,你认为 C 或早期 Unix 是否预见了线程和大规模并行计算?我猜不是真的。我是说,也许有人看到了,但不是在需要你做任何事情的层面上。很长一段时间以来,处理器变得更快,然后处理器停止变得更快,因为像功耗和热量产生这样的事情。所以发生的事情是,处理器没有变得更快,而是开始有了更多的处理器。这就是并行线程的由来。所以,如果你能评论一下其他语言,你是否会因为永远无法探索它们而心碎?当然。你感觉如何?很多全方位的选择。它不会让我心碎,但我希望我能尝试更多这些语言。我最接近的是我经常在这里春天教的一门课,这是一门编程课,我经常给出一个小例子,我会尽可能多地用不同的语言来写。我现在有 20 种语言。所以,我用一种语言进行最小的实验,只是说,好的,我有一个这个微不足道的任务,我理解这个任务,它在 awk 中需要 15 行,而在其他各种语言中也不多。所以它有多大?它运行有多快?我经历了什么痛苦才学会怎么做?这就像一只秋田犬,对吧?它非常非常非常狭窄地像这样。所以,是的,但仍然是一个小样本,因为你可以,我认为编程语言最难的一步可能是第一步,对吧?所以,你正在迈出第一步。根据我的经验,有些语言非常积极,比如 Lua,一种脚本语言,我从未用过。我写了一个小程序,这个程序是一个微不足道的格式化程序,它只接收不同长度的文本行,并将它们输出成每行不超过 60 个字符的行。所以,就像在浏览器中处理流程一样。所以这是一个非常短的程序。在 Lua 中,我下载了 Lua,一个小时后它就能工作了,我一生中从未写过 Lua,只是查阅了在线文档。我用 Scala 也做了同样的事情,你可以认为它是 Java 的一种变体,同样微不足道。我用 Haskell 也做了,花了几个星期,但它确实运行得像一只乌龟。我用 Fortran 90 也做了,很痛苦,但它奏效了。我尝试了 Rust,花了几天时间才让它工作,因为内存管理模型对我来说有点陌生。我遇到的 Rust 问题,这又回到了我们刚才谈论的,我找不到良好一致的 Rust 文档。这已经是几年前的事了,我相信事情已经稳定下来了,但当时 Rust 世界的一切似乎都在迅速变化。所以你会发现一个看起来可行的例子,但它与我使用的语言版本不兼容。所以它比应该的要长。Rust 是一种我想回去的语言,但可能不会。我认为你必须做一些你想做的事情。如果你没有正确组合的东西,如果你想做,而且你又有足够的可支配时间来让它比学习新语言更糟糕,那么它永远不会发生。那么你对另一种语言 JavaScript 有什么看法?嗯,让我评论一下我刚才说的,当我被教导时,JavaScript 被认为是可能最丑陋的语言,但它可以说是正在接管,不仅是互联网的后端,而且可能在未来接管一切,因为他们现在已经学会了让它非常高效。是的。那么你对此有什么看法?嗯,我认为你在很多方面都抓住了它。当它刚出现时,JavaScript 被认为是一种相当不规则且丑陋的语言。当然,在学术界,如果你说你在研究 JavaScript,人们会嘲笑你。它根本不适合学术研究。我认为很多情况都得到了发展。语言本身已经发展,当然编译它的技术也比以前好得多。所以,从这个意义上说,它绝对是后端的一个可行的解决方案。它用于前端。嗯,我认为它是一种相当不错的语言。我写了适量的它,我玩过 JavaScript 翻译器之类的东西。我不是真正的专家,而且很难跟上新出现的东西。所以,我不知道它是否会接管世界,我认为不会,但它肯定是一种重要的语言,值得多了解。也许可以让你评论一下 JavaScript 和实际上大多数语言,Python,它们是编程体验的重要组成部分,包括库,基本上是建立在别人构建的代码之上的。我认为这可能与我们刚才谈到的 Unix 和 C 时代的经验不同,当时你从头开始构建东西。你如何看待这个基本上是利用相互堆叠的库并利用它们的世界?是的,这是一个非常敏锐的问题。过去编程之所以有趣,原因之一是你真的在自己构建一切。你必须处理的库的数量非常少,也许是 printf 或标准库之类的东西。而今天不是这样了。如果你想用 Python 和 JavaScript 做什么,你提到了这两个例子,你通常必须下载一大堆其他东西,而且你不知道你得到的是什么,绝对不知道。我这两天一直在玩机器学习,如果有什么东西不起作用,你 pip install 这个,好的,又下载了数百万兆字节的东西,你不知道那是什么。如果你运气好的话,它会奏效,如果它不起作用,你就无能为力了。你根本无法弄清楚这数千个不同的包中的哪个。我认为在 JavaScript 的 npm 环境中情况更糟。我认为那里的纪律性更差,控制也更少。而且不仅有不理解它是如何工作的方面,还有安全问题,是否有漏洞。所以你不想用 JavaScript 来运行核电站,基本上。哦,可能不会。所以,说到语言的多样性,你认为多样性是好的吗?还是你希望我们随着时间的推移会趋向于一两种编程语言?你提到了贝尔实验室的时代,人们可以,嗯,社区。语言越多,你就越会分离社区。有 Ruby,有 Python 社区,有 C++ 社区。你希望有一天它们会联合起来,只用一两种语言吗?我当然不希望这样,我也不确定是否正确,因为老实说,我认为没有一种语言可以满足世界上所有的编程需求。现在是不是太多了?嗯,可以说,嗯,但我想如果你看看它们的使用分布,大概有十几种语言占了所有编程的 95%。这似乎是合理的。然后还有另外大约 2000 种语言仍在被使用,但没有人使用,或者至少没有大量使用。但我认为新语言在很多方面都是个好主意,因为它们通常是探索语言如何提供帮助的想法的机会。我认为这是函数式语言的一个积极方面,例如,它们是人们探索那些当时看起来不可行的想法的特别好的地方,但最终也成为了主流语言的一部分。让我回到递归,Lisp,然后向前发展,函数作为一等公民,基于模式的语言,天哪,我不知道闭包等等等等。Lambda 是在,让我们称之为广泛的函数式编程社区中首先出现的有趣想法,然后进入主流语言。是的,这是一个反叛者的游乐场。是的,正是如此。因此,我认为语言本身可能不会成为主流,至少在一段时间内,但从中产生的想法是无价的。所以,让我们谈谈我最近发现的一些事情。我知道你做过很多事情,但有一件事我不知道,你曾在 Ample 中扮演过角色。在你打断我之前,通过最小化你在其中的作用,你的 Ample 是最小化函数,是的,最小化函数,没错。我不能说 Ample 的优雅和抽象能力是不可思议的。好吧,当我大约十年前第一次接触它时,你能描述一下 Ample 语言吗?当然。Ample 是一种用于数学编程的语言。技术术语,把它想象成线性规划,也就是说,建立线性方程组,它们是某种约束系统,所以你有一堆东西必须小于这个,大于那个,或者其他什么,你想找到一组值,用于一些决策变量,以最大化或最小化某个目标函数。所以,它是一种解决特定类型优化问题的方法,一种非常正式的优化问题,但它非常有用。它指定了目标函数、约束和变量,这些变量与它操作的数据是分开的。所以,这种分离允许你,你知道,戴上不同的帽子,戴上优化专家的帽子,然后戴上数据专家的帽子,来回切换。然后,你可以有其他人来参与,然后构建他们的求解器,无论是线性的还是非线性的,凸的还是非凸的,这类东西。那么,在普通生活中,你如何进入那个世界?你认为优化世界中有哪些美丽或有趣的想法?嗯,我先说一句,我绝对不是这方面的专家,而且大部分重要的工作都来自我的两位犯罪伙伴,一位是 Bob Fuhrer,他是西北大学工业工程与管理科学系的教授,我的贝尔实验室同事 Dave Gay,他是一位数值分析师和优化专家。所以,线性规划,先说线性规划是最简单的例子。所以,线性规划在学校里教授,你有一个大矩阵,总是称为 a,你说 ax 小于等于 b。所以 b 是一组约束,x 是决策变量,a 是决策变量如何组合以设置各种约束。所以 a 是一个矩阵,x 和 b 是向量。然后有一个目标函数,它只是许多 x 的总和以及它们上的一些系数。然而,这就是你想优化的东西。问题是,在现实世界中,这个矩阵 a 是一个非常非常非常复杂、非常大且非常稀疏的矩阵,模型的各个组成部分分布在系数中,以一种任何人都不明显的方式。所以你需要一种方法来表达原始模型,你和我会在黑板上写,比如“这个的总和大于那个的总和”之类的事情。所以你需要一种语言来编写这些约束。Bob 一直对建模语言感兴趣,使之成为可能的语言。有一个叫做 GAMS(通用代数建模系统)的建模语言,但它看起来非常像 Fortran,有点笨拙。所以 Bob 在 1984 年在贝尔实验室休假一年,他住在我的隔壁办公室,地理位置总是如此。他和 Dave Gay 和我开始谈论这类事情。他想设计一种语言,使之能够将这些代数规范,你知道,在集合上的求和符号,你在黑板上写的,并将它们转换成基本上是这个矩阵,然后将其传递给求解器,这是一个完全独立的事情。所以我们讨论了语言的设计。我现在不记得任何细节了,但这是一种显而易见的事情,你只是用一种类似 Fortran 的,抱歉,用代数但文本化的语言来编写数学表达式。我写了第一个版本的 Ample 程序,我的第一个 C++ 程序,它是用 C++ 写的,是的。所以我相当快地完成了它,我们写了大约 3000 行,所以它不算很大,但它只是展示了它的可行性,你实际上可以做一些对人们来说很容易指定模型并将其转换为求解器可以处理的东西。同时,正如你所说,模型和数据是分开的。所以一个模型可以与各种不同的数据以相同的方式工作,就像许多程序做同样的事情,但使用不同的数据一样。所以一个真正的好处是,模型的规范对人类来说就像你说的,是人类可读的。我真的,我一直在处理我工作的东西,我把它发给那些我确信从未编程过的同事,只是为了让他们理解优化问题是什么。我认为转换它有多难?你说了第一个原型是用 C++ 写的。将其转换为求解器可以实际使用的东西并不难,因为大多数求解器都有某种机制,可以让他们以 AI 的形式导入模型。它可能就像矩阵本身一样简单,只是某种表示形式。或者,如果你在做非线性规划的事情,可能有一些机制可以提供要调用的函数或其他模型约束。所以,Ample 所做的就是生成这种东西,然后求解器处理所有繁重的工作。然后,当求解器返回数字时,Ample 会将它们转换回你的原始形式,这样你就知道你应该购买、制造或运输多少东西。所以,我们在 84 年做到了,从那以后我没有怎么参与,除了我们写了几本关于这本书的书,这是有史以来最伟大的书之一。我喜欢那本书。我不知道为什么,这是一本出色的书。福特写了大部分。所以它真的,真的做得很好。他一定是一位出色的老师。用 Dec 排版?不,不,你在开玩笑吗?我真的很喜欢排版。所以,我不知道,我们用 tear off 完成的。我甚至不知道那是什么。是的,正是如此。我认为 tear off 是 TeX 系列的先驱。它是一种在 70 年代初在贝尔实验室完成的格式化程序。哦,它比 TeX 和类似的东西早了 5 到 10 年。然而,我只是根据记忆,我记得它很漂亮。是的,它很漂亮。除了 Unix,除了我们谈到的所有事情,你所做的所有惊人的工作,你还从事图论工作。让我问一个疯狂的问题。如果你必须打赌,而且我必须强迫你打赌,你认为 P=NP 吗?答案是否定的。尽管我告诉某人,有人问 Jeff Dean P=NP 的条件是什么,他说 P 是 0 或 n 是 1,或者反之,我忘了。但你的直觉是?我没有直觉,但我有很多有直觉的同事。他们的赌注是“否”。这是流行的,这是流行的赌注。那么,什么是计算复杂性理论?你认为这些复杂性类,特别是你在现代世界中教授的,仍然是理解问题难度的有用方法吗?我不做那种事。我最后一次接触它是在它被发明之前。因为,这是真的,我 1968 年的博士论文是关于磁带上的好东西。我是在 1968 年做的。我研究了图划分,这是一个问题。你有一个图,它是一个节点和边的图,边有权重,你想把节点分成两个大小相等的堆,这样从一边到另一边的边的数量就尽可能小。我们开发了,所以这个问题很难。事实证明,我和 Shen Lin 在贝尔实验室一起研究这个问题,我们从未找到过能保证给出正确答案的东西。我们找到了效果相当不错的启发式方法,我为我的论文剥离了一些特殊情况,但它就是很难。而这正是 Steve Cook 表明存在一类问题似乎非常困难的时候,图划分就是其中之一。但我的专业知识,如果有的话,完全早于这个发展。哦,有趣。所以,那个启发式方法,现在你关心什么?你们两个的名字,旅行推销员问题,图划分,就像,你甚至没有考虑类别,你只是在尝试寻找一个效果相当好的东西。你试图找到一个能做好工作的,而且没有你称之为闭合形式或算法的东西能给你一个保证正确的答案。我是说,将图划分与最大流最小割之类的东西进行比较。这是同一个问题,只是对一边或另一边的节点数量没有限制。这意味着它是一个简单的问题,至少据我所知。而那个说两者必须在大小上受约束的约束使得它成为一个难题。是的。所以,罗伯特·弗罗斯特有那首诗,你选择了两条路。那么,为什么你?是否存在另一个平行宇宙,你选择了唐·克努斯的算法设计之路,或者说,你不够聪明?你足够聪明,你是无限谦虚的。所以,你继续,你对编程的热爱。我是说,当你回顾那些,我是说,只是看看那个世界,那看起来就像理论计算机科学的遥远世界吗?它与编程世界有根本区别吗?我不知道。我是说,当然,在所有理论中,我就是没有那方面的天赋。我来普林斯顿读研究生时,我开始考虑研究,在我第一年结束时,我曾短暂地与约翰·霍普金斯合作过。他是诺贝尔奖得主,他说他是个很棒的人。然后我清楚地意识到,我根本不适合做这些事情。所以,我转向了我更适合的事情,那往往是编写程序,最终是写书。你说你在多伦多读本科时,做了一个关于人工智能的毕业论文或文献调查。那是 1964 年,对吗?当时人工智能的格局、想法、梦想是什么?我认为那是其中之一,嗯,你听说过 AI 的冬天,这是什么?这是 AI 的夏天,或者类似的东西。人们认为,哇,我们可以用计算机做任何事情,所有这些难题,计算机将解决它们。它们将进行机器翻译,它们将玩像国际象棋这样的游戏,它们将证明几何定理。有很多这样的例子,人们认为,哇,我们真的可以做这类事情。嗯,你知道,我有时会读到“喝彩”的集合,那是一本关于那个时代出版的精彩论文集,叫做《计算机与思想》。人们非常乐观。然后,当然,事实证明,人们认为几年内就能做到的事情,比几年要长得多。其中一些现在或多或少地得到了控制。我们终于可以玩像围棋和国际象棋这样的游戏了,而且比人们做得更好。还有一些,机器翻译比以前好多了,但那已经是 50 年,近 60 年的进步,硬件的巨大演变,以及海量的数据,你可以构建能够实际从中学习的系统。以及支持开发者协同工作的基础设施,比如开源,互联网的出现,也具有赋能作用。那么,你从那个,与冬天相反的乐观主义中吸取了什么教训?嗯,我想教训是,短期内很容易过于悲观,或者可能过于乐观。而从长远来看,你可能不应该过于悲观。我说得不太好。这让我想起了科幻作家阿瑟·克拉克的评论,他说,当一些杰出但年长的说某事是可能的时候,他可能是对的。如果他说不可能,他几乎肯定错了。但你不知道时间尺度是多少。时间尺度是好的。好吧,那么你对现在这个新的人工智能夏天有什么看法?在机器学习和神经网络方面,你似乎已经开始探索和研究这个世界,它似乎与启发式和搜索算法的世界根本不同。它现在纯粹是试图获取海量数据并从中学习,对吧?从数据中学习程序?不,不,我认为这非常有趣。我绝对不是专家。我所知道的大部分知识都来自我的学生,他们可能对我的学习能力感到失望,但……我认为它在某些方面具有巨大的潜力,游戏就是其中之一,它显然也对其他方面产生了影响。我认为,这是我绝对不是专家,我认为在某些机器学习方面存在严重问题,至少是因为它们学习的数据是我们给它们的。如果我们给它们的数据有问题,那么它们从中学习到的东西可能也是错误的。显而易见的是某种偏见。数据中有一些东西,比如,我不知道,女性在某件事上不如男性。好吧,这简直是错的。但如果它在数据中,因为历史待遇,那么机器学习的东西就会传播这种错误。这是一个严重的担忧。积极的一面是,机器学习揭示了数据中的偏见,并映照了我们自己的社会,从而帮助我们消除偏见。它就像一面镜子。这是一个乐观的观点。如果它真的这样运作,那将是绝对伟大的。而我不知道的是,它是否真的这样运作,或者,你知道,人工智能机制或机器学习机制是否会强化和放大过去错误的事情。我不知道,但我认为这是一个我们必须关注的严重问题。让我问你另一个问题。好吧,我知道没人知道,但你认为要构建一个人类水平的智能系统需要什么?这是自 60 年代以来的梦想。我们谈论游戏、语言、图像识别,但真正的梦想是创造人类水平或超人类水平的智能。你认为要做到这一点需要什么?我们接近了吗?我不知道,我不知道。你想骗我猜个假设。我是说,图灵在他的关于机器智能的论文中谈到了这一点,大概在 50 年代初。他有图灵测试的想法。我不知道图灵测试是什么。我不知道,它至少是一个有趣的测试,在某种模糊的意义上是客观的,你是否能从中读出任何结论是另一回事。你对人工智能的未来有担忧、顾虑或兴奋吗?嗯,很多人都担心。你可以广泛地说,不仅仅是人工智能,基本上是计算在各种形式上接管世界。你对这个未来感到兴奋吗?计算无处不在的可能性,还是你担心?它是这些的某种组合吗?我认为几乎所有技术从长远来看都是有益的,但也有很多例子表明它们并非如此,无论是从长远来看对某些人,还是从短期来看。计算也是如此,人工智能也是如此。但计算,广义上说,例如,今天的隐私问题。使用社交媒体等意味着,商业监控意味着,比你可能觉得舒适的要多得多的人,你知道,企业、政府等等,对我们了解的更多。所以这是一个例子,这是一个可能的负面影响,计算无处不在。这是一个有趣的例子,因为它也可以是积极的,如果正确利用的话。这是一个很大的“如果”。所以,我,你知道,我对人类心理学有浓厚的兴趣,而人类似乎对这个数据问题非常偏执。但这取决于年龄组。是的,似乎年轻人是这样。所以,看到 50 年后社会的样子,我感到很兴奋。对隐私的担忧可能完全颠倒过来,完全基于人类心理学,而不是实际的担忧,或者不是。你对摩尔定律有什么看法?你说了很多话。你谈到了编程语言的设计和它们的想法,它们来自约束和它们运行的系统。你认为摩尔定律,系统的指数级改进会无限期地持续下去吗?目前对此有各种各样的看法。或者你认为会有一个平台期?嗯,模糊的答案是,没有指数可以永远持续下去。你会耗尽某种东西。就像我们说的,时间尺度很重要。所以,如果它持续足够长,那可能就是我需要的。是的,没错。它无关紧要。所以,我不知道。我们已经看到摩尔定律发生变化的地方。例如,前面提到的处理器不再更快。但你利用了同样的增长,你知道,在给定区域内放置更多东西,将它们水平增长而不是垂直增长。所以,你可以在同一个芯片上获得更多的处理器或内存或其他东西。这会遇到限制吗?大概是因为,你知道,在某个时候,你会下降到单个原子。所以你必须找到一种方法来绕过它。我们会找到一种方法来绕过它吗?我不知道。我刚说了,如果我说了,我就会错。我们会说,我刚和 Jim Keller 谈过,他说,他实际上描述了,他认为摩尔定律将继续很长时间,因为你提到了原子。在达到量子水平之前,我们实际上还有千倍的增加来减小晶体管尺寸。所以,仍然有很多可能性。他认为它会无限期地继续下去,这是一个有趣的乐观观点。但你认为编程语言将如何改变以适应这种增长,无论我们是否遇到瓶颈?你认为编程语言的设计方式会发生根本性变化吗?我对此不担心。我认为会发生的是,我们现在在某些领域看到的将继续下去,即更多的编程将由程序而不是由人来完成。而且,更多的是通过声明式而不是过程式机制来完成,我说我想要发生什么,你来弄清楚如何做。在很多情况下,这已经是狭窄领域的专业语言的领域了。但你可以想象它会扩大。所以,我不必说太多,太多细节。一套软件,我们称之为语言或程序或类似的东西,将弄清楚我想要做什么。一些更高层次的抽象。是的。有一天可能会达到人类水平。也许只是使用。所以,你在这里普林斯顿大学教授“计算机与我们的世界”课程,该课程向非专业人士介绍计算和编程。仅仅从这次经历来看,你对那些对编程一无所知但又对这个世界感到好奇的人有什么建议?或者编程似乎越来越成为人们至少在这个世界上需要的基本技能?嗯,我可以推荐一本好书。那是什么?对于这门课程。我认为这是关于每个人都应该如何编程的问题。我认为答案可能不是,但我认为每个人都应该至少了解它是什么,这样,如果你对某人说“我是一名程序员”,他们就会对这可能是什么有一个概念。或者,如果你说“这是一个程序”或“这是由一台运行程序的计算机决定的”,他们就会有一个模糊的直观理解,并且准确地理解是什么。

这可能意味着我在这门课程中所做的一部分工作,这门课程绝对是为非技术人员准备的。我的意思是,典型的人是历史或英语专业的学生,我试图解释计算机是如何工作的,它们是如何完成工作的,什么是编程,如何编写程序,以及计算机之间是如何通信的,以及它们在通信时会做什么。然后我会说,在那个课程里,没有人,很少有人会成为一个真正严肃的程序员,但至少他们对所有这些东西有了更好的了解,不仅仅是编程,还有计算机和通信背后的技术。他们会写出来吗?他们会尝试自己写程序吗?哦,是的,是的,非常少量。我向他们介绍了机器在高级语言以下的层面是如何工作的,所以我们有一个玩具机器,它有一个非常小的指令集,只有几十条指令,他们编写了非常简单的汇编语言程序。哇,那好吧,如果你要给人们一些编程世界的风味,竞争世界的风味,那应该是什么例子呢?所以,一点点汇编,让你在最低的层面上了解程序到底在做什么。是的,我的意思是,从某种意义上说,没有最低的层面,因为你可以一直往下走,但那就是我划定的界限。所以,计算机拥有一个相当小的、非常简单的指令集,它们可以执行加、减、分支等操作,就像你之前提到的那样,你可以用那个级别编写代码,它就能完成工作。然后,我们有了像 Fortran 或 C 或其他语言那样的高级语言所带来的抽象层级,这使得编写代码更容易,并且不太依赖于特定的架构。然后我们谈论了他们一直在使用但可能没有意识到的各种程序,比如他们在电脑上运行的 Mac OS 或 Windows,以及他们在手机上下载的应用程序。所有这些东西都是程序,就像我们刚才讨论的,只是规模宏大。很容易忘记它们是实际的程序,是人们编写的。有工程师,他们写了那些东西。是的,没错。所以,在某种程度上,我期望他们从他们写的那种只有 5 到 10 行的玩具汇编语言程序,它能将两三个数字相加,到一个巨大的概念飞跃,变成他们手机上的浏览器,或者其他什么。但如果你从宏观的角度看历史,它真的就是一样的东西。你认为世界会是什么样子?你认为计算机是如何改变世界的?当你身处其中时,有时很难看到全局。但我想问的是,你是否注意到了一些随着时间的推移而发生的事情,比如你提到的学生们现在更分心了,他们看着他们的设备,现在有设备可以看了,对吧?嗯,我认为计算已经改变了它的数量,显而易见,但我认为其中一个方面是人们相互互动的方式,无论是本地还是远方。当我,你知道,和那些孩子一样大的时候,打电话给别人是一件大事,因为要花很多钱,那是 60 年代的事情,对吧?而今天,人们不打电话了,他们发短信或者其他什么。人们认为没有什么大不了的,可以与世界任何地方的朋友或家人进行定期的通信、会议、视频等等,他们根本不考虑这些。所以,这只是通信方面的问题。你认为这会让我们更亲近,还是会让我们疏远人与人之间的亲密关系?我认为这在很大程度上取决于各种事情。所以我比以前更频繁地和我住在加拿大的哥哥姐姐交换邮件,而不是在电话里和他们说话。所以,大概每两三天,我就会收到或寄给他们一些东西,而 20 年前,我可能不会在电话里和他们说那么多。所以,从这个意义上说,这让我的哥哥姐姐和我更亲近了,这是一件好事。我看着校园里的孩子们,他们大多低着头,玩着手机,以至于我不得不躲避他们。我不知道这是否让他们在某些方面更亲近了。有一些社会学研究表明,人们实际上不像以前那么亲近了。我不知道这是否真的属实,但我可以看到孩子们身上潜在的缺点,你会想,拜托,醒醒吧,闻闻咖啡的味道,或者别的什么。没错。但如果你再看看,没有人能预测未来,但你对未来感到兴奋吗?你稍微触及了人工智能,但你对未来 10 到 20 年的计算感到兴奋吗?你曾经在那里,那时真的没有计算机,而现在计算机无处不在,遍布世界各地,非洲和亚洲,几乎每个人,世界上几乎每个人都拥有一个设备。所以,你对那个未来感到乐观吗?老实说,这很复杂。我认为有些事情是好的。我认为人们有潜力在各地改善他们的生活,这显然是好的。同时,至少在短期内,你可以看到很多很多坏的方面,人们变得更加部落化或狭隘于他们的兴趣,而且“我们”和“他们”的界限变得越来越大,人们以各种方式使用计算机来误导、歪曲或公然撒谎,这正在影响地方政治,我认为也影响着世界各地。对政治体系等的长期影响,谁知道呢?谁知道呢?人们现在有了发言权,这是一件强大的事情。有媒体的人有发言权,但每个人都有发言权,由此产生的混乱非常有趣。是的,如果你能回到过去,重温生命中一个让你真正快乐的时刻,除了家人之外,或者是一个深刻的转变时刻,有没有什么时刻或时刻从你的记忆中跳出来?我不认为有具体的时刻。我认为在贝尔实验室有很多很多美好的时光,你建造了一些东西,它奏效了。是的,工作。所以,那些时刻,有人使用了它,他们说,“哦,这真酷。”在 70 年代,当 UNIX 刚刚起步,有很多唾手可得的成果和有趣的事情要做的时候,这种情况相当频繁地发生。一群人,我们都聚在一起,如果你做了什么,他们会为你尝试一下。我认为在某种意义上,那是一段非常非常美好的时光。Ock 就是一个例子。然后你把它钻研出来,人们就使用了它。是的,绝对是。现在有数百万人使用它,你所有的愚蠢错误都暴露在他们面前,让他们查看。所以,这很复杂。是的,这很可怕,很脆弱,但也很美,因为它确实对这么多人产生了积极的影响。所以,我认为没有更好的方式来结束了。布莱恩,非常感谢你的谈话,这是我的荣幸。好的,我很乐意。很有趣。感谢您收听与布莱恩·克尼汉的这次谈话,也感谢我们的赞助商 8Sleep 床垫和 Rake on 耳塞。请考虑通过访问 aleep.com/lex 和 rakeon.com/lex 来支持这个播客。点击链接,购买这些产品。这两款产品都非常棒。这是支持这个播客和我正在做的事情的最好方式。这样他们就知道是我推荐的,并增加了他们将来支持这个播客的可能性。如果你喜欢这个节目,请在 YouTube 上订阅,在 Apple Podcasts 上给它五星好评,在 Patreon 上支持它,或者在 Twitter 上与我联系,用户名是 LexFreedman,不知何故奇迹般地没有字母 e,就是 FriDman,因为我们移民到这个国家时,拼写不太好。现在,让我用布莱恩·克尼汉的一句话结束:不要评论糟糕的代码,重写它。感谢您的收听,希望下次再见。