son - ¿Python es interpretado, compilado o ambos?
qué son los lenguajes compilados y los lenguajes interpretados (6)
Desde mi entendimiento:
Un lenguaje interpretado es un lenguaje de alto nivel ejecutado por un intérprete (un programa que convierte el lenguaje de alto nivel a código de máquina y luego ejecuta) sobre la marcha; procesa el programa poco a poco.
Un lenguaje compilado es un lenguaje de alto nivel cuyo código primero se convierte en código de máquina por un compilador (un programa que convierte el lenguaje de alto nivel a código de máquina) y luego ejecutado por un ejecutor (otro programa para ejecutar el código).
Corrígeme si mis definiciones son incorrectas.
Ahora que regreso a Python, estoy un poco confundido acerca de esto. En todas partes aprendes que Python es un lenguaje interpretado, pero se interpreta con un código intermedio (como byte-code o IL) y no con el código máquina. Entonces, ¿qué programa luego ejecuta el código de MI? Por favor, ayúdame a comprender cómo se maneja y ejecuta un script de Python.
Casi, podemos decir que Python es un lenguaje interpretado. Pero estamos usando parte del proceso de compilación de una vez en python para convertir el código fuente completo en código de bytes como el lenguaje Java.
El código python que escribe se compila en python bytecode, que crea un archivo con la extensión .pyc. Si se compila, de nuevo la pregunta es, ¿por qué no se compila el lenguaje?
Tenga en cuenta que esto no es compilación en el sentido tradicional de la palabra. Típicamente, diríamos que la compilación toma un lenguaje de alto nivel y lo convierte a código máquina. Pero es una compilación de géneros. Compilado en código intermedio no en código máquina (Espero que lo hayas conseguido ahora).
Volviendo al proceso de ejecución, su bytecode, presente en el archivo pyc, creado en el paso de compilación, es luego ejecutado por las máquinas virtuales apropiadas, en nuestro caso, la VM CPython La marca de tiempo (llamada como número mágico) se usa para validar si. El archivo py se cambia o no, según se cree ese nuevo archivo pyc. Si pyc es de código actual, simplemente omite el paso de compilación.
En primer lugar, interpretar / compilar 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 pertenecen a una categoría, por lo que uno podría guardar algunas palabras diciendo que el idioma también se interpreta, pero sigue siendo una distinción importante, tanto porque ayuda a la comprensión como porque hay bastantes idiomas con implementaciones utilizables de ambos tipos (principalmente en el ámbito de los lenguajes funcionales, ver Haskell y ML). Además, hay C intérpretes y proyectos que intentan compilar un subconjunto de código de Python a C o C ++ (y, posteriormente, a código de máquina).
En segundo lugar, la compilación no está restringida a la compilación anticipada al código máquina nativo. Un compilador es, más generalmente, 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 idioma de entrada y salida si se aplican transformaciones significativas). Y los compiladores JIT compilan código máquina nativo en tiempo de ejecución , lo que puede dar una velocidad muy cercana o incluso mejor que la compilación previa (dependiendo de la referencia y la calidad de las implementaciones comparadas).
Pero para dejar de criticar y responder a la pregunta que pretendía hacer: Prácticamente (léase: utilizando una implementación algo popular y madura), Python se compila . No compilado al código de la máquina por anticipado (es decir, "compilado" por la definición restringida e incorrecta, pero desafortunadamente común), "solo" compilado en bytecode , pero sigue siendo una compilación con al menos algunos de los beneficios. Por ejemplo, el enunciado a = bc()
se compila en una secuencia de bytes que, cuando se "desensambla", se parece algo a la load 0 (b); load_str ''c''; get_attr; call_function 0; store 1 (a)
load 0 (b); load_str ''c''; get_attr; call_function 0; store 1 (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 un poco más bajo: puede experimentar con el módulo estándar de biblioteca y ver cuál es el verdadero negocio. Interpretar esto es más rápido que interpretar desde una representación de nivel superior.
Ese bytecode es interpretado (tenga en cuenta que hay una diferencia, tanto en teoría como en rendimiento práctico, entre la interpretación directa y la primera compilación a alguna representación intermedia e interpretar eso), como con la implementación de referencia (CPython), o ambas interpretadas y compiladas para código de máquina optimizado en tiempo de ejecución, como con PyPy .
La CPU solo puede entender el código de la máquina. Para el programa interpretado, el objetivo final de un intérprete es "interpretar" el código del programa en código máquina. Sin embargo, generalmente 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 con un código inmediato antes de interpretarlo en código máquina. Es por eso que siempre necesita otro programa para ejecutar una secuencia de comandos de Python, a diferencia de C ++, puede ejecutar el ejecutable directamente. Por ejemplo c: / Python27 / python.exe o / usr / bin / python.
La respuesta depende de qué implementación de python está siendo utilizada. Si está usando permite 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 bytecode , y dependiendo de la implementación de python que esté utilizando, este bycode se dirige al correspondiente máquina virtual para la interpretación . PVM (Python Virtual Machine) para CPython y JVM (Java Virtual Machine) para Jython.
Pero digamos que está utilizando PyPy, que es otra implementación estándar de CPython. Usaría un Compilador Just-In-Time .
Según python.org, es un intérprete.
https://www.python.org/doc/essays/blurb/
Python es un lenguaje de programación interpretado, orientado a objetos y de alto nivel ...
...
Como no hay un paso de compilación ...
...
El intérprete de Python y la extensa biblioteca estándar están disponibles ...
...
En cambio, cuando el intérprete descubre un error, genera una excepción. Cuando el programa no capta la excepción, el intérprete imprime un seguimiento de la pila.