Python 发展史:众人的语言(第一卷)
讲述一门语言如何从一个人的夜晚,成长为无数人的白昼。
序幕:冬夜的终端光(1989,阿姆斯特丹)
午夜后的走廊安静得只剩暖气声。CWI 的办公室里,老旧显示器泛着蓝绿的微光。Guido 拿起杯子,杯里只剩冷掉的咖啡。他把外套搭在椅背上,重新坐回键盘前。
屏幕上闪着他刚敲下的注释:
“A new scripting language, simple, readable, extensible.”
这是个朴素得不能再朴素的愿望。ABC 给了他“怎么把编程变得友好”的直觉,Amoeba 让他见识“脚本如何粘合系统”的可能。两条河在这个冬夜汇合——要做一门既像橡皮泥又像扳手的语言。
“名字呢?”同事问。
Guido 抬头,嘴角一弯:“Python。”
“蛇?”
“不是。Monty Python。要留一点幽默感。”
窗外的雪更密了。他在编辑器里敲下0.9的骨架:类与继承、异常与模块、列表和字典。
“让读者在三页之内写出第一个工具。”
这不是宣言,只是一句自说自话的工作笔记。
第一章 走向公开(1991—1994)
Usenet 的帖子像纸飞机,带着热切与随意飞来飞去。1991 年 2 月 20 日,Guido 把 0.9.0 投进了 alt.sources。有人下载,有人试跑,有人问:“为什么要用空白缩进?”
Guido 的回复总是温和而坚决:
“可读性不是压迫,而是合约。我们为未来的读者让路。”
到了 1994 年,1.0 抵达。模块化的边界、异常的叙事、函数式的小工具——lambda
、map
、filter
、reduce
——都像井边的石阶:不是风景,都是落脚点。
那年,Python 的语气成型了:少一些口号,多一些示例;少一些魔法,多一些“应该这样写”。
第二章 工程的气味(1995—2000)
互联网长大了,脚本的用途也跟着长大。系统管理员在 crontab 里写了第一行 Python;Web 开发者借 CGI 做了第一个表单;文本处理者拿 re
把日志切成了片。
“我们需要更可靠的回收机制。”有人在邮件列表里说。
2000 年,2.0 端上桌:
- 循环垃圾回收,照看那些互相握着手不肯离开的对象;
- 列表推导式,把“从……到……”这类句子写成一行;
- Unicode 开始成为默认叙事的一部分。
这不是炫技,这是工具箱的更新。Python 在更大的工程里找到了自信:你可以把我当脚本用,也可以要我写正经活儿。
第三章 语法的光泽(2001—2006)
PEP 流程像一台缓慢但稳健的印刷机,印出社区的共识。新的对象模型让“万物皆对象”从口号变成结构,生成器的 yield
让“延迟”与“流动”听起来不再晦涩。
在某一个 PyCon 的走廊上,有人打趣:
“
yield
像一把单簧管,让乐队里多了呼吸。”
装饰器 出现后,横切关注点有了优雅的语法外衣;上下文管理器 揉捏出 with
语句,让资源的开与关都在一对大括号一样的缩进里呼吸。
这几年,Python 的手感愈发一致:打开文件、处理异常、迭代一切——像走在刻度均匀的台阶上。
第四章 两条铁轨(2006—2010)
长大的语言需要修缮旧街区。3.0 就是那份“城市更新”规划。
“我们得把文本与字节分开。”
“print
应该是函数。”
“range
应该惰性。”
这些句子像城市的交通规则,从此减少歧义。可规则一改,老街的商户会抱怨:2.x 的老店太多,搬迁艰难。
于是社区做了一个现实而温柔的决定——给 2.7 足够长的维护期,而 3.x 另一条铁轨则加速向前。
论坛里争论难免,走廊里拥抱依旧。分歧背后是共同的守望:
“把短痛集中在一次,换长期的可维护。”
第五章 记忆的工匠(2012—2014)
如果你把一段中文小说和一封拉丁文邮件放在同一只 str
里,Python 该如何在内存里摆放它们?PEP 393 给出了优雅的答案:
“用最合适的宽度存每个字符。”
这不像新地标,更像给每一扇窗换上了更合身的窗框。内存占用下降,切片更轻快。
在工具链一侧,venv
和 ensurepip
成为标配:隔离环境、开箱即用。新手不再为“怎么装 pip”困惑。
第六章 时间的回路(2014—2017)
会议厅里,白板上画着一个圈:事件循环。asyncio
把“等待 I/O”从阻塞的黑箱,变成可组合的语句。后来,async
/await
这对关键字把协程请到了语法的正中央。
与此同时,类型提示像一股清风从 IDE 的窗缝里吹进来。最初是注解,后来是工具链;mypy、pyright、Pylance 让**“渐进式类型”不再是口号,而是更少回归、更稳重构**的路径。
再后来,f 字符串让字符串格式化从此像对话一样自然;数据类让值对象的样板被一行装饰器抹平。
这些改变没有烟花,但它们落在每一天的键盘上。
第七章 治理之变(2018)
夏天的邮件列表突然安静了一拍。Guido 写下那句后来被无数次引用的话:
“我想给自己放一个永久的假期。”
这是一个时代的句号,也是另一个句子的开头。社区很快以Steering Council 的方式重新排好了队形:明确流程、分散权力、把“权力”当作“兜底的少数时刻”。
人们在大会上举杯——不是为离开,而是为可持续。
第八章 新常态(2019—2021)
年更节奏确立:十月是收获的月份。zoneinfo
把时区的烦恼搬进了标准库;结构化模式匹配把“以形断意”的古典技巧,变成 match/case
的现代语法;PEP 一篇篇讲透动机与代价,像法庭一样充分而克制。
打包生态也悄然“工业化”:wheel 成为分发主力,pyproject.toml 把构建系统写进了共同的契约。你可以选择 setuptools
、flit
、poetry
或 pdm
,但选择的自由建立在标准的统一之上。
第九章 加速器(2022—2013)
有人在白板上写下四个字母:Faster CPython。
“如果大多数路径在运行时是稳定的,我们就让解释器自适应地为它们铺快车道。”
PEP 659 于是诞生:专用化、可回退的解释层,把“常见的加法”“常见的属性读取”变成更窄但更快的指令。3.11 的发布会上,演讲者把基准图挂在屏幕上,指着那条10–60% 的提速区间,笑得像做完了一次心肺复苏。
随后,3.12 收束边界、整理接口;到了 3.13,一个大胆的预览被端上桌:
自由线程(无 GIL 构建)与JIT 的雏形。
它们还不完美,甚至会带来单线程回退的代价,可大家都明白:这是三十年后的一次大跨步,不是戏法,是基建。
第十章 另一条地平线(尾声)
某个黄昏,初学者在 REPL 里因为一个拼写错误看到彩色的回溯与更友好的建议;另一个角落,运维团队把长期服务从 3.10 升到 3.13,账单里静悄悄出现了“少 20% CPU”的曲线;还有团队在实验室里用“自由线程”把一个老旧的多线程库从“看似并行”变成“真的并行”。
Python 的故事,越来越像一部群像剧——语言、实现、打包、治理、生态共同演出。它从不是最快的,也不总是最时髦的,但它始终是最愿意照顾读者与使用者的那部作品。
“愿每一次语法的改变,都能让更多人写得更稳、更久;愿每一次实现的突破,都能为下一个世代打好地基。”
卷一结束
注:本卷以“故事体”串联关键史实与技术节点,所涉年份与事件均有公共文献可考。卷二(2013—2025)将继续以叙事方式展开:类型系统扩展、打包标准化进程、数据科学与 AI 兴起、PyPy/MicroPython 等多实现的交错影响、以及 3.14+ 在自由线程道路上的“从试验到支持”。