The History of Python

2009年4月28日星期二

Python选择了动态类型

英文原文链接:http://python-history.blogspot.com/2009/02/pythons-use-of-dynamic-typing.html

原文作者:Guido van Rossum

ABC和Python的重要区别之一在于类型系统的通用风格。ABC是静态类型语言,ABC的编译器会分析程序中类型的一致性。如果存在不一致情况,程序就会被拒绝运行。和现在大多数静态类型语言不同的是,ABC使用类型推断(这一点和Haskell一样)而不是常在C语言中看到的那样明确声明变量类型。相反,Python采用动态类型。Python编译器对程序中的类型一无所知,统统放行,所有的类型检查在运行时完成。

虽然表面上看起来是对ABC背离很远,实际上并没有想象的那么夸张。和其它静态类型语言不同的是,ABC不(真的不?这个记忆可老有历史了:-)完全依赖仅靠静态类型检查以保证程序不会崩溃,还有一个运行时库在程序运行时对所有的操作类型进行再次检查。这个是作为编译器类型检查的安全性检查的一部分,在语言原型实现阶段没有完全实现。这个运行时库对于调试也有用,因为进行明确的运行时类型检查有助于输出更有针对性的出错信息(这是对实现团队来说的),而不是解释器在运行时不检查参数类型是否正确就盲目运行而导致内核崩溃那样。

然而,ABC在静态类型检查之外还采用运行时类型检查的最关键原因在于ABC是交互式的。在一次交互过程中,用户输入ABC程序语句和变量定义后立刻被执行。交互模式中一次完整过程可能将一个变量定义为数值类型,删除变量,然后重新定义变量(也就是创建另外一个同名变量)为字符串类型。在单个语句中某变量名从数值类型变为字符串类型会产生静态类型错误,然而在交互模式下不同语句之间也要求这种类型检查就有些不妥当了,否则不小心创建了一个数值类型的变量x,就会被禁止创建变量名为x的其他类型!因此作为折中,ABC对全局变量使用动态类型检查,对局部变量使用静态类型检查。为了简化实现,动态类型检查对局部变量也同样适用。

于是,从ABC的类型检查实现方法到Python的方法只剩下一步之遥了--Python简单的把编译时类型检查完全去掉。这完全符合Python的“偷工减料”原则,只要这种实现上的简化不影响最终的安全性,所有的类型检查都会在运行时进行所以各种类型错误会被捕获而不是导致Python解释器失效。

然而,一旦决定采用动态类型,就没有回头路了。ABC仔细设计了built-in(内置)运算以便从运算形式上推测参数类型。例如,从表达式“x^y”中,编译器可以得知变量x和y是字符串。Python中就无法采用这样的推理规则了。例如表达式“x+y”可能是字符串连接,也可能是数字相加,或者用户自定义类的重载操作。

没有评论: