用 Python 将一切粘合在一起
用 Python 将一切粘合在一起
Guido van Rossum
CNRI
1895 Preston White Drive
Reston, VA 20191
电子邮件:guido@cnri.reston.va.us, guido@python.org为 OMG-DARPA-MCC 组合式软件架构研讨会 撰写的立场文件,1998 年 1 月 6-8 日,加利福尼亚州蒙特雷。
简介
Python 是一种高级脚本语言,它被成功地用于将大型软件组件粘合在一起。它跨越多个平台、中间件产品和应用领域。Python 是一种面向对象的语言,具有高级数据结构、动态类型和动态绑定。Python 自 1991 年以来一直存在,并且拥有非常活跃的用户社区。有关更多信息,请访问 Python 网站 https://pythonlang.cn。
像 Tcl 一样,Python 可以很容易地使用 C/C++/Java 代码进行扩展,并且可以很容易地嵌入到应用程序中。Python 甚至使用 Tk(Tcl GUI 工具包)作为事实上的标准便携式 GUI 工具包。然而,与 Tcl 不同的是,Python 支持面向对象编程。Python 程序员可以创建类、使用多重继承、定义方法、重载运算符等等。
Python 的优势
在语法上,Python 代码看起来像可执行的伪代码。使用 Python 进行程序开发比使用 C/C++ 快 5-10 倍,比使用 Java 快 3-5 倍。在许多情况下,可以使用 Python 编写应用程序原型,而无需编写任何 C/C++/Java 代码。通常,原型具有足够的功能并且性能足够好,可以作为最终产品交付,从而节省大量开发时间。其他时候,原型可以部分或全部翻译成 C++ 或 Java -- Python 的面向对象性质使翻译过程变得简单明了。
最好的方法通常是在 C++ 或 Java 中只编写应用程序的性能关键部分,并使用 Python 进行所有更高级别的控制和自定义。有一些关于应用程序的轶事,这些应用程序最初是纯 C++ 代码,后来添加了 Python 作为扩展语言,在每个新版本中,用 Python 编写的应用程序的百分比都在增加,同时也提高了应用程序的整体性能、功能和可靠性。(例如,案例研究:Greg Stein,微软,在 第六届国际 Python 会议的论文集 中撰写的 “商业环境中的 Python”,以及 UvA 和 CMU 的 Alice VR 项目。)
Python 在 Web 上有很强的影响力。它适用于 CGI 编程(在所有平台:Unix、Windows 和 Mac 上);它有到所有主要商业数据库的接口。Python 有一个接口到主要的 Internet 和 Web 协议的库,并且具有 HTML 解析和生成工具包。当 Infoseek 规模较小时,Python 是其主要实现语言。至少有一家公司(Digital Creations)正在使用 Python 销售一套服务器端工具。最后,Python 已被用于实现 Web 浏览器 (Grail)。
Python 在分布式系统领域也很有代表性。它是 Xerox PARC 的 ILU(跨语言统一;一种与 CORBA 兼容的分布式对象系统)支持的主要语言之一,并且许多分布式应用程序都是使用 ILU 在 Python 中构建的。Python 也被澳大利亚昆士兰大学的 Hector 项目使用。
最后,Python 与 Windows 平台很好地集成在一起。Python 程序可以与 COM 和 DCOM 服务交互,甚至可以实现新的 COM 和 DCOM 服务(这在使用 Visual Basic 时是不可能的!)。Python 还可以用作 Microsoft Active Scripting 架构中的脚本引擎。
将 Python 用作集成语言
与本次研讨会的主题相关,Python 在许多地方被用作集成语言,用于将现有组件粘合在一起(“指导”)。这里的策略是创建 Python 扩展模块(用 C/C++ 编写),使 C/C++ 编写的大型组件的功能可供 Python 程序员使用。需要扩展(“粘合”)模块,因为 Python 不能直接调用 C/C++ 函数;粘合扩展处理 Python 数据类型和 C/C++ 数据类型之间的转换以及错误检查,将翻译错误返回值转换为 Python 异常。
通过 SWIG 的存在,简化了粘合扩展的创建,SWIG 读取包含函数和方法原型的头文件,并自动生成必要的类型转换和错误检查代码。在底层代码(通常是 C 代码)不使用面向对象模型的情况下,粘合扩展又可以包装在一个定义了适当类层次结构的 Python 模块中,同时将性能关键的操作委托给 C 代码。
使用 Python,可以开发更好的应用程序,因为不同类型的程序员可以在项目上协同工作。例如,在构建科学应用程序时,C/C++ 程序员可以实现高效的数值算法,而同一项目的科学家可以编写测试和使用这些算法的 Python 程序。科学家不必学习低级编程语言,而 C/C++ 程序员不需要了解所涉及的科学。
如果没有 Python,通常需要编写大量 C/C++ 代码,只是为了提供一个足够灵活的输入机制,以便科学家可以输入程序的数据,在实验设置所要求的各种变体中(例如)。使用 Python,可以使用 Python 在更短的时间内编写更灵活的输入机制,或者 Python 本身可以成为最终的灵活输入机制。作为一个极端的例子,劳伦斯利弗莫尔国家实验室正在使用 Python 最终取代为此目的在内部开发的脚本语言 (BASIS);BASIS 最初是 Fortran 程序的简单输入机制,并逐渐获得脚本语言的许多特性(变量、条件、循环、过程等等),但越来越笨拙。
由于 Python 具有到如此多不同应用领域中如此多不同组件的现有接口,因此 Python 非常适合用于特殊的集成任务。它可以将商业数据库链接到数值计算代码;它可以为网络管理工具添加图形用户界面;它可以从虚拟现实应用程序发送电子邮件。
结论
Python 可以在具有较长预期寿命的大型应用程序的设计中发挥重要的集成作用。它允许对用户需求的变化做出快速响应,这些变化需要调整更高级别的应用程序逻辑,而无需更改基本底层组件。它还允许应用程序快速适应底层组件的变化。
后记:Python 和 Java 集成
一个用 100% Pure Java 编写的新的 Python 实现,称为 JPython,目前正在开发中;alpha 版本可用于评估。JPython 为 Java 提供无缝脚本。它是 Python 语言和标准库的完整实现,增加了对 Java 类领域的直接访问。Java 代码也可以使用 Python 类 -- 例如,这对于回调很重要。
JPython 的主要目的是让 Java 实现 Python 已经为 C 和 C++ 所做的事情:通过提供更动态、更具表现力的替代方案,为程序员提供在开发时间和执行时间之间进行权衡的更多选择。JPython 与 Java 的集成优于 Python 与 C/C++ 的集成:由于 Java 的反射 API,JPython 可以使用任意 Java 类,而无需像 SWIG 这样的包装器生成器的帮助。(C/C++ 代码必须首先通过 Java 本机代码接口提供给 Java;一旦可以从 Java 调用,就可以从 JPython 调用。)