The History of Python

2009年5月1日星期五

大改名

英文原文链接:http://python-history.blogspot.com/2009/03/great-or-grand-renaming.html


原文作者:Guido van Rossum

Python初创时期,我总是将其作为一个独立程序来用,偶尔连接一些第三方库进来。因此源代码随意定义全局名称(当然要符合C/连接器要求)例如“object”、“getlistitem”和“INCREF”诸如此类。随着Python流行开来,人们开始要求“嵌入”版本的Python,以便Python自身作为一个库供其它应用程序连接-这和Emacs与Lisp解释器之间混合的方式还不一样。


糟糕的是,嵌入由于命名冲突而复杂化,Python全局名和那些嵌入Python的应用之间会发生名称冲突-特别是“object”很常见。为了解决这个问题而进行了命名约定,约定所有的Python全局名称开头为“Py”或者“_Py”(用于因技术原因不得不作为全局变量的内部名称)或者“PY”(用于宏)。


为了向下兼容(已经有许多第三方扩展模块)和方便核心开发人员转换(在他们的大脑中原来的旧名字已经根深蒂固)分成了两个阶段。第一个阶段连接器看到的是旧名字,而源代码使用的是新名称,用一个包含许多规则的C语言预编译宏来完成转换。第二个阶段连接器看到的是新名字,但是为了继续支持还没移植的原有扩展模块,另外一套宏用于旧名字转换为新名字。在任一阶段,代码都可以在新旧名字混合情况下正常工作。


我研究了一下Subversion日志中名称改变的历史。我发现1995年1月12日的r4583在所有头文件中引入新名称,标志伟大改名(great renaming)第二阶段的开始。然而直到1996年12月C源代码中的改名工作仍在继续进行中。也是大约在这个时候,重命名本身也被重新称呼,checkin comments常称之为“宏大命名(Grand Renaming)”了。在2000年5月,作为Python1.6版本发布的成果之一,向下兼容的宏被移除。check-in comment r15313庆祝了此一事件。


此事归功于Barry Warsaw和Roger Masse,他们做了大量细致的工作,对源文件内容逐个进行重新命名(有些脚本来帮助这一过程)。对大量标准库进行unit test也有助于他们重命名,这是又一个繁琐的工作。


Wikipedia上对Great Renaming有一个早期条目,是指USENET groups的改名。我称Python的改名为Great Renaming时可能正模糊记得这一事情。我还看到有些参考资料指向随后Sphinx的Grand Renaming,这是用于生成Python文档的包。看起来Zope也有一个Grand Renaming,最近Py3k也讨论到了术语PyString到PyBytes的重命名(当然这个和前面那些比要小得多)。


伟大改名或者宏大改名(Great or Grand Renamings)对软件开发社区来说是一个长期的创伤,因为这需要程序员的脑袋接受再教育、重写文档、对改名前提议的补丁集成到到改名后的分支变得困难。(尤其是还存着未改名分支时更是如此。)

没有评论: