Pregunta:
Tengo algunos problemas para comprender el concepto de runtime library
de runtime library
, especialmente la de Python. Así que escribí un programa de python 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 de ejecución de Python y / o la biblioteca?
Respuesta:
Por 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 envía a un intérprete. Se trata de un área muy importante de la informática conocida como teoría del compilador . Un compilador es un programa que traduce código de un idioma (su código fuente) a otro idioma (típicamente código máquina, aunque existen "transpilers" que traducen de un idioma de alto nivel a otro). Este es un tema realmente masivo que podría 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 averiguar si tiene sentido como código Python válido (en su caso). Si no es así, el analizador arrojará un error y el compilador se saldrá, pero si lo hace, el analizador generará lo que se conoce como un árbol de sintaxis abstracta, o AST para abreviar. El AST es una estructura de datos de árbol cuyos nodos contienen cada uno un elemento de la sintaxis. Por ejemplo, si dice x = 5
, podría terminar con un nodo BinaryExpression
con un valor de operator
de =
, un valor Left
de ReferenceExpression(x)
y un valor Right
de IntegerLiteralExpression(5)
. Todo su programa puede estar representado por un gran árbol como este.
Una vez que el analizador genera un AST, la segunda fase es el análisis semántico . En términos sencillos, esto significa "averigüe lo que significa este AST". Verifica el AST para determinar si hizo algo que sea ilegal a pesar de que es un análisis válido (por ejemplo, al intentar 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 modificaciones para que sea más sencillo de entender para una máquina.
La tercera fase es la generación de código. Una vez que tiene un AST válido, simplificado y completamente analizado, lo introduce en el generador, que recorre el AST y produce código en el lenguaje de salida. Este es su 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 la 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 de ejecución de Python y / o la biblioteca?
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ía difícil para los usuarios implementar por sí mismos por una razón u otra. Su código puede llamar a estas funciones sin necesidad de bibliotecas de terceros. (Por ejemplo, en Python tiene print
, que envía la salida 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, razón por la cual se conoce como la biblioteca de tiempo de ejecución del lenguaje, o simplemente "el tiempo de ejecución" para abreviar.