¿Qué es CPython?

Mejor respuesta

CPython es la implementación de referencia de Python escrita en el lenguaje de programación C. Hay una serie de otras implementaciones, incluso algunas otras en C. Pero CPython es la más utilizada y se compara la de todas las demás.

Python es una especificación de lenguaje. Si uno se refiere a los detalles de la implementación y especifica una implementación en particular, entonces la suposición razonable será que se refiere a la versión de CPython.

Puede buscar implementaciones, pero es probable que los resultados sean algo confusos. No todas las implementaciones están completas, ni todas se ejecutan en sistemas «normales» o en entornos de ejecución de programas convencionales (como una ventana de terminal o una consola de texto).

Por ejemplo MicroPython es un derivado reducido de CPython que está dirigido a microcontroladores. Jython está escrito en Java y se ejecuta en la JVM (máquina virtual de Java) e incluye funciones para importar Java nativo e interoperar con él (incluida la introspección). IronPython está escrito en C # de Microsoft y está diseñado para ejecutarse dentro de CLR (Common Language Runtime) del marco .NET. PyPy es una versión de Python que está escrita principalmente en Python, pero envuelta alrededor de un núcleo que implementa un subconjunto restringido del lenguaje y proporciona JIT (Just-In- Time dymanic / runtime compilación). (Ese subconjunto se llama RPython y está destinado a admitir más que solo Python).

¿Ves lo que quiero decir con confundir?

Hay al menos dos implementaciones diferentes de Python que están escritas en JavaScript y diseñadas para ejecutarse desde un navegador normal (en DOM… o Documenr Modelo de objetos … entorno). Estos son Brython y Skulpt . Además, hay varios «transpilers» diferentes o compiladores de Python a Javascript, incluidos Transcrypt, y pyjs a. > – (formalmente Pajamas) y quizás incluso RapydScript (aunque eso es más como un híbrido de Python con JS).

Como puede ver , si profundiza lo suficiente en el tema, será cada vez más difícil clasificar diferentes proyectos y herramientas como «implementaciones».

Por ejemplo, hay Cython que es una herramienta para tomar código similar a Python especialmente anotado y compilarlo en módulos cargables (binarios / nativos) que se pueden importar a Python y usar como cualquier otra extensión compilada de forma nativa para el intérprete. En realidad, no se considera una «implementación» de Python, sino una herramienta para optimizar fragmentos seleccionados de código Python en extensiones binarias para el intérprete CPython. (Si estuviera trabajando en Jython, podría reescribir partes de su código en Java y usar las funciones de interoperación e introspección de Jython para usar ese código. Solo a modo de analogía).

También hay Numba , que es una herramienta para compilar de forma transparente un subconjunto de Python y código NumPy en LLVM e integrando el soporte de tiempo de ejecución LLVM en el motor en ejecución del interpretador de Python. Esto se describe más como un JIT que el paradigma distintivo de módulo / extensión de Cython. Aún así, es más una herramienta que una «implementación» de todo el lenguaje.

Pero luego, si miras Nuitka , ves un ambicioso proyecto para compilar programas completos de Python. Así que podría ser más una implementación.

Otro proyecto (que parece ser uno en el que Guido van Rossum, el creador de Python, ha estado trabajando) es mypy : Python con escritura estática opcional y alguna inferencia de tipo local. Esta no sería una nueva implementación. Parece ser una especie de interfaz que procesa Python (con anotaciones de tipo opcionales) y devuelve el Python (sin anotaciones) al motor de tiempo de ejecución de CPython (intérprete).

Si desea sumergirse en aún más implementaciones y los enlaces miren: PythonImplementations – Python Wiki .

Tenga en cuenta que he tratado muchos de ellos aquí y he tratado de explicar cómo se relacionan hasta tal punto. Esa página wiki es más una bolsa de sorpresas, con menos exposición y algunos enlaces a proyectos muertos o no mantenidos.

Respuesta

Incluso yo tenía el mismo problema para entender cómo son CPython, JPython , IronPython, PyPy son diferentes entre sí.

Por lo tanto, estoy dispuesto a aclarar tres cosas antes de comenzar a explicar:

  1. Python : Es un lenguaje, solo establece / describe cómo transmitirse / expresarse al intérprete (el programa que acepta su código Python).
  2. Implementación : se trata de cómo se escribió el intérprete, específicamente, en qué idioma y lo que acaba haciendo .
  3. Bytecode : es el código que es procesado por 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 código de bytes (conjunto de instrucciones basado en la 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 se ven como instrucciones de máquina. Pero no es necesario producir algún código de bytes antes de la ejecución (pero CPython sí lo produce).

Si desea ver el código de bytes de CPython, puede hacerlo. Así es como puede:

>>> 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)

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 puede decir, desensamblador para el bytecode de Python) que es generado por CPython (intérprete).

NOTA : Obtuve el enlace a este código del canal de IRC #python: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Y luego, está Jython, que está escrito en Java y termina produciendo código de bytes de 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 tiene idea de cómo funciona Java. En términos simples, el código Java (el lenguaje, no el compilador) lo toma el compilador de Java y genera un archivo (que es un código de bytes de Java) que solo se puede ejecutar usando un JRE. Esto se hace para que, una vez compilado el código Java, pueda ser portado a otras máquinas en formato de código de bytes Java, que solo puede ser ejecutado por JRE. Si aún le resulta confuso, le recomendamos que eche un vistazo a esta página web .

Aquí, puede preguntar si el CPython » s bytecode es portátil como Jython, sospecho que no. El bytecode producido en la implementación de CPython era específico para ese intérprete para facilitar la ejecución posterior del código (también sospecha que, tal producción de bytecode intermedio, solo por la facilidad de procesamiento que se realiza en muchos otros intérpretes). Si ahora se pregunta cómo es fácil ejecutar el bytecode como se muestra arriba en el código (después de la línea 9 hasta el final ), entonces, piense en esto. Tenemos una pila (estructura de datos) y cada línea en el código de bytes realiza alguna operación de pila modificando la pila en consecuencia. CPython (el intérprete) utiliza esta pila modificada para producir la salida final del código .

Entonces, en Jython, cuando compila su código Python, termina con un código de bytes de Java, que se puede ejecutar en una JVM.

De manera similar, IronPyt hon (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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *