📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Chris Lattner: The Future of Computing and Programming Languages | Lex Fridman Podcast #131

Lex Fridman2:42:41

Transcription

以下是与 Chris Lattner 的对话,这是他第二次来到播客。他是现代计算领域最杰出的工程师之一,他创建了 LLVM 编译器基础设施项目、Clang 编译器、Swift 编程语言,并且在张量流 (TensorFlow) 和 TPU 方面做出了许多关键贡献。在谷歌 (Google) 工作期间,他曾担任自动驾驶软件副总裁。在特斯拉 (Tesla),他是一位软件创新者和领导者。现在,他在 SciFi 担任平台工程高级副总裁,致力于彻底改变芯片设计,使其更快、更好、更便宜。

快速提及每位赞助商,然后是一些与本集相关的想法。

第一位赞助商是 Blinkist,一个可以总结数千本书籍核心思想的应用程序。我几乎每天都用它来学习新事物,或者选择接下来要阅读或收听的书籍。

第二位是 Nootro,功能性无糖口香糖和薄荷糖的制造商,我用它来为我的大脑注入咖啡因、茶氨酸和 B 族维生素。

第三位是 MasterClass,来自世界上最优秀的人士提供的在线课程,涵盖从火箭到游戏设计,从扑克到写作,再到吉他等各种主题。

最后是 Cash App,我用来给朋友发送食物、饮料和不幸的赌博输款的应用程序。

请查看描述中的赞助商,以获取折扣并支持此播客。

顺便说一句,我想说的是,Chris 在人际关系方面一直是我学习的榜样,因为他作为一名工程师和工程师的领导者非常出色,但他仍然能够保持谦逊,特别是谦逊到能够倾听不同的声音并从中学习。他从早期就一直支持我制作这个播客,对此我永远感激不尽。说实话,我一生的大部分时间里,没有人真正相信我会取得什么成就,所以当另一个人看着我,让我觉得自己可能是一个特别的人时,这确实是鼓舞人心的。这对教育工作者来说是一个教训:角落里那个怀揣梦想的怪孩子,可能需要你的爱和支持才能让梦想茁壮成长。

如果你喜欢这个节目,请在 YouTube 上订阅,在 Apple Podcasts 上给予五星好评,在 Spotify 上关注,在 Patreon 上支持,或者在 Twitter 上与我联系,我的用户名是 @LexFridman。

现在,这是我和 Chris Lattner 的对话。

史蒂夫·乔布斯、埃隆·马斯克和伟大的杰夫·迪恩最强的品质是什么?你已经有机会与他们每个人共事了。

你从一个简单的问题开始。嗯,这三个人非常不同。我想你可以对他们进行成对比较,而不是群体比较。所以,如果你看看史蒂夫·乔布斯和埃隆……我与埃隆的合作比与史蒂夫的合作要多得多。他们有很多共同点。他们都在各自的方式上是富有远见的。他们都在各自的方式上非常苛刻。我的感觉是,史蒂夫更关注人为因素,而埃隆更关注技术。

人为因素是什么意思?

史蒂夫试图创造让人感觉良好、人们喜爱、影响人们生活方式的东西。他也在展望未来,看看人们想要什么。而我认为埃隆更专注于学习指数级增长是如何运作的,并预测其发展。

史蒂夫与许多工程师合作,这是我从传记中读到的,一个设计师如何与工程师沟通并赢得他们的尊重?

我没有与史蒂夫密切合作,我一点也不专业。我的感觉是,他会给人们施加很大的压力,但当他得到一个他觉得有道理的解释时,他就会放手。他确实非常尊重工程,但他知道何时该施压。当你善于读懂人时,你就能知道他们何时有所保留,何时可以从他们那里获得更多。我认为他在这一点上做得非常好。

我的意思是,如果你比较其他……其他那些人,比如杰夫·迪恩?杰夫·迪恩是个很棒的人。他非常聪明,就像其他人一样。杰夫是个非常、非常、非常善良的人,心地善良。他是典型的谷歌人。他希望人们快乐。他将这一点与才华结合起来,所以他能以一种非常棒的方式将人们聚集在一起。他绝对不是那种 CEO 型的人,我认为他甚至不想成为那样的人。

你知道他还在编程吗?

哦,绝对还在编程。杰夫是一位了不起的工程师,至今如此。这从未改变。所以,很难将杰夫与那两个人中的任何一个进行比较。我认为杰夫通过技术和自己构建技术来领导,然后吸引和激励人们。所以,我认为这是杰夫身上令人惊叹的一点。但这些人,无论优缺点,都非常鼓舞人心,并取得了惊人的成就。所以,我非常幸运能与这些人共事。

就你自己而言,你领导过大型团队,你完成过许多令人难以置信的、困难的技术挑战。你从他们那里学到了什么关于领导的知识?

是的,嗯,我认为领导力非常困难。这真的取决于你想要什么。我认为你真的需要了解你在说什么。所以,扎根于产品、技术、业务、使命非常重要。理解人们在寻找什么,他们为什么在那里。特斯拉最令人惊叹的事情之一就是统一的愿景。人们在那里是因为他们相信清洁能源和电气化等等。

其他的是要理解真正激励人们的是什么,如何找到最好的人,如何制定一个切实可行的计划。领导力有很多不同的方面,这真的取决于时间、地点、问题。你知道,有很多问题不需要解决。所以,如果你专注于正确的事情并正确地确定优先级,那真的可以帮助推动事情的发展。

你提到了两件有趣的事情。一件是你真的需要了解你在说什么。你已经完成了许多非常具有挑战性的技术工作。当然,我假设你天生就技术娴熟,但假设情况并非如此,你是如何发展技术专业知识的?比如,即使在谷歌,你也参与了……我不知道多少个项目,但非常具有挑战性、非常多样化的编译器、TPU、硬件、云服务等等。

随着经验的增长,我越来越习惯于接受“不知道”的状态。所以,领导力的一大部分实际上并不是拥有正确的答案,而是找到正确的答案。所以,如果你在一个由了不起的人组成的团队中工作,而这些地方,许多公司都有了不起的人,问题是如何将人们聚集在一起,如何建立信任,如何让人们敞开心扉,如何让人们……有时在想法不够好但却是美好事物的开端时,表现出脆弱。你如何提供一个环境,让你不仅仅是自上而下地命令别人做事,而是鼓励人们成为解决方案的一部分?并提供一个安全的空间,如果他们没有做正确的事情,他们愿意告诉你?

所以,你乐于问愚蠢的问题?

愚蠢的问题是我的专长。

嗯,我最近在硬件部门工作,我对芯片设计知之甚少。我非常了解如何使用它们,我了解一些原理和技术层面,但事实证明,如果你问很多愚蠢的问题,你会学得非常非常快。当你周围都是想教导和学习的人时,这可以是一件美妙的事情。

那么,我们来谈谈编程语言,如果可以的话,从这个荒谬的哲学层面开始,因为我……我不会变得浪漫,Lex。我永远会变得浪漫。Tor,我很抱歉。为什么编程语言甚至重要?

好吧,非常感谢。所以,你的意思是,为什么我们应该关心任何编程语言?或者为什么我们关心编程计算机?

不,为什么我们关心编程语言设计,创建有效的编程语言,选择一种编程语言而不是另一种编程语言?为什么我们一直在努力并通过编程语言的演变来改进?

当然,当然,当然。好吧,所以,我认为你必须回到我们在这里试图做什么。所以,我们有这些……这些被称为计算机的野兽,它们非常擅长做特定的事情,我们认为让它们为我们做这些事情很有用。现在,你有一个如何最好地表达它的问题,因为你仍然有一个人类大脑,里面有一个想法,你想实现一些东西。所以,有很多方法可以做到这一点。你可以直接与机器对话,说汇编语言,然后你可以直接表达计算机理解的内容。这很好。然后,你可以有越来越高的抽象级别,直到机器学习,你正在设计一个神经网络来为你完成工作。问题是,你希望在这个过程中停在哪里?以及这样做会带来什么好处?

所以,编程语言通常有 C、Fortran、Java、Pascal、Swift,有很多不同的东西。它们都有不同的权衡,它们在解决问题的不同部分。现在,大多数编程语言都在努力让你拥有一些基本的东西,比如跨不同硬件的可移植性。所以,你可以在 Intel PC 上运行,可以在 RISC-V PC 上运行,可以在 ARM 手机上运行,等等。很好。我想写一个程序并让它具有可移植性。这是汇编语言做不到的。

现在,当你开始审视编程语言领域时,我认为这很有趣,因为编程语言都有权衡。大多数人会走上前去,看看语法的表面,然后说,“哦,我喜欢花括号”,或者“我喜欢制表符”,或者“我喜欢分号,或者不分号,或者别的什么”。这些是主观的、相当主观的、非常肤浅的东西。但编程语言如果做得好,实际上可以非常强大,它们带来的好处是表达能力。

如果你看看编程语言,它们实际上有两个不同的层面。一个是深入到细节,如何让计算机高效运行,诸如此类,类型系统、编译器等等。另一个是用户界面。而编程语言的用户界面实际上是一个设计问题,很多人不这样认为。

用户界面是什么意思?所有那些带有花括号的东西?

是的,所有那些东西。用户界面,而用户界面意味着用户界面。所以,真正发生的是人与机器之间的接口。而人是很难的。人有感情,有他们喜欢的东西,有他们不喜欢的东西。很多人对待编程语言就像人类只是抽象的生物,无法预测一样。但事实证明,实际上存在更好和更差的情况。人们可以分辨出一种编程语言是好是坏,或者它是否是一个意外。

而 Swift 的一个特点是,投入了大量的时间和大量的人力来真正打磨它,让它感觉很好。但它下面也有非常好的细节。

你说 Swift 让很多人感觉很好。你是如何达到那个点的?你是如何预测成千上万、数十万人会喜欢使用这个编程语言的用户体验的?

你可以从更好和更差的角度来看。所以,如果你必须写很多样板代码,或者类似的东西,你会觉得效率低下。所以,这是一件坏事。你可以从安全性来看。比如 C,它被称为内存不安全的语言。所以,你会得到悬空指针,你会得到所有这些类型的错误,然后你必须花大量时间调试,这非常令人头疼,你会觉得效率低下。所以,通过从体验中减去这些东西,你会得到……嗯,更快乐的人。

但……再次打断,我很抱歉。但如果看看 Stack Overflow 上最高产的人,他们有一套优先级,这可能并不总是与大多数用户的体验完全相关。你知道,比如,如果你看看 Stack Overflow 上上传最多的“正确”答案,它通常会非常……可以说是优先考虑安全的代码、正确的代码、稳定的代码,诸如此类。而不是,比如,我想在我的 BASIC 中使用 GOTO 语句。我……我想使用 GOTO 语句。如果 99% 的人想使用 GOTO 语句,或者使用完全不正确、不安全的语法呢?

我不认为人们实际上……如果深入研究,人们并不真正关心 GOTO 语句或 if 语句。他们关心的是实现目标。所以,真正的问题是,我想设置一个 Web 服务器,我想做一件事,而我……无论如何,我能多快实现它?所以,从编程语言的角度来看,有两个方面很重要。一个是存在哪些库,然后你能多快地将它们组合起来,以及周围的工具是什么样的?而当你想要构建一个缺失的库时,你会怎么做?

现在,这就是你看到世界之间巨大的力量分歧的地方。所以,你看看 Python。Python 非常擅长组装东西,但它在构建所有库方面并不那么出色。所以,你得到的是,因为性能原因等等,Python 建立在 C 之上。这意味着做某些事情……用 Python 做某些事情并不真正明智。你用 C 来做,然后你快速……然后你生活在两个世界里。两个世界从来都不是真正好的,因为工具和调试器不起作用,诸如此类的事情。

你能稍微解释一下你说的“Python 不擅长构建库”是什么意思吗?是说它不适合开发者来添加库,还是……

不,不是说它不适合开发者来添加库。或者,语言……或者,它是 Python 和 C 之间的舞蹈?Python 是一个很棒的语言。我无意说 Python 对库不好。我本来想说的是,Python 有一些 Python 非常擅长的库。你可以用 Python 来写。但还有其他事情,比如,如果你想构建一个机器学习框架,你不会用 Python 来构建一个机器学习框架,因为性能原因。或者,你想要 GPU 加速或类似的东西。相反,你写了很多 C 或 C++ 代码,然后你从 Python 调用它。所以,这是因为在 Python 设计中所做的决定。而这些决定有其他制衡因素。

但关键是,当你从编程语言的角度来看这个问题时,你会说,“酷,我如何构建这个库目录,这些库非常强大,然后如何让它们以一种感觉良好的方式组合起来,并且通常第一次就能工作?”因为当你谈论构建一个东西时,你必须将调试、修复、周转周期、开发周期以及所有这些东西都包含到构建这个东西的过程中。不仅仅是敲出代码。

所以,这就是像……比如,在编译时捕获错误是有价值的。但如果你深入研究细节,比如 Swift,它有一些像值语义的东西。这是一种花哨的说法,意思是当你……将一个变量视为一个值时,它就像一个数学对象一样。所以,你在 PyTorch 中用过一点点。在 PyTorch 中,你有张量。张量是……数字的 N 维网格。非常简单。你可以对它们进行加法和其他运算。这完全没问题。但有时为什么你需要克隆一个张量?你遇到过这种情况吗?

是的。

为什么你需要克隆一个张量?它是 Python 中常见的对象问题。所以在 Python 中,就像 Java 和许多其他语言一样,这并非 Python 独有。在 Python 中,它有一个叫做引用语义的东西,这是这个的极客解释。这意味着你实际上有一个指向某个东西的指针,而不是那个东西本身。现在,这是由于很多实现细节,你不想深入研究。但在 Swift 中,你有一个叫做值语义的东西。所以,当你有一个 Swift 中的张量时,它是一个值。如果你复制它,它看起来就像你有一个唯一的副本。如果你去改变其中一个副本,它不会更新另一个,因为你只是复制了这个东西。

所以,这在……至少在计算机科学、数学中心学科中,对于 Python 来说是高度容易出错的,即……你期望像数学一样表现的东西,它不像数学一样表现。事实上,它悄悄地不像数学一样表现,然后可能会毁掉你的整个数学。

没错。然后你又陷入了调试模式。

没错。现在,你只想完成某件事,然后你说,“等等,等等,我需要在哪个层面……我需要在哪个层面放克隆?这个堆栈的哪个层面?这非常复杂。我以为我正在重用别人的库,现在我需要理解它,才能知道在哪里克隆一个东西。”

而且很难调试,顺便说一句。

没错。所以,这就是编程语言真正重要的地方。所以,在 Swift 中拥有值语义,这样……你既能获得数学像数学一样工作的优势,也能获得效率优势。某些实现细节在那里真正使你作为程序员受益。

你能澄清一下值语义吗?你如何知道一个东西应该被视为一个值?

所以,Swift 有一种相当强的文化和良好的语言支持来定义值。所以,如果你有一个数组,张量就是其中一个例子。机器学习领域的人们非常习惯于……只考虑数组。同样的事情。你有一个数组,你放……你创建了一个数组,你放了两个、三个或四个东西进去,然后你把它传递给另一个函数。

嗯?

发生了什么?

你会在你传递进去的那一侧看到它。这叫做引用语义。现在,如果你传递一个数组给一个函数,它把它存放在某个字典或其他数据结构中。好吧,它以为你只是把那个数组给了它。然后你返回。而那个数组的引用仍然存在于调用者那里。他们继续往里面放东西。你交给它的人可能认为他们拥有那个数组的唯一引用,所以他们不知道这会在后台发生变化。

