Python vs Cpython

Python vs Cpython

关于python和cpython(jython,ironpython),有什么好大惊小怪的,我不明白:

python.org提到cpython是:

The"traditional" implementation of Python (nicknamed CPython)

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

CPython is the default byte-code interpreter of Python, which is written in C.

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

那么,cpython到底是什么?与python相比,它有什么不同?我应该在python之上使用cpython吗?如果是,它的优势是什么?


那什么是塞顿?

cpython是最初的python实现。这是从python.org下载的实现。人们称之为cpython,是为了将其与其他稍后的Python实现区分开来,并将语言引擎的实现与Python编程语言本身区分开来。

后一部分是产生混乱的地方;您需要将该语言与运行Python代码的任何语言分开。

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

cpython也是第一个实现新特性的人;语言开发使用cpython作为基础;其他实现也遵循。

Jython等怎么样?

Jython、IrPython和PyPy是Python编程语言的当前"其他"实现;它们分别在爪哇、Cyz和RPython(Python的子集)中实现。Jython编译您的Python代码到Java字节码,因此您的Python代码可以在JVM上运行。Ironpython允许您在Microsoft CLR上运行python。pypy在python中实现,它让您比cpython更快地运行python代码,而cpython会让您大吃一惊。-)

实际编译到C

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


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

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

Python是一种语言。cpython是python在C中的实现,Jython是Java中的实现,等等。

总而言之:你已经在使用cpython了(如果你从这里下载的话)。


本文彻底解释了不同的Python实现之间的区别。正如文章所说:

The first thing to realize is that ‘Python’ is an interface. There’s a
specification of what Python should do and how it should behave (as
with any interface). And there are multiple implementations (as with
any interface).

The second thing to realize is that ‘interpreted’ and ‘compiled’ are
properties of an implementation, not an interface.


甚至我也有同样的问题,理解cpython、jpyton、ironpython和pypy之间的区别。

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

  • python:它是一种语言,它只说明/描述如何向解释器(接受python代码的程序)传递/表达自己。
  • 实现:这一切都是关于解释器是如何被编写的,具体来说,是用什么语言编写的,以及最终要做什么。
  • 字节码:由程序(通常称为虚拟机)处理的代码,而不是由硬件处理器"真正的"计算机机处理的代码。
  • CPython is the implementation, which was
    written in C language. It ends up producing bytecode (stack-machine
    based instruction set) which is Python specific and then executes it.
    The reason to convert Python code to a bytecode is because it's easier to
    implement an interpreter if it looks like machine instructions. But,
    it isn't necessary to produce some bytecode prior to execution of the
    Python code (but CPython does produce).

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    >>> 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 irc channel获得了此代码的链接: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代码时,你会得到Java字节码,它可以在JVM上运行。

    同样,Ironpython(用C语言编写)将您的python代码编译为公共语言运行时(clr),这是一种与微软开发的JVM类似的技术。


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

    不管您采用什么实现,它们都做了几乎相同的事情:获取程序的文本并解释它,执行它的指令。它们都不会将您的代码编译成C或任何其他语言。

    c python是用c编写的原始实现("cpython"中的"c"部分指用于编写python解释器本身的语言)。

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

    Ironpython解释器是用C语言编写的。

    还有pypy——一个用python编写的python解释器。做你的选择:)


    implementation是指用于实现Python的语言,而不是Python代码的实现方式。使用cPython的优点是C运行时间的可用性以及与C/C++的简单集成。

    因此,cpython最初是使用C实现的。原来的实现还有其他的叉子,它使Python可以使用杠杆边缘Java(Jython)或.NET运行时(IrPyPython)。

    根据您使用的实现,库的可用性可能会有所不同,例如,Jython中没有CTypes,所以任何使用CTypes的库都不会在Jython中工作。类似地,如果您想使用Java类,则不能直接从CPython这样做。您要么需要一个胶水(JEPP),要么需要使用Jython(Python的Java实现)


    您应该知道,由于全局解释器锁的存在,cpython并不真正支持多线程。它也没有用于递归的优化机制,并且有许多其他实现和库试图填补的其他限制。

    你应该看看python wiki上的这个页面。

    看看这一页上的代码片段,它会让你对什么是解释器有一个很好的了解。


    程序设计语言实现是用于执行计算机程序的系统。

    编程语言实现有两种一般方法:

      百万千克1口译:口译员将某种语言的程序作为输入,在某种机器上执行用这种语言编写的操作。百万千克1百万千克1编译:编译器将某一语言的程序作为输入,并将该程序翻译成另一种语言,该语言可作为另一个解释器或另一个编译器的输入。百万千克1

    python是guido van rossum在1991年创建的一种解释性高级编程语言。

    c python是Python计算语言的参考版本,它也用guido van rossum创建的C语言编写。

    其他python实现列表

    来源


    当您希望将它与其他选项进行对比(否则只使用简单的"python")。这个名称来源于它是在可移植的ANSI C language code中编码的。这是从http://www.python.org获取的python,使用activepython和热情的发行版,并且在大多数Linux和MacOSX机器上都有自动的。如果您在您的计算机上找到了一个预安装的python版本,它可能是CPython,除非您的公司或组织正在更专业化地使用python方法。

    Unless you want to script Java or .NET applications with Python or find the benefits
    of Stackless or PyPy compelling, you probably want to use the standard CPython system.
    Because it is the reference implementation of the language, it tends to run the
    fastest, be the most complete, and be more up-to-date and robust than the alternative
    systems.


    我最初的经历使我暂时以下印象。我喜欢两者的特点。

    python与c编程语言:

    C——数据声明和初始化不好。--其结构化形式中的细节使得逻辑在没有装饰的情况下,它的功能更容易执行无关的评论或过于描述性的名字。

    python——简单快速的数据声明和初始化。——被调用函数结构简单使对其应用程序和Python中的逻辑方向。这就需要过度标记变量及其例程时的措辞。python更适合安装,而c在后续工作中更出色。和应用程序。