En programación de computadoras , un sistema de ejecución o entorno de ejecución es un subsistema que existe tanto en la computadora donde se crea un programa, como en las computadoras donde se pretende ejecutar el programa. El nombre proviene de la división de tiempo de compilación y tiempo de ejecución de los lenguajes compilados , que distingue de manera similar los procesos informáticos involucrados en la creación de un programa (compilación) y su ejecución en la máquina de destino (el tiempo de ejecución). [1]
La mayoría de los lenguajes de programación tienen algún tipo de sistema de ejecución que proporciona un entorno en el que se ejecutan los programas. Este entorno puede abordar una serie de cuestiones que incluyen la gestión de la memoria de la aplicación , cómo el programa accede a las variables , mecanismos para pasar parámetros entre procedimientos , interfaz con el sistema operativo (SO), entre otros. El compilador hace suposiciones dependiendo del sistema de ejecución específico para generar el código correcto. Normalmente, el sistema de ejecución tendrá cierta responsabilidad de configurar y administrar la pila y el montón , y puede incluir características como recolección de basura , subprocesos u otras características dinámicas integradas en el lenguaje. [1]
Cada lenguaje de programación especifica un modelo de ejecución y muchos implementan al menos parte de ese modelo en un sistema de ejecución. Una posible definición del comportamiento del sistema en tiempo de ejecución, entre otras, es "cualquier comportamiento que no sea directamente atribuible al programa en sí". Esta definición incluye colocar parámetros en la pila antes de las llamadas a funciones, ejecución paralela de comportamientos relacionados y E/S de disco .
Según esta definición, esencialmente todos los idiomas tienen un sistema de ejecución, incluidos los lenguajes compilados , los lenguajes interpretados y los lenguajes integrados de dominio específico . Incluso los modelos de ejecución independientes invocados por API , como Pthreads ( subprocesos POSIX ), tienen un sistema de ejecución que implementa el comportamiento del modelo de ejecución.
La mayoría de los artículos académicos sobre sistemas de ejecución se centran en los detalles de implementación de sistemas de ejecución paralelos. Un ejemplo notable de un sistema de ejecución paralelo es Cilk , un popular modelo de programación paralela. [2] El kit de herramientas proto-runtime se creó para simplificar la creación de sistemas de ejecución paralelos. [3]
Además del comportamiento del modelo de ejecución, un sistema en tiempo de ejecución también puede realizar servicios de soporte como verificación de tipos , depuración o generación y optimización de código . [4]
El sistema de ejecución es también la puerta de enlace a través de la cual un programa en ejecución interactúa con el entorno de ejecución . El entorno de ejecución incluye no sólo valores de estado accesibles, sino también entidades activas con las que el programa puede interactuar durante la ejecución. Por ejemplo, las variables de entorno son características de muchos sistemas operativos y forman parte del entorno de ejecución; un programa en ejecución puede acceder a ellos a través del sistema de ejecución. Asimismo, los dispositivos de hardware, como discos o unidades de DVD, son entidades activas con las que un programa puede interactuar a través de un sistema de ejecución.
Una aplicación única de un entorno de ejecución es su uso dentro de un sistema operativo que solo le permite ejecutarse. En otras palabras, desde el inicio hasta el apagado, todo el sistema operativo está dedicado únicamente a las aplicaciones que se ejecutan dentro de ese entorno de ejecución. Cualquier otro código que intente ejecutarse, o cualquier falla en las aplicaciones, interrumpirá el entorno de ejecución. Romper el entorno de ejecución a su vez daña el sistema operativo, deteniendo todo el procesamiento y requiriendo un reinicio. Si el arranque se realiza desde una memoria de sólo lectura, se crea un sistema extremadamente seguro, sencillo y de una sola misión.
Ejemplos de estos sistemas de ejecución directamente empaquetados incluyen:
El sistema de ejecución del lenguaje C es un conjunto particular de instrucciones insertadas por el compilador en la imagen ejecutable. Entre otras cosas, estas instrucciones administran la pila de procesos, crean espacio para variables locales y copian parámetros de llamada de función en la parte superior de la pila.
A menudo no existen criterios claros para determinar qué comportamientos del lenguaje son parte del propio sistema de ejecución y cuáles pueden ser determinados por cualquier programa fuente en particular. Por ejemplo, en C, la configuración de la pila es parte del sistema de ejecución. No está determinado por la semántica de un programa individual porque el comportamiento es globalmente invariante: se mantiene en todas las ejecuciones. Este comportamiento sistemático implementa el modelo de ejecución del lenguaje, en lugar de implementar la semántica del programa en particular (en el que el texto se traduce directamente en código que calcula los resultados).
Esta separación entre la semántica de un programa en particular y el entorno de ejecución se refleja en las diferentes formas de compilar un programa: compilar el código fuente en un archivo objeto que contiene todas las funciones versus compilar un programa completo en un binario ejecutable. El archivo objeto solo contendrá código ensamblador relevante para las funciones incluidas, mientras que el binario ejecutable contendrá código adicional que implemente el entorno de ejecución. Al archivo objeto, por un lado, le puede faltar información del entorno de ejecución que se resolverá vinculando . Por otro lado, el código en el archivo objeto todavía depende de suposiciones en el sistema de ejecución; por ejemplo, una función puede leer parámetros de un registro o ubicación de pila en particular, según la convención de llamada utilizada por el entorno de ejecución.
Otro ejemplo es el caso del uso de una interfaz de programación de aplicaciones (API) para interactuar con un sistema de ejecución. Las llamadas a esa API tienen el mismo aspecto que las llamadas a una biblioteca de software normal ; sin embargo, en algún momento durante la llamada, el modelo de ejecución cambia. El sistema de ejecución implementa un modelo de ejecución diferente al del lenguaje en el que está escrita la biblioteca. Una persona que lea el código de una biblioteca normal podría comprender el comportamiento de la biblioteca con solo conocer el idioma en el que está escrita. Sin embargo, una persona que lea el código de la API que invoca un sistema de ejecución no podría comprender el código. comportamiento de la llamada API con solo conocer el idioma en el que se escribió la llamada. En algún momento, a través de algún mecanismo, el modelo de ejecución deja de ser el del lenguaje en el que está escrita la llamada y pasa a ser el modelo de ejecución implementado por el tiempo de ejecución. sistema. Por ejemplo, la instrucción trap es un método para cambiar de modelo de ejecución. Esta diferencia es lo que distingue un modelo de ejecución invocado por API, como Pthreads, de una biblioteca de software habitual. Tanto las llamadas a Pthreads como las llamadas a la biblioteca de software se invocan a través de una API, pero el comportamiento de Pthreads no se puede entender en términos del idioma de la llamada. Más bien, las llamadas a Pthreads ponen en juego un modelo de ejecución externo, que es implementado por el sistema de ejecución de Pthreads (este sistema de ejecución suele ser el kernel del sistema operativo).
Como ejemplo extremo, la propia CPU física puede verse como una implementación del sistema de ejecución de un lenguaje ensamblador específico. Desde este punto de vista, el modelo de ejecución lo implementan la CPU física y los sistemas de memoria. Como analogía, los sistemas de ejecución para lenguajes de nivel superior se implementan utilizando otros lenguajes. Esto crea una jerarquía de sistemas de ejecución, con la propia CPU (o en realidad su lógica en la capa de microcódigo o debajo) actuando como el sistema de ejecución de nivel más bajo.
Algunos lenguajes compilados o interpretados proporcionan una interfaz que permite que el código de la aplicación interactúe directamente con el sistema de ejecución. Un ejemplo es la Thread
clase en el lenguaje Java . La clase permite que el código (animado por un hilo) haga cosas como iniciar y detener otros hilos. Normalmente, los aspectos centrales del comportamiento de un lenguaje, como la programación de tareas y la gestión de recursos, no son accesibles de esta manera.
Los comportamientos de nivel superior implementados por un sistema de ejecución pueden incluir tareas como dibujar texto en la pantalla o establecer una conexión a Internet. A menudo ocurre que los sistemas operativos también proporcionan este tipo de comportamientos y, cuando están disponibles, el sistema de ejecución se implementa como una capa de abstracción que traduce la invocación del sistema de ejecución en una invocación del sistema operativo. Esto oculta la complejidad o variaciones en los servicios que ofrecen los diferentes sistemas operativos. Esto también implica que el kernel del sistema operativo puede verse como un sistema en tiempo de ejecución, y que el conjunto de llamadas del sistema operativo que invocan comportamientos del sistema operativo pueden verse como interacciones con un sistema en tiempo de ejecución.
En el límite, el sistema de ejecución puede proporcionar servicios como una máquina de código P o una máquina virtual , que oculta incluso el conjunto de instrucciones del procesador . Este es el enfoque seguido por muchos lenguajes interpretados como AWK y algunos lenguajes como Java , que deben compilarse en algún código de representación intermedio independiente de la máquina (como bytecode ). Esta disposición simplifica la tarea de implementación del lenguaje y su adaptación a diferentes máquinas, y mejora la eficiencia de características sofisticadas del lenguaje como la programación reflexiva . También permite ejecutar el mismo programa en cualquier máquina sin un paso de recompilación explícito, una característica que se ha vuelto muy importante desde la proliferación de la World Wide Web . Para acelerar la ejecución, algunos sistemas de ejecución cuentan con compilación justo a tiempo en código de máquina.
Un aspecto moderno de los sistemas de ejecución son los comportamientos de ejecución paralela, como los comportamientos exhibidos por construcciones mutex en Pthreads y construcciones de secciones paralelas en OpenMP . Un sistema de ejecución con tales comportamientos de ejecución paralela se puede modularizar de acuerdo con el enfoque proto-runtime.
Los primeros ejemplos notables de sistemas de ejecución son los intérpretes de BASIC y Lisp . Estos entornos también incluían un recolector de basura . Forth es un ejemplo temprano de un lenguaje diseñado para ser compilado en un código de representación intermedio; su sistema de ejecución era una máquina virtual que interpretaba ese código. Otro ejemplo popular, aunque teórico, es la computadora MIX de Donald Knuth .
En C y lenguajes posteriores que admitían la asignación de memoria dinámica, el sistema de ejecución también incluía una biblioteca que administraba el grupo de memoria del programa.
En los lenguajes de programación orientados a objetos , el sistema de ejecución a menudo también era responsable de la verificación dinámica de tipos y la resolución de referencias de métodos.
El compilador debe cooperar con el sistema operativo y otro software del sistema para admitir estas abstracciones en la máquina de destino.
[…]
SpeedStart
hace que nuestro software sea más fácil de usar. Todo el software de la biblioteca de aplicaciones CP/M tiene la nueva versión SpeedStart del
sistema operativo
CP/M
integrada directamente en el disco del programa. Todo lo que tiene que hacer para utilizar estas aplicaciones es introducir el disco en su
PC IBM
, encender el sistema y estará listo para comenzar. Esto elimina la necesidad de cargar un sistema operativo independiente, cambiar discos e iniciar el programa de aplicaciones. El software SpeedStart de la biblioteca de aplicaciones CP/M también: […] Le proporciona una versión de ejecución gratuita de CP/M […] Elimina la necesidad de instalar cada nuevo programa de aplicaciones […] Le brinda compatibilidad con
Digital
Research potente sistema operativo de 16 bits,
CP/M-86
, y el sistema operativo
concurrente CP/M
multitarea de última generación .
[…]
[…]
Dr. Logo
apareció por primera vez en el mercado minorista en el otoño de 1983 para la
PC IBM
y subió a la cima de la
Hot List de Softsel
. El lanzamiento comercial incluyó
SpeedStart CP/M
, una versión abreviada de
CP/M
que
arranca automáticamente
cuando se enciende el sistema. […][1]
[…] Presentamos
SpeedStart
, el exclusivo sistema de software load-and-go. La biblioteca de aplicaciones CP/M ofrece mucho más que el mejor software
para PC IBM
de marca del sector. Cada una de nuestras aplicaciones ofrece la comodidad inigualable de nuestro exclusivo sistema de disco único SpeedStart. SpeedStart es una versión especial del potente sistema operativo
CP/M-86
integrado en cada uno de nuestros discos de software. Cuando esté listo para trabajar, simplemente cargue el disco, encienda su PC IBM y ¡listo! SpeedStart elimina la lenta tarea de cargar un disco operativo independiente y luego "instalar" el software. De hecho, el sistema SpeedStart le permite trabajar más rápido y más fácilmente que cualquier otro software disponible en la actualidad. Lo mejor de todo es que es tuyo sin coste adicional. Es más, se puede omitir SpeedStart para ejecutar software bajo el sistema operativo de PC IBM del futuro: el notable y multitarea
Concurrent CP/M
. […]
[…] el sistema operativo
Artline 2
ha sido
GEM/4
[…] todos los cambios a GEM/4 se han realizado en cooperación con Lee Lorenzen y Don Heiskell para mantener la compatibilidad con
Ventura Publisher
. […]
{{cite book}}
: |work=
ignorado ( ayuda ){{cite book}}
: |work=
ignorado ( ayuda )