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

用Python将所有内容粘合在一起

用Python将所有内容粘合在一起

吉多·范罗苏姆
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(微软)在第6届国际Python大会论文集中撰写的《案例研究:商业环境中的Python》,以及UvA和CMU的Alice VR项目。)

Python在网络上拥有强大的影响力。它适用于CGI编程(在所有平台:Unix、Windows和Mac上);它有与所有主要商业数据库的接口。Python有一个与主要互联网和网络协议接口的库,并有HTML解析和生成工具包。当Infoseek规模较小时,Python是其主要的实现语言。至少有一家公司(Digital Creations)正在销售一套使用Python的服务器端工具。最后,Python已被用于实现一个网络浏览器(Grail)。

Python在分布式系统领域也表现良好。它是施乐PARC的ILU(Inter-Language Unification;一个兼容CORBA的分布式对象系统)支持的主要语言之一,并且许多分布式应用程序已使用ILU用Python构建。Python也被澳大利亚昆士兰大学的Hector项目使用。

最后,Python与Windows平台很好地集成。Python程序可以与COM和DCOM服务交互,甚至可以实现新的COM和DCOM服务(这是Visual Basic无法做到的!)。Python还可以作为脚本引擎在微软的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%纯Java编写的新Python实现,名为JPython,目前正在开发中;alpha版本可供评估。JPython为Java提供了无缝脚本编写。它是Python语言和标准库的完整实现,增加了对Java类世界的直接访问。Java代码也可以使用Python类——这对于回调等非常重要。

JPython的主要推动力在于它为Java做了Python已经为C和C++所做的事情:通过提供更动态、更富有表现力的替代方案,为程序员在开发时间与执行时间之间提供更多选择。JPython与Java的集成优于Python与C/C++的集成:由于Java的反射API,JPython可以无需SWIG等包装器生成器的帮助即可使用任意Java类。(C/C++代码必须首先通过Java本地代码接口提供给Java;一旦它可从Java调用,它就可以从JPython调用。)