在计算机科学的历史上,很少有一场演讲能像它这样:整场用一种“自我设限的行为艺术”来完成论证。1998年10月,语言设计大师 Guy L. Steele Jr.(盖伊·斯蒂尔)在温哥华 OOPSLA 大会上做了题为《Growing a Language》(让语言生长)的主题演讲。他登台后宣布了一条怪规矩:接下来的一段时间,他只允许自己使用单音节单词——因为“词”这个话题,正是他想谈的话题:一门编程语言,应该让使用者自己往上加“新词”,还是永远等设计者恩赐?
二十多年过去,这场演讲的录像在 YouTube 上被反复重传、被无数技术社区转引,播放量累计达百万级(据多方社区数据转述,本次未能实时核实精确数字),而它的书面版发表于 ACM SIGPLAN Notices(1999年第34卷第10期),至今仍是语言设计领域的必读文献。读过它的人会告诉你:这不是一堂“语言课”,而是一堂关于表达能力、控制权和自由的哲学课——只不过用程序员最熟悉的方式讲出来。本文带你把这条视频完整“拆开吃透”:它讲了什么、为什么这样讲、背后有哪些真实的学术脉络、哪些主张经得起推敲、以及普通开发者能从中带走什么。
| 项目 | 内容 |
|---|---|
| 视频标题 | Growing a Language |
| 中文常译 | 让语言生长 / 生长一门语言 |
| 主讲人 | Guy L. Steele Jr. |
| 场合 | OOPSLA 1998 大会主题演讲(加拿大温哥华,1998年10月) |
| 书面版 | ACM SIGPLAN Notices, Vol.34 No.10, 1999 |
| YouTube录像 | 多个上传版本流传,最广为流传的一版见文末链接;播放量为百万级(据社区数据,未经精确核实) |
| 时长 | 约30分钟 |
| 核心主题 | 可扩展性(extensibility):语言应允许使用者自行定义新词、新类型与新记法 |
说明:本次未能实时抓取 YouTube 页面,播放量与上传时间未能精确核实,特此注明。演讲本身的时间、地点与发表信息以 ACM 出版记录为准。
看这条视频之前,必须先知道说话的人是谁——因为他的身份本身就是演讲说服力的一半。
Guy L. Steele Jr. 是编程语言领域宗师级的人物。1975年,还在 MIT 人工智能实验室时,他与 Gerald Jay Sussman 一起创造了 Scheme——Lisp 家族中最优雅、影响最深的方言之一,两人的技术报告《SCHEME: An Interpreter for Extended Lambda Calculus》(AI Memo 349)成了函数式编程的奠基文献之一,其中对尾调用的分析(他在1977年那篇著名论文里系统论证了“过程调用可以像 goto 一样便宜”)深刻影响了此后所有语言实现。此后他主持编写了《Common Lisp the Language》,被视为 Common Lisp 事实标准;1980年代他整理出版的《黑客词典》为整个黑客文化留下了语言志。而在工业界影响最大的一笔:他是 Java 语言规范的第一作者之一(与 James Gosling、Bill Joy 署名同列)。他于1988年获得 ACM Grace Murray Hopper 奖(据 ACM 奖项记录)。
换句话说:这是一位亲手从零长出过好几门主流语言的人,站在台上告诉你“语言应该怎么长大”。这不是纸上谈兵,是实战复盘。
演讲最负盛名的部分是它的开场。Steele 宣布:在演讲的前半段,他只用单音节的英文单词说话。(演讲全文是他事先逐字写好的——因为在这种约束下,即兴是不可能的。)于是观众看到了一场奇特的表演:这位世界顶级语言学家被迫用最笨拙的方式说话。他不能说 "number" 吗?能,这是一个音节;但 "function"(双音节)、"syllable"(三音节)、"extensible"(四音节)统统是禁词。想表达“定义一个词”?他得先把“词是什么”“定义是什么”用娃娃英语一个个搭出来。
【解读】这个装置的精妙在于:它让听众不是“听到”而是“亲身忍受”了表达力匮乏的痛苦。普通演讲告诉你“词汇贫乏会限制思想”,这条视频让你在30分钟的前半段里亲自当一次词汇贫乏的人。修辞学上这叫以形式承载内容(form embodies content),而 Steele 把它用到了极致。
单音节牢笼里,Steele 展示了什么叫“用短词做数学”。他先搭出算术("one plus two is three"),然后定义了完全数(perfect number):一个正整数如果等于它所有真因子之和,就叫完全数。6 是完全数(6 = 1+2+3 = 1×2×3),28 也是(28 = 1+2+4+7+14),再往后是 496 和 8128——这是古希腊人就知道的四颗“数论明珠”。他给自己布置任务:写一段“程序”找出某个范围内的全部完全数。
问题来了:他想说“检查 x 是否为完全数”,但 "perfect" 是两个音节,禁用。于是他只能自己发明一个短记号来指代这个概念,再基于这个自造词继续往下写——这一步正是全篇的隐喻:当语言里没有你需要的词,唯一的出路是定义它,而不是等谁批准。他用自造的记号和自造的词,把找完全数的“程序”写了出来。现场观众在笑声中第一次直观理解了什么叫“语言的生长”。
讲到一半,Steele 停下来说:现在,我要开始使用更长的单词了。(大意转述)全场如释重负——而这个如释重负本身,就是论据。他随即点破:一门允许使用者不断添加新词、新概念的语言,叫做可扩展的(extensible)语言。前半段的憋屈与后半段的流畅形成对照:只有可扩展的语言,才能让使用者“说到哪,长到哪”。
他进一步把“造词”从名词层面推到更深处:真正的语言扩展不只是加名词(新类型、新数据),还包括加动词(新操作)、加语法(新记法)。设计者永远猜不到用户要说什么——他举的例子(转述)包括复数运算、四元数这类数学工具:做三维图形的人需要四元数来做旋转,可没有哪门标准语言内建它,靠标准委员会去加?十年也未必排上队。设计师要么想不到,要么会猜错——这个论断在书面版里被反复引申,成了语言设计圈的格言级论点。
结尾,Steele 拉高到设计哲学:好的语言不该是设计者一次交付的成品,而应是一个初始很小、但人人都能往里添砖的框架。他还有一条常被忽视却极重要的叮嘱(转述大意):新词应该共享——你定义的好词应该进库、进社区,让别人复用,否则人人自造暗语,语言会碎成一地方言。让语言生长,是集体的事业。
这句话在今天听来近乎预言:看看现代主流语言——Kotlin 的扩展函数、C# 的扩展方法、Swift 的 extension、Rust 的 trait、TypeScript 的 declaration merging——“不改动原有类型定义、由使用者原地添加新能力”早已从 Lisp 学派的异端,变成2020年代语言的标配。
1. Lisp 与“同像性”传统。 1958-1960年,John McCarthy 发表 Lisp 的奠基论文(Recursive Functions of Symbolic Expressions, 1960),确立了“程序即数据”(homoiconicity)思想。正因为 Lisp 代码就是可以被程序处理的数据结构,宏(macro)——让程序员用程序生成程序——才成为可能。“用户自己长出新语法”的源头在这里。Steele 正是这一传统的核心传人。
2. Scheme 的卫生宏谱系。 让“造词”不互相污染(即宏展开不意外捕获使用者的变量)的卫生宏(hygienic macros),由 Kohlbecker、Friedman、Duba、Felleisen 在1986年论文《Hygienic Macro Expansion》中系统提出,后来写进了 Scheme 标准报告——Steele 本人是早期 Scheme 报告的编辑之一。这条脉络的当代巅峰是 Racket 学派(Matthew Flatt 等)提出的“语言导向编程”:Racket 把“造一门小语言”变成了和“写一个函数”同等日常的操作。
3. FORTH 的词典哲学。 与 Lisp 遥相呼应,Chuck Moore 在1970年前后创造的 FORTH,整个语言就是一本可增补的“词典”:程序员的工作就是不断定义新词、再用新词定义更新的词。Steele 演讲里“单词—新词—更多词”的叙事,几乎就是 FORTH 世界观的白话版。
4. Smalltalk 的设计原则。 Dan Ingalls 1981年在 BYTE 杂志的《The Design Principles Behind Smalltalk》写下名言“简单的事应当简单,复杂的事应当可能”。面向对象里的“类”本身就是一台造词机器:每个新类都是给语言加的新名词。Steele 在 OOPSLA(一个面向对象大会)讲“语言生长”,正是把 OOP 的价值从“建模”重新表述为“扩展语言本身”。
5. 当代验证:Julia。 2012年发布的 Julia(Jeff Bezanson、Stefan Karpinski、Viral Shah、Alan Edelman)用多重分派(multiple dispatch)把“给已有类型添加新操作”做到了极致,其技术报告(arXiv:1209.5145)与2017年 SIAM Review 论文明确以“可扩展”为核心卖点,社区常直接引用 Steele 这场演讲作精神注脚。科学计算界“要么有库、要么等C++委员会十年”的痛点,是“生长 vs. 等待”最现实的注解。
6. DSL(领域专用语言)传统。 Paul Hudak 1996年在《American Scientist》上系统阐述嵌入式 DSL;Martin Fowler 与 Rebecca Parsons 2010年出版《Domain-Specific Languages》。Eric Evans 2003年的《Domain-Driven Design》则从软件工程侧提出“统一语言”(ubiquitous language):团队必须共同打磨领域词汇——这与 Steele“共享你的新词”遥相呼应。Paul Graham 2001年的名文《Beating the Averages》更是把“用可生长的语言作为竞争优势”讲成了创业寓言。
证据充分的部分。 “可扩展语言能显著降低表达成本”这一核心主张,有四十年的工程史背书:Lisp 系在 AI 早期研究、Julia 在科学计算、Racket 在教学与语言实验、各类语言的原生扩展机制在大规模工程中的普及,都指向同一结论——允许用户造词的语言生态,长期演化能力确实更强。这场演讲的论证结构(先让听众受苦,再给解药)虽是修辞手法,但修辞在此处恰恰是论证的一部分:它构造了一个可体验的反事实。
需要打折扣的部分。 第一,演讲是立场陈述,不是实证研究——它没有数据、没有对照,说服力来自示范而非统计。第二,扩展性有真实代价,Steele 对此着墨不足:运算符重载被滥用后的可读性灾难(C++ 社区对此有大量反思,2014年前后 Herb Sutter 在 CppCon 等场合也多次强调“重载语义应符合直觉”)、人人自造记法导致的“只写语言”(write-only language)、团队方言碎片化带来的维护成本,都是反例。第三,一个常被社区提及的讽刺(此为社区讨论,非演讲内容):演讲之后 Steele 参与的 Java,恰恰在语法层面选择了“不生长”——没有运算符重载、语法不可扩展。一种善意的解读是:面向数百万普通工程团队的语言,可读性与一致性比表达力更优先,Steele 在后来的访谈与 Java 相关文献中也表达过“语言服务于大规模协作”的立场。这提醒我们:“该不该生长”没有普适答案,取决于使用者的规模与专业化程度。第四,自然语言的类比只能用一层:自然语言靠亿万人几百年涌现式演化,编程语言要编译器、标准与工具链背书,“生长”必须被机制化,否则只是混乱。
1. 写代码时,优先“定义新词”,而不是堆砌旧词。下次发现自己在业务代码里反复解释同一个概念时,停下来:给它起名字,建一个领域词汇表(类型、函数、模块名都是“词”),让代码变成用领域语言写成的句子。这是 Steele 的原则与 DDD 的交汇处,也是普通工程师距离“语言设计”最近的一步——每一次好的命名,都是一次微型的语言生长。
2. 主动学一门“可生长”的语言,给大脑接种疫苗。不必换工作栈,只需花几周体验 Lisp/Racket 的宏、Julia 的多重分派或 Kotlin 的扩展函数,亲身感受“等语言给 vs. 自己长”的差别。它会永久改变你评价语言与框架的尺度:以后看一门新技术,先问一句——它让我更容易定义自己的词汇了吗?
3. 把“共享新词”写进团队规范。代码评审时加一条暗线:这个新抽象是只服务本次需求,还是值得进共享库?团队的工具函数库、内部DSL、领域术语表,就是你们共同的“生长层”。反之,发现有人在业务代码里私造只有作者能懂的“暗语”时,果断拦下——生长必须是公共的,否则就是方言瘟疫。
flowchart TD
A[开场装置<br>只用单音节词] -->|听众亲历| B[表达力匮乏之苦<br>连说清一个概念都难]
B --> C[完全数实验<br>自造短记号完成任务]
C -->|第一次胜利| D[洞见一<br>语言缺词时,用户应当能自己定义]
D --> E[中场解禁<br>启用多音节词]
E --> F[概念命名<br>可扩展性 extensibility]
F --> G[洞见二<br>扩展不止于名词:类型/操作/记法]
G --> H[论据<br>设计师想不到·会猜错<br>四元数等现实需求]
H --> I[终章主张<br>语言应初始小·人人可生长]
I --> J[约束条件<br>新词须共享,避免方言碎片化]
J --> K[历史验证<br>Lisp宏 / FORTH / Smalltalk<br>Racket / Julia / 现代语言扩展机制]
K --> L[工程启示<br>命名即造词·共享即生态]
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
