<!-- title: 只用单音节词的编程神课 -->
<!-- domain: programming -->
<!-- video: https://www.youtube.com/watch?v=_ahvzDzKdB0 -->

# 只用单音节词的编程神课：盖伊·斯 Steele《让语言生长》深读

## 概述：一条被程序员传诵二十八年的演讲

在计算机科学的历史上，很少有一场演讲能像它这样：**整场用一种“自我设限的行为艺术”来完成论证**。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、领域术语表，就是你们共同的“生长层”。反之，发现有人在业务代码里私造只有作者能懂的“暗语”时，果断拦下——生长必须是公共的，否则就是方言瘟疫。

## 论证结构图

```mermaid
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>命名即造词·共享即生态]
```

## 延伸阅读

1. **Guy Steele 原始访谈级材料之外，最配这篇的读物是 Paul Graham 的《Beating the Averages》（2001）**——把“用可生长的语言”讲成商业战略的经典文章，与 Steele 的哲学互为表里。
2. **Julia 团队的技术报告《Julia: A Fast Dynamic Language for Technical Computing》（arXiv:1209.5145）**——看看“可扩展”这个理念在2012年如何被重新发明并落地为千万级用户的事实标准。

## 参考来源

1. [Growing a Language — Guy Steele 演讲录像（YouTube）](https://www.youtube.com/watch?v=_ahvzDzKdB0) — 本文解读对象；如链接失效，可在 YouTube 检索标题
3. [Paul Graham: Beating the Averages](https://www.paulgraham.com/avg.html) — 关于可生长语言作为竞争优势的名文
4. [Julia: A Fast Dynamic Language for Technical Computing (arXiv:1209.5145)](https://arxiv.org/abs/1209.5145) — 可扩展理念在科学计算语言中的当代实践
5. Guy L. Steele Jr., *Growing a Language*, ACM SIGPLAN Notices, Vol.34, No.10, 1999 — 演讲书面版（纸质/ACM 数字图书馆收录）

---
> 本文由「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 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
