编程语言是思维的自行车

原标题Programming Languages Are Bicycles for the Mind

Chris Lattner 与 Lex Fridman 聊 Swift、LLVM、RISC-V,以及为什么计算的下一次飞跃,与其说是芯片问题,不如说同样是语言问题。

CLChris Lattner嘉宾 · Modular
频道
Lex Fridman Podcast
发布
2020年10月18日
视频
2:46:57
阅读
26 分钟
原文
英语
在 YouTube 打开
往下滚动阅读时,视频会缩到右下角继续播放。字幕跟随阅读语言。
阅读语言共 2 种语言可读
由 AI 从英语原文翻译。打开“对照原文”可以逐段核对。
摘要

30 秒看懂

在他的第二期 Lex Fridman 播客上,编译器设计师 Chris Lattner 从乔布斯和 Jeff Dean 讲起,谈到 Swift 的值语义、已有二十年历史的 LLVM 体系,以及他如今在 SiFive 帮助推向产品化的开放指令集 RISC-V。他认为,语言首先是一种用户界面,然后才是类型系统;写时复制可以让数学像数学一样运作,又不必付出复制税;Software 2.0 是一种新的编程范式,并非对写代码的取代。贯穿始终的是设计:该隐藏多少魔法,该留给人多少控制权,以及如何防止一个社群因自身的成功而僵化。

  1. 1Jeff Dean 仍然写代码Lattner 说,他的领导方式是亲手把技术做出来,然后把人拉进来、激励他们;他大概连 CEO 的职位都不会想要。
  2. 2Lattner 的体会是,领导力的很大一部分在于找到正确答案,而非事先掌握答案。办法是在一群乐于教人的人面前问些笨问题。
  3. 3编程语言分两层:让机器跑得快的底层机制,以及介于底层与人之间的用户界面。人们能分辨一门语言是经过设计的,还是偶然形成的。
  4. 4剥去大括号还是缩进的争论,语言设计主要回答两个问题:现成有哪些库,以及人们能多快把它们拼成一个第一次就能跑通的东西。
  5. 5Swift 的赌注是:默认采用值语义,再加上写时复制,就能落在 Lattner 没在别处见过的甜区,即数学像数学一样运作,又不必像 Java 那样每次追加都重新分配内存。
  6. 6如果你想成长,就待在一群远比你懂得多的人身边,多问笨问题。聪明人往往很乐意教人,而跨领域跳跃,正是新连接产生的方式。
全文

按章节阅读整理后的全文

只看原始文稿
01

Lattner 搭建的编译器体系如今几乎撑起了一切

Lex Fridman 向观众介绍 Chris Lattner,称他是现代计算领域最重要的工程师之一,这是他第二次做客播客。Lattner 创建了 LLVM 编译器基础设施和 Clang 编译器,设计了 Swift 编程语言,参与了谷歌 TPU 相关的软件工作,担任过特斯拉 Autopilot 软件的副总裁,并在苹果担任过软件方面的领导职务。他现在是 SiFive 的平台工程资深副总裁,这家公司希望让定制芯片的设计更快、更好,也更便宜。

Fridman 说,他从这次对话中得到的个人教训是谦逊:Lattner 作为工程师和工程团队的领导者都堪称顶尖,却依然愿意听取分歧并从中学习。插播广告之后,他以一个刻意设计得很难的问题开场:Lattner 与乔布斯、马斯克和 Jeff Dean 都共过事,那么,Fridman 问,这三人各自最突出的品质是什么?

02

乔布斯、马斯克和 Jeff Dean 各自以三种不同的力量领导

Lattner 拒绝给三个人排个高低。乔布斯和马斯克都有远见,也都要求极高,但他与马斯克的合作远多于与乔布斯的合作,所以他把两人追求的东西区分开来。在他看来,乔布斯更看重人的因素:他想做出人们会爱不释手、会改变生活方式的东西,并且会提前一步去想人们将来会想要什么。马斯克则更侧重技术,他会花时间和工程师待在一起,并努力预测指数曲线究竟会怎样展开。

