Python与Cpython

有什么关于Python和CPython (Jython,IronPython)的大惊小怪,我不明白:

python.org提到CPython是:

Python的“传统”实现(绰号CPython)

另一个堆栈溢出问题提到:

CPython是Python的默认字节码解释器,用C语言编写

老实说,我不明白这两个解释实际上是什么意思,但我认为是, 如果我使用CPython这是否意味着当我运行一个示例Python代码,它编译到C语言,然后执行它,就像它是C码

那么CPython究竟是什么,它与Python相比有什么不同,我应该使用CPython而不是Python吗?如果有的话,它有什么优势?

那么CPython是什么?

CPython是原始的 Python实现。 这是从Python.org下载的实现。 人们称之为CPython,以便与其他Python实现区分开来,并区分Python 编程语言本身的语言引擎实现。

后半部分是您的困惑来自何处; 您需要将Python语言与运行 Python代码的语言分开。

CPython 恰好在C中实现。这实际上只是一个实现细节。 CPython将Python代码编译为字节码(透明地)并在评估循环中解释该字节码。

CPython也是第一个实现新的function; Python的语言开发使用CPython作为基础,其他实现如下。

那么Jython呢等等

Jython,IronPython和PyPy是Python编程语言的当前“其他”实现; 这些分别在Java,C#和RPython(Python的子集)中实现。 Jython将你的Python代码编译成Java字节码,所以你的Python代码可以在JVM上运行。 IronPython可以让你在Microsoft CLR上运行Python。 PyPy是在Python的一个子集中实现的,所以你可以比CPython更快地运行Python代码,这应该会让你大开眼界。 🙂

实际编译为C

所以CPython不会把你的Python代码本身转换成C语言。 它运行一个解释器循环。 有一个项目将Python-ish代码转换为C,这就是所谓的Cython 。 Cython为Python语言添加了一些扩展,并允许您将代码编译为C扩展,将代码插入 CPython解释器中。

你需要区分一种语言和一个实现。 Python是一种语言,

根据维基百科的说法,“编程语言是编写程序的符号,它是计算或algorithm的规范”。 这意味着它只是编写代码的规则和语法。 另外我们有一个编程语言实现 ,在大多数情况下,它是实际的解释器或编译器。

Python是一种语言。 CPython是C中的Python的实现.Jython是Java中的实现,等等。

总结一下:你已经在使用CPython(如果你是从这里下载的)。

本文深入解释了Python不同实现之间的区别。 像文章所说:

首先要认识到的是“Python”是一个接口。 有一个Python应该做什么的规范,以及它应该如何performance(就像任何接口一样)。 有多个实现(与任何接口一样)。

第二个要认识到的是“解释”和“编译”是实现的属性,而不是接口。

Python是一种语言:一套可以用来编写程序的规则。 这个语言有几个实现。

不pipe你采取什么样的实施方式,他们都做同样的事情:把你的程序的文本解释出来,执行它的指令。 他们都没有把你的代码编译成C或其他语言。

CPython是最初的实现,用C编写(“CPython”中的“C”部分是指用于编写Python解释器本身的语言。)

Jython是相同的语言(Python),但使用Java实现。

IronPython解释器是用C#编写的。

还有PyPy – 一个用Python编写的Python解释器。 让你select:)

即使我有同样的问题了解CPython,JPython,IronPython,PyPy是如何彼此不同。

所以,在我开始解释之前,我愿意清楚三件事情:

  1. Python :它是一种语言,它只是陈述/描述如何向解释器(接受你的python代码的程序)传达/expression你自己。
  2. 实施 :这完全是关于如何编写口译员的问题,具体来说,是用什么语言写的,最终是怎么写的。
  3. 字节码 :这是由程序处理的代码,通常称为虚拟机,而不是“真实”的计算机,硬件处理器。

CPython是用C语言编写的实现。 它最终生成Python特定的字节码(基于堆栈机器的指令集),然后执行它。 将Python代码转换为字节码的原因是,如果它看起来像机器指令,那么实现解释器会更容易。 但是,在执行Python代码之前不需要生成一些字节码(但CPython确实会生成)。

