困扰多年的问题,Python到底是语言,还是工具,哈佛教授完美诠释

  

困扰多年的问题,Python到底是语言,还是工具,哈佛教授完美诠释“> </p>
  <p>然而,这是一句非常模棱两可的话。这里的“Python   

上面提到的那些技术经常被提起和引用,它们的使用目的和场景是完全不一样的(至少,它们的操作方式是完全不一样的)

  

自从我使用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字节码的过程是一样的)。

  

困扰多年的问题,Python到底是语言,还是工具,哈佛教授完美诠释“> <br/>”为啥你要用其他的实现吗?”,你可能会如此发问。好吧,对开发者而言,不同的实现对不同的技术难题的支持程度不一样。</p>
  <p> CPython中很容易为你的Python代码写C扩展,因为最终都是由C解释器执行的。另一方面,Jython则使得和其他java程序共同工作很容易:无需其他工作,你就可导入任何java类,在你的Jython程序中使用其他java类。(题外话,若你没有认真思考,这一段会很难。此时我们已经在讨论把不同语言的代码混在一起,并编译成同一程序。(Rostin提出混合Fortran和C代码编程已经有一段时间了,所以,这并不新鲜,但仍然很酷)。)<h2 class=困扰多年的问题,Python到底是语言,还是工具,哈佛教授完美诠释