关于设计师如何与工程师打交道、又赢得他们的尊重,Lattner 说得很谨慎:他与乔布斯并没有密切合作,也不算专家。他的感觉是,乔布斯会非常用力地推动,等听到一个讲得通的解释之后就会放手。他尊重工程,也知道什么时候该继续施压。Lattner 说,如果你能很好地读懂人,就能分辨出他们什么时候在保留,什么时候还有余力可以再挖一些。这种能力很难教。

Jeff Dean 属于另一类。他极其聪明,而且 Lattner 特别强调,他是一个真正友善的人:典型的谷歌人,希望身边的人都过得开心,并能把一群人凝聚起来,因为聪明和善意在他身上同时出现。他仍然写代码,领导方式是亲手做技术,再把人吸引过来。Lattner 不认为他是 CEO 型的人,也不认为 Dean 会想要那个角色。在 Lattner 看来,领导力没有统一的模板,它取决于时代、地点和所面对的问题。

03

领导力在于找到正确答案,而非事先掌握答案

问到他从这三个人身上为自己的团队借鉴了什么,Lattner 先从不起眼的部分说起。你必须扎根于产品、技术、业务和使命。在他看来,特斯拉统一的愿景,比如清洁能源和电气化,是这家公司的超能力之一:人们来上班,是因为相信这件事。你还得懂得什么能激励人,怎样把其中最好的人招进来,以及如何写出真正能执行的计划。很多问题其实不必解决,确定优先级本身就是工作。

他越来越能接受的一项能力,是接受自己不知道答案。“领导力的很大一部分,其实在于找到正确答案,而非事先掌握答案。”在一个由能干的人组成的团队里,工作就是建立信任,让人们愿意敞开心扉,并让一个只成了一半的想法留在房间里,直到它长成好东西。环境不能是自上而下的“汝应当”式命令。人们必须是解决方案的一部分,并且要敢于在你出错时告诉你。

他给出了一个具体的练习。他曾经在港口附近待过,几乎完全不懂船是怎么设计的。结果发现,只要问很多笨问题,人成长得会非常快,前提是你身边都是乐于教人、同时自己也仍在学习的人。这种做法,也就是把自己放进懂得更多的人中间,并且愿意显得无知,是他在整期节目中不断回到的习惯。

04

编程语言是思维的自行车

Fridman 以刻意拔高的哲学视角发问:编程语言到底为什么重要?Lattner 从机器讲起。计算机是擅长特定工作的机器;人脑有了一个想法,希望把活儿交给机器完成。你可以用汇编语言告诉硬件具体该做什么,也可以一层层往上攀登抽象,直到设计出一个神经网络替你干活。每一门语言,都是在这架梯子上押注该在哪里停下,以及停在那里能换来什么。可移植性,即写一次、就能在电脑或手机上运行,只是这些押注里最基础的一项。

他说,大多数人走到一门语言前,争的都是大括号、制表符和分号。那些都是浅层、主观的表面特征。做得好的语言,关乎的是表达。它有两层:一层是底层机制,比如类型系统、编译器,以及让计算机高效运转的那套机器;另一层是介于这些底层与人之间的用户界面。人是有感受的,他们能分辨一门语言是被设计出来的,还是出于偶然。照 Lattner 的说法,Swift 在打磨这种手感上花了不寻常的心血,同时也没有怠慢底下的机制。

怎样预测几十万人会喜欢这样的界面?先减去那些让人痛苦的东西。样板代码太多,你会觉得自己毫无产出。像 C 那样的内存不安全,会让你一直追着悬空指针跑。不过,Stack Overflow 上得票最高的回答,所代表的是一小撮声音很大的人的偏好:代码要安全,要合乎规范,还要稳定。这未必就是多数用户真正需要的。把争论压缩到最简单,人们其实并不在乎 goto,他们在乎的是把一台网络服务器搭起来。从语言设计者的位置看,有两件事占主导:有哪些库,以及你能多快把它们拼到一起,包括调试和迭代的周期,而不只是初版代码写得多快。