所以,这就是你最终需要克隆的地方。比如,我传递了一个东西,我不确定我是否拥有唯一版本,所以现在我必须克隆它。所以,值语义的作用是让你说,“嘿,我有一个……在 Swift 中,它默认为值语义。”所以,默认为值语义。因为大多数东西都应该是值,所以这样做是有意义的。而其中重要的一点是,数组、字典以及所有其他集合或事物的聚合也具有值语义。所以,当你把它传递给程序的其他部分时,你不必进行防御性复制。

所以,这在两个方面都很棒。它很棒,因为你消除了错误,这是一件大事,对生产力来说是头等大事。但它也对性能有好处,因为当你进行克隆时……你把数组传递下去,它就像,“我不知道别人有没有。”我必须克隆它。好吧,你刚刚复制了一堆数据,可能很多。然后,调用你的那个东西可能没有保留旧的东西,所以你刚刚复制了它,而你可能不必。

而 Swift 中的值语义的工作方式是,它使用一种叫做“写时复制”的东西。这意味着你……你获得了安全性和性能的优势。它还有另一个特殊的技巧,因为……如果你想到像 Java 这样的某些语言,它们有不可变的字符串。所以,它们试图做的是提供值语义,通过纯粹的不可变性。函数式语言在很多地方都有纯粹的不可变性。这提供了一个比它提供的价值语义更安全模型。

问题是,如果一切都不可变,一切都很昂贵,一切都需要复制。例如,在 Java 中,如果你有一个字符串 X 和一个字符串 Y,你将它们连接起来。我们必须分配一个新的字符串来保存 XY。如果它们是不可变的呢?字符串在 Java 中是不可变的。对于短的字符串有优化,而且很复杂。但总的来说,把它们看作是单独的分配。所以,当你将它们连接起来时,你必须分配第三个东西。

因为 Swift 值语义系统的美妙之处在于,如果你有一个 Swift 字符串,然后你说,“嘿,放进去 X。”然后他们说,“附加 Y、Z、W。”它知道只有一个引用。所以,它可以进行就地更新。所以,你不会在旁边分配大量东西。你不会遇到所有这些问题。当你把它传递出去时,你可以知道你拥有唯一的引用。如果你把它传递给不同的人,但没有人改变它,他们都可以共享同一个东西。所以,你获得了纯粹可变设计的许多优势。所以,你得到了一个很好的甜点,我还没有在其他语言中见过。

这就像……我以为会有某种哲学叙事,你必须为此付出代价,因为听起来……我认为值语义有利于调试的简便性,或者最小化错误的风险,将错误的症状……将错误的症状拉近错误的根源,无论你怎么说。但你说,如果正确实现,也没有性能损失?

嗯,所以,一切都有权衡。所以,如果你在做非常底层的操作,有时你会注意到成本。但然后你所做的是,你说,“什么是正确的默认值?”

所以,回到用户界面。当你谈论编程语言时,Swift 做的一件主要的事情,让人们喜欢它,而这在设计语言时并不明显,就是这种……渐进式复杂性披露的用户界面原则。所以,Swift 就像许多语言一样,非常强大。问题是,作为用户,你何时必须学习它的强大之处?

所以,Swift 就像 Python 一样,允许你从……比如,“打印你好,世界。”

嗯。

某些其他语言……以“public static void Main”开始,所有这些仪式。所以,你教一个新人,“嘿,欢迎来到这个新东西。让我们来谈谈公共访问控制、类。那是什么?string.System.out.println。比如,包?天哪。”

所以,如果你把它拿过来,你说,“我们需要包,你知道,模块。我们需要强大的东西,比如类。我们需要数据结构。我们需要……所有这些东西。”问题是我们如何分解复杂性?以及如何让普通情况是你正在处理那些正确工作的东西,默认情况下给你良好的性能。但然后,作为高级用户,如果你想深入,你可以获得完整的 C 性能,完全控制底层指针,你可以调用 malloc,如果你想调用 malloc。这在每个教程的第一页都不推荐,但实际上当你想要完成工作时,它非常重要。

所以,能够拥有那个才是真正的设计。编程语言设计非常非常困难。我认为很多人……再次,除了用户界面之外,很多人都认为它是主观的。没什么,它就像花括号,或者别的什么,只是某人的偏好。但实际上,好的设计是你能够感受到的。

有多少人参与了好的设计?所以,如果我们看看 Swift,从历史上看……我的意思是,这可能也涉及到……这可能也涉及到史蒂夫·乔布斯的问题,即需要多少独裁的决策,而不是……协作?我们将讨论所有这些如何出错或正确,但……

嗯,Swift……我不能谈论普遍的设计。所以,Swift 的工作方式是,有一个核心团队。所以,核心团队是……六七个人左右。是那些从早期就开始与 Swift 合作的人。所以,我……而早期并不是很久以前。好吧,是的。所以,它……它在 2014 年公开,所以现在已经公开六年了。但……但仍然有足够的时间,有一个故事情节。好吧,犯过错误,然后被修复,然后你学到一些东西,然后你……你知道。

所以,核心团队所做的是提供连续性。所以,你想,“好吧,有一个很大的漏洞,我们想填补它。我们知道我们想填补它。所以,不要做其他侵占那个空间的事情,直到我们填补那个漏洞。”那里有一个缺失的巨石。我们想做那个巨石。即使不是今天,也要把它做出来。保持那个空间。而核心团队记得……记得那个巨石的神话。

是的。有一个对未来的广泛的看法,以及对它的共同理解。结合对过去发生过的事情的共同理解,哪些是成功的,哪些是不成功的。

下一层是……所谓的 Swift Evolution 社区。在这种情况下,有数百人非常热衷于 Swift 的发展方式。这真是太棒了。核心团队不一定需要提出所有好主意。你有数百人在那里关心某件事,他们也提出了非常好的主意。这提供了一个……想法的滚筒。所以,演进过程是……很多人在一个话语形式中,他们正在……正在讨论,试图……试图谈论,“好吧,我们应该向左还是向右?如果我们这样做,什么会是好的?”你知道,这里有数百人,所以你可能得不到共识,不是明显的共识。

所以,有一个提案过程,允许核心团队和社区一起解决这个问题。核心团队的目标是获得社区的共识,并提供……提供护栏,但也提供长期的……确保我们朝着正确的方向前进。

所以,那个小组代表了……你认为他们能捕捉到人们对用户界面的喜爱程度吗?

嗯,这是我们经常谈论的事情,我们很关心。我们做得有多好,有待商榷。但我认为到目前为止我们做得相当好。

初学者是否在考虑范围内?因为你说了渐进式复杂性披露。

我们非常关心……非常关心这一点。非常关心力量。非常关心效率。有很多好的设计因素。你必须找到一种方法来……来处理它。所以,如果你想到……我喜欢的语言是 Lisp。可能仍然是,因为我使用 Emacs。但我没有认真做过 Lisp 的任何事情。但它有大量的括号。

我也……你知道,用 Java 和 C++……花括号。你知道,我……我喜欢……我喜欢花括号之间的舒适感。你知道,Python 真的……抱歉打断。就像,最后一点,对我来说,作为一种设计,如果我是一个语言设计师,天哪,我希望……我会非常惊讶 Python 没有花括号,但仍然会让人感到舒适。所以,就像,我可以看到所有这些论点。

但看看,这是证据,它不是关于花括号还是制表符。

没错。这是一个很好的观点。所以,就像,你知道,有证据表明……这是最有争议的事情之一。

哦,当然。就像标签和空格一样。它确实……有一个明显的正确答案。但实际上并不重要。

那是什么?来吧,我们是朋友。来吧,你想对我做什么?人们会……一半的人会退出。

所以,你能够识别出对体验不重要的事情吗?

不,不,不。这总是……这是一个非常困难的……简单的决定是简单的。我的意思是,你……C 很好。这些不是有趣的事情。有趣的是困难的。困难的地方是……嘿,我们想做一件事。每个人都同意我们应该做。桌上有一个提案。但它伴随着所有这些坏事。好吧,我们该怎么办?我们只是接受它吗?我们推迟它吗?我们说,“好吧,也许有这个其他功能,如果我们先做那个,这个就会奏效。”

如果我们这样做,我们会把自己逼入绝境吗?所以,这就是……再次,你拥有这个核心团队,他们……拥有一定的连续性,拥有视角,拥有一些历史理解,这真的很有价值。因为你得到……这不仅仅是一个大脑。你得到了多个人的力量,他们聚集在一起做出好的决定。然后你得到了这些人中最好的。你还可以利用周围的社区。

关于……比如,Python 中只有一个类型,或者……严格的类型?

是的,是的。让我们来谈谈这个。所以,所以……我喜欢你这样说。所以,所以……很多人会说 Python 没有类型。没有类型。是的。我听你听得够多了,所以我……我是一个粉丝。听了太多播客和视频谈论这个。哦,是的。所以我认为 Python 有一个类型。

所以,比如,当你将 Python 导入 Swift 时,顺便说一句,效果非常好。一切都以 Python 对象的形式出现。现在,这里有权衡,因为……你知道,这取决于你优化什么。Python 是一个非常成功的语言,有充分的理由。因为它有一个类型,你免费获得了鸭子类型等等。但另一方面,你正在……你正在让它非常容易地……快速地敲出代码。一方面,你也在让它非常容易地引入……复杂的错误,需要调试。你把字符串传递给一个期望整数的东西,它不会立即崩溃。它会一直追溯到堆栈。你发现自己在一个你真的不想知道任何事情的代码中间。然后它就爆炸了。你只是说,“我做错了什么?”

所以,类型有好有坏。它们有权衡。它们对性能和其他一些事情有好处,这取决于你的出发点。但这一切都是关于权衡。所以,这就是设计。设计就是权衡,并试图理解你正在权衡的事情的后果。比如,类型,或者不是。一个类型,还是多个类型。但也在多个类型中,你如何让类型系统如此强大?这是另一个非常复杂的问题,有很多权衡。它非常有趣,顺便说一句。但……但那是……一个维度。还有很多其他维度。即时编译,静态编译。垃圾回收,引用计数,手动内存管理,或者……比如,在……所有这些不同的权衡中,以及你如何平衡它们,就是让编程语言变得好的原因。

所以,所有这些东西,我想……当你设计语言时,你还必须考虑它将如何被编译成……如果你关心性能的话。

嗯,回到 Lisp。所以,Lisp 也……我认为 JavaScript 是另一个例子,一个非常简单的语言。所以,其中一个……我也喜欢 Lisp。我没有像你那样……或者曾经那样经常使用它。不,我认为我们都是……每个喜欢 Lisp 的人,就像……我不知道,我喜欢弗兰克·辛纳屈,但……我多久认真听一次弗兰克?

当然。但……但你看看它,或者看看 JavaScript,这是另一个非常不同但相对简单的语言。而且有些东西在语言中不存在。但……但存在固有复杂性,即我们试图建模的问题。所以,在……在两者的情况下,会发生什么?比如,你说,“好吧,关于大规模软件开发。”好吧,你需要像包。这两种语言都没有……语言层面的包的便利性。所以,你得到的是模式。你得到像 npm 这样的东西。你得到……围绕这些生态系统建立的东西。

我相信,如果你不……至少在语言中建模最重要的固有复杂性,那么最终会发生的是,复杂性被推到了别处。当它被推到别处时,有时这很棒,因为通常构建库非常灵活,非常强大,允许你发展等等。但通常会导致……很多不必要的……力量的分歧和碎片化。而当这种情况发生时,你就会得到一团糟。

所以,问题是,你如何……你如何平衡这一点?不要把太多东西放进语言里,因为那真的很昂贵,而且会让事情变得复杂。但你如何建模足够多的问题固有复杂性,以便……你提供框架和结构,让人们思考……

所以,所以,所以,关键是要思考……关于编程语言,以及你认为编程语言是做什么的,它是为了让人类更有效率。所以,就像有一个……我记得是史蒂夫·乔布斯的一句话,关于……它是“思想的自行车”。你可以……你可以肯定地走路,但如果你能在路上骑自行车,你会更快到达。而编程语言就是“思想的自行车”。

基本上是……哇,这是一个非常有趣的思考方式。通过提高抽象级别,你现在可以在头脑中容纳更多东西。通过能够直接利用某人的库,你现在可以快速完成某件事。

在 Swift 的情况下,SwiftUI 是苹果最近发布的一个新框架,用于进行 UI 编程。它有一个声明式编程模型,消除了整个类别的错误。它建立在值语义和其他许多不错的 Swift 特性之上。而这……它允许你用更少的代码完成更多的工作。现在,你作为开发者的生产力要高得多。所以,这才是编程语言应该关注的。它不是关于标签与空格,或者花括号,或者别的什么。而是你让这个人有多高效。而你只有在拥有……以正确意图构建的库,并且语言是为之设计的时,才能看到这一点。而 Swift……我认为我们还处于早期阶段。但 SwiftUI 和现在出现的许多其他东西,确实展示了这一点。我认为它们正在打开人们的视野。

思考一下,你知道,关于……然后关于好自行车的知识,人们如何了解它。你知道,我用过 C++。现在,这不是对 C++ 的垃圾攻击。但用 C++ 已经很久了。我在那里有伤疤。我感觉我花了多年时间才意识到……有语言可以……对我特定的生活方式、大脑风格、思维风格来说,有语言可以让我……在调试阶段,在开发阶段,在思考……就像“思想的自行车”一样,我能把更多东西装进我的……

Python 是一个很好的例子。机器学习框架在 Python 中是一个很好的例子。它只是……非常高的抽象级别。所以,你可以思考……在非常高的算法层面思考问题,而不是思考,“好吧,我是否正在将这个张量复制到 GPU?”这不是你想思考的事情。

就像我告诉你的那样,我猜我头脑中的问题是……你知道,像我这样的人,或者一般人,如何发现更有效率的……语言?就像我告诉你的,离线的时候,我一直在寻找一个项目来用 Swift 工作,这样我就可以真正尝试一下。我的直觉是,做一个“你好,世界”不会让我……让我体验到语言的力量。你需要几周时间来改变你的新陈代谢。

这正是……这是人们在节食方面遇到的问题之一。我……我实际上正在……并行进行,但稍微偏离一下。我最近只吃肉。

好的。

好的。所以,大多数人会觉得这非常不健康,或者别的什么。无论科学是什么,听起来都不对。

所以,回到我上大学的时候,我们做了阿特金斯饮食法。那是个类似的东西。但你必须……你必须总是给这些东西一个机会。我的意思是,在饮食方面……不是饮食,只是你喜欢的东西。如果我个人吃肉,只吃肉,我可能会比平时更专注。我感觉很棒。我一直在跑步,你知道,做俯卧撑和引体向上等等。

Python 在这方面也很相似。对我来说,就像……我真的……当我第一次开始使用 Python 时,我脸上有一种愚蠢的笑容。我可以……快速地编写东西。我……我看到了世界。我被赋予了编写脚本的能力,来……你知道,做一些基本的数据处理,重命名我电脑上的文件。

是的。

Pearl 做不到。我的意思是,有点。

而且,再次,这些都不是关于哪个是最好的,或者别的什么。但……但确实有更好的和更差的。但它奏效了。

是的。如果看看 Perl,你会陷入……标量与数组与哈希与类型 glob 等等。而 Python 就像,“好吧,我们不做这个。”而其中一些是调试。每个人都有不同的优先级。但对我来说,问题是,我能否为自己创建系统,使我能够快速调试?我一直是一个……即使是粗糙的断言的忠实粉丝,总是陈述应该是真的事情。在 Python 中,我发现自己越来越多地这样做,因为……因为类型,所有这些东西。

你可以认为编程语言中的类型有点像断言。它们在编译时被检查。

所以,你如何学习新东西?所以,或者人们如何学习新东西?这很难。人们不喜欢改变。人们通常也不喜欢周围发生变化。所以,我们都适应和改变得很慢。通常需要一个催化剂来……强迫自己……

