注意: 虽然 JavaScript 对于本网站不是必需的,但您与内容的互动将受到限制。请开启 JavaScript 以获得完整的体验。

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)的设施。

Python 在开发环境和代码分发方面有着不同的理念。Smalltalk 传统上有一个包含环境和用户程序的整体“系统镜像”,而 Python 将标准模块和用户模块存储在单独的文件中,这些文件可以轻松地重新组织或在系统外部分发。一个结果是,将图形用户界面 (GUI) 附加到 Python 程序有不止一种选择,因为 GUI 没有内置到系统中。

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 拥有一个单一、免费、紧凑的实现。