Siéntete libre de divulgar nuestra web y códigos con otro, necesitamos de tu ayuda para hacer crecer esta comunidad.
Solución:
En primer lugar, interpretado/compilado no es una propiedad del lenguaje sino una propiedad de la implementación. Para la mayoría de los lenguajes, la mayoría, si no todas, las implementaciones caen en una categoría, por lo que uno podría ahorrar algunas palabras diciendo que el lenguaje también se interpreta/compila, pero sigue siendo una distinción importante, tanto porque ayuda a comprender como porque hay bastantes lenguajes. con implementaciones utilizables de ambos tipos (principalmente en el ámbito de los lenguajes funcionales, consulte Haskell y ML). Además, hay intérpretes de C y proyectos que intentan compilar un subconjunto de Python en código C o C++ (y posteriormente en código de máquina).
En segundo lugar, la compilación no está restringida a la compilación anticipada del código de máquina nativo. Un compilador es, de manera más general, 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 se compilan en código de máquina nativo en tiempo de ejecuciónque puede brindar una velocidad muy cercana o incluso mejor que la compilación anticipada (según el punto de referencia y la calidad de las implementaciones comparadas).
Pero para dejar de ser quisquilloso y responder a la pregunta que quería hacer: prácticamente (léase: usando una implementación un tanto popular y madura), Python es compilado. No compilado en código de máquina antes de tiempo (es decir, “compilado” por la definición restringida e incorrecta, pero por desgracia común), “solo” compilado en código de bytes, pero sigue siendo 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 “desensambla”, se parece un poco a load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)
. Esta es una simplificación, en realidad es menos legible y un poco más de bajo nivel: puede experimentar con la biblioteca estándar dis
módulo y vea cómo se ve el trato real. 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 hay una diferencia, tanto en la 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 interpretados y compilados para 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 la 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, por lo general, un lenguaje interpretado moderno no interpreta directamente el código humano 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 necesita otro programa para ejecutar un script de Python, a diferencia de C ++, donde puede ejecutar el ejecutable compilado de su código directamente. Por ejemplo, c:Python27python.exe
o /usr/bin/python
.
La respuesta depende de qué implementación de python se esté utilizando. Si está usando, 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 bytesy dependiendo de la implementación de python que esté usando, esto bycode se dirige a la máquina virtual correspondiente para su 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. Usaría un Compilador justo a tiempo.