Python是出类拔萃的html 然而,这是一句很是模棱两可的话。这里的"Python"到底指的是什么? 是Python的抽象接口吗?是Python的通用实现CPython吗(不要把CPython跟Cython搞混了)?亦或者指的彻底是其余的东西呢?可能我另外指的是Jython,或者IronPython,或者是PyPy。也或者转而谈论的又是RPython或者RubyPython(这二者是彻底不一样的东西)。java 上面提到的那些技术常常被提起和引用, 它们的使用目的和场景是彻底不同的(至少,它们的操做方式是彻底不同的)python |
自从我使用Python工做以来,我已经用过了各类各样的.*ython工具了。可是直到最近我才花时间去理解到底它们是干吗的,它们是怎样工做的,为何它们是不可或缺的。web 在这篇文章里面,我会介绍各类Python的实现,最后以对PyPy的介绍结尾, 由于我我的认为它是Python的将来。数据库 全部的都从理解什么是"Python"开始。编程 若是你对机器码,虚拟机之类的很熟了,你能够跳过开头,直接从 "即时编译: PyPy和它的将来" 这部分开始看起。浏览器 |
Python是解释型的仍是编译型的?这是个Python新人都会迷惑的问题。缓存 首先须要明了的是Python只是一个接口。有一个关于Python应该作什么以及怎么作的具体说明(就像其余任何接口同样 ),而且对应的有不少具体的实现(也像其余接口同样)。安全 其次须要知道的是“解释型”和“编译型”是具体实现的特性,而不是接口的特性。ruby 因此,这个问题自己就没有组织好。 Python是解释型仍是编译型的?这个问题真的没有组织好。 |
对使用最普遍的实现(CPython:用C实现的,一般简单的说成Python,若你不知道我所说的这些,那很肯能你在使用的就是CPython)而言,这个问题的答案是:解释型,但带有一些编译型特征。CPython把Python源码编译*成字节码,以后再解释这些字节码,执行之。 *注意:这个编译不是一般意义上的编译。一般咱们说的编译,是指把高级语言代码转换成机器码。但这里的编译其实是另外一种意义上的编译。(译者,这句话不是很懂,原文是it is a ‘compilation’ of sorts,不知做何解,求教各位读者。) 再详细看下上面的答案吧,这有助于咱们理解本文中后面会讲到的几个概念。 |
字节码 vs. 机器码了解字节码和机器码(或者native code)的区别是很重要的,最好的办法或许是看看例子:
简而言之:机器码快的多,但字节码更易迁移,也更安全。 |
机器码随机器的变化而变化,但字节码在全部的机器上都是同样的。有人可能会认为机器码是对特定环境优化了的。
字节码随后在CPython虚拟机上执行。 初学者经常由于看到.pyc文件而假设Python是编译型的。这也有一些合理性:.pyc文件正式以后要解释的字节码文件。因此,你若以前运行过你的Python代码,生成了.pyc文件,再次运行时就要快得多,由于不须要再次编译生成字节码了。 |
可选的虚拟机:Jython,IronPython等正如我以前所述,Python有不少实现。前面也提到,CPython是最通用的。这是一个用C实现的,被认为是”默认“的实现。 但其余的呢?其中最显赫的之一就是Jython,一个用Java实现的采用了JVM的实现。CPython生成在CPython虚拟机上运行的字节码,而Jython生成在JVM上运行的java字节码(这同编译Java程序生成java字节码的过程是同样的)。 ”为啥你要用其余的实现?”,你可能会如此发问。好吧,对开发者而言,不一样的实现对不一样的技术难题的支持程度不同。 |
CPython中很容易为你的Python代码写C扩展,由于最终都是由C解释器执行的。另外一方面,Jython则使得和其余java程序共同工做很容易:无需其余工做,你就可导入任何Java类,在你的Jython程序中使用其余Java类。(题外话,若你没有认真思考,这一段会很难。此时咱们已经在讨论把不一样语言的代码混在一块儿,并编译成同一程序。(Rostin 提出混合Fortran和C代码编程已经有一段时间了。因此,这并不新鲜,但仍然很酷。)) 下面是一个例子,一段合法的Jython代码:
|
你可能会说,Jython:Java::IronPython:C#。它们各自运行在相同的虚拟机上,你能从你的IronPython中导入C#的类,从你写的Jython代码中带入Java类,等等 你彻底能够不用任何非CPython的实现就能完成你手上的任何工做。可是使用这些技术也是有不少的好处的,大部分取决于你如今所使用的技术栈。 你使用了不少基于JVM的语言?Jython就是为你准备的。使用的都是.NET世界的语言?那么你应该试试IronPython了(或许你已经在用了) 顺便说一下(尽管这不是使用不一样的实现的理由),注意Python的各类实如今对待你的Python源码的时候所作的处理方式是彻底不同的。而后这些差别是很小的,因为这些实现都在不停的发展改进中,随着时间的推移,这些差别会慢慢融合和兼容。好比,IronPython默认状况下使用Unicode字符串,可是在2.x版本的CPython中默认是ASCII字符串(若是使用了非ASCII字符串,会抛出一个UnicodeEncodeError错误),可是在3.x版本里面CPythong已经默认支持Unicode字符串了。 |
即时编译: PyPy和它的将来咱们已经有了一个使用C写的Python实现,一个用Java写的,一个用C#写的。接下来就是:用Python写的Python实现(有心人可能会注意这句话有点问题,是个死循环,^_^) 接下来咱们看下什么地方容易搞混淆。首先,咱们讨论下即时编译器JIT JIT: 为何会有这个?它的原理是什么? 你们都知道本地机器码的速度比字节码的速度快不少。那么,若是咱们能将一些字节码直接编译成本地机器码再去运行它会怎样呢?咱们必须花费一些代价(好比时间)在编译字节码到本地机器码上,若是最终的运行时间更快,那么这个代价就是值得的。这就是JIT编译器的动机,一种混合了解释器和编译器好处的技术。简单来说,JIT就是想经过编译技术提高脚本解释器系统的速度。 |
例如, 被JIT(及时编译)采用的通用方法:
这是关于PyPy的用处: 把JIT代入Python语言 (参看前面成果的附录).固然也有其余目的: PyPy 目标是成为一个跨平台,轻内存,支持stackless(译注:stackless为python提供微线程扩展,具备并发特性)。 可是及时编译才是它真正的卖点。 基于一系列时间测试的平均, 听说性能上能提升6.27倍. 停一下, 看看下面这个由PyPy Speed Center提供的图表: |
PyPy is Hard to UnderstandPyPy具备巨大的潜力,在这一点上,它与CPython高度兼容因此它能运行Flask,Django等等)。 但关于PyPy有许多困惑 (例如,荒谬的建议创造一种PyPyPy…语言). 按个人观点,那主要是由于PyPy其实是两种东西: 一种用RPython (非Python (我以前撒谎了))编写的Python解释器。 RPython是Python的子集,具备静态类型。在Python里,最难严格推论类型 (为何这么困难,考虑下下面的事实:
只为清晰,我将引用这些PyPy(1)和PyPy(2)。 |
为何你在同一层面下同时须要这二者? 你能够这样想一下:PyPy(1)是一个用RPython写的解释器,所以它能加载用户的Python代码并将它编译成字节码。可是这个用RPython写的解释器自己要能运行,就必需要被另一个Python实现去解释,对不? 咱们能够直接用CPython去运行这个解释器。可是这个还不够快 取而代之,咱们使用了PyPy(2)(参考 RPython的工具链)去编译这个PyPy的解释器,生成其余平台(好比C, JVM或CLI)代码在咱们的机器上运行,而且还加入了JIT特性。这个很神奇:PyPy动态的将JIT加入一个解释器,生成它本身编译器!(这就是核心原理:咱们在编译一个解释器,并同时加入了另一个单独的编译器到里面去)。 |
最终结果就是一个融合了JIT优化特性的单独的可执行文件,用来解释执行咱们的Python源代码。这就是咱们以前想要达到的效果。这么讲可能比较拗口,下面这张图可能会解释的比较清楚点: 再次重申下,PyPy真正难得之处在于咱们能够利用RPython实现各类不一样的Python解释器,不用去关心JIT(除了一些小的提示外)。PyPy到时候会利用RPython工具链/PyPy(2)为咱们自动实现JIT |
事实上,咱们还能够更抽象一点,咱们理论上能够写一个适用于任何语言的解释器,而后将它扔给PyPy,最后得到那种语言的JIT。缘由是PyPy仅仅关心的是优化解释器,而不会去关心这个解释器到底解释的是什么语言。 理论上你本身能够写一个适用于任何语言的解释器,而后将这个解释器传给PyPy,最后你获得这个语言的一个JIT。一个简单的题外话,我这里想提一下,JIT本事是至关棒的。它使用了一种叫作跟踪的技术,按照下面的步骤执行:
想获取更多信息,能够参考这篇文章,易于理解,而且很是有趣 最后收尾:咱们使用PyPy的RPython-to-C(或者其余目标平台)编译器去编译PyPy的基于RPython实现的解释器。 |
结尾为何它如此的伟大?为何这个疯狂的想法值得咱们去追求?我想Alex Gaynor已经在他的博客上面作了很好的解释了:“[PyPy就是将来] 由于[它]提供了更快的速度,更大的灵活性,而且对于Python的成长也提供了一个更好的平台” 总之:
|
附录: 其余一些你可能已经听过的名字
|
其它翻译版本(1) |
语言绑定
JavaScript 框架
|
出处:http://www.oschina.net/translate/why-are-there-so-many-pythons