The History of Python

2009年4月24日星期五

Python设计哲学

英文原文链接:http://python-history.blogspot.com/2009/01/pythons-design-philosophy.html

原文作者:Guido van Rossum

随后的博文重心落在Python历史细节上。然后,在开始具体内容之前,我想在这里详细说明一下Python设计与实现过程中指导我做出决策的哲学方针。

首先,Python最初只是一个人的“私活”,没有正式资金支持,我希望能尽快做出成品,以便向管理层要求对该项目的支持(这方面我做的相当成功)。基于这一点,采取了如下一些节约时间的原则:
  • 只要合适,尽可能从其它语言借用已有思路。
  • 事情应当简约而不简陋(爱因斯坦)。
  • 只做一件事,做好一件事(UNIX哲学)。
  • 对性能不需要太多顾虑,有在遇到性能瓶颈是进行优化的方案即可。
  • 不对抗大环境,顺势而为。
  • 不强求完美,因为通常“足够好”已经“足够好”了。
  • (因此)有些细碎之处可以先放在一边,尤其是那些放在以后正确处理的部分。

还有一些原则则不是从节约时间的角度来考虑的,有时还会因此耗费相当时间:

  • Python实现应当不依赖具体平台,可以允许部分函数不是在所有平台实现,但是核心部分应当在所有平台都正常工作。
  • 不劳烦用户处理那些机器可处理的部分(我并没有一直遵守这一原则,因此损失惨重,其中一些教训将在后文提到)。
  • 支持并且鼓励用户写平台无关代码,同时不禁止利用平台特性。(这一点和Java的设计原则尖锐对立。)
  • 一个大规模复杂系统应当有多层次的可扩展性。这对自己动手进行扩展的新老用户都有利。
  • 出错不应当是致命的。也就是说,只要虚拟机还能工作,用户代码就有从出错处恢复的能力。
  • 同时,也不应简单忽略出错之处。(这和上一条一起,导致了在具体实现时广泛采用异常。)
  • 用户所写Python代码中的bug不应使Python解释器产生未定义行为;永远不会因为用户代码中的错误导致Python核心错误。

最后,我还有些关于编程语言设计的好思路,这些主要是从ABC开发组借鉴而来。正是在ABC开发组我第一次有了编程语言设计与实现的实际经验。这些思路可归结为优美、简洁、良好可读性等主观想法,难以用言语具体表达。

虽然在后边我还会提到ABC对Python的影响,我想在这儿强调特别和可读性有关的一点:慎用标点符号,只采用书面英语和高中代数中的常用标点符号。当特定用法在编程语言中已经长期存在成为传统时,可以考虑破例。例如“x*y”表示乘法,“a[i]”表示数组下标,“x.foo”表示选择对象属性。但是Python不用“$”表示变量,也不用“!”表示运算以避免副作用。

Tim Peters,是Python的长期用户,并最终成为最高产与卓越的核心开发人员。他对我的设计语言进行理解并表达为“Python之禅”。我把全文贴出来:
(这一段的翻译译者ZoomQuiet,来源:http://wiki.woodpecker.org.cn/moin/PythonZenZoomq)

  • 美丽好过丑陋,
  • 浅显好过隐晦,
  • 简单好过复合,
  • 复合好过复杂,
  • 扁平好过嵌套,
  • 稀疏好过密集,
  • 可读性最重要,
  • 即使祭出实用性为理由,特例也不可违背这些规则.
  • 不应默认包容所有错误,得由人明确的让它闭嘴!
  • 面对太多的可能,不要尝试猜测;应该有一个(而且是唯一)直白的解决方法;
  • 当然,找到这个方法不是件容易的事~谁叫你不是荷兰人呢?
  • 但是!现在就做永远比不做要好;
  • 若实现方案很难解释,那么它就不是一个好方案;反之也成立!
  • 名称空间是个绝妙想法. --现在就来共同体验和增进这些吧!

虽然我在ABC的工作经验对Python影响深远,ABC开发组有一些设计原则和Python有根本不同。Python尽量避免了下面这些设计思路:

  • ABC开发组努力追求完美,例如采用了树的结构,这对于大的收集(collection)是渐进优化的(但是对小的收集效果并不理想)。
  • ABC开发组希望将用户和“笨重脏乱的计算机世界”尽量隔离开。不仅不设定数字上限、字符串长度、收集包含元素数量(仅有可用内存来进行限制),而且让用户不需要直接接触文件、磁盘、“存盘”等概念。ABC本身成为用户唯一需要了解的工具,基于这一思路,ABC开发组创建了一个ABC所特有的集成编辑环境(确实在使用ABC时存在不使用集成编辑环境的可能,但是这样做困难重重,多是求之不得之后的一种懊悔,而且只能间接实现。)
  • ABC开发组假定用户没有任何计算机知识(或者用户愿意忘记以前所学的计算机知识)。因此,他们设计了另外一套“新手友好”的计算机术语。例如,程序被改称“怎么办”,变量则称作“定位件”。
  • ABC开发组在设计ABC语言时对其未来发展的规划并不明确,也没有考虑用户如何参与对语言的设计。ABC是一个封闭的系统,被设计为尽量“完美无缺”。不鼓励用户查看ABC的具体实现。虽然在项目后期也有考虑对高级用户开放部分实现,但终未能实现。

从各方面来说,我在创建Python语言时采用的设计原则可能是Python语言获得巨大成功的最重要原因之一。不强求完美,而是让早期的用户群发现Python对他们的需求“足够好”。随着用户数量的增加,他们所提出的改进建议逐渐融入语言本身。我们可以在后面的介绍中看到,许多建议对语言有相当变化,需要对核心部分进行显著改动。时至今日,Python仍在继续进化过程之中。

没有评论: