设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

为什么有这么多 Python?

2013-9-29 09:56| 发布者: 红黑魂| 查看: 1576| 评论: 0|来自: 开源中国编译

摘要: Python是出类拔萃的然而,这是一句非常模棱两可的话。这里的"Python"到底指的是什么? 是Python的抽象接口吗?是Python的通用实现CPython吗(不要把CPython跟Cython搞混了)?亦或者指的完全是其他的东西呢 ...

PyPy is Hard to Understand

PyPy具有巨大的潜力,在这一点上,它与CPython高度兼容所以它能运行Flask,Django等等)。

但关于PyPy有许多困惑 (例如,荒谬的建议创造一种PyPyPy…语言). 按我的观点,那主要是因为PyPy实际上

是两种东西:一种用RPython (非Python (我之前撒谎了))编写的Python解释器。 RPython是Python的子

集,具有静态类型。在Python里,最难严格推论类型 (为什么这么困难,考虑下下面的事实:

1= random.choice([1"foo"])
  1. 将是合法的Python代码 (归功于 Ademan). x的类型是什么? 我们怎么推出变量的类型,当类型还没有

    被严格实施?)通过RPython,你牺牲了一些灵活性, 但使得内存管理和优化大大的容易。

  2. 一个编译RPython代码为了各种目标和加入及时编译的编译器。 默认平台是C,也就是从RPython到C

    编译器,但你也可以瞄准JVM或者其他。

只为清晰,我将引用这些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本事是相当棒的。它使用了一种叫做跟踪的技术,

按照下面的步骤执行:

  1. 执行解释器并解释执行所有代码(还没有加入JIT特性)
  2. 对被解释过的代码做一些记录
  3. 确认你已经执行过的操
  4. 将确认过的这些代码编译成本地机器码

想获取更多信息,可以参考这篇文章,易于理解,并且非常有趣

最后收尾:我们使用PyPy的RPython-to-C(或者其他目标平台)编译器去编译PyPy的基于RPython实现的解释器。


结尾

为什么它如此的伟大?为什么这个疯狂的想法值得我们去追求?我想Alex Gaynor已经在他的博客上面做了

很好的解释了:“[PyPy就是未来] 因为[它]提供了更快的速度,更大的灵活性,并且对于Python的成长也提

供了一个更好的平台”

总之:

  • 它很快,因为它将源代码编译成了本地机器码(使用了JIT)
  • 它很灵活,因为除了极少数的额外工作需要做外,它就能将JIT加入你的解释器中
  • 它还是很灵活,因为你能使用RPython实现你的解释器,这个比其他的(比如C语言)更易扩展。事实上,它是如
  • 此的简单,这里有一篇教程教你如何实现你自己的解释器


附录: 其他一些你可能已经听过的名字

  • Python 3000 (Py3k): Python 3.0的一个别名,2008年释出的一个主要版本,但是它并不向后兼容.。

    Py3k团队预测这个版本被完全采用可能需要5年时间.。现在绝大多数(注意:这个是江湖传闻)Python开

    发者继续在使用2.x版本,不过现在人们越来越多的对Py3k开始关心了。

  • Cython: 一个Python的超集,能够调用C语言的函数
    • 目标: 允许你为你的Python代码写C扩展
    • 允许你为你的Python代码加入静态类型,运行编译并达到接近C语言的性能。
    • 这个跟PyPy比较类似,但是不是一样的。使用这个的时候,在提交给编译器之前必须用户代码里面写好
    • 这些特殊代码。如果使用PyPy的话,你写的还是普通形式的Python代码,编译器会帮你处理一切优化的工作。
  • Numba: 将JIT加入到被注解的Python代码中,简单来讲就是,你给它一些提示,它就会优化加速你这段代码。

    Numba是Anaconda发行版(一系列数据分析和管理的软件包)的一部分。

  • IPython: 跟我们讨论过的其他版本完全不一样。这是一个Python的计算环境。为一些GUI工具集和浏览器体验

    等提供支持。

  • Psyco: 一个Python的扩展模块,也是早先的一种Python JIT的成果。 然而,它已经被标注为“停止维
  • 护和死亡”了。事实上,Psyco的首席开发者Armin Rigo现在在为PyPy工作。


语言绑定

  • RubyPython: Ruby和Python虚拟机的一座桥梁。允许你在你的Ruby代码中嵌入Python代码。你定义

    Python的起始位置,然后RubyPython负责在不同VM直接传递整理数据。

  • PyObjc: Python和Objective-C语言直接的桥梁。实际上,这意味着你能在你的Python代码中使用

    Objective-C的库(包括创建一个OS X应用程序所需要的一切),反过来在Objective-C里面也可以使用

    Python的模块。这样的话,CPython用C语言来实现就很方便了,因为C语言是Objective-C的一个子集。

  • PyQt: 同PyObjc帮你绑定OS X GUI组件类似,PyQt帮你绑定Qt应用程序框架,让你可以创建丰富的图

    形界面,访问关系数据库等等。另外的一个旨在帮你简化从Python到另外的框架的工具。 

JavaScript 框架

  • pyjs (Pyjamas): Python中一个创建web和桌面应用程序的框架。包含一个Python-to-JavaScript的编

    译器和其他一些工具。

  • Brython: 一个使用JavaScript语言写的Python虚拟机,可以让Py2k 代码在浏览器中执行。


英文原文:Why Are There So Many Pythons?

参与翻译(4人)

酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部