世界在这里分岔。Python 很擅长拼装东西,却不太擅长写某些类型的库,所以对性能敏感的部分就用 C 或 C++ 写,再包一层。你因此同时生活在两个世界里,而两个世界从来都不太好:工具和库没有真正对上。你不会为了速度或 GPU 加速,用 Python 去写机器学习框架,你只会用 C++ 去写它,再从 Python 去调用。让程序拼装起来顺手,在编译期就捕捉 bug,是其中一部分;让语言里的值表现得符合数学家的预期,也是。

05

值语义能换来正确性,无需付出复制税

Lattner 拿张量(tensor)作为例子。张量是带有普通运算符的多维数字网格。在 Python 里,有时你得克隆一份,原因在于引用语义:你握着的是指向对象的指针,指向的并非对象本身。把张量传给一个函数,函数加了点什么,调用方手里那一份也跟着变了。把它交给一个会把引用存进字典的对象,再接着修改,就没人说得清数据归谁。习惯数学思维的人会觉得很恼火,因为数学是传值的。Python 悄悄地不这么做,你往往要到调试器里才会发现,或者不得不去读库的代码,才能弄清克隆该放在哪里。

Swift 默认采用值语义。张量就是一个值:复制一份,你得到的就是一个独立副本;改动其中一个,另一个不会跟着变。数组、字典以及其他集合也是同样的做法,因此传递数据结构时不必大费周章地做防御性克隆。这从定义上消除了一整类 bug,Lattner 称之为大多数人真正在乎的头号效率收益。它同时也是性能上的收益,因为防御性克隆复制的数据,很可能根本用不着复制。

实现上的关键技巧是写时复制。如果你把数组传给一个只读它的函数,大家共享的是同一块内存;只有发生修改时,才会真正复制一份。如果只剩一个引用,Swift 就可以原地更新。Java 用不可变字符串来模拟值语义,结果把 x 和 y 拼接起来时,会另外分配第三个字符串,以防有人仍然持有输入的指针。纯函数式语言在更多地方付出这种代价。Swift 的赌注是:默认使用值,直到写入时才恢复共享,这样的组合落在 Lattner 没在其他语言里见过的甜区。你不必为了正确性牺牲性能,也不必整天琢磨自己手里是不是唯一的引用。

他把这一点归入一条界面原则,这条原则他和类型一样看重:复杂性的渐进式披露。和 Python 一样,Swift 让你一开始就能写 print("hello, world")。而其他语言会在第一天就让初学者面对 public static void main、访问控制、类和包。那些强大的功能依然存在:模块、类,甚至如果你想用 C 级的指针,也还有 malloc,只是它们不在教程的第一页。他说,把复杂性拆解开,让默认路径既安全又快速,同时让高级用户能往下钻,是最难的设计工作之一。好的设计是可以感受到的,即便局外人总把它当成品味问题。

06

最美的特性,是让库感觉像内置于编译器一样

Swift 的设计并非出自一人独断。一个由约六七人组成的核心团队,自语言早期便一直参与其中(Swift 于 2014 年公开),负责维持连续性:他们打算填补的空白、计划安放的巨石,以及他们已经为之付过代价的错误。围绕他们的是 Swift Evolution 社区,数百人热情高涨,Lattner 说,他们常常提出核心团队想不到的好主意。讨论串本身不会产生共识。提案流程让核心团队能够征求社群的一致意见、保留护栏,并确保长远的走向不会跑偏。

Fridman 说,自己在 C++ 的大括号里感到安心,同时也明白为什么 Python 没有大括号也觉得没问题。Lattner 把这当作证据,说明大括号还是缩进,都算不上关键。真正艰难的决定,是那些每个人都同意某个空白应当被填上、摆在桌面上的提案只有一个,而且附带一堆缺点的时候:是采纳,是延后,还是先做另一个功能,免得把自己逼进死角。多个大脑之间的连续性,胜过单一的记忆。类型就是其中一个维度。Lattner 喜欢 Fridman 那个说法:Python 只有一种类型。鸭子类型让人很容易快速敲出代码,也很容易把字符串传到本该接收整数的地方,然后在一个你从未想读的库深处爆炸。类型也有代价。设计者会把类型的代价,与垃圾回收还是引用计数、编译还是解释、以及并发等取舍放在一起权衡。

