上面提到的那些技术经常被提起和引用,它们的使用目的和场景是完全不一样的(至少,它们的操作方式是完全不一样的)
自从我使用Python工作以来,我已经用过了各种各样的。* ython工具了。但是直到最近我才花时间去理解到底它们是干嘛的,它们是怎样工作的,为什么它们是不可或缺的。
在这篇文章里面,我会介绍各种Python的实现,最后以对PyPy的介绍结尾,因为我个人认为它是Python的未来。
所有的都从理解什么是“Python"开始。
如果你对机器码,虚拟机之类的很熟了,你可以跳过开头,直接从“即时编译:PyPy和它的未来“这部分开始看起。
Python是解释型的还是编译型的?
这是个Python新人都会迷惑的问题。
首先需要明了的是Python只是一个接口。有一个关于Python应该做什么以及怎么做的具体说明(就像其他任何接口一样),并且对应的有很多具体的实现(也像其他接口一样)。
其次需要知道的是“解释型”和“编译型”是具体实现的特性,而不是接口的特性。
所以,这个问题本身就没有组织好。
Python是解释型还是编译型的?这个问题真的没有组织好。
对使用最广泛的实现(CPython的:用C实现的,通常简单的说成Python,若你不知道我所说的这些,那很肯能你在使用的就是CPython的)而言,这个问题的答案是:解释型,但带有一些编译型特征.CPython把Python源码编译*成字节码,之后再解释这些字节码,执行之。
*注意:这个编译不是通常意义上的编译。通常我们说的编译,是指把高级语言代码转换成机器码。但这里的编译实际上是另一种意义上的编译。(译者,这句话不是很懂,原文是它算得上是一种“编译”,不知作何解,求教各位读者)。
再详细看下上面的答案吧,这有助于我们理解本文中后面会讲到的几个概念。
字节码与机器码
了解字节码和机器码(或者本机代码)的区别是很重要的,最好的办法或许是看看例子:
C代码被编译成机器码,将在处理器上直接执行。每一条指令控制CPU工作。
Java代码被编译成字节码,将在Java虚拟机(JVM)这个抽象的计算机上执行。每一条指令由JVM处理,JVM同计算机本身之间交互。
简而言之:机器码快的多,但字节码更易迁移,也更安全。
机器码随机器的变化而变化,但字节码在所有的机器上都是一样的。有人可能会认为机器码是对特定环境优化了的。
回,到CPython工具链的执行过程如下:
CPython编译你的Python源代码,生成字节码。
字节码随后在CPython的虚拟机上执行。
初学者常常因为看到.pyc文件而假设Python是编译型的。这也有一些合理性:.pyc文件正式之后要解释的字节码文件,所以,你若之前运行过你的Python代码,生成了.pyc文件,再次运行时就要快得多,因为不需要再次编译生成字节码了。
可选的虚拟机:Jython, IronPython等
正如我之前所述,Python有很多实现。前面也提,到CPython是最通用的。这是一个用C实现的,被认为是“默认”的实现。
但其他的呢?其中最显赫的之一就是Jython,一个用Java实现的采用了JVM的实现.CPython生成在CPython的虚拟机上运行的字节码,而Jython生成在JVM上运行的Java字节码(这同编译Java程序生成Java字节码的过程是一样的)。