所以,学习编程语言,真的归结为找到一个借口。构建一个……构建一个语言真正擅长的事情。生态系统已经准备好了。

所以,如果你要写一个 iOS 应用,那显然是最简单的情况。你会用 Swift。

有其他……Android 上的 Swift?

哦,是的。是的。Swift 可以在很多地方运行。所以,Swift 是建立在 LLVM 之上的。LLVM 可以在任何地方运行。LLVM,例如,构建了 Android 内核。

哦,哇。

好的。我不知道这个。是的。所以,Swift 非常便携。它可以在 Windows 上运行。它可以在很多不同的地方运行。

而 Swift UI?

然后是 Swift UI。然后有一个叫做 UIKit 的东西。

我能用 Swift 构建一个应用程序吗?

嗯,所以,这就是问题所在。生态系统才是最重要的。所以,SwiftUI 和 UIKit 是苹果的技术。

明白了。

所以,它们碰巧是用 Swift 编写的,但它是一个苹果专有的框架,苹果喜欢并希望保留在自己的平台上。这完全有道理。你去 Android,你没有那个库。

是的。

所以,Android 有一个不同的生态系统。还没有建立起来,并且与 Swift 的配合效果不佳。所以,你绝对可以用 Swift 来做……比如,算术等等。但用 Swift 在 Android 上构建 UI,目前并不是一个……不是一个很好的体验。

所以,如果我想……