如果一门语言拒绝对内在的复杂性建模,比如包,复杂性并不会因此消失,它会转移到模式和生态里,像 npm 那样,而且往往会碎片化。语言里塞得太多,你会为此付出永久的代价。把问题建模得足够充分,就能给人一套可以用来思考的结构。他借用了乔布斯那句关于电脑是思维的自行车的话,把它搬到语言本身上:你可以走路,但骑自行车能更快到达。提高抽象层级,让你能借用别人的库,正是重点所在。SwiftUI 基于值语义的声明式界面模型,就是当下的例子:用更少的代码做更多的事,整类 bug 从定义上被消除。

问他见过的最美的语言特性是什么,Lattner 没有挑一个巧妙的运算符。他选的是能写出感觉像原生一样的库的能力。在 Swift 里,Int 和 Float 都是库类型,并非编译器里的特殊内置物;标准库需要的东西,你的四元数类型同样可以用。Lisp 是这个世界的极端版本。Java 和 C 则是反例:你可以定义一个类,但 Java 里的 complex 是引用类型,于是丢掉了值语义,也就丢掉了数学。第一性原理思维,让你能判断什么时候该打破惯例。Swift 最初带着自增、自减运算符,是因为它们是从 C 里照搬来的,后来演进流程把它们去掉了。x += 1 更清楚。在他看来,清晰,就是语言不再制造痛苦的方式。

07

语法糖在一个人必须承担决定时变得很私人

Fridman 把话题引向争议:Python 3.8 的海象运算符 :=,既赋值又返回值,而它的争议促使 Guido van Rossum 卸下终身仁慈独裁者(BDFL)的职务。Lattner 没有停在这个功能本身上。海象运算符之所以引起争论,是因为它属于语法糖,也就是用更简洁的写法表达语言本来就能做到的事。并非所有东西都是语法糖,类型系统显然就不属于此类。语法糖的取舍几乎完全是主观的:这种情况多久出现一次,更短的写法值不值得?人的心理让争论变得更激烈。人们会系统性地高估学习新东西的负担,它看起来陌生。要是第一天它就在,那它就只是 Python 的一部分。

Lattner 对 Guido 不算熟悉。他的感觉是,Guido 不仅扛着决策者的重担,还把这件事和自己的身份绑在一起,于是把争论当成了私人的事。他就是“那个人”,身边没有支撑的结构。Python 社群很大,哪怕只有百分之一的人发来仇恨邮件,也是数量可观的仇恨邮件。Fridman 指出,核心开发者中有多数反对海象运算符,或者至少看不出它有什么好处,这造成了一种停滞、压抑的感觉。Lattner 的回应是,给语言添加东西是一种高负担的行为:人们会在它之上构建,你无法收回,而且一门已有二十五年历史的语言也不必急于求成。到了某个时候,Python 已经超出了 Guido 本人。现在它属于用户了,哪怕他的大部分职业生涯都在其中。

Fridman 反驳说:艰难的决定本来就会引起分歧,领导者无论如何都得凭直觉拍板。Lattner 举了创始人的例子。创始人知道公司是怎么走到今天的,能够说:我们二十年来一直这么做,今天我们改做 Y。创始人离开之后,即便接任者拥有 CEO 的头衔,往往也感受不到那种主动权。原因有两个。第一,他们没有参与最初的决策,于是旧路线在他们眼里就像福音。第二,即使理论上由你负责,你也只是一个自认为负责的人。你仍然得激励团队、解释转向,并让他们相信这个方向。他们不相信的转向,奖金也买不来。领导者的权力是有上限的。

