聚焦伴读:本文是《编程语言谱系总报告》中"Python 受 ABC 启发"这一句的深度展开。 数据来源:CWI(荷兰数学与计算机科学研究中心)官方 ABC 页面、Guido van Rossum 自述与访谈、Artima/Inference Review 等公开资料。
一、ABC 是什么
ABC 是一门为"个人计算"设计的命令式通用编程语言 + 集成环境,诞生于荷兰CWI(Centrum Wiskunde & Informatica,数学与计算机科学研究中心)。
| |
|---|
| 里奥·格茨(Leo Geurts)、兰伯特·梅尔滕斯(Lambert Meertens)、史蒂文·彭伯顿(Steven Pemberton) |
| 设计始于 1970 年代末;首个实现在 1980 年代初;ABC 1.0 约 1987 年(Pemberton 在 IEEE Software 1987 年 1 月发表介绍论文) |
| 作为 BASIC 的"好替代品"——先对"编程这件事"做任务分析(task analysis),再据此设计语言 |
| |
| Python 最直接的前身(most direct predecessor) |
CWI 官方介绍原文:"ABC is an interactive programming language and environment for personal computing, originally intended as a good replacement for BASIC. It was designed by first doing a task analysis of the programming task."
一个有意思的更深的源头:ABC 本身又受到 SETL(SET Language,纽约大学 Jack Schwartz 在 1960–70 年代设计的"集合论"超高级语言)的启发。所以真正的远祖链是:
SETL(集合论超高级语言,NYU)
└─► ABC(CWI,1980s,教学/易用)
└─► Python(Guido,1991)
二、ABC 的核心特性(也是它的"遗产")
CWI 官方列出的 ABC 特性:
只用 5 种强大数据类型,可轻松组合(数字、字符串、列表、集合/collection、表/table)
强类型,但无需声明变量(Strong typing, yet without declarations)——不必写 int x; 之类
用缩进表示嵌套(nesting by indentation)
无人为上限(如整数无最大限制,直到内存耗尽)
支持自顶向下(top-down)编程
交互式环境:退出登录后过程和函数、全局变量仍然保留("no need for files")
统一的用户界面:执行命令、编辑、输入数据时用同一个一致界面
通用的撤销(undo)机制
程序通常只有等效 Pascal/C 程序的 四分之一到五分之一 大小
一段 ABC 代码示例(统计文档中所有单词的集合):
HOW TO RETURN words document:
PUT {} IN collection
FOR line IN document:
FOR word IN split line:
IF word not.in collection:
INSERT word IN collection
RETURN collection
可以看到:缩进组织块、无类型声明、PUT ... IN、FOR ... IN、集合操作——这些气质在 Python 里都找得到影子。
三、ABC 与 Python 的关系:Guido 是"内部人"
关系本质:Python 是 ABC 的"精神继承者 + 工程修正版",而设计者 Guido van Rossum 本人就是 ABC 团队的一员。
关键事实:
Guido 亲手参与过 ABC 的开发(他在自己的 GitHub abc-unix 仓库里写明:"ABC was Python's most direct predecessor; I worked on it from around 1983–1986.")
之后 Guido 在 CWI 参与 Amoeba 分布式操作系统项目,需要用一门脚本语言去处理异常、并与 Amoeba/系统交互——而 ABC 做不到这点。
于是他在 1989 年底(圣诞假期)动手设计一门新语言,明确把它定位为 ABC 的继任者(successor),保留 ABC 的优点、修补 ABC 的致命缺陷。1991 年发布 Python 0.9.0。
Guido 本人自述(关于 Python 特性来源):
"我在 CWI 的 ABC 部门时在实现解释型语言方面积累了丰富经验,通过与这个部门成员的协同工作,我学到了大量有关语言设计的知识。这是许多 Python 特性的最初来源,包括使用缩进来组织语句
Python 从 ABC 直接继承的特性
| |
|---|
| 用缩进表示嵌套(nesting by indentation) | |
| |
| Python 内置 list / tuple / dict / set / str / number 等高层结构 |
| |
| |
| Python 的 for x in ... 迭代模型 |
| |
注:缩进作为语法并非 ABC 的原创——Donald Knuth 早就在倡导,occam 语言也用过。但是 ABC 把它认真做成一门语言的统一风格,再由 Python 发扬光大。
四、最关键的一段:ABC 为什么失败,Python 又改了什么
这是理解"ABC 与 Python 关系"最有价值的部分——Python 不是凭空更好,而是精准修补了 ABC 的失败。
ABC 失败的若干原因(据 Guido 与社区总结)
不可扩展(not extensible):语言是单体(monolithic)的,用户很难甚至无法编写扩展模块去加新功能。
无法与系统/操作系统真正交互:很难访问文件系统、调用系统能力——而真实工程离不开这些。
平台迁移能力弱:难以方便地移植到多平台。
只盯初学者:只专注教学场景,没把有经验的程序员纳入用户群,天花板低。
开放性不足:早期不够开放,传播受限。
Python 对应的"修正手术"
极易写扩展模块:设计了干净的 C API,能用 C/C++ 给 Python 写扩展(这是 Python 后来庞大的科学计算生态——NumPy 等——的根基)。
能对接系统:支持异常处理(exception handling)、能直接与 Amoeba/Unix 系统交互、操作文件。
跨平台:从一开始就面向多平台运行。
同时讨好新手与专家:保留 ABC 的易读易学,又不牺牲专家需要的控制力与生态。
开源开放:1991 年即以开源方式发布,借助社区滚雪球。
一句话:ABC 证明了"极简、高层、可读"是正确方向,却在"工程可用性"上摔了跤;Python 接住了 ABC 的方向盘,又给车装上了引擎(扩展性、系统交互、跨平台、开源社区)。
五、结论
ABC 是什么:CWI 在 1980 年代设计的一门"替代 BASIC"的教学型超高级语言,以缩进、强类型无声明、5 种高层内置类型、交互环境为标志,受 SETL 启发。
它和 Python 的关系:Python 是 ABC 的直接继任者;设计者 Guido 本人就是 ABC 团队核心成员,Python 的缩进风格与高层数据结构直接源自 ABC 的熏陶;而 Python 的成功,恰恰在于它保留了 ABC 的优雅,又补上了 ABC 缺失的工程能力(可扩展、可对接系统、跨平台、开源)。
谱系上的精确定位: SETL → ABC → Python,其中 ABC 是 Python 的"最近、最直接的祖先",Python 则是 ABC 理想在真实世界里的"成功转世"。