Incluso tuve el mismo problema al entender cómo CPython, JPython, IronPython, PyPy son diferentes entre sí.
Entonces, estoy dispuesto a aclarar tres cosas antes de comenzar a explicar:
- Python : es un lenguaje, solo establece / describe cómo transmitir / expresarse al intérprete (el programa que acepta su código de Python).
- Implementación : Se trata de cómo se escribió el intérprete, específicamente, en qué idioma y qué termina haciendo .
- Bytecode : es el código que procesa un programa, generalmente denominado máquina virtual, en lugar de la máquina de computadora "real", el procesador de hardware.
CPython es la implementación, que fue escrita en lenguaje C. Termina produciendo bytecode (conjunto de instrucciones basado en máquina de pila) que es específico de Python y luego lo ejecuta. La razón para convertir el código de Python en un código de bytes es porque es más fácil implementar un intérprete si parece instrucciones de máquina. Pero, no es necesario producir algún bytecode antes de la ejecución del código Python (pero CPython produce).
Si desea ver el código de bytes de CPython, puede hacerlo. Así es como puedes:
>>> 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
Ahora, echemos un vistazo al código anterior. Las líneas 1 a 6 son una definición de función. En la línea 8, importamos el módulo 'dis' que se puede usar para ver el bytecode intermedio de Python (o se puede decir, desensamblador para el bytecode de Python) generado por CPython (intérprete).
NOTA : Obtuve el enlace a este código del canal #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
Y luego, está Jython, que está escrito en Java y termina produciendo código de bytes Java. El código de bytes de Java se ejecuta en Java Runtime Environment, que es una implementación de Java Virtual Machine (JVM). Si esto es confuso, sospecho que no tienes idea de cómo funciona Java. En términos simples, el compilador de Java toma el código Java (el lenguaje, no el compilador) y genera un archivo (que es el código de bytes de Java) que solo se puede ejecutar utilizando un JRE. Esto se hace para que, una vez que se compila el código Java, se pueda portar a otras máquinas en formato de código de bytes Java, que solo puede ejecutar JRE. Si esto sigue siendo confuso, es posible que desee echar un vistazo a esta página web .
Aquí, puede preguntar si el código de bytes de CPython es portátil como Jython, sospecho que no. El bytecode producido en la implementación de CPython era específico de ese intérprete para facilitar la ejecución posterior del código (también sospecho que, tal producción de bytecode intermedio, solo por la facilidad de procesamiento en muchos otros intérpretes).
Entonces, en Jython, cuando compila su código Python, termina con un código de bytes Java, que puede ejecutarse en una JVM.
Del mismo modo, IronPython (escrito en lenguaje C #) compila su código Python en Common Language Runtime (CLR), que es una tecnología similar en comparación con JVM, desarrollada por Microsoft.