Swift 尝试避免让这份重担压在某一个人的身份上。核心团队认真对待这一角色,然后把最终决定交给群体的智慧,让决定不至于变得私人化。流程是透明的,理由都写下来。Lattner 把它比作最高法院的判例:一份记录既指导下一场论证,也起到防御机制的作用。人们抱怨的是“那项决定”,指向的是决定本身,而非“那个人”。团队里的人仍然会有分歧。成员变化很慢,他认为这是健康的,苹果、谷歌和 SiFive 也都在这张桌子边上。从原则出发,再把原则讲清楚,让社群认同,这是他所知道的让这件事行得通的唯一办法。

08

LLVM 已老到开始僵化,于是 Lattner 在旁边构建了一个更通用的 IR

LLVM 很快就要满二十岁了。Lattner 说,社群已经到了可能僵化的年纪,这是真实的危险。有一批人在上面工作了十年,时间长到足以让他们看不见问题。LLVM 有很多问题,如果项目自己不去修,别人也会去修。Lattner 自嘲,自己的毛病正好是爱的反面:他看到了许多缺陷,看着它们很不顺眼,却已经没有时间去写补丁。这些问题像指甲缝里的沙子一样硌人。每当他说某个东西应该修,会场里的人听到的是“这听起来很冒险”。

新的框架是 MLIR(多层级中间表示)。Lattner 打趣说,编译器圈子的人不擅长起名字,很多人以为 ML 指的是机器学习。以往的编译器通常是为某个领域量身打造的完整方案:LLVM 很擅长 CPU,JVM 很擅长需要动态编译的带垃圾回收语言。每个领域往往都要从头重建整套技术栈,里面有大量重复的基础设施。Swift 自己就有一个 LLVM 后端,又有一层 Swift 专用的高层部分,重复了很多类似的机制。

MLIR 是一堆编译器基础设施,用来更快地构建这些领域专用的编译器,而且结果确实很好。它覆盖的领域包括定制加速器、矩阵乘法硬件和硬件综合,也就是把设计编译成硬件电路。它比 LLVM 更通用、更灵活;在 Lattner 的说法里,LLVM 只是 MLIR 能做的一部分。更让局面复杂的是,MLIR 已经并入了 LLVM 项目。那些维护了二十年经典组件的人,对这个新东西并不熟悉。它是由 Lattner 和其他人构建的,他们很清楚 LLVM 犯过哪些错,所以能够修正它们。新东西总让人觉得不可靠。他认为这种张力是健康的:想法会慢慢渗透,人们会用自己的语言重新理解这些工作。扩散很慢,但它正在发生。

09

RISC-V 让指令集脱离任何一家公司的掌控

SiFive 是围绕 RISC-V 成立的,而 RISC-V 正是编译器真正与之对话的指令集。Lattner 提到的功臣之一是 Dave Patterson;RISC-V 的三位创始人在伯克利的研究基础上创办了这家公司。RISC-V 的特别之处在于它是开放标准。x86 芯片可以由英特尔和 AMD 生产,ARM 卖授权,MIPS 有所有者并对外授权。RISC-V 则是任何人都能实现的规范,就像 TCP/IP 或 C 是标准,而非某个单一的二进制文件。SiFive 既推动标准向前发展,也在整个设计谱系上销售实现,从微小的内核到又大又耗面积的内核都有。

制造是另一个行业。台积电、三星等芯片制造厂,把设计转化为光刻掩膜和硅片,批量可达数亿颗。从类似 Verilog 的源码一路走到芯片厂能接受的东西,这条路是一条古老且被充分研究的流水线,经过多年并购,如今主要由三家 EDA(电子设计自动化)厂商主导。工具零散,标准松散,生产力就消耗在胶带和补丁上。Lattner 忍不住把整条流程看成一个编译器:有表示,有变换,组合性和易用性都很重要。在所谓摩尔定律的终点,定制加速器是仅存的几条获取性能的途径之一,这使得这套设计技术栈一下子具有了战略意义。

