¿Qué es el "tiempo de ejecución"?
He oído hablar de cosas como "C Runtime", "Visual C++ 2008 Runtime", ".NET Common Language Runtime", etc.
- ¿Qué es exactamente el " tiempo de ejecución "?
- ¿De qué está hecho?
- ¿Cómo interactúa con mi código? O tal vez más precisamente, ¿cómo controla mi código?
Al codificar lenguaje ensamblador en Linux, podría usar la instrucción INT para realizar la llamada al sistema. Entonces, ¿el tiempo de ejecución no es más que un conjunto de funciones prefabricadas que envuelven la función de bajo nivel en funciones más abstractas y de alto nivel? ¿Pero no parece esto más bien la definición de biblioteca, no del tiempo de ejecución?
¿Son "tiempo de ejecución" y " biblioteca de tiempo de ejecución " dos cosas diferentes?
AÑADIR 1
En estos días, pienso que tal vez Runtime tenga algo en común con la llamada Máquina Virtual , como JVM. Aquí está la cita que lleva a tal pensamiento:
Este proceso de compilación es lo suficientemente complejo como para dividirlo en varias capas de abstracción, y éstas generalmente involucran tres traductores: un compilador, una implementación de máquina virtual y un ensamblador. --- Los elementos de los sistemas informáticos (Introducción, El camino hacia la tierra del hardware)
AÑADIR 2
El libro Programación experta en C: secretos de Deep C. El Capítulo 6 Estructuras de datos en tiempo de ejecución es una referencia útil para esta pregunta.
AÑADIR 3 - 7:31 a.m. 28/02/2021
Esta es mi perspectiva después de adquirir algunos conocimientos sobre el diseño de procesadores. Todo el asunto de la computadora es simplemente múltiples niveles de abstracción . Va desde los transistores elementales hasta el programa en ejecución. Para cualquier level N
abstracción, su tiempo de ejecución es el inmediato level N-1
de la abstracción que va debajo de él. Y es Dios quien nos da el nivel 0 de abstracción.
El tiempo de ejecución describe el software/instrucciones que se ejecutan mientras su programa se ejecuta, especialmente aquellas instrucciones que no escribió explícitamente, pero que son necesarias para la ejecución adecuada de su código.
Los lenguajes de bajo nivel como C tienen un tiempo de ejecución muy pequeño (si es que tienen alguno). Los lenguajes más complejos como Objective-C, que permiten el paso dinámico de mensajes, tienen un tiempo de ejecución mucho más extenso.
Tiene razón en que el código de tiempo de ejecución es código de biblioteca, pero código de biblioteca es un término más general que describe el código producido por cualquier biblioteca. El código de tiempo de ejecución es específicamente el código necesario para implementar las características del propio lenguaje.
Tiempo de ejecución es un término general que se refiere a cualquier biblioteca, marco o plataforma en la que se ejecuta su código.
Los tiempos de ejecución de C y C++ son colecciones de funciones.
El tiempo de ejecución de .NET contiene un intérprete de lenguaje intermedio , un recolector de basura y más.
Según Wikipedia: biblioteca en tiempo de ejecución / sistema en tiempo de ejecución .
En programación de computadoras, una biblioteca en tiempo de ejecución es una biblioteca de programas especial utilizada por un compilador para implementar funciones integradas en un lenguaje de programación, durante el tiempo de ejecución (ejecución) de un programa de computadora. Esto incluye a menudo funciones de entrada y salida, o de gestión de memoria.
Un sistema de tiempo de ejecución (también llamado sistema de tiempo de ejecución o simplemente tiempo de ejecución) es un software diseñado para soportar la ejecución de programas informáticos escritos en algún lenguaje informático. El sistema de tiempo de ejecución contiene implementaciones de comandos básicos de bajo nivel y también puede implementar comandos de nivel superior y puede admitir verificación de tipos, depuración e incluso generación y optimización de código. El programador puede acceder a algunos servicios del sistema en tiempo de ejecución a través de una interfaz de programación de aplicaciones, pero otros servicios (como la programación de tareas y la gestión de recursos) pueden ser inaccesibles.
Re: su edición , "tiempo de ejecución" y "biblioteca de tiempo de ejecución" son dos nombres diferentes para la misma cosa.
El tiempo de ejecución o entorno de ejecución es la parte de la implementación de un lenguaje que ejecuta código y está presente en tiempo de ejecución ; la parte de la implementación en tiempo de compilación se denomina entorno de traducción en el estándar C.
Ejemplos:
El tiempo de ejecución de Java consta de la máquina virtual y la biblioteca estándar.
un tiempo de ejecución de C común consta del cargador (que es parte del sistema operativo) y la biblioteca de tiempo de ejecución, que implementa las partes del lenguaje C que el compilador no integra en el ejecutable; En entornos alojados, esto incluye la mayor parte de la biblioteca estándar.
No me entusiasman las otras respuestas aquí; son demasiado vagos y abstractos para mí. Pienso más en historias. Aquí está mi intento de dar una mejor respuesta.
un ejemplo BÁSICO
Digamos que es 1985 y escribes un breve programa BÁSICO en un Apple II:
] 10 PRINT "HELLO WORLD!"
] 20 GOTO 10
Hasta ahora, su programa es solo código fuente. No se está ejecutando y diríamos que no implica ningún "tiempo de ejecución".
Pero ahora lo ejecuto:
] RUN
¿Cómo funciona realmente? ¿Cómo sabe cómo enviar el parámetro de cadena PRINT
a la pantalla física? Ciertamente no proporcioné ninguna información del sistema en mi código y PRINT
él mismo no sabe nada sobre mi sistema.
En cambio, RUN
es en realidad un programa en sí mismo: su código le dice cómo analizar mi código, cómo ejecutarlo y cómo enviar cualquier solicitud relevante al sistema operativo de la computadora. El RUN
programa proporciona el entorno de "tiempo de ejecución" que actúa como una capa entre el sistema operativo y mi código fuente. El sistema operativo en sí actúa como parte de este "tiempo de ejecución", pero normalmente no pretendemos incluirlo cuando hablamos de un "tiempo de ejecución" como el RUN
programa.
Tipos de compilación y tiempo de ejecución
Lenguajes binarios compilados
En algunos idiomas, el código fuente debe compilarse antes de poder ejecutarse. Algunos lenguajes compilan su código en lenguaje de máquina; su sistema operativo puede ejecutarlo directamente. Este código compilado a menudo se denomina "binario" (aunque todos los demás tipos de archivos también están en binario :).
En este caso, todavía hay un "tiempo de ejecución" mínimo involucrado, pero ese tiempo de ejecución lo proporciona el propio sistema operativo. El paso de compilación significa que muchas declaraciones que provocarían que su programa fallara se detectan antes de que se ejecute el código.
C es uno de esos lenguajes; cuando ejecutas un programa en C, es totalmente capaz de enviar solicitudes ilegales al sistema operativo (como, "dame el control de toda la memoria de la computadora y bórrala toda"). Si se recibe una solicitud ilegal, normalmente el sistema operativo simplemente eliminará su programa y no le dirá por qué, y volcará el contenido de la memoria de ese programa en el momento en que fue eliminado en un .dump
archivo al que es bastante difícil encontrarle sentido. Pero a veces su código tiene un comando que es una muy mala idea, pero el sistema operativo no lo considera ilegal, como "borrar un bit aleatorio de memoria que este programa está usando"; eso puede causar problemas súper extraños a los que es difícil llegar al fondo.
Idiomas de código de bytes
Otros lenguajes (por ejemplo, Java, Python) compilan su código en un lenguaje que el sistema operativo no puede leer directamente, pero un programa de ejecución específico puede leer su código compilado. Este código compilado a menudo se denomina "código de bytes".
Cuanto más elaborado sea este programa de ejecución, más cosas adicionales podrá hacer en el lado que su código no incluye (incluso en las bibliotecas que usa); por ejemplo, el entorno de ejecución de Java ("JRE") y el entorno de ejecución de Python. puede realizar un seguimiento de las asignaciones de memoria que ya no son necesarias y decirle al sistema operativo que es seguro reutilizar esa memoria para otra cosa, y puede detectar situaciones en las que su código intentaría enviar una solicitud ilegal al sistema operativo y, en su lugar, salir con un error legible.
Toda esta sobrecarga los hace más lentos que los lenguajes binarios compilados, pero hace que el tiempo de ejecución sea potente y flexible; en algunos casos, incluso puede introducir otro código después de comenzar a ejecutarse, sin tener que empezar de nuevo. El paso de compilación significa que muchas declaraciones que provocarían que su programa fallara se detectan antes de que se ejecute el código; y el potente tiempo de ejecución puede evitar que su código haga cosas estúpidas (por ejemplo, no puede "borrar un bit aleatorio de memoria que este programa esté usando").
Lenguajes de scripting
Otros lenguajes no precompilan su código en absoluto; el tiempo de ejecución hace todo el trabajo de leer el código línea por línea, interpretarlo y ejecutarlo. Esto los hace incluso más lentos que los lenguajes de "código de bytes", pero también más flexibles; En algunos casos, ¡incluso puedes jugar con tu código fuente mientras se ejecuta! Aunque también significa que puede tener una declaración totalmente ilegal en su código, y podría permanecer ahí en su código de producción sin llamar la atención, hasta que un día se ejecuta y provoca un bloqueo.
Generalmente se denominan lenguajes de "scripting"; incluyen Javascript, Perl y PHP. Algunos de estos proporcionan casos en los que puede optar por compilar el código para mejorar su velocidad (por ejemplo, el proyecto WebAssembly de Javascript). Por lo tanto, Javascript puede permitir a los usuarios de un sitio web ver el código exacto que se está ejecutando, ya que su navegador proporciona el tiempo de ejecución.
Esta flexibilidad también permite innovaciones en entornos de ejecución, como node.js, que es a la vez una biblioteca de códigos y un entorno de ejecución que puede ejecutar su código Javascript como servidor, lo que implica comportarse de manera muy diferente que si intentara ejecutar el mismo código en un navegador.