阅读更多
Jython, IronPython, PyPy。这几个项目相信玩过 python 的兄弟都不会陌生。Jython 好像是没有继续下去了,就不多说了。IronPython 和 PyPy 两个项目现在都正是如日中天的时候,都有许多让人兴奋的进展!
先来看看 IronPython 吧。在讨论之前,我们不妨先下这么一个定义,对于 python 来说,通常说让它支持某个平台,不光是要让 python 程序能够在该平台上运行,更重要的是 python 程序要能与这个平台进行互操作!
我们说 python 是跨平台的,是因为 CPython 不光能让 python 程序运行在不同的操作系统上,更可以通过一定的接口与 c 语言进行互操作,其实也就是和操作系统平台进行互操作了。
但是如果把 .net、java 两个也看作是平台的话,就更有意思了。.net 和 java 是两个特殊的平台,它们构建于操作系统平台之上,而且它们本身已经拥有了一些比较高级的抽象,比如OO、自动内存管理等。固然,在它们上面实现 python 的时候,某些问题可以(比如内存管理)不用再考虑了,但是解决 python 与这个两个平台之间互操作的问题仍然艰巨。问题的关键还是在于静态与动态的区别,或者说编译期与运行期之间的区别。就拿对 OO 的实现来说吧,静态语言和动态语言就大不一样,比如说静态语言中对象的属性在运行时其实只是编译器算出来的相对对象基地址的一个偏移,取属性值的过程只是个对地址做加法的过程;而 python 的属性却是实打实的 key:value ,名字和值都存在内存中,取属性值的过程实际上是个查哈希表的过程。如何才能让这两种 OO 系统之间的对象之间可以互相使用,甚至进行组合、继承?另外这两个平台本身也拥有一些自己独特的特性,比如 元数据、.net的 attribute、delegate 等,如何让 python 对象拥有这些特征?这些问题就成为 Jython 和 IronPython 要解决的关键问题所在了。
适配!也许你已经联想到这个设计模式了,不过这两个字的答案还是太抽象,等于没说,如何适配才是问题的关键所在。IronPython 在这方面似乎已经做得很不错了,许多 .NET 平台上组件、框架(比如 asp.net)已经可以为 IronPython 所用了。 木野狐 同学已经写了好几篇分析 IronPython 实现的文章,看完后受益匪浅,也期待他更多的分析。从他的文章中可以看出,通过让 .net 对象实现一些由 IronPython 定义的接口便可以让 .net 的对象拥有一些 python 对象的动态特性。其实现在很想知道在 IronPython 中,一个 python 对象究竟被翻译成了一个什么样的 .NET 对象,有时间再研究研究。
再说说 PyPy 吧。今天逛到 pypy 首页的时候发现首页不知何时变了,变成了对项目的一个描述。可以感觉到,PyPy 已经比以前成熟很多了,至少现在对于“什么是PyPy”这个问题有了个明确的答案:“Researching a higly flexible and modular language platform and implementing it by leveraging the Open Source Python Language and Community” 。这是个实验性很强,也是野心很大的项目。我的理解是一套通用的“面向方面”的动态语言转换机制(其实现在只是 python 向其它语言的转换,不过许多东西对于其它语言也是通用的)。
它是从对 python 语言的一个“抽象”的实现开始的,其实这也就是它的名字的由来:用 python 编写的 python 实现。虽然看起来没有多大意义,其实这只是一个开始。为什么说它是个“抽象”的实现呢,因为在这个实现中把 python 实现中的许多“ 方面”都抽象出来了,比如 对象模型、 自动内存管理、 并发模型 等,单就这个实现本身它只是个空壳(从 pypy的源代码也看得出来,非常少),而把这些“方面”一加上,它就是个有用的 python 实现了!而这些“方面”或者是可选的,或者是可替换的,这让这个 python 实现拥有了 巨大的灵活性!
然后它通过实现一整套 语言转换的流程成了一个python到其它语言的转换工具!其中有一个 demo 演示了一个神经网络的程序在转换成 c 后执行速度提高了十几倍!目前可用的转换后端已经有: c、 LLVM、 .net、 Smalltalk、 ECMAScript、 Common Lisp !
对于研究人员来说 PyPy 自然是一个不可多得的实验平台。而随着 pypy 的成熟,它对于 python 程序员的价值也会越来越大,我觉得最重要的一点就是对 python 程序进行优化,比如向 c 语言的转换,为 python 虚拟机提供 JIT ,还有在 转换中进行的优化等;其次就是 stackless ;另外 向 javascript 的转换也是很有用(也是很好用)的。
最后还有重要的一点不得不提的就是,所有这些全部都是用纯 python 编写而成!
更多的细节也不多说了 (再说下去就要露馅了 ;-) PyPy 涉及的范围广,要研究透彻还得花一番功夫,只能是期待它结出累累硕果的那一天早日来到吧,呵呵。