计算史上充满了随公司一起兴起又消失的指令集。Sun 的 SPARC 仍在苟延残喘。惠普的 PA-RISC 撑着一条服务器业务和一大批客户,直到惠普转向英特尔的 Itanium,结果并不理想。你为一种由单一公司拥有的指令集投入数十亿美元,然后那家公司做出一个技术或商业决定,你就被卡住了。英特尔自己也并非次次都能执行到位。RISC-V 提供的是选择权:从 SiFive 买一个内核;二十年后如果 SiFive 出了什么事,你可以从别家买一个 RISC-V 内核。多家实现、各有取舍的生态,意味着一个产品家族大概总能找到合适的方案。但指令集过于多样,尤其是在微小的单片机里,同样不好:工具古怪,生态微小。Lattner 预计,RISC-V 会吞掉这条长尾,因为它能向上、向下和横向扩展。

如果 SiFive 成功,他预计的是更多定制芯片,而不会陷入无穷无尽的指令集混乱:电池续航更好,针对具体工作调优的物联网芯片,上市速度更快。如今,没有 iPhone 那样出货量的公司负担不起定制芯片,只能买现成的芯片,然后为用不上的硅片付费。把设计成本压下来,就会出现更多差异化的芯片,因为世界还在不断增加无线电、标准和功能组合。没人知道未来会怎样。他愿意打赌,未来里会有大量的硅片。

10

摩尔定律是死了、还活着,还是被误解了,取决于你想听哪个版本

Fridman 把 Dave Patterson 和 Jim Keller 放在摩尔定律的两端。Lattner 说两人都对,因为他们谈的并不是同一件事。Keller 的版本讲的是物理:还有大约一千倍的余量,晶体管仍然可以变得更小、更快,我们还没到极限。Lattner 同意这一点,但那并非 Gordon Moore 当年写下的内容。最初的观察带有经济维度,即每单位面积的成本,以及那个空间里成本最经济的点,这正是 Patterson 等人强调的技术细节。按照这个定义,这条定律已经变了。

Lattner 给出了第三种读法,这可能才是大多数程序员真正的意思。单线程性能已经不再像过去那样大幅跃升。你买一颗奔腾,等上一年半,同样的程序就快了一倍,那个版本已经死了。取代“免费午餐”的,是对人们写软件方式的新要求:GPU 计算用 CUDA,CPU 上有五十个核心、一百个线程,还有面向特定领域的机器学习加速器。性能依然存在,只是编程模型变了。

改变编程模型,就又回到了语言的世界。C 是为 CPU 设计的,要与 GPU 打交道,就得与它的表亲 CUDA 打交道,那是另一套工具、另一种思维方式。目前还没有一个能够扩展的统一世界,而 Lattner 认为它是可以出现的。硬件设计语言天生是隐式并行的,就像始终在工作的晶体管阵列。CUDA 介于两者之间:你写的是类似标量的内核,驱动在一千条通道上运行它。一旦底层有了 MLIR 这样的编译器,设计问题就变成:如何让库表达这些模型,这样你就能创新,而无需每次都发明一套新语法,同时还能在芯片流片之前捕捉 bug。

11

可预测的并发,胜过一个平时神奇、到了悬崖边却突然失灵的编译器

Swift 并发宣言(Swift Concurrency Manifesto)之所以存在,是因为社群既想要小而可审阅的提案,也需要一个大的走向。没有墙上挂着的那幅图景,小步骤就只是随机游走。Lattner 写这份宣言,就是为了画出这幅图景。这座塔的地基很简单:当计算机或线程相互通信时,它们应当是异步的,也就是要有一种对这种通信进行建模的方式,很可能是 async/await。接下来是内存安全。两个线程同时访问同一块内存,就是竞争,是那种令人抓狂、通常无法稳定复现的 bug。值语义会有帮助,因为在并发的世界里,数学和复制依然能正常工作。

在此之上是人的模型。这份宣言的赌注,是对一个旧想法的新诠释:Actor(参与者)即一座座逻辑上单线程的孤岛,它们彼此异步通信,默认安全,是你首先会想到的工具。如果这些孤岛只互相发送消息,它们就不必共享同一个进程,甚至不必在同一台机器上,这是通往分布式编程的一条循序渐进的通道。在同样的图景里,加速器只是另一种你可以向其发送消息的异步事物。最后这一步并不在提案里。这一切底下的设计张力非常古老:多少该是魔法,多少该由人来控制,以及当默认值本身就是错误的默认值时,会发生什么?

Logo 语言是一个警示故事:入门很容易,然后遇到天花板,最后到另一个世界里重写。Python 的全局解释器锁,也给大型并发程序设下了类似的困局。Lattner 偏好的是一个简单、能解释清楚的模型,外加一个逃生口。Swift 的内存安全就是范本:默认情况下,你不会误伤自己的脚;如果你想要 C 级的指针,可以显式地请求。在并发提案里,由人来决定什么是并行的,运行时和编译器则保持可预测。这是在否定一个长期的传统,也就是那些承诺能让未修改的代码提速十倍的自动并行化编译器。这种技巧在你加入一个功能、某个函数无法内联、某个启发式规则失效之前一直有效,然后性能就断崖式下跌。你本不想知道编译器或内存层级是怎么工作的。魔法一旦消失,你就完全不知道该怎么办。如果你在乎性能,可预测性本身就是特性。

对普通的命令式 C 或 Swift 代码(带着所有指针)做自动并行化,依然是个残酷的难题。机器学习改变了抽象的层级。那些本来只想做出猫脸识别器的人,用可组合的算子拼装网络,抽象层级之高,使编译器能够把一个 TensorFlow 模型切分到 1024 个 TPU 节点上。批量处理(batching)是一个同样简单、却杠杆效应极大的想法。Lattner 指出,这种编程模型出自解决实际问题的人之手,并非语言研究者的成果,如今它让你能用 Python 驱动一台超级计算机。让网络跑得快依然是全栈问题:顶层是 Keras 和模块 API,中间是硬件抽象,底层是在 TPU 或 iPhone 加速器上榨出峰值性能。他说,连他帮忙打造的那些系统,也还远谈不上出色。

12

Software 2.0 是一种新范式,并非对写代码的取代

关于 GPT-3,Lattner 既不意外,又印象深刻。深度学习早就知道,更大的模型加上更多数据,在训练得当的情况下会得到更好的模型;但要真正把它跑起来,需要极其庞大的工程投入。他仍然认为,OpenAI 当初对发布 GPT-2 持谨慎态度,这一担忧依然有效:一个出于好意的工具,可能被以可怕的方式使用。Transformer 很简单,与大脑并不太像,而扩大规模会持续带来回报。他更感兴趣的是架构上的跃迁,以及 Jeff Dean 谈过的一些想法:一种稀疏门控的混合专家模型,分布在整个集群上,由局部专家组成,通过学习得到的路由,让一次查询借助专业分工,而非靠蛮力的稠密计算,来调动整台机器。

Andrej Karpathy 提出的 Software 2.0,即用学习到的模型逐步替换更多命令式代码。Lattner 说,这种说法部分正确,但并非取代。他把机器学习视为与结构化、函数式、面向对象、泛型和可微分编程并列的一种新编程范式。你不会再用 C 写猫脸识别器或翻译器;学习到的模型,才是应对人类世界中杂乱感官输入的正确方式。你也不会用神经网络去写引导程序。这些模型耗能巨大。理论上它们能实现任何函数,但这并不意味着它们高效。值得关注的部分在于范式的混合,就像面向对象在被重新放回函数式风格旁边之后,就不再是一种教条。强化学习本身就在迫使这种混合:一个学习到的策略,要接在机器人手臂和一堆遗留系统上。

