¿Python se interpreta, se compila o ambas cosas?
Según tengo entendido:
Un lenguaje interpretado es un lenguaje de alto nivel ejecutado por un intérprete (un programa que convierte el lenguaje de alto nivel en código de máquina y luego lo ejecuta) sobre la marcha; procesa el programa poco a poco.
Un lenguaje compilado es un lenguaje de alto nivel cuyo código se convierte primero a código de máquina mediante un compilador (un programa que convierte el lenguaje de alto nivel en código de máquina) y luego lo ejecuta un ejecutor (otro programa para ejecutar el código).
Corrígeme si mis definiciones son incorrectas.
Ahora, volviendo a Python, estoy un poco confundido acerca de esto. En todas partes se aprende que Python es un lenguaje interpretado, pero se interpreta en algún código intermedio (como código de bytes o IL) y no en código de máquina. Entonces, ¿qué programa ejecuta el código IM? Ayúdenme a comprender cómo se maneja y ejecuta un script de Python.
En primer lugar, interpretado/compilado no es una propiedad del lenguaje sino una propiedad de la implementación. Para la mayoría de los idiomas, la mayoría, si no todas, las implementaciones caen en una categoría, por lo que se podrían ahorrar algunas palabras diciendo que el idioma también se interpreta/compila, pero sigue siendo una distinción importante, porque ayuda a la comprensión y porque hay bastantes idiomas. con implementaciones utilizables de ambos tipos (principalmente en el ámbito de los lenguajes funcionales, ver Haskell y ML). Además, existen intérpretes de C y proyectos que intentan compilar un subconjunto de Python en código C o C++ (y posteriormente en código máquina).
En segundo lugar, la compilación no se limita a la compilación anticipada en código de máquina nativo. Un compilador es, en términos más generales, un programa que convierte un programa en un lenguaje de programación en un programa en otro lenguaje de programación (podría decirse que incluso puede tener un compilador con el mismo lenguaje de entrada y salida si se aplican transformaciones significativas). Y los compiladores JIT compilan en código de máquina nativo en tiempo de ejecución , lo que puede brindar una velocidad muy cercana o incluso mejor que la compilación previa (según el punto de referencia y la calidad de las implementaciones comparadas).
Pero para dejar de ser quisquilloso y responder la pregunta que quería hacer: prácticamente (léase: usando una implementación algo popular y madura), Python está compilado . No compilado en código de máquina con anticipación (es decir, "compilado" según la definición restringida e incorrecta, pero lamentablemente común), "solo" compilado en código de bytes , pero aún así es una compilación con al menos algunos de los beneficios. Por ejemplo, la declaración a = b.c()
se compila en un flujo de bytes que, cuando se "desmonta", se parece algo a load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)
. Esto es una simplificación, en realidad es menos legible y de un nivel un poco más bajo: puede experimentar con el dis
módulo de biblioteca estándar y ver cómo se ve realmente. Interpretar esto es más rápido que interpretar desde una representación de nivel superior.
Ese código de bytes se interpreta (tenga en cuenta que existe una diferencia, tanto en teoría como en el rendimiento práctico, entre interpretar directamente y compilar primero en alguna representación intermedia e interpretar eso), como con la implementación de referencia (CPython), o ambos se interpretan y compilan en código de máquina optimizado en tiempo de ejecución, como con PyPy .
De hecho, la CPU solo puede entender el código de máquina. Para los programas interpretados, el objetivo final de un intérprete es "interpretar" el código del programa en código de máquina. Sin embargo, normalmente un lenguaje interpretado moderno no interpreta el código humano directamente porque es demasiado ineficiente.
El intérprete de Python primero lee el código humano y lo optimiza a algún código intermedio antes de interpretarlo en código de máquina. Es por eso que siempre necesitas otro programa para ejecutar un script de Python, a diferencia de C++, donde puedes ejecutar el ejecutable compilado de tu código directamente. Por ejemplo, c:\Python27\python.exe
o /usr/bin/python
.
La respuesta depende de qué implementación de Python se esté utilizando. Si está utilizando, digamos CPython (la implementación estándar de Python) o Jython (dirigido a la integración con el lenguaje de programación Java), primero se traduce a código de bytes y, dependiendo de la implementación de Python que esté utilizando, este código byte se dirige al correspondiente. Máquina virtual para interpretación . PVM (Máquina Virtual Python) para CPython y JVM (Máquina Virtual Java) para Jython.
Pero digamos que estás usando PyPy , que es otra implementación estándar de CPython. Utilizaría un compilador Just-In-Time .
Sí, es un lenguaje tanto compilado como interpretado. Entonces, ¿por qué generalmente lo llamamos lenguaje interpretado?
¿Ves cómo se compila e interpreta?
Primero que nada quiero decirte que te gustará más mi respuesta si eres del mundo Java.
En Java, el código fuente primero se convierte al código de bytes a través del compilador javac y luego se dirige a la JVM (responsable de generar el código nativo para fines de ejecución). Ahora quiero mostrarles que llamamos a Java lenguaje compilado porque podemos ver que realmente compila el código fuente y proporciona el archivo .class (nada más que código de bytes) a través de:
javac Hello.java -------> produce el archivo Hello.class
java Hola -------->Dirigir código de bytes a JVM para fines de ejecución
Lo mismo sucede con Python, es decir, primero el código fuente se convierte al código de bytes a través del compilador y luego se dirige al PVM (responsable de generar el código nativo para su ejecución). Ahora quiero mostrarles que generalmente llamamos a Python como un lenguaje interpretado porque la compilación ocurre detrás de escena y cuando ejecutamos el código de Python a través de:
python Hello.py -------> ejecuta directamente el código y podemos ver el resultado siempre que el código sea sintácticamente correcto
@python Hello.py parece que se ejecuta directamente, pero en realidad primero genera el código de bytes que interpreta el intérprete para producir el código nativo para el propósito de ejecución.
CPython : asume la responsabilidad tanto de la compilación como de la interpretación.
Mire las líneas siguientes si necesita más detalles :
Como mencioné, CPython compila el código fuente, pero la compilación real se realiza con la ayuda de Cython y luego la interpretación se realiza con la ayuda de CPython.
Ahora hablemos un poco sobre el papel del compilador Just-In-Time en Java y Python.
En JVM existe el intérprete de Java que interpreta el código de bytes línea por línea para obtener el código de máquina nativo para fines de ejecución, pero cuando un intérprete ejecuta el código de bytes de Java, la ejecución siempre será más lenta. ¿Entonces, cuál es la solución? la solución es el compilador Just-In-Time que produce el código nativo que puede ejecutarse mucho más rápido de lo que podría interpretarse. Algunos proveedores de JVM utilizan el intérprete de Java y otros utilizan el compilador Just-In-Time . Referencia: haga clic aquí
En Python, para evitar el intérprete y lograr una ejecución rápida, utilice otra implementación de Python ( PyPy ) en lugar de CPython . Haga clic aquí para ver otra implementación de Python, incluido PyPy .