将 Python 与其他语言进行比较
将 Python 与其他语言进行比较
免责声明:这篇文章是在 1997 年左右写的。它显示了它的年代。它保留在这里仅仅作为历史文物。--Guido van Rossum
Python 通常与其他解释型语言进行比较,例如 Java、JavaScript、Perl、Tcl 或 Smalltalk。与 C++、Common Lisp 和 Scheme 的比较也可能具有启发性。在本节中,我将简要比较 Python 与这些语言中的每一种。这些比较仅集中在语言问题上。在实践中,编程语言的选择通常由其他现实世界的约束条件决定,例如成本、可用性、培训和前期投资,甚至情感依恋。由于这些方面变化很大,因此在本次比较中过多考虑它们似乎是浪费时间。
Java
Python 程序通常预计运行速度比 Java 程序慢,但它们的开发时间也少得多。Python 程序通常比等效的 Java 程序短 3-5 倍。这种差异可以归因于 Python 内置的高级数据类型及其动态类型。例如,Python 程序员不会浪费时间声明参数或变量的类型,而 Python 强大的多态列表和字典类型,这些类型在语言中直接构建了丰富的语法支持,几乎在每个 Python 程序中都有用。由于运行时类型,Python 的运行时必须比 Java 的运行时更努力。例如,在计算表达式 a+b 时,它必须首先检查对象 a 和 b 以找出它们的类型,这在编译时是未知的。然后它调用适当的加法运算,这可能是一个重载的用户定义方法。另一方面,Java 可以执行有效的整数或浮点数加法,但需要为 a 和 b 声明变量,并且不允许为用户定义类的实例重载 + 运算符。
由于这些原因,Python 更适合作为一种“粘合”语言,而 Java 更适合作为一种低级实现语言。事实上,两者结合在一起形成了一个极好的组合。组件可以在 Java 中开发,并组合起来在 Python 中形成应用程序;Python 也可以用于对组件进行原型设计,直到它们的設計可以“硬化”在 Java 实现中。为了支持这种类型的开发,正在开发一个用 Java 编写的 Python 实现,它允许从 Java 调用 Python 代码,反之亦然。在这个实现中,Python 源代码被翻译成 Java 字节码(在运行时库的帮助下,以支持 Python 的动态语义)。
Javascript
Python 的“基于对象”子集大致相当于 JavaScript。与 JavaScript(与 Java 不同)一样,Python 支持一种编程风格,它使用简单的函数和变量,而无需进行类定义。但是,对于 JavaScript,这就是全部。另一方面,Python 支持编写更大的程序并通过真正的面向对象编程风格(其中类和继承起着重要作用)来更好地重用代码。
Perl
Python 和 Perl 来自相似的背景(Unix 脚本,两者都早已超越),并且拥有许多相似的功能,但具有不同的理念。Perl 强调对常见面向应用程序的任务的支持,例如通过内置正则表达式、文件扫描和报告生成功能。Python 强调对常见编程方法的支持,例如数据结构设计和面向对象编程,并通过提供优雅但不过于神秘的符号来鼓励程序员编写可读(因此可维护)的代码。因此,Python 接近 Perl,但在其原始应用领域很少胜过它;然而,Python 的适用范围远远超出了 Perl 的利基市场。
Tcl
与 Python 一样,Tcl 可用作应用程序扩展语言,也可作为独立编程语言。但是,Tcl 传统上将所有数据存储为字符串,在数据结构方面很弱,并且执行典型代码的速度比 Python 慢得多。Tcl 还缺少编写大型程序所需的功能,例如模块化命名空间。因此,虽然使用 Tcl 的“典型”大型应用程序通常包含特定于该应用程序的用 C 或 C++ 编写的 Tcl 扩展,但等效的 Python 应用程序通常可以用“纯 Python”编写。当然,纯 Python 开发比编写和调试 C 或 C++ 组件要快得多。据说 Tcl 的唯一优点是 Tk 工具包。Python 已将 Tk 的接口用作其标准 GUI 组件库。
Tcl 8.0 通过提供具有有限数据类型支持的字节码编译器来解决速度问题,并添加了命名空间。但是,它仍然是一种更繁琐的编程语言。
Smalltalk
也许 Python 和 Smalltalk 之间最大的区别是 Python 更“主流”的语法,这使其在程序员培训方面具有优势。与 Smalltalk 一样,Python 具有动态类型和绑定,并且 Python 中的一切都是对象。但是,Python 区分内置对象类型和用户定义的类,并且目前不允许从内置类型继承。Smalltalk 的集合数据类型的标准库更加完善,而 Python 的库在处理电子邮件、HTML 和 FTP 等互联网和 WWW 现实方面具有更多功能。
Python 在开发环境和代码分发方面具有不同的理念。在 Smalltalk 传统上有一个单一的“系统映像”,它包含环境和用户的程序,而 Python 将标准模块和用户模块存储在可以轻松重新排列或在系统外部分发的单个文件中。一个结果是,有多种选择可以将图形用户界面 (GUI) 附加到 Python 程序,因为 GUI 不是内置在系统中的。
C++
对于 Java 来说,几乎所有关于 Java 的说法都适用于 C++,只是程度更甚:Python 代码通常比等效的 Java 代码短 3-5 倍,它通常比等效的 C++ 代码短 5-10 倍!轶事证据表明,一名 Python 程序员可以在两个月内完成两名 C++ 程序员无法在一年的时间内完成的任务。Python 作为一种粘合语言而大放异彩,用于组合用 C++ 编写的组件。
Common Lisp 和 Scheme
这些语言在动态语义方面接近 Python,但在语法方法方面却大相径庭,以至于比较几乎变成了宗教争论:Lisp 的语法缺乏是优势还是劣势?应该注意的是,Python 具有类似于 Lisp 的自省能力,并且 Python 程序可以动态地构建和执行程序片段。通常,现实世界的属性是决定性的:Common Lisp 很大(从各个方面来说),而 Scheme 世界在许多不兼容的版本之间支离破碎,而 Python 只有一个免费的、紧凑的实现。