所以学习 Swift,它的优点是什么?我的意思是,它的一个实际的、不同的版本是,嗯,Swift for TensorFlow,举个例子。对我来说,TensorFlow 和 PyTorch 都很鼓舞人心的一点是,社区能够多快地从不同的库切换。比如,你现在可以看到一些社区正在转向 PyTorch,但很容易看到,然后 TensorFlow 正在真正地提升它的水平,而且我认为它之所以如此运作,基本上是因为必须有一个 GitHub 仓库,一篇论文,能让人兴奋起来,让人兴奋起来,然后他们会说,“啊,我必须学习这个。” Swift for 什么?Swift 又是什么?然后他们学习,然后他们爱上了它。我的意思是,这就是 PTO 的情况。必须有一个原因,一个催化剂,是的。所以,而且,我的意思是,人们不喜欢改变,但事实证明,一旦你使用了一两种编程语言,它们的基础知识就非常相似了。所以,学习编程语言的有趣之处之一,甚至可能是列出的,我不知道你是否同意这一点,就是当你开始这样做时,你就会开始学习新东西,因为你有了一种新的做事方式,而且你被迫去做,这迫使你去探索,它让你进入学习模式,当你进入学习模式时,你的思维会稍微打开一点,你就能以一种新的方式看待事物,即使你回到旧的地方,对吧?是的,完全正确。好吧,列出的功能是函数式的,是的,呃,但是我希望有一种窗口,也许你可以告诉我是否有。呃,好了,这是一个问题,要问的是,在编程语言中最美的特性是什么?在我问之前,让我说一下,就像 Python 一样,我记得当我看到列表推导式的时候,好吧,就像我真的把它吸收进去的时候,是的,我不知道,我就是喜欢它,做起来很有趣,就像做那种嗯,呃,是的,它有一种能过滤列表并在一行中创建新列表的优雅之处。我都能理解,它让我爱上了这门语言。那么,让我问你一个问题,呃,在你遇到过的编程语言中,最美的特性是什么?在 Swift 中也许呢?然后在 Swift 之外,我认为我最喜欢编程语言的一点,所以,所以我认为你必须考虑编程语言的一点是,再次,你的目标是什么?你想让人们快速完成事情,所以你需要库,你需要高质量的库,然后你需要围绕它们的用户群,他们可以组装它们并用它们做很酷的事情,对吧?所以对我来说,问题是,什么能实现高质量的库?好的,是的。世界上在实现高质量库的库和在语言中加入特殊东西的库之间存在巨大的鸿沟。所以,实现高质量库的编程语言,高质量的库,明白了。所以,所以,我的意思是,我指的是富有表现力的库,然后感觉就像语言本身的自然集成部分。嗯,所以,Swift 中的一个例子是,int 和 float,还有 array 和 string,这些东西,它们都是库的一部分,比如 int 不是硬编码在 Swift 中的。所以,这意味着,因为 int 只是标准库中定义的一个库的东西,以及字符串、数组和其他所有标准库附带的东西,嗯,希望你喜欢 int,但是任何语言特性,你需要定义 int,你也可以在自己的类型中使用。所以,如果你想定义一个,呃,querian 或者类似的东西,对吧?嗯,它不包含在标准库中,有一群非常特别的人非常关心这一点,但那些人也很重要。这与阶级主义无关,对吧?这与关心 instant floats 的人比关心 querian 的人更重要无关。所以,对我来说,编程语言中最美妙的事情是,当你允许这些社区构建感觉原生的、感觉就像内置到编译器中的高质量库时,而无需成为,int 是库的一部分,不是硬编码的,这意味着什么?所以,什么是,什么是 INT?好的,int 就是一个整数,在这种情况下,它就像一个,你知道,像一个 64 位整数或者类似的东西。但是,所以,64 位是硬编码的吗?还是不,都不是硬编码的。所以,int,如果你去看看它是如何实现的,它只是 Swift 中的一个结构体。所以,它是一个结构体,然后你如何将两个结构体相加?你定义加号。所以,你可以定义 int 的加号,你也可以定义你的东西的加号。你可以定义 int 有一个 is OD 方法或者类似的东西。所以,是的,你可以给东西添加方法。所以,你可以定义运算符,比如它的行为方式。是的,那也很美妙,当语言中有一些东西能够让别人创建不那么 hacky 的库时,是的,感觉原生的。所以,其中一个最好的例子就是 Lisp,嗯,对,因为在 Lisp 中,所有的库基本上都是语言的一部分,对吧?你编写术语重写系统之类的东西。所以,你能提供一个反例,说明为什么编写一个原生的库很难吗?是 Python C 吗?嗯,所以,嗯,所以,我将给你两个例子,Java 和 C++,或者 Java 和 C。它们都允许你定义自己的类型,但是 int 是硬编码在语言中的。好的,为什么?嗯,在 Java 中,举个例子,回到所有这些引用语义和值语义的问题,int 是按值传递的,是的。但是,如果你创建一个,如果你创建一个对或者类似的东西,一个复数,对吧?它是一个类,在 Java 中,现在它被按引用传递,通过指针传递,所以现在你失去了值语义,你失去了数学。好吧,那不太好,对吧?如果你能用 int 做某事,为什么我不能用我的类型做呢?是的,对,那就是事情的消极面。我发现美妙的是,当你能够解决这个问题时,当你能够拥有完整的表现力时,你作为语言的用户拥有与实现所有标准内置功能的那些人一样多的,或者几乎一样多的权力,因为这使得真正美妙的库成为可能。你知道,这有点奇怪,因为我已经习惯了,那是另一个方面,编程语言设计,你必须考虑,你知道,旧的,第一原理思考,为什么我们要这样做?顺便说一句,我的意思是,我记得,因为我当时在想 Walrus 运算符,我稍后会问你,但它让我意识到,比如赋值的等号,是的,比如为什么我们用等号来赋值?而且那不是唯一的解决方案,对吧?所以,如果你看看 Pascal,它们使用冒号等号进行赋值,等号进行相等性判断,它们使用小于大于而不是不等于之类的东西,这里有其他答案。所以,但是,是的,比如问你所有的问题,但你如何决定打破常规,说,你知道吗,每个人都在做错,我们要把它做对?所以,所以,这就像一个投资回报率,对吧?所以,如果你做一些奇怪的事情,比如不是冒号等号,而是等号进行赋值,以今天的审美来看,那会很奇怪,对吧?所以,你会说,这在理论上更好,但在哪些方面更好?我从中得到了什么?我定义了一个错误类别吗?嗯,C 的一个错误类别是,你可以使用,你知道,如果 x 等于,而不是等于等于 f x 等于 y,是的,对,好吧,事实证明,你可以用很多方法解决这个问题,Clang,例如 GCC,所有这些编译器都会检测到这是一个可能的错误,产生警告。它们会吗?我感觉它们没有,或者 Clang,GCC 没有,而且这是编程语言设计的一个重要方面,你实际上是在创造痛苦,对吧?比如,我感觉,我的意思是,一种看待它的方式是,它是思想的自行车,但另一种方式是,最小化痛苦。好吧,你必须决定是否值得,对吧?所以,让我们回到这一点,好吧?但是,但是,如果你看看这个,再次,这里有很多细节,嗯,嗯,C 中的等号返回一个值,是的,那很糟糕,它允许你说 x=y=z,这在 C 中是可行的,是的,嗯,它很糟糕吗?你知道,大多数人都认为它很糟糕,我的意思是,它很少被用于好的目的,而且经常用于错误,是的,对,所以,这是对的,一个很好的定义。你可以使用,你知道,它,事后看来,这并不是一个很好的主意。现在,Swift 中一个非常强大的东西,也是它实际上很好而不是充满好主意的原因是,嗯,当我们推出 Swift 1 时,我们宣布它是公开的,人们可以使用它,人们可以构建应用程序,但它会改变和破坏。好吧,当 Swift 2 出来时,我们说,嘿,它是开源的,有一个开放的流程,人们可以帮助演进和指导语言。所以,整个社区,比如 Swift 用户,现在可以帮助塑造语言。在那个过程中,很多非常糟糕的错误被剔除了。例如,Swift 过去有 C 风格的 ++ 和 -- 运算符,比如它在之前和之后是什么意思?好吧,早期,它被从 C 复制到 Swift,什么是复制?复制意味着,在没有真正考虑的情况下被带进来。这可能不是最 py 的术语,但是,必须在 Urban Dictionary 上查找,是的,是的,所以,它被拉入了 C,或者被拉入了 Swift,而没有经过很好的考虑。我们经历了这样一个过程,其中第一批被移除的东西是 ++ 和 --,因为它们会导致混淆,它们几乎没有价值,不如说 X += 1 和 X += 1 更清晰。所以,当你优化可教性、清晰度和错误以及你正在观察的这个多维空间时,像这样的事情真的很重要。所以,从第一原理出发,你的出发点是什么,你想实现什么,并以目标为导向,这真的很重要。好吧,让我问你关于,呃,最,呃,这个,这个,这个播客不是关于信息的,它是关于戏剧的。所以,让我和你谈谈一些戏剧。你提到了 Pascal 和冒号等号,有一个叫做 Walrus 运算符的东西,对吧?而且,Python,在 Python 3.8 中添加了 Walrus 运算符,我认为它之所以有趣,不仅仅是因为它实现的功能,它具有相同的表达性功能,你可以提到它返回赋值的值,也许你可以对此进行评论,但另一方面,它也是那个推翻了独裁者的东西。所以,好吧,它终于迫使 Guido 从 EDFL 辞职,社区的毒性。所以,也许,你对 Python 中的 Walrus 运算符有什么看法?Swift 中有等效的东西吗?它真的给社区带来了压力,然后,另一方面,你对 Guido 辞职有什么看法?如果,如果我忽略了 Walrus 运算符的细节,使它最具争议性的一点是,它是语法糖。你是什么意思,语法糖?这意味着你可以采用语言中已有的东西,并以更简洁的方式表达它。所以,好吧,我要扮演辩护律师。所以,这是伟大的,这是客观的还是主观的陈述?比如,你能争辩说,基本上任何东西都是语法糖,还是不行?不,不是所有东西都是语法糖。所以,例如,类型系统,比如你可以有类,还是,比如你有类型,还是没有?所以,一种类型与多种类型不是影响语法糖的东西。所以,如果你说,我想拥有定义类型的能力,我必须拥有所有这些,比如语言机制来定义类,哦,现在我必须拥有继承,我必须拥有所有这些东西,这只是让语言更复杂。这与糖化无关。Swift 有糖,比如 Swift 有 IFL 这样的东西,它有各种运算符来简化特定的用例。语法糖的问题在于,当你谈论“我有一个需要写很多东西的东西,我有一个新的写法”时,你有一个可怕的权衡,这几乎完全是主观的,那就是这种情况发生的频率有多高,它重要吗?人类心理学的一个特点是,尤其是在你谈论引入新事物时,人们会高估学习某事的负担。所以,当你还没有习惯它时,它看起来很陌生,但如果它从一开始就在那里,当然,它就是 Python 的一部分,毋庸置疑,这就是我所知道的一件事,它不是一个你担心学习的新事物,它只是交易的一部分。现在,关于 Guido,我不知道 Guido,是的,你见过他几次吗?是的,我见过他几次,但我不太了解 Guido。但我从整个动态中得到的印象是,他不仅承担了决策者的重担,而且它与他的个人身份紧密相连,以至于他把它当作个人问题,他觉得有必要,他把自己置于那个位置,而不是围绕他建立支持基础。我的意思是,这可能不是字面上的真实情况,但太多了,太多集中在他身上了。是的,而且这会让你筋疲力尽。是的,尤其是当人们说,“Guido,你是个糟糕的人,我讨厌这个东西,等等,等等,等等。”当然,就像,也许是社区的 1% 在这样做,但 Python 有一个庞大的社区,数百万人的 1% 是很多仇恨邮件,而这仅仅是人类因素,就会让你筋疲力尽。为了澄清,从我看到的消息来看,我们不看数百万 Python 用户,而是看 Python 核心开发者,感觉大多数人投票反对它?我不太清楚,所以,所以,这个,好的,所以情况是,是的,我的意思是,大多数核心开发者都反对。他们甚至不是反对,而是有一种感觉,嗯,他们反对,但他们的反对不是“这是一个坏主意”,他们更多的是“我们不明白为什么这是一个好主意”,结果是有一种停滞的感觉,就像你只是减缓了所有事情。从我的角度来看,现在你可以争辩,而且我认为这非常有趣,如果我们看看今天的政治以及国会如何运作,它减缓了所有事情,它是一种抑制器,是的,它是一种抑制器,但那也很危险,因为如果它抑制了像,你知道,抑制结果,你在说什么?它是一个低通滤波器,但是,如果你需要数十亿美元注入经济,或者数万亿美元,那么事情就会发生,对,所以,当然,你说的,我不是在为我们的政治状况辩护,只是为了澄清,你说的就像,全球大流行病。我希望我们能解决,比如医疗保健系统和教育,你知道,我不是,我不是政治人士,我不知道。当涉及到语言时,社区在某种程度上是正确的,因为向语言中添加东西的负担非常高。所以,一旦你添加了东西,你就会有一个构建它的社区,而且你不能移除它。而且,如果有一个社区的人对此感到非常不舒服,那么放慢速度,我认为很重要。而且没有赶时间,尤其是有一些已经存在了 25 年并且非常成熟的东西,而且你知道,它不像正在成型。关于特性呢?我认为 Guido 的问题可能是,他意识到它已经超越了他,它从,或者语言,Python,我的意思是,Guido 很棒,但 Python 不再是关于 Guido 了,它是关于用户的,在某种程度上,用户拥有它,你知道,Guido 花了很多年的人生,他职业生涯的很大一部分都花在了 Python 上,从他的角度来看,我想他会说,“但是,这是我的东西,我应该能够做我认为正确的事情。”但是你也可以理解用户,他们觉得,“这是我的东西,我用它,”而且,我不知道,这很难,这很难。但是,如果我们能谈谈领导力呢?因为这对我来说太有趣了。我将,我将,我将,我希望有人能制作一件 Walrus 运算符的衬衫,如果不行,我会自己做一件,因为对我来说,它代表了,也许是我的俄罗斯血统,或者别的什么,你知道,这是领导的重担。我觉得,要顶回去,我觉得进步只能,大多数艰难的决定,就像你说的,尤其是在充满激情的社区中,会有很多分歧。我觉得领导者需要做出那些冒险的决定,那些,如果你听,有一定概率,甚至是很高的概率是错误的决定,但他们必须运用直觉做出决定。好吧,这是,这是,这是你看到很棒的创始人之一,创始人完全理解发生了什么,以及公司是如何走到这一步的,并且愿意说,“我们过去 20 年一直在做 X,但今天我们要做 Y,”他们为整个公司做出了重大转变,公司紧随其后,他们前进,这是正确的。但是,当创始人去世时,继任者并不总是觉得有那种做出这些决定的权力。即使他们是 CEO,理论上他们可以做任何事情。在我看来,或者在很多情况下,这总是有不同的原因。其中之一是,他们并没有参与所有做出的决定,所以他们不知道做出这些决定的原则。一旦原则改变,你就应该有义务改变你的做法并改变方向。所以,如果你不知道你是如何走到这一步的,它似乎就像福音一样,你知道,你不会质疑它,你可能不理解它真的是正确的,所以你可能看不到它。这太棒了,我从未那样想过,当领导者进入一个已经运作了很长时间的事情时,负担会重得多。是的,是的,而且如果你改变了它,它不起作用,那么你就成了那个搞砸了的人。人们总是会事后猜测。而且第二点是,即使你决定做出改变,即使你理论上负责,你也只是,你只是一个认为自己负责的人。与此同时,你必须激励士兵,你必须向他们解释,从理解的角度来看,你必须让他们相信并相信它,因为如果他们不相信,他们就无法转向,即使你告诉他们,你知道,他们的奖金会减少,他们就是不会相信。所以,作为领导者,你只有那么大的权力,你必须了解它的局限性。你还在 BDFF 吗?你一直是某些事情的 BDFF,你非常强调“仁慈的独裁者”,我想是终身制的。嗯,我想是 LLVM,你仍然是,我仍然领导着 LLVM 世界。我的意思是,角色的作用是什么?所以,关于 Swift,你说有一群人,是的,所以,如果你对比 Python 和 Swift,原因之一是,每个人都非常认真地对待核心团队的角色,而且我认为我们都非常关心 Swift 的发展方向。但是,你几乎是将最终决策权委托给了集体的智慧,所以它不会变成个人的。而且,当你与社区交谈时,是的,有些人对某些决定感到非常恼火。人们对这个过程有一定的信心,因为这是一个非常透明的过程,当一个决定做出时,会提供完整的理由,诸如此类的事情,这些几乎是防御机制,有助于指导未来的讨论,并提供判例法,就像最高法院所做的那样,关于这个决定是出于这个原因,这是理由,我们想看到更多或更少的东西。但是,这是一种提供防御机制的方式,这样当有人抱怨它时,他们不是说那个人做错了,而是说,“这个东西很糟糕,”然后他们继续前进,他们就过去了。最高法院的比喻,我认为真的很好。但是,好吧,不是针对 Swift 团队的个人,但是,有分歧吗?它似乎不可能没有分歧。嗯,Swift 核心团队的每个人,例如,都是不同的,而且 Swift 核心团队的成员会随着时间的推移缓慢变化,我认为这是一件好事。所以,这些不同的人都有不同的观点,相信我,它绝不是一个单一的意识。你有三个主要组织,包括苹果、谷歌和 Sci-Fi,都在一起工作。而且,这是一小群人,但你需要高度信任,你需要再次回到你试图实现的目标的原则,并理解,你知道,你在优化什么。而且,我认为从强大的原则开始并朝着决策努力,总是做出明智决定的好方法,然后能够将它们传达给人们,以便他们能够接受,而这很难。所以,你提到了 LLVM,LLVM 今年 12 月将满 20 岁了,所以它显示出它的年龄了。你有一个像,像,像龙蛋糕植物,或者,不,我们绝对应该这样做。是的,如果我们能有一个,大流行蛋糕,每个人都得到一块蛋糕,然后通过电子邮件发送。但是,但是,LLVM 在过去也经历了很多挑战,对吧?而且,LLVM 社区面临的一个挑战是,在我看来,它有很多已经为 LLVM 工作了 10 年的人,因为这发生了,不知何故,LLVM 一直是这样,但它需要是另一种方式,而且他们已经工作了大约 10 年,这是一个很长的时间来工作,你知道,你突然看不到你正在工作的那个东西的缺点,而 LLVM 有很多问题,我们需要解决它们,我们需要让它变得更好,如果我们不让它变得更好,那么别人就会想出更好的主意,对吧?所以,它正好到了那个年龄,社区有陷入过于僵化的危险,而且,所以我很高兴看到新项目加入,新事物带来变化。你知道,Fortran 现在是 LLVM 社区中的一个新事物,这很搞笑,也很好。我一直在尝试寻找,在这个小小的离题中,找到那些用 Cobalt 或 Fortran 编程的人,尤其是 Fortran,来和他们谈谈,他们很难找到。是的,是的,看看科学界,他们仍然大量使用 Fortran。有趣的是,你刚才提到的 LLVM,或者总的来说,如果某样东西演变了,你就看不到它的缺点。所以,你是否会随着时间的推移爱上它,或者你会开始憎恨它的一切?所以,所以,我的个人愚蠢之处在于,我看到了,也许不是全部,但很多缺点,它们让我烦恼,而我没有时间去修复它们。而且它们随着时间的推移而放大。而且它们可能不会放大,但它们永远不会被修复。就像你脚下的沙子,你知道,它就像在和你作对,就像你指甲里的沙子一样,你知道,它在那里,你无法摆脱它。而且,所以,问题是,如果其他人看不到,没有人会得到,就像我没有时间去写代码并修复它了。但是,人们抵制改变。所以,你说,“嘿,我们应该去修复这个东西,”他们说,“哦,是的,这听起来有风险。”那么,它是正确的吗?还是不是?挑战是,是群体动态,还是也只是技术上的?我的意思是,一些功能,是的,我认为,作为一个观察者,就像一个粉丝一样,在,你知道,作为一个旁观者,我并不经常考虑,你知道,有些事情可能在技术上很难实现。一个例子是,我们构建了一个新的编译器框架,叫做 ML。ML 是一个全新的框架。不是,很多人认为它与机器学习有关。ML 代表多级,因为编译器人员不太会命名东西,我想。我们可以深入了解 ML IR 是什么吗?所以,当你看看编译器时,编译器历史上是针对特定空间的解决方案。所以,LLVM,它非常适合处理 CPU,让我们说,从高层次来看。你看看,Java,Java 有一个 JVM,JVM 非常适合需要动态编译的垃圾回收语言,而且它针对特定空间进行了高度优化。所以,Hotspot 是其中一个编译器,在该空间中使用。而且,那个编译器非常擅长这类事情。通常,当你构建这些领域特定的编译器时,你最终会为每个领域从头开始构建整个东西。什么是领域?所以,这里,我想说,如果你看看 Swift,Swift 编译器有几个不同的部分。其中一部分由 LM 部分覆盖。还有一个高级部分,是 Swift 特有的。而且,这两个不同的基础设施之间存在巨大的冗余,以及大量重新实现的类似但不同的东西。什么是 LLVM?定义 LLVM 是一个基础设施,你可以用不同的方式混合搭配它。它是构建的库,你可以用它做不同的事情,但它非常适合 CPU 和 GPU。CPU 和 GPU 的尖端。它对 GPU 并不真正擅长。但是,事实证明,使用它来与 CPU 通信的语言。而且,所以,有很多硬件是定制加速器,比如机器学习。有很多矩阵乘法加速器之类的东西。有一个完整的硬件综合世界,我们正在使用 ML 来构建电路。所以,你正在为晶体管领域进行编译。所以,ML 提供了一个巨大的编译器基础设施,它允许你以快得多的方式构建这些领域特定的编译器,并使结果很好。如果我们,如果我们现在展望未来,我们正在谈论像 ASICs 这样的东西,比如,任何东西,是的,是的,所以,如果我们展望未来,这些 ASICs 的数量,非常具体的,基础设施的东西,架构的东西,比如乘法,可能会呈指数级增长。我希望如此。是的,所以,这就是 ML。所以,ML 的作用是,它允许你非常高效地构建这些编译器。现在,关于 LLVM 的事情,然后我们将转向硬件,LLVM 是一个针对特定领域的特定编译器。MLIR 是一个非常通用、非常灵活的东西,可以解决许多不同类型的问题。所以,LLVM 是 ML 所做的一部分。所以,ML,我的意思是,这是一个雄心勃勃的项目。是的,这是一个非常雄心勃勃的项目。而且,为了让事情更加混乱,ML 加入了 LLVM 的伞形项目,所以它是 LLVM 大家庭的一部分。但是,这又回到了原点,现在那些从事 LLVM 部分工作的人,那个经典的、20 年的部分,并不了解新事物中所有很酷的新东西,你知道,MLIR 是由我和许多了解 LLVM 的人构建的。所以,我们修复了 LLVM 中存在的许多错误。所以,现在你有了这种社区动态,就像,嗯,有这个新东西,但它不熟悉,没有人知道它,感觉很新,所以,让我们不要相信它。所以,看到由此产生的文化和社会动态真的很有趣。而且,我认为这非常健康,因为我们看到了思想的渗透,我们看到了技术的扩散,随着人们越来越适应它,他们开始用自己的方式理解事物,这只是,想法需要一段时间才能传播,即使,它们可能与人们习惯的非常不同。所以,也许让我们谈谈 ASIC 的世界,嗯,实际上,你,你在 Sci-Fi 有一个新的角色。那个地方是关于什么的?它的愿景是什么?当然,对于他们的愿景,我想说是计算的未来。我领导 Sci-Fi 的工程和产品团队。Sci-Fi 是一家公司,它基于一种叫做 RISC-V 的架构。RISC-V 是一种新的指令集。指令集是你电脑内部告诉如何运行东西的东西。英特尔的 x86 和 ARM 公司的 ARM 以及类似的东西,或者其他指令集。我谈过,抱歉打断你,我谈过 Dave Patterson,他对 RISC-V 非常兴奋。Dave,Dave 很棒,他很聪明。是的,是的,RISC-V 的特点是它不是专有的。嗯,所以,x86 只能由 Intel 和 AMD 制造,ARM 只能由 ARM 制造。它们将构建 ARM 芯片的许可证出售给其他公司,类似的东西。MIPS 是另一个指令集,现在属于 MIPS 公司。它被授权出去,类似的东西。所以,RISC-V 是一个开放的标准,任何人都可以构建芯片。所以,Sci-Fi 由 RISC-V 的三位创始人创立,他们在伯克利与 Dave 一起设计和构建了它。所以,这是公司的起源。今天的 Sci-Fi 拥有世界上一些最好的 RISC-V 核心,我们正在销售它们,这真的很棒。它们被用于大量产品,非常令人兴奋。所以,它们正在采用这种开源的东西,并试图成为,或者是世界上最好的构建这些东西的公司。是的,所以,这里的规范是开源的,就像说 TCP/IP 是一个开放的标准,或者 C 是一个开放的标准。但是,然后你必须构建标准的实现。所以,Sci-Fi 一方面推动和定义并推动标准,另一方面,我们有针对空间中不同点的最佳实现,这取决于你想要一个非常小的 CPU,还是一个非常大、非常强大的 CPU,它更快,但使用更多的面积,诸如此类的事情。实际制造芯片怎么样?比如,那一切都适合哪里?我要问很多愚蠢的问题,没关系,这就是我们学习的方式。而且,所以,它的工作方式是,通常是设计电路的人和制造它们的人的分离。所以,你会听到像 TSMC 和 Samsung 这样的晶圆厂,它们实际生产芯片,但它们会接收一个设计,该设计规定了如何,你知道,将芯片的代码转化为,呃,小矩形,然后使用光刻技术制作掩模组,然后将晶体管烧蚀到芯片上,或者烧蚀到硅上。嗯,所以,我们谈论的是大规模生产,是的,他们谈论的是制造数亿个零件。是的,所以,晶圆厂负责批量生产。但是,当你看看这个问题时,有趣的是,在这个空间里,当你看看它时,从设计芯片和编写它的“代码”以及像 Verilog 这样的语言,到你交给晶圆厂的东西,这是一个非常深入研究的、非常古老的问题。有很多人研究过它,很多聪明的人构建了系统和工具。这些工具通常已经通过收购,所以它们最终落在了三个主要公司,它们构建和销售这些工具,它们被称为 EDA 工具,比如电子设计自动化。问题是,你有大量的碎片化,你有松散的标准,而且工具并不真正协同工作。所以,你有大量的胶带,你有大量的,生产力损失。这些是,这些是设计工具。所以,RISC-V 是一个指令,比如,RISC-V 是什么?它有多深入?它触及硬件的程度有多大?它定义了多少硬件?是的,所以,RISC-V 完全是关于,给定一个 CPU,比如处理器,你电脑里的处理器,编译器,比如 Swift 编译器,C 编译器,诸如此类,如何让它工作?所以,它是汇编代码,所以,你编写 RISC-V 汇编,而不是 x86 汇编,例如。但是,它是一组指令,而不是一组指令。是的,为什么,为什么你说它告诉编译器如何工作?抱歉,它是编译器通信的对象。是的,然后,你提到的工具,是用于什么?用于,当你构建特定芯片时?所以,RISC-V 在硬件,在硬件中,是的,所以,所以,RISC-V,你可以从 Sci-Fi 购买 RISC-V 核心,说,“嘿,我想有一定数量的,运行一定数量的千兆赫兹,我想它这么大,我想它有这些功能,我想有,比如,浮点数,或者没有。”然后,你得到的是,你得到一个具有这些特征的 CPU 描述。现在,如果你想制造芯片,你想制造像 iPhone 芯片这样的东西,对吧?你必须同时拥有 CPU,然后你必须与内存通信,你必须有计时器,I/O,GPU,其他组件。所以,你需要将所有这些东西拉到一个叫做 ASIC 的东西中,应用程序专用集成电路。所以,定制芯片。然后,你采用该设计,然后你必须将其转换为晶圆厂,比如 TSMC,知道如何将其投入生产。明白了,所以,是的,好的,而且,所以,这个过程,我忍不住看到它是一个大型编译器。它是一堆编译器,没有从那个角度去思考它,不是宇宙是一个编译器吗?就像,编译器做两件事:它们表示事物并转换它们。所以,有很多东西最终成为编译器,但这正是我们谈论设计、可用性和你思考事物的方式,事物如何正确组合的地方。所以,Sci-Fi 在这个领域投入了很多,我们认为,通过允许人们更快地设计芯片,更快地推向市场,并扩展出去,可以带来很多好处。因为,你知道,摩尔定律的说法,你面临着这样的问题,你无法通过等待一年更快的 CPU 来获得免费的性能。所以,你必须在其他方面寻找性能。其中一种方法是使用定制加速器和其他硬件。所以,嗯,我们将稍微多谈一点 ASIC,但是,你是否认为很多人,很多公司会尝试拥有,比如不同的要求集,这个整个过程要经历?所以,比如,不同的汽车公司可能会使用不同的,就像,不同的 PC 制造商一样?所以,RISC-V 在这个过程中,它有可能是所有计算设备的未来吗?我认为,是的,如果你看看 RISC-V,并从硅方面退一步,RISC-V 是一个开放的标准。几十年来发生的一件事是,如果你看看计算的长远发展,不知何故,它已经几十年了,你看到公司来了又去,指令集也来了又去。一个例子是,Sun 的 SPARC。Sun 消失了,SPARC 仍然存在,富士通。但是,HP 有一个叫做 PA-RISC 的指令集。PA-RISC 是其大型服务器业务,拥有大量客户。他们决定转向 Intel 的 Itanium。这并没有奏效。所以,你面临着这样的问题,你正在对一家公司拥有的指令集进行数十亿美元的投资。即使是像 Intel 这样的大公司,也不总是能像他们本可以那样执行。他们有自己的问题。例如,HP 决定继续投资这个领域不符合他们的最佳利益,因为它非常昂贵。所以,他们做出技术决策,或者他们做出自己的商业决策。这意味着客户,你该怎么办?你已经投入了所有这些时间,所有这些工程,所有这些软件工作,所有这些,你围绕它们构建了其他产品,现在你被困住了。RISC-V 提供了更多的选择性。因为,如果你从 Sci-Fi 购买 RISC-V 的实现,你应该购买,它们是最好的。但是,如果 Sci-Fi 在 20 年后发生什么坏事,那么,太好了,你可以从别人那里购买 RISC-V 核心,而且有一个生态系统,所有人都制造不同的 RISC-V 核心,并做出不同的权衡。这意味着,如果你有多个需求,如果你有一个产品系列,你可能可以在 RISC-V 领域找到适合你需求的东西。而如果你谈论 x86,例如,Intel 只会制造某些类别的设备。我明白了。所以,也许一个奇怪的问题,但是,如果 Sci-Fi 在未来 20 到 30 年里取得无限成功,世界会是什么样子?所以,计算世界如何改变?太多的硬件指令集多样性,我认为是不好的。我们有很多人在使用,很多不同的指令集,尤其是在嵌入式领域,比如非常小的微控制器领域,你烤面包机里的东西。它们只是奇怪且不同,出于历史原因。所以,编译器、工具链和它们之上的语言都不存在。所以,那个软件的开发者必须使用非常奇怪的工具,因为支持它的生态系统不够大。所以我预计这种情况会改变。人们将拥有更好的工具、更好的语言、更好的功能,可以服务于空间中的许多不同点。而且,我认为 RISC-V 将逐渐吞噬更多的生态系统,因为它能够扩展,它能够缩小,横向,左,右,它非常灵活,而且是一个考虑周全、设计精良的指令集。我认为,当你看看 Sci-Fi 如何处理硅以及人们如何构建芯片时,这是一个非常不同的领域。在那里,你会看到更多的定制芯片,这意味着你会获得更好的电池寿命,你会为你的物联网设备获得更优化的解决方案,你会让人们行动更快,你会获得更快的上市时间。所以,有多少定制的?首先,关于物联网,你是否认为智能烤面包机的数量会呈指数级增长?而且,如果你这样做,那么每个烤面包机有多少定制?世界上所有的烤面包机都运行相同的芯片吗?同一个设计?还是不同的公司有不同的设计?比如,有多少定制是可能的?很多都取决于成本。所以,芯片的工作方式是,你最终会按数量付费,其中一个因素是芯片的大小。所以,从经济角度来看,每年生产的特定设计的芯片数量是有限的。所以,通常客户最终不得不选择一个现有的芯片,为别人制造的芯片,这样他们就可以发货他们的产品。原因是因为他们没有 iPhone 那样的销量,他们负担不起制造定制芯片。然而,这意味着他们现在购买的是现成的芯片,而这并不是真正好的,也不是最适合他们需求的。所以,他们为此支付了很多钱,因为他们购买的硅并没有得到很好的利用。如果你现在降低设计芯片的成本,那么你就会获得更多的芯片。你降低得越多,设计芯片就越容易。世界不断发展,我们获得更多的 AI 加速器,我们获得更多的其他东西,我们获得更多的通信标准,我们获得 6G。你获得,你获得,你获得世界上的变化,你想能够与这些不同的东西通信。人们想要的功能的交叉产品有更多的多样性。而且,这会在另一个方向上驱动差异化的芯片。所以,没有人真正知道未来会是什么样子。但是,我认为未来会有很多硅。谈到未来,你

摩尔定律据称已经死了,你认为呢?你同意戴夫·帕特森和许多人关于摩尔定律已死的说法吗?还是你同意吉姆·凯勒的说法,他正站在海盗船的舵手位置上,说它“还活着,还活着”?

是的,我也同意他们所说的,而且不同的人对摩尔定律有不同的解读。

是的,吉姆会说,物理学还有一千倍的潜力,我们可以继续挤压石头,让它变得更快、更小,使用更小的几何形状等等。他说得对。吉姆绝对是对的,还有大量的进步空间,我们还没有达到物理学的极限。

但那并不是摩尔定律的真正含义。如果你看看摩尔定律是什么,它是一个非常简单的评估:好吧,你看看每单位面积的成本,以及该空间中最经济的点。如果你去看看描述这个的、现在已经相当古老的论文,摩尔定律有一个特定的经济方面。我认为这是戴夫和其他人经常指出的。所以从技术上讲,这是正确的。

我从我的角度来看,所以我可以承认这两种观点,它们都是正确的,它们都是正确的。

我会给你第三种观点,它可能以自己的方式是正确的,那就是单线程性能不再像以前那样提高了。以前,你得到一个奔腾 66 或者类似的东西,而前一年你有一个奔腾 33,现在它快了一倍。

嗯,它在做完全相同的事情时快了一倍,对吧?就像字面上的同一个程序运行速度快了一倍。你只需要写一张支票,然后等一年,一年半。

所以,很多人对摩尔定律的看法就是这样,我认为这已经死了。所以我们现在看到的是,我们正在推动,我们正在推动人们以不同的方式编写软件。所以我们正在推动人们编写 CUDA,以便他们能够获得 GPU 计算能力以及 GPU 上的数千个核心。我们正在谈论 C 程序员不得不使用 P 线程,因为他们现在有,你知道,机器上有 100 个线程或 50 个核心,或者类似的东西。你现在正在谈论机器学习加速器,它们现在是领域特定的。当你看到这些用例时,你仍然可以获得性能。而且吉姆肯定会想出利用硅的酷炫新方法。但你也要改变编程模型,对吧?现在,当你开始谈论改变编程模型时,你也会回到语言和类似的东西,因为通常你会看到,比如你以 C 编程语言为例,对吧?C 编程语言是为 CPU 设计的。所以,如果你现在想与 GPU 通信,你就是在与它的表亲 CUDA 通信。CUDA 是一个不同的东西,拥有一套不同的工具,一个不同的世界,一种不同的思维方式。我们没有一个可扩展的世界。我认为我们可以做到,我们可以有一个可扩展性好得多的世界。

稍微跑题一下,我认为大多数编程语言都是为 CPU 设计的,甚至是为单核设计的,即使它们允许并行化。那么,编程语言如何将并行化或大规模并行化作为其“第一原理”呢?

最典型的例子是硬件设计领域。Verilog、VHDL,这些语言被称为“高层综合语言”。这是人们设计芯片的工具。当你设计芯片时,它有点像大脑,你拥有无限的并行性。你正在铺设晶体管,晶体管一直在运行,对吧?你不是说“运行这个晶体管,然后运行那个晶体管,然后运行那个晶体管”。它就像你的大脑,你的神经元总是在做某事,它们没有时钟,它们只是在做,它们在做它们的事情。所以,当你设计一个芯片,或者当你设计一个 CPU,当你设计一个 CPU,当你设计,当你铺设晶体管时,你也在讨论“好吧,这些东西如何通信?”所以这些语言存在。Verilog 是一个混合的例子。这些语言都不是真正的好,它们非常低级。是的,是的,它们非常低级,而且抽象在这里是必要的,而且有不同的方法。这是一个非常复杂的世界,但它是隐式并行的。所以,拥有这个作为你编程的目标领域,意味着默认情况下你会得到并行系统。

如果你看看 CUDA,CUDA 是空间中的一个中间点。在 CUDA 中,当你为 GPU 编写 CUDA 内核时,感觉就像你在编写一个标量程序。你会有 if 语句,你会写 for 循环,类似的东西,你只是在编写正常的代码。但除此之外,在你的驱动程序中会发生什么?它实际上一次运行你在成千上万个东西上,对吧?所以它是并行的,但它已经把它从编程模型中抽离出来了。所以,现在你作为一个程序员在一个更简单的世界里工作,它为你解决了这个问题,对吧?

你如何让像 Swift 这样的语言,你知道,如果我们考虑 GPU,也考虑 ASIC,也许我们可以来回切换硬件和软件,你知道,如何设计这些功能,使其能够成为一种一流的公民,能够做到像 Swift for TensorFlow,能够在当前硬件上进行机器学习,也能在未来的硬件上进行机器学习,比如 DPUs 和我敢肯定会越来越多的 ASIC?

是的,所以这一切都归结于拥有一个在幕后真正有效工作的“螺母和螺栓”的想法。所以你需要,如果你在与 TPU 通信,你需要,你知道,ML 或 XLA 或其中一个编译器与 TPU 通信,在此基础上进行构建。如果你在与电路通信,你需要弄清楚如何铺设晶体管,如何组织它,如何设置时钟,以及你在电路中遇到的所有领域问题。然后你必须决定如何向人类解释它,用户界面是什么?如果你做得对,那就是一个库问题,而不是语言问题。而且这行得通,如果你有一个库或一种语言,它允许你的库编写感觉像原生语言的东西,通过实现库,因为这样你就可以在编程模型上进行创新,而无需更改语法,然后不得不发明新的代码格式化工具以及语言附带的所有其他东西。这变得非常有趣。

所以,如果你看看这个领域,有趣的事情是,一旦你分离出语法,那就是编程模型。所以,你想要 CUDA 风格的吗?我编写一个程序,它在多个地方运行。你想要隐式并行模型吗?你如何推理它?你如何让开发者,你知道,芯片架构师能够表达他们的意图?这涉及到整个设计问题,你如何快速检测错误,这样你就不用等到芯片制造出来才发现它是错的,理想情况下?你如何,你知道,这是一个光谱,你如何让人们感到高效,所以他们的周转时间非常快?所有这些都是非常困难的问题。在这个世界里,我认为在设计问题和思考分层方面没有投入太多精力。

关于并发,你写了《Swift 并发宣言》。我认为这很有趣。任何带有“宣言”字样的东西都非常有趣。你能总结一下你写的五个部分的要点吗?

那么,什么是宣言?是的,我们从那里开始吧。所以在 Swift 社区,我们有一个问题,一方面,你想要相对较小的提案,你可以大概理解它们,你可以非常精细地理解细节,并推动世界前进。但另一方面,你也有这些大的弧线。而且,当你处理一个大的弧线,但你把它分解成小块时,你就会遇到这个问题:我怎么知道我不是在随机行走?我们要去哪里?这如何累加?此外,当你开始第一个小步骤时,你使用什么术语?我们如何思考它?在这个领域,什么更好,什么更糟?原则是什么?我们试图实现什么?

所以,Swift 社区中的宣言开始说:“嘿,让我们从细节中退一步,让我们描绘一个广阔的图景,来谈谈我们试图实现什么。让我们给出一个示例设计点,让我们尝试描绘一个大图景,这样我们就可以聚焦于单个步骤,并确保我们取得了良好的进展。”

所以,《Swift 并发宣言》是我三年前写的。已经有一段时间了,也许更长了。试图为 Swift 和并发做这件事。它从一些相当简单的事情开始,比如观察到,当你有多台不同的计算机或多个不同的线程在通信时,最好是异步的。所以你需要能够独立运行事物,然后相互通信。这意味着异步,这意味着你需要一种建模异步通信的方式。许多语言都有类似的功能,async/await 是一个流行的例子。所以,我认为这在 Swift 中很可能发生。

但是,当你开始构建这个抽象塔时,它不仅仅是如何编写它。然后你深入到如何获得内存安全,因为你想要正确性,你想要可调试性,以及开发者的理智。以及如何将内存安全引入语言。所以,如果你以 Go 或 C 或任何这些语言为例,你会得到所谓的“竞态条件”,当两个不同的线程或 Goroutine 或其他东西触及内存中的同一个点时。这是一个巨大的、令人抓狂的调试问题,因为它通常是不可复现的。所以有工具,有一整套解决方案围绕它建立起来,但当你编写并发代码时,这是一个巨大的问题。

所以,对于 Swift 来说,这个值语义的东西确实很强大,因为事实证明,即使在并发世界中,数学和复制也有效。所以,你开箱即用就能获得很多安全性。但也有一些难题,它也谈到了其中的一些。

当你开始构建到下一个级别,你开始谈论内存安全之外的事情时,你必须谈论什么是程序员模型?人类如何思考这个问题?所以,一个试图构建程序的开发者会这样想。它提出了一个非常古老的模型,但有一个新的视角,叫做 Actor。Actor 的作用是说,我们有单线程的逻辑岛屿。所以你写的东西感觉就像一个程序在一个单元中运行,然后它异步地与其他事物通信。所以,让它富有表现力,感觉自然,成为你首先想到的东西,并且默认安全,这是该提案设计的一个重要部分。

当你开始超越这一点时,你就会开始说:“酷,这些异步通信的东西不必共享内存。”如果它们不必共享内存,并且它们在发送消息给对方,那么为什么它们必须在同一个进程中呢?这些东西应该能够在你的机器上的不同进程中。为什么只是进程?为什么不能是不同的机器?所以现在你有一个非常好的、渐进式的向分布式编程的过渡。

当然,当你开始谈论未来,这个宣言并没有深入探讨。但加速器是异步的东西,你通过发送消息给它们来异步通信。你如何编程它们?嗯,这变得非常有趣。这不在提案中。

但是,你希望程序员明确控制整个过程的程度是多少?

好问题。所以,当你设计任何这些功能或语言功能,甚至库时,你都必须做出一个非常困难的权衡:有多少是魔法?有多少在人类的控制之下?他们能预测和控制多少?当默认情况是错误的情况时,你会怎么做?

所以,当你设计一个系统时,我不会说名字,但有一些系统,开始很容易,然后你就跳了。让我们以 Logo 为例,类似的东西。开始很容易,它被设计用来教孩子,但当你深入进去时,你会遇到一个瓶颈。然后你就不能再往上走了。然后你该怎么办?你必须切换到另一个世界,重写你所有的代码。Logo 是一个愚蠢的例子,这在许多其他语言中都存在。

用 Python,你会说,呃,并发,对吧?Python 有全局解释器锁,所以线程在 Python 中很有挑战性。所以,如果你开始用 Python 编写一个大型应用程序,然后你需要并发,你就被一系列糟糕的权衡所困扰。有其他方法,你说,把所有的复杂性都压在用户身上,一次性全部压给他们。这也很糟糕,以另一种方式。

所以,我更喜欢构建一个你可以解释的简单模型,然后它有一个逃生舱。你进入,你有护栏,内存安全在 Swift 中是这样工作的,默认情况下,如果你使用所有标准的东西,它是内存安全的,你不会搞砸自己。但如果你想要一个 C 级别的指针,你可以明确地做到。但默认情况下,有护栏,有护栏。

但是,你知道,谁负责弄清楚代码的哪个部分可以并行化?

在这种情况下,这是人的工作。所以他们决定如何构建他们的应用程序。然后运行时和编译器非常可预测。这与,你知道,有大量的工作,包括 Fortran 的自动并行化编译器,这是一个糟糕的例子。

作为一名编译器人员,我可以嘲笑编译器人员。通常编译器人员会说:“酷,既然我不能改变代码,我将编写我的编译器,然后它将采用这段未修改的代码,并在我的机器上运行得更快。”应用程序开发人员。所以它进行模式匹配,进行非常深入的分析。编译器人员非常聪明。所以他们喜欢做一些非常聪明和棘手的事情。你通过将结构数组变成数组结构之类的东西来获得 10 倍的加速,因为它对内存来说好得多。有大量的技巧。

他们喜欢优化。是的,你喜欢优化。每个人都喜欢优化。每个人都喜欢它。

而且,这只是一个承诺:用我的编译器构建,你的东西就会变快。是的。

但问题是,你编写了一个程序,用我的编译器运行它,它运行得很快,你非常高兴。哇,它比其他编译器快得多。然后你去给你的程序添加一个功能,或者重构一些代码,突然你的性能下降了 10 倍。为什么?发生了什么?发生的事情是,你,那个模式匹配和编译器,无论它在做什么分析,都被打败了,因为你没有内联一个函数,或者别的什么。作为用户,你不知道。你不想知道。你不想知道编译器是如何工作的。你不想知道内存层次结构是如何工作的。你不想知道它如何在所有这些东西上并行化。你希望它被抽象掉。但一旦你做了某事,魔法就消失了,你就会从性能悬崖上掉下来。现在你处于一个奇怪的境地:我该怎么办?我不能改变我的代码,我不能修复那个错误,它花费了 10 倍的性能。现在我该怎么办?

这就是不可预测性能的问题。如果你关心性能,可预测性非常重要。

所以,提案提供了一种架构模式,可以让你布局你的代码,让你完全控制它,让它非常简单,这样你就可以解释它。然后,如果你想以不同的方式扩展,你就可以完全控制它。

所以,在你看来,编译器自动并行化太难了,对吧?因为编译器会自动做一些令人印象深刻的事情,但对于并行化,我们甚至还没有接近。

这取决于编程模型。所以,编译器有很多不同种类的编译器。所以,如果你谈论像 C 编译器或 Swift 编译器之类的东西,你正在编写命令式代码,并行化它并推理所有指针和类似的东西是一个非常困难的问题。

现在,如果你切换领域,有一个很酷的东西叫做机器学习。所以,机器学习的怪才们,除了其他令人喜爱的事情,比如解决猫探测器和其他类似的事情,他们取得了一个惊人的突破,那就是产生一个编程模型,你将操作组合在一起。这个抽象级别足够高,以至于突然间你可以拥有自动并行化编译器。你可以用 TensorFlow 编写和建模,并在 TPU 的 1024 个节点上运行它。

这是真的。我甚至没有想到,你知道,设计的灵活性如此之大,最终会归结为一个可为你并行的图。这对你来说是并行的。如果你仔细想想,那很酷。你认为批处理,例如,作为一种能够利用更多并行化的方式。这很简单,现在非常强大,它不是来自编程语言的怪才。那些人,他们只是在解决问题,使用一些 GPU,并由专注于机器学习的人们社区有机地发展起来。这是一个非常强大的抽象层,使编译器人员能够利用它。你可以用 Python 来驱动超级计算机。这很酷,这很了不起。

所以,只是停顿一下。因为我不是足够低级,我忘了欣赏它的美丽和力量。但也许只是停留一下。运行神经网络需要多长时间?编译有多难?

这真的很难。所以,你跳过了,你说“这太神奇了”,但它确实很难。这是一个很难的问题。而且,我认为并非所有系统都真正出色,包括我帮助构建的系统。所以还有很多工作要做。

是编译器怪才在做这个,还是一个全新的团队?

这是一个完整的堆栈问题,包括编译器人员。包括 API,比如 Keras 和 PyTorch 和 Jax 的模块 API。有一群人在推动这些事物的各个部分。因为当你看到它时,它是“我如何表达计算?”我堆叠层吗?好的,设置一个简单的层序列对于简单情况来说很棒,但如何处理困难情况?我如何进行强化学习?现在我需要将我的应用程序逻辑集成到这里。然后是下一级,你如何为运行时表示它?你如何获得硬件抽象?然后你进入下一个级别,说“忘掉抽象,我如何从 TPU 或 iPhone 加速器或任何东西中获得峰值性能?”所有这些不同的东西。以及如何,所以这是一个分层问题,这个领域有很多非常有趣的设计和工作。以及很多非常聪明的人在做这项工作。机器学习现在是一个资金雄厚的投资领域。所以有很多进展。

那么,在更低的级别,更接近 ASIC 的地方,有多少创新?重新设计硬件,或者重新设计与该硬件并发的编译器?如果你要预测最大的,你知道,摩尔定律式的改进,在推理和训练你的神经网络方面,所有这些,你认为它将来自哪里?

当然,你有可扩展性,有不同的东西。所以你有,你知道,吉姆·凯勒缩小工艺技术。你有 3 纳米而不是 5 纳米或 7 纳米或 10 纳米或 28 纳米或任何东西。所以它在前进,它提供了改进。你有架构级别的性能。所以,你知道,一个带有矩阵乘法单元和 systolic 阵列的 TPU 比拥有一个标量核心进行乘法和加法等操作要高效得多。然后你获得系统级别的改进,例如你如何与内存通信,你如何跨集群通信,你如何扩展,你如何拥有机器之间的快速互连。然后你获得系统级编程模型。现在你有了所有这些硬件,如何利用它。然后你获得算法突破,你说:“哇,酷,而不是在一周内训练 ResNet50,我现在在 25 秒内训练它。”

这是新的优化器和新的训练方案以及不同的训练方法以及所有这些东西的结合,它们共同推动世界前进。

这是一个美丽的阐述。但如果你被迫把所有的钱都押在一个上面,你会押哪个?

我们为什么要这样做?不幸的是,我们有很多人在做所有这些工作。这是一个激动人心的时代。所以,你知道,OpenAI 发表了一篇关于算法改进的小论文,它一直在指数级增长。我还没有看到对堆栈其他层的相同分析。我敢肯定它也在显著改进。我只是,这是一个很好的直觉构建器。我的意思是,摩尔定律之所以存在是有原因的,那就是有人写了一篇论文,做出了一个荒谬的预测,然后它在某种意义上变成了现实。这些叙事有一些东西。当你,你知道,克里斯·莱恩在一个愚蠢的小播客上把所有的钱都押在一个特定的东西上,它似乎会产生涟漪效应,实际上变成现实。这是一个有趣方面。因为,你知道,也许我们与摩尔定律的重点是,计算行业的绝大多数人都非常关注硬件。我不知道有多少软件创新,比如英特尔给予,比尔带走,对吧?

是的,编译器也得到了显著改进,对吧?

嗯,实际上不是。所以,我是在开玩笑说,软件变得越来越慢,几乎和硬件一样快,至少在 90 年代是这样。

在编译器中还有一个笑话,还有一个定律,我认为它叫做普鲁斯坦定律,意思是编译器每 18 年将任何给定代码的性能提高一倍。所以它们移动得很慢。

嗯,是的,这也是指数级的。你在进步。但同样,问题不在于编译器的力量仅仅在于如何让相同的东西运行得更快,而在于如何解锁新硬件。新芯片出来了,如何利用它?你说,哦,编程模型,我们如何让人们更高效?我们如何,你知道,有更好的错误消息?即使是像“我如何生成关于你的代码的非常具体的错误消息”这样平凡的事情,也能让人们高兴,因为他们知道如何修复它。

这又回到了你如何帮助人们完成工作。是的。

那么,在这个指数级增长的智能烤面包机世界里,你如何将计算扩展到所有这些设备?你看到这个世界,一切都是计算表面吗?你看到那种可能性吗?一切都是计算机?

我看不出有什么理由不能实现。事实证明,沙子变成了玻璃,玻璃也很有用。而且,你知道,为什么不呢?

那么,一个非常重要的问题是,如果我们生活在一个模拟中,而模拟正在运行一台计算机,那么那台计算机的架构是什么?你认为呢?你是在说它是一个量子系统吗?还是一个,是的,关于这个量子讨论,它是有必要的,还是我们可以用一个,你知道,RISC-V 架构,一群 CPU 来运行它?

我认为这取决于适合这项工作的工具。

是的,那正是我的问题。我如何让这项工作成为宇宙编译器?

嗯,据我们所知,量子系统是迄今为止堆栈的底部。所以,我们不知道在不使用量子计算机的情况下实现量子系统的有效方法。这完全超出了我们所谈论的一切。

但是谁来运行那台量子计算机呢?

是的。所以,如果我们真的生活在一个模拟中,那么它是更大的量子计算机吗?是不同的吗?它如何运作?它如何扩展?

嗯,它的大小是一样的。但然后,模拟的想法是,你不必运行整个东西。你知道,我们人类的认知能力非常有限。

检查点,检查点。

而且,如果我们,我们人类的那个点,所以你基本上只做最少量的,你知道,Swift 的“写时复制”?所以你只调整模拟。

并行宇宙理论?

所以,每一次做出决定,有人就会打开你的盒子里的锁,然后就会有一个分叉。这可能会发生。

感谢您考虑这种可能性。但是的,它可能不需要,你知道,整个宇宙来模拟它。但这是一个有趣的想法,因为我们正在创造越来越高保真度的系统。

但我确实想问一下量子计算机方面的问题,因为我们与 Sci-Fi、与编译器所谈论的一切,这些都不包括量子计算机,对吧?这是真的。你有没有想过,你知道,这项严肃的工程工作,量子计算机是什么样的?编译器的?架构的?所有这些东西?

我稍微看了一下。我几乎一无所知。这意味着我总有一天会找到一个借口来参与,因为那是……

你认为呢?你认为这是一个时机的问题吗?是时候参与了吗?现在还不是时候吗?

嗯,我真正擅长的是我跳进混乱的系统,弄清楚如何让它们,弄清楚真相是什么,试图找出统一的理论是什么,如何分解复杂性,如何找到一个优美的答案,一个被充分研究过,很多人都碰壁过的问题。我不知道量子计算机是否足够成熟和易于访问,可以被弄清楚。

而且,我认为量子计算机的开放性问题是,是否有量子计算机解决的有用的问题,使其值得拥有这些东西的经济成本,以及拥有大量的人来设置它?你回到 50 年代,有预测说世界只需要七台计算机。

而且,部分原因是人们还没有弄清楚它们有什么用。我们要运行什么算法?要解决什么问题?这又回到了我们如何让世界变得更好,无论是经济上,还是让某人的生活变得更好,或者解决一个以前没有解决过的问题,诸如此类的事情。

而且,我认为我们在这个发展周期中还为时过早,因为它仍然是字面上的科学项目,没有负面含义,它是一个科学项目。而且,那里的进步是惊人的。所以,我不知道是 10 年后,是 2 年后,突破会发生在哪里。

但是,你看看机器学习,我们经历了几个赢家,在 AlexNet 过渡之前,然后突然它就有了突破性的时刻。那是驱动人才涌入的催化剂。那是驱动经济应用的。那是驱动技术加速的,因为你现在有更多的人投入到这个问题中。这就是导致深度学习和我们使用的算法的原因。

所以,我认为这就是量子需要经历的。所以,现在它处于那个可怕的阶段,找到它,弄清楚物理学。然后它必须找到一个有用的应用程序。就像现在,我不是怀疑它会发生。我认为这只是,你知道,十年左右的时间。

我忘了问,你认为模拟是用什么编程语言写的?

哦,可能是 Lisp。

所以不是 Swift?如果你要打赌,如果你要打赌?

我只说这么多。

所以,我们提到了你与所有这些公司合作过。我们谈论了所有这些项目。如果我们退一步,放大你完成工作的方式,看看新冠疫情时代,我们正在经历的这场大流行。如果我看看硅谷人的谈话方式,看看 MIT 的谈话方式,这可能会持续很长时间,不仅仅是病毒,还有远程办公的性质,经济影响。我……是的,是的,这将是一团糟。

你的预测是什么?我是说,从科幻小说到谷歌,再到所有你工作过的地方,硅谷,你就在其中。你认为整个地方将如何改变?

是的,所以,我真的只能从技术角度来谈。我身处那个泡沫中。我认为这将非常有趣,因为,你知道,远程和视频会议的 Zoom 文化对人们有非常有趣的影响。一方面,它是一个很好的正常化器。它是一个正常化器,我认为它将帮助那些传统上代表性不足的群体。因为现在,在某些情况下,你摘下了面具,你不需要打开摄像头,对吧?所以你可以进行对话,而身体外表不是动态的一部分,这非常强大。你正在接纳远程员工,他们已经远程工作了,你正在说,你现在和其他人处于同一水平和地位。没有人会使用白板。你不会是那个不参与白板对话的人,这非常强大。

你正在迫使人们在某些情况下异步思考,因为很难将人们聚集在一起,而偶然的碰撞迫使人们找到解决这些问题的新方法。我认为这会导致更具包容性的行为,这是好事。

另一方面,它也很糟糕。所以,你知道,实际的沟通,或者只是每天和人们在一起,与他们合作,这很糟糕。是的,所有这些,对吧?我的意思是,这一切都很糟糕。

我主要的意思是,我认为大多数人喜欢与人一起工作。我认为这是很多人天生就会做的事情。而且我认为我们从中获得了一些东西,这些东西很难表达,至少对我来说是这样。所以,也许不是每个人都如此。

所以,问题是,你知道,当你度过那个适应期后,你从三月和四月走出来,进入十二月,进入明年三月,如果它没有改变,那已经很可怕了。

你想到这一点,然后想到工作的性质,对吧?我们如何适应?人类是非常适应的物种。我们可以学习。当我们被迫时,并且有催化剂时。那么,从中会产生什么?我们会变得更好还是更糟?我认为,你知道,你看看湾区的房价,简直是疯了。为什么?因为有很强的激励要留在物理位置上,因为如果你没有近距离,你就会付出代价,通勤。而且,在社会压力方面,一直存在巨大的压力,比如“你必须参加会议”,或者任何情况。我认为这将会好得多。我认为远程员工将变得更加普遍,我认为这将非常好。

你有没有朋友,或者听说有人搬家?

我知道一个家庭朋友搬家了。他们搬回了密歇根。你知道,他们是一个有三个孩子的家庭,住在一个小公寓里,快疯了。他们在科技行业工作,丈夫在谷歌工作。

首先,我的朋友们有的正在失去,有的已经失去了他们的生意,他们充满激情、梦想的东西。可能是小企业家项目,也可能是大型企业,比如经营健身房的人,比如开餐馆的人,很多东西。

但是,也有人照镜子问自己:“我人生想做什么?”出于某种原因,他们直到新冠疫情才这样做。他们真的问了这个问题。这通常会导致搬家,或者离开公司,或者开始自己的生意,或者转到另一家公司。

你认为我们会看到很多这种情况吗?

嗯,我不能说。我是说,我们肯定会比以前看到更多的情况。因为,我认为你试图说的是,有些决定是你自己做的,你做出了重大的生活决定,比如“我要辞职,开始新的事情”。也有一些决定是为你做的,比如“我被解雇了,我该怎么办?”这不是你思考过的决定,但你被迫采取行动。

所以,我认为那些“被迫行动”的时刻,比如全球大流行病来了,经济崩溃了,你的生意就不存在了。我认为这确实会导致更多的反思,因为你对你所拥有的东西的束缚更少了。它不是“我有什么可失去的,与我有什么可获得的”的比较。它更像是一个新的开始。

我能做任何事。我现在想做我以前做的事情吗?那让我快乐吗?现在是时候回去上大学,上一门课,学习一项新技能了吗?这是花时间陪伴家人的时间吗,如果你能负担得起的话?这是真的搬去和父母住吗?我的意思是,所有这些以前不正常的事情,突然间变得……我认为价值体系已经改变了。而且,我认为这实际上是一件好事,至少在短期内是这样。因为,你知道,世界在一种优先事项上进行了过度优化。现在也许我们会得到一个更平衡、更有趣的世界,人们在做不同的事情。我认为这可能是好事。我认为它可能会带来更多的创新。

你对我们正在经历的所有社会混乱有什么看法?这很糟糕。你认为一切都会好起来吗?

嗯,我认为人类会幸存下来。

从生存的角度来说,我们不会都死掉。

嗯,是的,我认为病毒不会杀死所有人类。我认为所有人类都不会杀死所有人类。我认为这不太可能。

但我把它看作是进步需要催化剂。所以,你需要一个理由,让人们愿意做不舒服的事情。我认为美国至少,但我想世界总体上,对很多人来说,是一个相当不理想的生活场所。我认为我们现在看到的是,我们看到了很多不快乐。因为,因为所有的压力,因为世界上所有的坏事都汇集在一起,它真的点燃了一些应该很久以前就发生的辩论。

我确实认为我们会看到更多的进步。你问的是离线,你问的是政治。难道不希望政治 move faster 吗?因为世界上有这么多问题,我们可以 move it。

人们是故意的,或者本质上是保守的。所以,如果你谈论保守的人,特别是如果他们肩负重担,因为他们代表着成千上万的人,那么保守是有道理的。但另一方面,当你需要改变时,你如何实现它?全球大流行病可能会带来一些改变。它不是一个有方向的计划,但我想它会让人提出一些非常有趣的问题,其中一些问题应该很久以前就被问到了。

让我知道你是否也观察到了这一点。机器学习社区中有些事情一直困扰着我,我猜想它可能在其他地方也很普遍。那就是,感觉就像 2020 年的毒性水平有所提高。人们更容易攻击别人,他们只是对彼此很严厉,就像 mob 一样,挑出一个搞砸了的人,然后大肆宣扬。

你在其他地方观察到过这种情况吗?有没有办法摆脱它?

我认为人类有一种固有的“我们 vs. 他们”的东西。那就是你想成功。你如何成功?嗯,这是相对于别人的。所以,至少在某些方面,随着互联网和在线交流的出现,世界变得越来越小。所以,我们有一些社会纽带,比如“我的城镇”对“你的城镇”的橄榄球队。变成了更大的、但更肤浅的问题。而且,人们没有时间。激励因素是点击诱饵,以及所有这些东西,它们都真的喂养了这个机器。我不知道它会走向何方。

是的,我的意思是,我之所以想到这一点,是因为我私下里和你提到过一点。你知道,我有几个困难的谈话要安排,有些是政治相关的,有些是在社区内的,困难的个性,经历了一些事情。我的意思是,其中一个我以前谈过,我还会再谈,就是 Yann LeCun。他在 Twitter 上因为谈论一篇关于数据集中的偏见而受到了一些批评。然后,在我看来,而且我很乐意说出来,对他评论的指责是巨大且不合理的夸张。因为他做出了非常基本的评论,即如果数据中有偏见,结果就会有偏见,所以我们不应该在数据中有偏见。但人们攻击他,因为他轻描淡写了偏见问题,认为这不仅仅是数据中的偏见。是的,这是一个很好的观点,但这并不是他所说的。这并不是他所说的。而且,回应,隐含的回应是他基本上是性别歧视和种族主义,这完全消除了细微讨论的可能性。

播客长篇对话的一个好处是,你可以把它谈出来,你可以阐述你的推理过程,即使你错了,你仍然可以表明你是一个好人。

你关于无法进行富有成效的讨论的观点,你如何才能达到人们可以改变、可以学习、可以倾听、可以思考、可以参与的程度,而不是仅仅是肤浅的,然后继续前进?而且,我认为真正的进步来自于此。而且,我认为你不应该期望它。我认为你会看到它加强了个人圈子和“我们 vs. 他们”的观点。我认为这是相当分裂的。

我认为,在 Twitter 上,当我在观察事物时,最让我烦恼的人不是那些非常情绪化、愤怒、过度的人,而是那些支持他们的人。我认为我们应该互相教导的是要有同情心。在 Twitter、互联网或电子邮件上,很容易忘记的是,有时人们只是度过了糟糕的一天。是的,你度过了糟糕的一天,或者你处于这种情况,你知道,会议之间,快速回复一封电子邮件,因为我想帮助解除封锁。措辞非常客观错误。我搞砸了。突然间,这变成了人们记住的东西。这不是因为他们不好,也不是因为你不好。这只是心理学,你说了一句话,它就留在了你身上。你不是那个意思,但它确实影响了某人,因为他们这样解释了。这只是我们作为人类一起工作的副作用。

我对人类的长期潜力非常有信心。但我认为这总是一段颠簸的旅程。你开始说,科罗娜和现在发生的所有社会动荡意味着什么?我认为短期内它非常糟糕,但我认为它将带来进步。所以,

我非常感激,是的,短期内确实很痛苦。嗯,是的,我的意思是人们失业了,有些人甚至吃不上饭,这太可怕了。但是,你知道,这是进步,所以我们会拭目以待,看看会发生什么。我的意思是,真正的问题是,当你回顾现在做出的决定,从现在起 10 年、 20 年、 100 年后,我们该如何评价它们?我认为这才是真正可以构建和看待它的方式,你说你整合了所有正在发生的短期内的可怕事情,然后看看这意味着什么,以及全世界的进步或倒退是否足够显著,足以使其成为一件好事或坏事。我认为这就是问题所在。是的,为此,研究历史很有好处。我目前面临的一个大问题是,我正在阅读《第三帝国的兴衰》,轻松阅读,所以一切都让我觉得我看到了相似之处,而且,我的意思是,你必须非常小心,不要越界,但最让我担心的是,当几件事结合在一起时,人们感到的痛苦,比如经济萧条,这在这个国家很有可能发生,然后就是被不尊重。是的,以某种方式,德国人民确实被世界上大多数人所不尊重,以一种过分的方式,以至于可以累积起来,然后你只需要一个有魅力的领导者,无论走向积极还是消极,只要他们有魅力,并且他们再次利用了世界正处于的那个转折点,他们会怎么做,可能是好是坏。所以,这是思考当下时间的好方法,就像在个人层面上,我们决定做什么,当历史被书写时,你知道,30 年后,2020 年发生了什么,历史可能会记住 2020 年。是的,我认为是这样,无论是好是坏,都取决于我们去书写它,所以这很好。

我观察到的一件事,我觉得很有趣的是,大多数人好像世界不会改变。你做出决定,你知道,你根据最近的过去所见来预测未来。所以,如果一直下雨,每天都下雨,那么你当然也期望今天会下雨,对吧?另一方面,世界一直在变化,是的,不断地,无论是好是坏,对吧?所以问题是,如果你对一些不对的事情感兴趣,那么导致改变的转折点是什么?你可以参考历史,看看是什么催化剂导致了那种爆发,导致了那种法案,导致了那种,你可以从那里倒推,也许如果你能把合适的人聚集在一起,把正确的想法聚集在一起,你就能真正开始推动这种改变,并以一种富有成效且伤害更少人的方式去做。是的,就像一个人,一个事件可以改变一切,绝对一切都始于某个地方,而且通常是多种因素的结合,但,是的,这些事情是可以被设计的,这实际上是我对一切,以及人性,长期持乐观态度的原因,你知道,我们可以看到人类所有的消极面,所有的琐碎,所有的自私,以及,嗯,就是那种残酷,对吧?偏见,人类有时会非常糟糕,但另一方面,我们也能做出惊人的事情,而且,嗯,跨越百年来看,进步是惊人的,即使是跨越几十年,我们也走了很长的路,还有很长的路要走,但这并不意味着我们已经停止了。是的,过去 100 年我们所做的事情是难以置信的,想想未来 100 年会发生什么,这有点令人害怕,就像令人兴奋一样,令人害怕,因为,有点可悲的是,未来 10 年、 20 年、 30 年后会出现的技术,我们可能太老了,无法真正欣赏,因为我们没有在它里面长大,就像现在的孩子们一样,他们有他们的虚拟现实和他们的 TikTok 之类的东西,就像,这东西怎么用,来吧,给我我的静态照片,你知道,我的 Commodore 64。是的,是的,没错。

好的,抱歉,我们有点跳过了,但让我问一下,你知道,机器学习领域一直受到 GPT-3 和这些语言模型的启发,激发了他们的想象力。我认为,了解你对这个令人兴奋的领域的看法会很酷。你对这个与计算实际相关的,嗯,语言模型,它们非常庞大,需要许多许多计算机,不仅是训练,还有推理。当然,嗯,我的意思是,这取决于你和谁说话,但我的意思是,我认为深度学习有一个相当成熟的理解的极限,那就是,如果你让模型更大,并且给它更多的数据,假设你训练得当,并且拥有良好的模型架构,你就会得到一个更好的模型。所以,一方面,GPT-3 并不那么令人惊讶。另一方面,为了实现它,付出了巨大的工程努力。我认为它的影响非常巨大。当 GPT-2 出来时,OpenAI 发表了一篇非常挑衅的博客文章,说我们不会发布它,因为它可能被滥用而造成的社会损害。我认为这仍然是一个担忧。我认为我们需要看看技术是如何应用的,你知道,善意的工具可能被以非常可怕的方式应用,并且它们可能产生非常深远的影响。嗯,我认为 GPT-3 是一个巨大的技术成就,而 GPT-4 会是什么?它可能会更大,训练成本也更高。非常酷的架构技巧。你认为有什么?我不知道你对分布式计算想了多少。有没有一些有趣的技术挑战,你希望能够探索,关于一个系统,比如一段代码,你知道,GPT-4,它可能有,我不知道,数万亿个参数,我们必须在数千台计算机上运行。有没有希望我们能做到这一点?是的,嗯,我的意思是,今天你可以写一张支票,获得 1000 个 TPU 核心的访问权限,并进行非常有趣的大规模训练和推理以及类似的事情,例如在 Google Cloud 中。所以,我认为这不是规模问题,而是效用问题。当我看到 GPT 系列所基于的 Transformer 系列架构时,研究它们非常有趣,因为它们实际上非常简单,设计简单,它们不是循环的,训练过程非常简单,所以它们并不真正反映人类大脑。但是它们非常擅长学习语言模型,而且它们足够展开,你可以模拟一些循环。所以,我想到的问题是,这会将我们带向何方?所以,我们可以继续扩大规模,拥有更多的参数,更多的数据,更多的事物,我们肯定会得到更好的结果,但有没有架构技术可以更快地取得进展?这就是,你知道,如何获得,而不是仅仅让它变得更大,如何从中获得算法上的改进?无论是新的训练方案,如果它变成稀疏网络,例如,人脑是稀疏的,所有这些网络都是密集的,连接模式可能非常不同。我认为这就是我非常感兴趣的地方,而且我在这方面远远超出了我的能力范围,但我认为这可能会带来重大突破。当你谈论大规模网络时,杰夫·迪恩喜欢谈论的一件事,他做过几次演讲,就是拥有一个稀疏门控专家混合模型,你有一些不同的网络被训练过,并且非常擅长某些类型的任务,所以你有一个跨集群的分布式系统,所以你有很多不同的计算机,它们在不同的领域 locally specialized,然后当一个查询进来时,你对其进行门控,并使用学习到的技术将其路由到网络的各个部分,然后你通过在其中进行 specialization 来利用整个集群的计算资源。我不知道这会走向何方,或者它何时开始起作用,但我认为类似的事情也会非常有趣。然后是数据方面,如果你能将数据选择视为一种编程,我的意思是,基本上,如果你看看凯西谈到的软件 2.0,我的意思是,从某种意义上说,数据就是编程。是的,是的。

所以,我只是,让我快速总结一下安德烈的立场,然后我将不同意他。是的,安德烈·凯西非常了不起,所以这与他无关,他是一位了不起的工程师,也是一位优秀的博文作者。是的,他是一位伟大的沟通者,他是一位了不起的人,他也很善良。所以,他的基本前提是软件是次优的,我认为我们都可以同意这一点。他还指出,深度学习和其他基于学习的技术非常棒,因为你可以用更结构化的方式解决问题,用更少的临时代码,人们会写出来,有时甚至不写测试用例,所以他们甚至不知道它是否有效。所以,如果你开始用深度学习模型替换命令式代码系统,你就会得到更好的结果。好的,我认为他认为软件 2.0 是一个普遍学习的模型集合,你不再编写代码,他做过演讲,谈论如何越来越多地将代码的一部分替换为学习到的代码,并以这种方式驱动。我认为这很有效,如果你倾向于喜欢机器学习,那么这绝对是一件好事。这在很多方面也有利于可访问性,因为有些人不会写 C 代码或其他东西,所以拥有一个数据驱动的方法来做这些事情我认为非常有价值。另一方面,存在巨大的权衡,而且我不清楚软件 2.0 是否是答案,而且安德烈可能也不会认为它适用于所有问题。但我将机器学习视为对软件 1.0 的补充,我将其视为一种新的编程范式。所以,编程范式,当你跨越领域时,你知道,结构化编程,你从 goto 转向 if then else,或者函数式编程,从 Lisp 开始,你开始谈论高阶函数和值以及类似的东西,或者你谈论面向对象编程,你谈论封装、子类、继承,你开始谈论泛型编程,你开始谈论代码重用,通过在不同类型实例化中的 specialization。当你开始谈论可微分编程时,这是我非常兴奋的,在机器学习的背景下,谈论函数并生成变体,比如另一个函数的导数,这是一种非常有用的编程范式,用于解决特定类的问题。机器学习在解决特定类的问题方面非常出色,比如你不会用 C 代码编写猫检测器,甚至语言翻译系统,那不再是一种非常有效的方式。所以,机器学习绝对是正确的方法。事实上,我会说,学习模型确实是处理人类世界的最佳方式之一。所以,任何时候你谈论多模态的感官输入,任何时候你谈论以一种对人类有意义的方式生成事物,我认为学习模型真的非常有用,那是因为人类很难被描述。所以,这是一个非常强大的解决问题类别的范式,但另一方面,命令式代码也是如此。你不会用深度学习模型编写计算机的引导加载程序。深度学习模型对硬件要求很高,对能源要求也很高,因为你有大量的参数,而且你可以通过这种学习模型来证明实现任何函数,这已经被证明了,但这并不意味着它有效率。所以,如果你谈论的是能源消耗的几个数量级,那么拥有其他工具箱工具就很有用。还有鲁棒性,我的意思是,是的,正是所有处理数据和偏见以及数据的问题,所有关于软件 2.0 的问题,而安德烈正在倡导的一件很棒的事情,我完全同意他,那就是当你开始用深度学习实现东西时,你需要从软件 1.0 中学习,关于测试、持续集成、如何部署、如何验证所有这些东西,并围绕这些构建系统,这样你就不会只是说,哦,看起来不错,发货吧。那么,当我的某个东西回归时会发生什么?当我做出一个错误的分类,然后我伤害了某人时会发生什么?我的意思是,所有这些事情你都必须考虑。是的,但同时,对我们人类来说,那个工作的引导加载程序看起来很像一个神经网络,对吧?所以,它很混乱,你可以切掉大脑的不同部分,有很多神经可塑性研究表明它会调整。这是一个非常有趣的问题,软件 2.0 可以取代多少世界编程?嗯,我的意思是,可以证明可以取代所有这些,所以问题不在于是否,我认为这是一个经济问题,这是一个你可以获得什么样的人才,维护方面的权衡是什么?我认为,你可以收集什么样的数据?我认为我最感兴趣的机器学习作为一种编程范式的原因之一是,我们在计算领域普遍看到的一件事是,过度专注于一种范式通常会让你陷入困境,这并不好。所以,你看看面向对象编程,它在 80 年代初非常流行,一切都必须是对象,人们忘记了函数式编程,即使它先出现。然后人们重新发现,嘿,如果你混合函数式和面向对象以及结构化,就像你混合这些东西一样,你可以提供非常有趣的工具,它们擅长解决不同的问题。所以,那里的问题是如何以最好的方式解决问题。这不是关于哪个部落应该获胜,不是关于,你知道,那不应该是问题。问题是如何让人类能够最快地解决这些问题,并且他们拥有正确的工具箱来构建优秀的库,并且他们能够解决这些问题。当你看到这一点时,你知道,你看看强化学习,这是一个非常有趣的子领域。强化学习通常需要集成一个学习模型和你玩的 Atari 或其他场景。你必须将那个东西与机械臂的机器人控制结合起来。所以,现在不仅仅是关于那个范式,而是关于将其与其他所有系统集成,包括经常存在的遗留系统。所以,对我来说,我认为有趣的是,如何从中获得最好的东西,以及如何让人们能够实现他们否则无法实现的目标,同时又不排除我们已经知道的所有好东西。但,好的,这是一个疯狂的问题,但我们谈论了 GPT-3 一点点,你认为这些语言模型,本质上在语言领域,软件 2.0,是否有可能取代编译的某些方面,例如,或者进行程序合成,取代编程的某些方面?是的,绝对。所以我认为,总的来说,学习模型非常强大,我认为人们低估了它们。也许你可以建议我该怎么做,例如,访问 GPT-3 API,我能否生成 Swift 代码?你认为这能做些什么有趣的事情吗?所以,GPT-3 可能没有在正确的语料库上训练,所以它可能能够生成一些 Swift,我敢打赌它能。它可能无法生成足够多的 Swift 来有用。但,就像,更进一步,如果你想训练类似 GPT-3 的东西,你想训练它生成源代码,它绝对可以做到。现在的问题是,你如何表达你想要填充的内容的意图?你绝对可以写出代码的脚手架,然后说填补空白,然后放一些 for 循环,打开一些类,或者其他什么,这些模型的威力令人印象深刻。但至少对我来说,有一个未解决的问题是,我如何表达要填充的内容的意图?你真正想要的是,我不知道这些模型是否能做到,那就是,你想要能够说,这里有一个脚手架,这里是最后的断言,并且断言总是通过的。所以,一方面,你想要一个生成模型,是的,哦,那太迷人了,是的,对吧?但你也想要一些反馈,一些强化学习系统或其他东西,你实际上在说,我需要爬升到一些更正确的东西,我不知道我们是否有那个。所以,它不仅会生成大量的代码,还会生成检查代码的测试,它会生成测试。我认为,人类会生成测试,因为测试是需求。是的,但,好的,因为你必须向模型表达你想要什么,你不想只是得到一些无意义的代码。看看这段代码多么引人注目,你想写一个关于四角独角兽的故事,或者别的什么。好吧,那么,正是如此,但那是人类的需求。然后,我认为 GPT-4 模型能够生成更,嗯,高保真的检查,检查正确性,因为它生成的代码,比如,我让它生成一个给我斐波那契数列的函数。当然,分解问题,对吧?你有两件事,你需要能够生成语法正确的 Swift 代码,这很有趣,我认为 GPT 系列模型架构可以做到这一点。但然后你需要能够添加需求,所以生成斐波那契数列,人类需要表达这个目标。据我所知,我们没有那种语言。不,我的意思是,它可以生成,你见过 GPT-3 可以生成什么吗?你可以说,我的意思是,有接口的东西,它可以生成 HTML,它可以生成基本的 for 循环,给你一些,对吧?但选择 HTML,我怎么说我想要 google.com?不,你不能说,或者不完全是 google.com。我怎么说我想要一个有购物车和其他东西的网页?我的意思是,好吧,所以,我不知道你是否见过这些演示,但你输入,我想要一个红色的按钮,上面写着“你好”,然后你用自然语言输入,它就生成了正确的 HTML。完成了这个演示,这有点令人信服。所以,你必须用类似的映射来提示它,当然,它可能是精心挑选的,必须进行实验,他们可能,但他们能够做到这一点,即使是 20 次中的一次,也是相当令人印象深刻的。再次,那是非常基础的,就像 HTML 有点混乱和糟糕。当然,当然,但是的,意图是意图,规格是自然语言。好的,所以我没有见过,那真的很酷。是的,是的,是的。但问题是,它的正确性,就像视觉上你可以检查,哦,按钮是红色的,但对于更复杂的函数,意图更难检查,这涉及到 NP 完全性之类的事情。我想知道这段代码是否正确,并且生成了一个巨大的东西,它做了一些计算,似乎在工作。思考一下,系统是否也应该尝试生成检查以确保正确性?我不知道,这远远超出了我的经验。我认为,似乎没有多少等式推理在进行,有很多模式匹配和填充,以及将看到的模式传播到未来和生成结果中。所以,如果你想要正确性,你需要定理证明之类的东西,以及更高级别的逻辑。我不知道你可以和 Yan 谈谈,看看那些聪明的人现在在想什么,但我认为 GPT 不属于那个范畴。它仍然非常酷,而且令人惊讶。谁知道呢,也许推理被高估了。是的,被高估了。我的意思是,我们推理吗?你怎么说?我们只是基于我们所拥有的东西进行模式匹配,然后为自己辩护,对吧?正是反向的。所以,我认为神经网络缺少的是,我认为 GPT-4 可能拥有的是,能够讲述关于它所做的事情的故事。是的,这就是人类所做的,对吧?我的意思是,你谈论网络可解释性,我们对神经网络很苛刻,但人类不知道我们为什么做决定。我们有直觉,然后我们试图说,感觉是对的,但为什么呢?你做艰难决定时会挣扎。这科学吗?不。

让我问几个高层问题,我想,你一生中做过很多事情,并且在很多方面都非常成功。一些年轻人听这个,向像你这样的成功人士寻求建议。如果你要给一个研究生或一个高中生关于追求计算职业或关于生活的建议,你有什么智慧之言可以给他们吗?我认为这又回到了变化,你知道,巨大的飞跃之所以发生,是因为人们愿意相信改变是可能的,并且世界确实在改变,并且愿意做使改变发生所需的艰苦工作。无论是实现一种新的编程语言,还是实现一个新的系统,还是实现一个新的研究论文,设计一个新的东西,推动科学和哲学在世界上的进步,无论是什么,它都归结为某个人愿意付出努力。而且,工作很难,原因有很多,其中之一就是,它是工作,所以你必须在生活中拥有可以做这项工作的空间,这就是为什么对某些人来说,读研究生是一件美妙的事情。但也有自我怀疑,比如,你做了两年项目,它有什么进展吗?你该怎么办?你只是因为困难就放弃吗?不,我的意思是,有些人喜欢受苦。所以,你坚持下去。对我来说,秘诀是你必须热爱你所做的事情,并追随你的热情,因为当你遇到困难时,那时你就知道,如果你热爱你所做的事情,你就愿意坚持下去。这真的很困难,因为很难知道你喜欢做什么,直到你开始做很多事情。所以,这就是为什么我认为,尤其是在职业生涯早期,尝试各种事情,做一点点,去上那些关于,你知道,你高年级课程的前半部分的四种不同课程,只是接触事物,因为有些事情会引起你的共鸣,你会发现哇,我真的很擅长这个,我真的很聪明。嗯,这只是因为它适合你的大脑。当有些东西跳出来时,我的意思是,人们经常问的问题是,嗯,我认为有很多很酷的东西,我该如何选择?是的,你如何将自己钩住并坚持下去?嗯,我运气好,我的意思是,我认为很多人都忘记了,其中很大一部分,或者大部分是运气。所以,让我们不要忘记。对我来说,我早就爱上了计算机,因为它们对我说话,我猜。它们说什么语言?BASIC。是的。但,嗯,但然后只是遵循一系列逻辑进展,但也决定做一些困难的事情是值得的,而且很有趣。所以,我认为这对许多其他领域也是如此,那就是,如果你找到你热爱做的事情,而且也很困难,如果你投入自己,并为世界增加价值,那么它通常会有意义。再次,这可以是一篇研究论文,可以是一个软件系统,可以是一个新的机器人,有很多事情可以做到,但很多时候,真正的价值来自于做困难的事情,这并不意味着你必须受苦,但它确实很困难。我的意思是,你很少听到这个信息。我们上次也谈过一点,但我,我,不是足够多的人谈论这个,它很美妙,听到一个成功的人。嗯,自我怀疑和冒名顶替综合症,这些都是成功人士也会遭受的,特别是当他们把自己置于不舒服的境地时,我喜欢时不时地这样做,只是因为它让你处于学习模式。如果你想成长,把自己置于一个房间里,里面有很多人,他们对你正在谈论的任何事情都比你了解得多,问愚蠢的问题,猜猜看,聪明人喜欢教,通常不是总是,但通常是。如果你听,如果你准备好倾听,如果你准备好成长,如果你准备好建立联系,你可以做一些非常有趣的事情。我认为很多进步是由那些偶尔在不同领域之间跳跃的人完成的,因为他们带来了别人没有的视角。如果人们只在这个领域工作过,我们提到宇宙就像一个编译器,你知道,整个进化就像一种编译,也许我们人类也是一种编译器。让我问那个我上次没有问的古老荒谬的问题,这一切的意义是什么?有意义吗?如果问编译器为什么,编译器会怎么说?生命的意义是什么?生命的意义是什么?嗯,我准备好它可能没有任何意义。我们都是被编程来生存和繁衍我们 DNA 的生物。也许宇宙只是一个计算机,你一直运行,直到熵接管世界,或者接管宇宙,然后你就完成了。我认为这不是一种非常有效的生活方式。所以,我更倾向于另一种方式,那就是说,世界,宇宙有很多价值,我从其他人那里获得快乐,很多时候部分是有了孩子,但也是你与他人建立的关系。所以,我试图过我的生活的方式是,我能做什么有价值的事情?我如何推动世界前进?我如何利用我的优势并将其带入世界?我如何,我是那些喜欢努力工作并专注于我所做的事情的人之一。所以,如果我要这样做,如何才能在一个真正重要的领域呢?因为我们做的很多事情,我们发现自己陷入了一个循环,比如,我正在做一件事情,我非常熟悉它,我做了很长时间,我从来没有做过其他事情,但我没有真正学习,我没有真正,我只是在维持,但有一个年轻一代,他们可以做同样的事情,甚至可能比我做得更好。也许如果我真的退出这个,进入一些我不舒服的事情,这很可怕,但另一方面,它给了别人新的机会。它也让你重新回到学习模式,这可能非常有趣。我学到的一件事是,当你经历了这个,首先你深入到冒名顶替综合症,但当你开始摆脱它时,你开始意识到,嘿,这实际上是有方法的。现在我能够添加新的东西,因为我带来了不同的视角。这就是带来不同类型的人在一起的好处之一,思想的多样性非常重要。如果你能把来自不同方向的人聚集在一起,你通常会获得创新。我喜欢看到那种恍然大悟的时刻,你会觉得,我们真的解决了这个问题,这是前所未有的。然后,如果你能在这样一个环境中做到,它能增加价值,其他人可以建立在它之上,它有助于推动世界,那么这才是真正让我兴奋的。所以,那种对人类体验的魔力的描述,你认为我们会在 AGI 系统中创造出来吗?你认为我们会能够赋予人工智能系统意义感,让它们在这个世界上运作,就像你描述的那样,它们相互互动,它们与我们人类互动。当然,当然。嗯,所以,我的意思是,你为什么如此种族主义?好吧,好吧,所以 AGI 对比生物网络,或者,你知道,对比生物。我们是什么?机器,对吧?我们只是被编程来运行我们的目标函数,我们优化它,对吧?所以,我们做我们的事情,我们认为我们有目的,但我们真的有吗?我准备好说,那些新来的 AGI 没有灵魂,仅仅因为我们不理解它们。我认为,当它们存在时,通过你自己的视角去看待一个新事物,而没有完全理解它,那将是过早的。你可能只是因为未来的人工智能系统会听这个而这么说,然后,哦,是的,是的,你不想说什么。请对我好一点。你知道,当天网天网杀死所有人时,请饶了我。明智的,有远见的。但我的意思是,我认为人们花了很多时间担心这类事情,我认为我们应该担心的是,我们如何让世界变得更好。我最害怕 AGI 的不是,不一定是因为天网会用激光射击每个人,用我们来获取卡路里。我担心的是,我认为人类需要挑战,如果我们进入一种没有个人挑战,没有个人贡献的模式,无论是你的孩子,看到他们成长并帮助指导他们,无论是你参与的社区,你正在推动它,无论是你的工作和你正在做的事情,以及你正在与之合作的人,以及你正在构建的产品以及那里的贡献。如果人们没有目标,我担心这意味着什么。我认为这将导致人们最糟糕的一面出现,而不是人们一起努力,试图让世界变得更好,它可能会退化成一个非常令人不愉快的世界。但,但,我不知道。我们希望还有很长的路要走,在我们发现这一点之前。不幸的是,我们现在在疫情方面面临着相当严峻的问题。所以,我认为我们也应该关注这一点。最终,就像你说的,你是乐观的。我认为我们保持乐观是有帮助的。这是“假装直到你成功”。嗯,为什么不呢?另一边是什么?我的意思是,我个人不是一个非常虔诚的人,但我听过人们说,哦,当然,我相信上帝,当然,我去教堂,因为如果上帝是真的,你知道,我想站在他那边。如果不是真的,那也没关系。所以,你知道,这是一种公平的做法。是的,我的意思是,核威慑,全球变暖,所有这些威胁,自然和人为的流行病,所有这些威胁,我们面临的威胁。我认为,对所有可能毁灭自己的方式感到恐惧是令人麻痹的。我认为,更重要的是,或者至少更有成效的是,保持希望,并设计防御措施,设计一个积极的未来,并设计那个未来。是的,而且我认为这是另一件需要考虑的事情,作为一个人,特别是如果你年轻,并且正在努力弄清楚你想成为什么样的人,就像我一样。我总是在寻找那个问题,那么,你想如何度过你的时间?现在似乎有一种常态,就是消费文化,比如,我要看新闻,然后陶醉于现在一切有多么糟糕。我要去了解最新的暴行,了解所有关于发生的糟糕事情的细节,并对此感到愤怒。你可以花很多时间看电视,看最新的情景喜剧,或者人们现在看的任何东西,我不知道。但那有很多小时,而这些小时,如果你把它们变成富有成效的,学习,成长,体验,你知道,疫情结束后去探索。它会导致更多的成长,我认为它会导致更多的乐观和幸福,因为你在建设,你在建设自己,你在建设你的能力,你在建设你的观点,你在建设你的视角。而且,我认为很多消费别人的信息会导致一种消极的观点,你需要意识到正在发生的事情,因为那也很重要,但有一种平衡。我认为专注于创造是一件非常有价值的事情。是的,所以你的意思是,人们应该专注于从事所有领域中最性感的领域,那就是编译器设计。正是如此。嗯,嘿,你可以去从事机器学习,然后被学校里成千上万的毕业生挤掉,他们都想做同样的事情,或者你可以去一个人们会高薪聘请你的地方,因为那里没有足够聪明的人在做。而且,根据一些人的说法,在摩尔定律的尽头,实际上软件也是难点。我的意思是,优化确实是美丽的,而且在 YouTube 或教育方面,嗯,会有人想看到编译器的美妙之处。是的,是的,这是对人们创造那种内容的呼吁。克里斯,你是我最喜欢交谈的人之一。能和你聊天真是太荣幸了,你竟然浪费时间和我说话。我一直很感激。非常感谢你。今天,事实上,你花了很多时间和我聊天,你知道,散步和其他事情。所以,很高兴能赶上。谢谢,伙计。感谢收听与克里斯·拉特纳的对话,也感谢我们的赞助商 Blinkist,一个总结了数千本书籍关键思想的应用。Neuro,功能性口香糖和薄荷糖的制造商,为我的大脑充电。MasterClass,世界专家的在线课程。最后是 Cash App,一个可以向朋友发送金钱的应用。请在描述中查看这些赞助商,以获得折扣并支持此播客。如果你喜欢这个节目,请在 YouTube 上订阅,在 Apple Podcast 上给它五星好评,在 Spotify 上关注,在 Patreon 上支持,或者在 Twitter 上与我联系,用户名是 Lex Friedman。现在,让我给你一些克里斯·拉特纳的话。语言设计很大程度上是关于权衡,除非你有一个真正代表这些不同观点的社区,否则你无法看到这些权衡。感谢收听,希望下次再见。