首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python与Cpython

Python与Cpython
EN

Stack Overflow用户
提问于 2013-06-16 07:00:18
回答 10查看 302.9K关注 0票数 614

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

python.org提到CPython是:

Python的“传统”实现(昵称CPython)

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

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

老实说,我不明白这两种解释实际上意味着什么,但我的想法是,如果我使用CPython,这意味着当我运行一个示例python代码时,它会将它编译成C语言,然后像C代码一样执行它

,那么CPython到底是什么?与python相比,它有什么不同?我应该使用CPython而不是CPython,如果是的话,它的优点是什么?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-06-16 07:02:38

那么CPython是什么呢?

CPython是最初的Python实现。这是从Python.org下载的实现。人们称它为CPython,以区别于其他的Python实现,并将语言引擎的实现与Python编程语言本身区分开来。

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

CPython碰巧是用C实现的,这只是一个实现细节,真的。CPython将您的Python代码编译为字节码(透明地),并在评估循环中解释该字节码。

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

那Jython呢等等?

JythonIronPythonPyPy是当前Python编程语言的“其他”实现;它们分别用C#和RPython (Python的一个子集)实现。Jython将Python代码编译为Java字节码,这样Python代码就可以在JVM上运行。IronPython允许您在Microsoft CLR上运行Python。PyPy是用Python的一个子集实现的,它允许您比CPython更快地运行Python代码,这应该会让您大吃一惊。:-)

实际编译为C

因此,CPython做的是而不是,它本身将您的Python代码转换为C。相反,它运行一个解释器循环。有一个项目确实将Python代码转换为C,称为Cython。Cython为Python语言添加了一些扩展,并允许您将代码编译为C扩展,即插入到CPython解释器中的代码。

票数 903
EN

Stack Overflow用户

发布于 2013-06-16 07:07:24

您需要区分语言和实现。Python是一种语言

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

Python是一种语言。CPython是C中Python的实现,Jython是Java的实现,依此类推。

总之:您已经在使用CPython (如果您从这里下载)。

票数 125
EN

Stack Overflow用户

发布于 2016-11-17 23:11:28

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

因此,在我开始解释之前,我愿意先澄清三件事:

  1. python :它是一种语言,它只声明/描述如何向解释器(接受您的代码的程序)传递/表达自己。
  2. Implementation:关于解释器是如何编写的,具体来说,是用什么语言编写的,是如何完成的。
  3. 字节码:它是由程序(通常称为虚拟机)处理的代码,而不是由“真实”计算机(硬件处理器)处理的代码。

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

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

代码语言:javascript
复制
>>> 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行中,我们导入'dis‘模块,该模块可以用于查看由CPython (解释器)生成的中间Python字节码(或者您可以说是Python字节码的反汇编程序)。

注意事项:我从#python通道:https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c获得了这段代码的链接

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

在这里,您可能会问CPython的字节码是否像Jython那样是可移植的,我想不是。在实现中生成的CPython字节码是特定于该解释器的,以使代码的进一步执行变得容易(我还怀疑,这种中间字节码的产生只是为了在许多其他解释器中完成处理的简单性)。

因此,在Jython中,当您编译Python代码时,您将得到Java字节代码,Java字节代码可以在JVM上运行。

类似地,IronPython (用C#语言编写)将您的C#代码编译成公共语言运行时(CLR),这是一种与微软开发的JVM类似的技术。

票数 67
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17130975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档