¿Se interpreta Python, o se comstack, o ambos?

Desde mi entendimiento:

Un lenguaje interpretado es un lenguaje de alto nivel ejecutado y ejecutado por un intérprete (un progtwig que convierte el lenguaje de alto nivel en código de máquina y luego se ejecuta) sobre la marcha; Procesa el progtwig poco a poco.

Un lenguaje comstackdo es un lenguaje de alto nivel cuyo código primero se convierte en código de máquina mediante un comstackdor (un progtwig que convierte el lenguaje de alto nivel en código de máquina) y luego lo ejecuta un ejecutor (otro progtwig para ejecutar el código).

Corrígeme si mis definiciones están equivocadas.

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 a un código intermedio (como el código byte o IL) y no al código de la máquina. Entonces, ¿qué progtwig ejecuta el código IM? Por favor, ayúdame a entender cómo se maneja y ejecuta un script de Python.

    En primer lugar, interpretado / comstackdo no es una propiedad del lenguaje sino una propiedad de la implementación. Para la mayoría de los idiomas, la mayoría de las implementaciones, si no todas, se encuentran en una categoría, por lo que se pueden guardar algunas palabras diciendo que el lenguaje también se interpreta / comstack, 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, consulte Haskell y ML). Además, hay intérpretes y proyectos de C que intentan comstackr un subconjunto de código de Python a C o C ++ (y posteriormente al código de máquina).

    En segundo lugar, la comstackción no se limita a la comstackción anticipada a código de máquina nativo. Un comstackdor es, más generalmente, un progtwig que convierte un progtwig en un lenguaje de progtwigción en un progtwig en otro lenguaje de progtwigción (podría decirse que incluso puede tener un comstackdor con el mismo lenguaje de entrada y salida si se aplican transformaciones significativas). Y los comstackdores JIT comstackn en código de máquina nativo en tiempo de ejecución , lo que puede dar una velocidad muy cercana o incluso mejor que la comstackción anticipada (dependiendo de la referencia y la calidad de las implementaciones comparadas).

    Pero para detener el nitpicking y responder a la pregunta que quería hacer: Prácticamente (lea: usando una implementación bastante popular y madura), se comstack Python. No comstackdo a código de máquina antes de tiempo (es decir, “comstackdo” por la definición restringida y errónea, pero desgraciadamente común), “solo” comstackdo a bytecode , pero sigue comstackndo con al menos algunos de los beneficios. Por ejemplo, la instrucción a = bc() se comstack en un flujo de bytes que, cuando se “desensambla”, se parece 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) . Esta es una simplificación, en realidad es menos legible y un poco más de bajo nivel. Puede experimentar con el módulo estándar de la biblioteca y ver cómo se ve el verdadero negocio. Interpretar esto es más rápido que interpretar desde una representación de nivel superior.

    Ese bytecode se interpreta (tenga en cuenta que existe una diferencia, tanto en la teoría como en el rendimiento práctico, entre la interpretación directa y la primera comstackción de una representación intermedia e interpretarla), como en la implementación de referencia (CPython), o ambas interpretadas y comstackdas para código de máquina optimizado en tiempo de ejecución, como con PyPy .

    La CPU solo puede entender el código de máquina de hecho. Para un progtwig interpretado, el objective final de un intérprete es “interpretar” el código del progtwig en un código de 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 leyó el código humano y lo optimizó a algún código inmediato antes de interpretarlo en código de máquina. Es por eso que siempre necesita otro progtwig para ejecutar un script 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 se esté utilizando. Si está utilizando, digamos CPython (la implementación estándar de python) o Jython (orientado para la integración con el lenguaje de progtwigción Java), primero se traduce a bytecode , y dependiendo de la implementación de python que está utilizando, este código se dirige al código correspondiente. Máquina virtual para la interpretación . PVM (Máquina virtual de Python) para CPython y JVM (Máquina virtual de Java) para Jython.

    Pero digamos que está utilizando PyPy, que es otra implementación estándar de CPython. Utilizaría un comstackdor Just-In-Time .

    Según python.org es un intérprete.

    https://www.python.org/doc/essays/blurb/

    Python es un lenguaje de progtwigción de alto nivel interpretado, orientado a objetos …

    Como no hay paso de comstackció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 progtwig no detecta la excepción, el intérprete imprime un seguimiento de stack.

    Si (ya sabes Java) {

    El código de Python se convierte en código de bytes como lo hace Java.
    Ese bytecode se ejecuta de nuevo cada vez que intentas acceder a él.

    } else {

    El código de Python se traduce inicialmente en algo llamado código de bytes
    Eso es bastante cercano al lenguaje de máquina pero no al código de máquina real
    así que cada vez que accedemos o ejecutemos ese bytecode se ejecutará de nuevo

    }

    Casi, podemos decir que Python es un lenguaje interpretado. Pero estamos usando parte de un proceso de comstackción en Python para convertir el código fuente completo en un código de bytes como el lenguaje Java.

    El código de Python que escribes se comstack en el bytecode de Python, que crea un archivo con la extensión .pyc. Si comstack, de nuevo la pregunta es, ¿por qué no comstackr el lenguaje?

    Tenga en cuenta que esto no es una comstackción en el sentido tradicional de la palabra. Por lo general, diríamos que la comstackción está tomando un lenguaje de alto nivel y convirtiéndolo en código de máquina. Pero es una recostackción de géneros. Comstackdo en código intermedio no en código de máquina (Espero que lo tengas ahora).

    De vuelta al proceso de ejecución, su bytecode, presente en el archivo pyc, creado en el paso de comstackción, luego es ejecutado por las máquinas virtuales apropiadas, en nuestro caso, el CPython VM La marca de tiempo (llamada como número mágico) se usa para validar si. El archivo py se modifica o no, según el nuevo archivo pyc que se cree. Si pyc es del código actual, simplemente omite el paso de comstackción.