与 2002 年的 ChinesePython 对照
★ ChinesePython 这个名字不是新的 —— 2002 年有人用过它 (基于 Python 2.1.1,改了 parser 与报错)。这里是 2026 年的第二次实现。 下面这份对照是逐文件数出来的,不是听说的。
对照的是 2001–2002 年那份真实源码(作者 Glace,基线 Python 2.1.3)。
不是听说的,是逐文件数出来的。
一、一句话区别
那一版改的是「解释器自己说的话」;这一版先把「名字」改掉。
| 2002 版 | 这里 | |
|---|---|---|
| 基线 | Python 2.1.3 | CPython 3.14.7 |
| 关键字 | 直接改进 Grammar/Grammar(繁体,约 24 个) | Tools/peg_generator/pegen/zh_keywords.py → 并进生成表,35 硬 + 3 软,简繁不论,全用简体 |
| 报错文案 | 硬编码在 C 里(errors.c 15 处、pythonrun.c 57 处、traceback.c 8 处…) | 显示层翻译,CHINESEPYTHON_ERRORS 可一键还原 |
| 回溯 | 改了 Python/traceback.c 的格式串 | 改了 Lib/traceback.py 的渲染,str(e)/e.args/type.__name__ 一律不动 |
| 方法别名 | 直接往类型里塞(str 44 个、list 9 个、file 14 个) | 234 条,查表层(不塞 tp_dict) |
| 内置名 | 改了 bltinmodule.c(3792 个汉字) | 74 条别名,英文名一个不少 |
| 异常 | 类名保持英文,只翻 exceptions.c 里的 docstring | 类名保持英文;另给 72+13 个别名(except 中文名 接得住) |
| 显示能不能还原 | 不能 —— 中文直接替换了英文 | 能,=en 完全还原 |
| 库 | 加了自己的 Lib/chdict/;Lib/ 基本没动 | Lib/ 是显示层 + 深拷贝派生的独立汉语库(文本折行/统计) |
| 规模 | 改 243 个文件、加 65 个 | 上游 Python/ 仓 30+ 个文件改动,产品仓 40+ 个工具/文档 |
二、那一版做到了什么(值得敬重的地方)
- 真的改进了语法层:
Grammar/Grammar里写的是'def' | '函數' | '定義',注释还留着# Modified by Glace. Chinese keywords added. 06/2001。 - 两种编码都支持:文件头
#--BIG5--/#--GBK--标记,配套Include/chineseencode.h。2001 年的 Windows 上这是必须的。 - 异常类名一个都没动 —— 跟这里的红线完全一致。它翻的是
Python/exceptions.c里的 docstring。 - 报错文案是真·硬编码进 C 的,
Python/errors.c15 处、pythonrun.c57 处、tokenizer.c10 处、traceback.c8 处。 - 它自己写了一份路线图
chinese/howto.txt,如实列了没做完的事。
三、那一版没做到什么(它自己的 howto.txt 里写着的)
Objects/里那些「友好的 dunder」没做;- 方法别名只做了
str/list/file三个类型; compile.c/ceval.c/exceptions.c/errors.c/modsupport.c里还有大量英文报错没翻;- 内置函数没有中文名;
Lib/没有中文文件;__doc__没有翻译。
这份「没做完」清单,正好就是这里这几个月在做的事。
四、最关键的一个差别:能不能还原
那一版的 Lib/traceback.py 跟原版 逐字节相同(10589 → 10589,0 个汉字)—— 因为中文直接替换在 C 里,Python 层根本没插手的余地。后果:
- 没有显示层,也没有英文回退;
- 想让报错变回英文?只能重新编一份解释器。
这里反过来:中文只在显示时出现,str(e) / e.args / type.__name__ 一个字没动, CHINESEPYTHON_ERRORS=en 一键还原。代价是「中文」这一层要靠渲染来做, 好处是老代码和第三方库永远不会因为汉化而坏。
五、名字上有没有继承
故意不一样的多,一样的少。 一样的只有三个:
| 英文 | 2002 版 | 这里 |
|---|---|---|
def | 定義 | 定义 |
pass | 忽略 | 略过 |
assert | 斷言 | 断言 |
故意不同的(这里都是简体 + 按「原名有没有英文对应」重定):
| 英文 | 2002 版 | 这里 | 为什么 |
|---|---|---|---|
if | 如 | 如果 | 「如」单字太短,容易跟标识符撞 |
break | 中斷 | 跳出 | 跟 continue 成对 |
return | 傳回 | 返回 | 更常见 |
import | 載入 | 导入 | 跟 from→来自 成对 |
while | 只要 | 每当 | 「只要」有歧义 |
class | 概念/類別 | 类型 | 跟 type 的软关键字统一 |
lambda | 匿名函數 | 匿名函数 | 简体 |
一句话:那一版是繁体、按 2001 年的用词习惯定的; 这里是简体、按「运算符/关键字原本有没有英文对应」这条铁律重新定的, 并且全都记在 本项目的名字总表 里,860 条,改哪一条都有据可查。
六、这一版比那一版多出来的东西
- 总判据:拿 CPython 自带的
Lib/test做三方对照(原生 / 英文模式 / 中文模式), 「我们改坏的」必须恒等于 0。那一版没有这种判据(2001 年也没这个条件)。 - 项目仓库:860 个中文名字,750 个被自动探针真调过一遍, 未覆盖的 110 个逐条写原因。那一版只有「加了多少个汉字」。
- 一键还原(
CHINESEPYTHON_ERRORS=en/both)。 - 汉语库:
文本折行/统计—— 英文名和中文名同一个对象, 官方Lib/test/test_textwrap.py68 个用例、test_statistics.py399 个用例照跑。 - 决策记录:相关记录 到 相关记录,每条都写「谁在守它、想改要动哪里」。
七、说句公道话
2001 年,没有 GitHub 上随手可查的 CPython 源码,没有 3.14 的 ast 模块, 没有 32 核并行跑 1148 个测试文件的机器 —— Glace 是一个人硬改 C 源码做到的。 它留下的 howto.txt 那份「没做完清单」,二十多年后还有人照着往下做, 这件事本身就很了不起。