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?
Respuestas:
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.
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 unBinaryExpression
nodo con unoperator
valor de=
, unLeft
valor deReferenceExpression(x)
y unRight
valor deIntegerLiteralExpression(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).
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 astdout
. ¡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.fuente
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".
fuente