甚至我也有同样的问题,理解CPython, JPython, IronPython, PyPy是如何彼此不同的。
因此,在我开始解释之前,我愿意澄清三件事:
Python:它是一种语言,它只声明/描述如何向解释器(接受你的Python代码的程序)传达/表达你自己。
实现:解释器是如何编写的,具体来说,是用什么语言编写的,以及它最终会做什么。
字节码:它是由程序处理的代码,通常被称为虚拟机,而不是由“真正的”计算机机器,即硬件处理器。
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行,我们导入'dis'模块,该模块可用于查看由CPython(解释器)生成的中间Python字节码(或者你可以说,Python字节码的反汇编程序)。
注意:我从#python IRC频道:https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c获得了这段代码的链接
And then, there is Jython, which is written in Java and ends up producing Java byte code. The Java byte code runs on Java Runtime Environment, which is an implementation of Java Virtual Machine (JVM). If this is confusing then I suspect that you have no clue how Java works. In layman terms, Java (the language, not the compiler) code is taken by the Java compiler and outputs a file (which is Java byte code) that can be run only using a JRE. This is done so that, once the Java code is compiled then it can be ported to other machines in Java byte code format, which can be only run by JRE. If this is still confusing then you may want to have a look at this web page.
在这里,您可能会问CPython的字节码是否像Jython一样可移植,我怀疑不是。在CPython实现中产生的字节码是特定于该解释器的,以便于进一步执行代码(我还怀疑,这种中间字节码的产生只是为了简化处理,在许多其他解释器中都是如此)。
因此,在Jython中,当您编译Python代码时,您最终会得到Java字节代码,它可以在JVM上运行。
类似地,IronPython(用c#语言编写)将Python代码编译为公共语言运行时(CLR),这是一种类似于JVM的技术,由微软开发。