如果你想看看CPython的字节码,那么你可以。 你可以这样做:

>>> def f(x, y): # line 1 ... print("Hello") # line 2 ... if x: # line 3 ... y += x # line 4 ... print(x, y) # line 5 ... return x+y # line 6 ... # line 7 >>> import dis # line 8 >>> dis.dis(f) # line 9 2 0 LOAD_GLOBAL 0 (print) 2 LOAD_CONST 1 ('Hello') 4 CALL_FUNCTION 1 6 POP_TOP 3 8 LOAD_FAST 0 (x) 10 POP_JUMP_IF_FALSE 20 4 12 LOAD_FAST 1 (y) 14 LOAD_FAST 0 (x) 16 INPLACE_ADD 18 STORE_FAST 1 (y) 5 >> 20 LOAD_GLOBAL 0 (print) 22 LOAD_FAST 0 (x) 24 LOAD_FAST 1 (y) 26 CALL_FUNCTION 2 28 POP_TOP 6 30 LOAD_FAST 0 (x) 32 LOAD_FAST 1 (y) 34 BINARY_ADD 36 RETURN_VALUE 

现在,让我们来看看上面的代码。 第1到第6行是一个函数定义。 在第8行中,我们导入了可用于查看由CPython(解释器)生成的中间Python字节码的“dis”模块(或者您可以说,反汇编Python字节码)。

注意 :我从#python IRC频道获得了此代码的链接: https ://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

接下来是Jython,它是用Java编写的,最终生成Java字节码。 Java字节码在Java运行时环境上运行,这是Java虚拟机(JVM)的一个实现。 如果这是混乱,那么我怀疑你不知道Java是如何工作的。 通俗地说,Java(编译器)语言,而不是编译器代码被Java编译器取代,并输出一个只能使用JRE运行的文件(即Java字节码)。 这样做是为了一旦Java代码被编译,就可以以Java字节代码格式移植到其他机器上,只能由JRE运行。 如果这仍然令人困惑,那么你可能想看看这个网页 。

在这里,你可能会问,CPython的字节码是否像Jython一样可移植,我猜不。 在CPython实现中生成字节码是特定于解释器的,以便于代码的进一步执行 (我也怀疑,这种中间字节码的生成,只是为了便于处理,在许多其他解释器中完成)。

所以,在Jython中,当你编译你的Python代码时,最终会得到可以在JVM上运行的Java字节码。

同样,IronPython(用C#语言编写)将Python代码编译为Common Language Runtime(CLR),这与Microsoft开发的JVM相比是一种类似的技术。

implementation意味着用什么语言来实现Python,而不是如何实现Python代码。 使用CPython的优势在于C运行时的可用性以及与C / C ++的轻松集成。

所以CPython最初是用C实现的。 原来的实现还有其他一些function,使得Python能够使用Java(JYthon)或.NET运行时(IronPython)。

根据您使用的实现,库的可用性可能会有所不同,例如Ctypes在Jython中不可用 ,所以任何使用ctypes的库都不能在Jython中工作。 同样,如果要使用Java类,则不能从CPython直接执行。 您需要粘合剂(JEPP)或需要使用Jython(Python的Java实现)

您应该知道CPython并不真正支持multithreading,因为全局解释器locking 。 它也没有recursion优化机制,还有其他的实现和库试图填充的其他限制。

你应该看看这个页面上的Python维基。

看看这个页面上的代码片段,它会给你一个解释器是什么的好主意。

那么CPython是什么?

CPython是原始的Python实现。 这是从Python.org下载的实现。 人们称之为CPython,以便与其他Python实现区分开来,并区分Python编程语言本身的语言引擎实现。

CPython恰好在C中实现。这实际上只是一个实现细节。 CPython将Python代码编译为字节码(透明地)并在评估循环中解释该字节码。

CPython也是第一个实现新的function; Python的语言开发使用CPython作为基础,其他实现如下。