语言模型能否取代编译或程序合成的某些环节?Lattner 说,当然可以,而且人们低估了它们。表达意图才是尚未解决的部分。补全脚手架里的一个空缺已经很令人印象深刻,你还希望有总能通过的断言,以及一个朝着正确性攀升的循环。他会让人类把测试当作需求来写。在他看来,GPT-3 一类的模型做的是模式匹配和续写,而非等式式的推理。也许推理被高估了:人类凭直觉做决定,事后再倒推出理由。对于未来的 AGI,即便我们不理解它,他也不准备仅因此就断言它没有灵魂。他真正担心的失败模式,与天网无关:那是一个人们失去个人挑战的世界,无论是孩子、社区还是工作,人性中最糟糕的一面,填补了这个空白。

给学生的建议,与造船厂的那些问题一脉相承。真正的飞跃,源于有人相信改变可能发生,并愿意做艰苦的工作。热爱你正在做的事,因为两年项目的中段恰恰是自我怀疑最重的时候;尽早尝试,因为在试过之前,你无法知道自己会爱上什么;还有,别忘了运气。让自己身处比你懂得多得多的人中间,多问笨问题,聪明人往往很乐意教人。跨领域跳跃,是带来领域里没人有的视角的办法。他宁愿年轻工程师去人才稀缺的地方工作,比如编译器,或摩尔定律终点那些不热门的一面,也不愿他们挤进涌向机器学习的人群。保持乐观、继续打造下一辆自行车,靠的是创造,而非消费愤怒。

同频道的其他文章

3:36:56EN → 简体中文
Lex Fridman· 2026年9月16日播客精神病学至今没有属于自己的青霉素主持 Lex Fridman历史学家 Andrew Scull 与 Lex Fridman 谈到,这门学科对症状有所缓解,但没有哪一种重大精神疾病真正被根治;过度自信的时候,代价要由病人来扛。Mental HealthPublic HealthNeuroscience
5:15:51EN → 简体中文
Lex Fridman· 2026年8月26日播客 · 2 人对谈DHH 没有亲手写一行 Omarchy Quattro 的代码嘉宾 DHH · 主持 Lex Fridman与 Lex Fridman 一次充满怀疑的对话过去十三个月后,Rails 的创造者讲述了 Opus 4.5、一群编码智能体(Agent)和一个一分钟的 Linux 安装器,如何结束了他一凿一凿手写 Ruby 的时代。编程智能体Vibe Coding智能体工程+3
3:12:58EN → 简体中文
Lex Fridman· 2026年8月12日播客 · 2 人对谈一个冷水澡,二十位冠军:Khabib Nurmagomedov 是如何炼成的嘉宾 Khabib Nurmagomedov · 主持 Lex Fridman在马哈奇卡拉的一间学校体育馆里,七十个人共用一个淋浴间,而且只有冷水。Martial ArtsCombat SportsCoaching+3
3:46:18EN → 简体中文
Lex Fridman· 2026年7月28日播客 · 2 人对谈抽掉奴隶制,就没有美国内战嘉宾 Gary Gallagher · 主持 Lex Fridman1860 年,美国奴隶主名下的奴隶价值,超过了全美所有铁路和工厂的总和。Political PhilosophyLeadershipHistory
3:51:47EN → 简体中文
Lex Fridman· 2026年6月30日播客 · 2 人对谈46% 的皇帝被暴力推翻,帝国照样延续下来嘉宾 Anthony Kaldellis · 主持 Lex Fridman历史学家 Anthony Kaldellis 与 Lex Fridman 一起走过 2200 年的罗马史,并主张我们所说的拜占庭,其实就是罗马本身。Political PhilosophyGeopoliticsLeadership
2:53:42EN → 简体中文
Lex Fridman· 2026年5月29日播客 · 2 人对谈月亮一直在下落,却总也落不到地球上嘉宾 Biggest Mysteries in Physics · 主持 Lex Fridman费米实验室(Fermilab)物理学家 Don Lincoln 在与 Lex Fridman 的对谈中说,物理学的历史就是一部统一的历史;反物质(antimatter)、暗能量(dark energy)和万物理论(theory of everything)依然远在我们能做的实验之外。Quantum MechanicsScience CommunicationPhilosophy of Science