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 的库具有更多用于处理互联网和 WWW 现实的功能,例如电子邮件、HTML 和 FTP。
Python 在开发环境和代码分发方面具有不同的理念。 Smalltalk 传统上具有由环境和用户程序组成的整体“系统映像”,而 Python 将标准模块和用户模块都存储在单个文件中,这些文件可以轻松地在系统外部重新排列或分发。 一个结果是,由于 GUI 没有内置到系统中,因此有多种选择可以将图形用户界面 (GUI) 连接到 Python 程序。
C++
为 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 具有一个单一的、免费的、紧凑的实现。