¿Cómo funciona realmente el tiempo de ejecución de Python?

26

Tengo algunos problemas para entender el concepto de a runtime library, especialmente el de Python. Así que escribí un programa de Python de Hello World y tengo la intención de ejecutarlo, así que escribo python ./hello_world.py.

¿Qué pasos ocurren entre que presiono el botón Enter y el código de máquina generado a partir de mi código python que se ejecuta en mi CPU? ¿Y cómo se relaciona esto con el sistema y / o biblioteca de tiempo de ejecución de Python?

hgiesel
fuente
Estos dos subprocesos dan una gran idea sobre el tiempo de ejecución de Python: ¿se interpreta, compila o ambos? Y Is Python interpreta (como Javascript o PHP)? . El tiempo de ejecución y la biblioteca de tiempo de ejecución no son lo mismo. Mapeo al mundo .NET que conozco: Common Language Runtime (CLR) y Framework / Base Class Library (FCL / BCL) no son lo mismo.
RBT

Respuestas:

33

Por más diversos que sean, hay un puñado de conceptos comunes que comparten todos los lenguajes de programación modernos y serios. Dos de ellos son el núcleo de la respuesta a sus preguntas anteriores.

¿Qué pasos ocurren entre que presiono el botón Enter y el código de máquina generado a partir de mi código python que se ejecuta en mi CPU?

El código se analiza, analiza y alimenta a un intérprete. Se trata de un área muy importante de la informática conocida como teoría de compilación . Un compilador es un programa que traduce el código de un idioma (su código fuente) a otro idioma (generalmente código de máquina, aunque existen "transpiladores" que traducen de un idioma de alto nivel a otro). Este es un tema realmente enorme que podrías pasar años investigando, pero aquí está la versión básica:

El compilador comienza con un analizador , una rutina que lee su código fuente y le aplica las reglas de sintaxis del lenguaje para determinar si tiene sentido como código válido de Python (en su caso). Si no lo hace, el analizador arrojará un error y el compilador se rescatará, pero si lo hace, el analizador genera lo que se conoce como Árbol de sintaxis abstracta o AST para abreviar. El AST es una estructura de datos en árbol cuyos nodos contienen cada uno un elemento de la sintaxis. Por ejemplo, si dice x = 5, podría terminar con un BinaryExpressionnodo con un operatorvalor de =, un Leftvalor de ReferenceExpression(x)y un Rightvalor de IntegerLiteralExpression(5). Todo su programa puede ser representado por un gran árbol como este.

Una vez que el analizador produce un AST, la segunda fase es el análisis semántico . En inglés simple, esto significa "averiguar qué significa este AST". Comprueba el AST para determinar si hizo algo ilegal aunque sea un análisis válido (por ejemplo, tratando de llamar a una función de 1 argumento con 3 argumentos) y genera errores si lo hace. De lo contrario, analiza el AST y realiza ediciones para que sea más fácil de entender para una máquina.

La tercera fase es la generación de código. Una vez que tiene un AST completamente analizado, simplificado y válido, lo introduce en el generador, que recorre el AST y produce código en el lenguaje de salida. Este es tu producto terminado.

Con Python, usa un intérprete en lugar de un compilador. Un intérprete funciona exactamente de la misma manera que un compilador, con una diferencia: en lugar de generar código, carga la salida en memoria y la ejecuta directamente en su sistema. (Los detalles exactos de cómo sucede esto pueden variar enormemente entre diferentes idiomas y diferentes intérpretes).

¿Y cómo se relaciona esto con el sistema y / o biblioteca de tiempo de ejecución de Python?

Todos los lenguajes, excepto los más simples, vienen con un conjunto de funciones predefinidas que son importantes para un gran porcentaje de usuarios y que serían difíciles de implementar por sí mismos por una razón u otra. Su código puede invocar estas funciones sin necesidad de bibliotecas de terceros. (Por ejemplo, en Python que tiene print, que envía resultados a stdout. ¡Buena suerte implementando eso por su cuenta!) Este conjunto de funciones generalmente se recopila en una biblioteca compartida a la que el código puede llamar en tiempo de ejecución, por eso es conocido como la biblioteca de tiempo de ejecución del lenguaje, o simplemente "el tiempo de ejecución" para abreviar.

Mason Wheeler
fuente
¿Entonces mi código se alimenta a otro programa (el sistema de tiempo de ejecución Python) que hace todo eso y termina cuando termina mi código (y después de la limpieza, por supuesto)?
hgiesel
@hgiesel Creo que en el caso de Python, el intérprete es parte del tiempo de ejecución. Este no es el caso para todos los idiomas. por supuesto, pero es bastante común entre los idiomas interpretados.
Mason Wheeler
5

La implementación estándar de Python es una máquina virtual de código de bytes. Esto significa que el código de máquina ( códigos de operación del conjunto de códigos de operación de su procesador) no se genera desde su programa. Los códigos de operación solo se seleccionan de los códigos de operación que ya están compilados en la máquina virtual mientras la VM interpreta el código de bytes.

Cómo se convierte su programa en código de bytes en primer lugar es una pregunta ligeramente diferente, pero la respuesta corta es "a través de la compilación, al igual que cualquier otra traducción de lenguaje descendente".

Kilian Foth
fuente