Ejecución del programa |
---|
Conceptos generales |
Tipos de código |
Estrategias de compilación |
Tiempos de ejecución notables |
|
Compiladores y cadenas de herramientas notables |
En programación informática , un sistema de ejecución o entorno de ejecución es un subsistema que existe en la computadora donde se crea un programa, así 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 de manera similar distingue 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 entorno 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, incluida la gestión de la memoria de la aplicación , cómo el programa accede a las variables , los mecanismos para pasar parámetros entre procedimientos , la interfaz con el sistema operativo (OS), entre otros. El compilador hace suposiciones según el sistema de ejecución específico para generar el código correcto. Normalmente, el sistema de ejecución tendrá cierta responsabilidad por configurar y administrar la pila y el montón , y puede incluir características como la 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 de ejecución, entre otras, es "cualquier comportamiento que no sea directamente atribuible al programa en sí". Esta definición incluye la colocación de parámetros en la pila antes de las llamadas a funciones, la ejecución paralela de comportamientos relacionados y la E/S de disco .
Según esta definición, básicamente todos los lenguajes tienen un sistema de ejecución, incluidos los lenguajes compilados , los lenguajes interpretados y los lenguajes específicos de dominio integrados . 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 en tiempo real se centran en los detalles de implementación de sistemas de ejecución en tiempo real paralelos. Un ejemplo notable de un sistema de ejecución en tiempo real paralelo es Cilk , un modelo de programación paralela popular. [2] El kit de herramientas proto-runtime se creó para simplificar la creación de sistemas de ejecución en tiempo real paralelos. [3]
Además del comportamiento del modelo de ejecución, un sistema de 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]
Tipo | Descripción | Ejemplos |
---|---|---|
Entorno de ejecución | Plataforma de software que proporciona un entorno para ejecutar código. | Node.js , marco .NET |
Motor | Componente de un entorno de ejecución que ejecuta código compilándolo o interpretándolo | Motor de JavaScript en navegadores web, máquina virtual de Java |
Intérprete | Tipo de motor que lee y ejecuta código línea por línea, sin compilar todo el programa de antemano. | Intérprete de CPython , Ruby MRI , JavaScript (en algunos casos) |
Intérprete JIT | Tipo de intérprete que compila dinámicamente el código en instrucciones de máquina en tiempo de ejecución, optimizando el código para una ejecución más rápida. | V8 , intérprete de PyPy |
El sistema de ejecución también es 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 solo 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 ellas a través del sistema de ejecución. Del mismo modo, 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 arranque 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. Al interrumpir el entorno de ejecución, se interrumpirá el sistema operativo, lo que detendrá todo el procesamiento y requerirá un reinicio. Si el arranque se realiza desde una memoria de solo lectura, se crea un sistema extremadamente seguro, simple y de una sola misión.
Algunos ejemplos de estos sistemas de ejecución agrupados directamente son:
El sistema de ejecución del lenguaje C es un conjunto particular de instrucciones que el compilador inserta en la imagen ejecutable. Entre otras cosas, estas instrucciones administran la pila de procesos, crean espacio para variables locales y copian los 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 forman 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 forma parte del sistema de ejecución. No está determinada por la semántica de un programa individual porque el comportamiento es globalmente invariable: 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 de objeto que contiene todas las funciones frente a compilar un programa completo en un binario ejecutable. El archivo de objeto solo contendrá código ensamblador relevante para las funciones incluidas, mientras que el binario ejecutable contendrá código adicional que implementa el entorno de ejecución. El archivo de objeto, por un lado, puede carecer de información del entorno de ejecución que se resolverá vinculando . Por otro lado, el código en el archivo de objeto aún depende de suposiciones en el sistema de ejecución; por ejemplo, una función puede leer parámetros de un registro particular o ubicación de pila, dependiendo de la convención de llamada utilizada por el entorno de ejecución.
Otro ejemplo es el caso de utilizar una interfaz de programación de aplicaciones (API) para interactuar con un sistema de tiempo de ejecución. Las llamadas a esa API parecen las mismas 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 tiempo 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 entender el comportamiento de la biblioteca con solo saber el lenguaje en el que está escrita la biblioteca. Sin embargo, una persona que lea el código de la API que invoca un sistema de tiempo de ejecución no podría entender el comportamiento de la llamada a la API con solo saber el lenguaje en el que está escrita 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 sistema de tiempo de ejecución. Por ejemplo, la instrucción trap es un método para cambiar los modelos de ejecución. Esta diferencia es lo que distingue a un modelo de ejecución invocado por API, como Pthreads, de una biblioteca de software habitual. Tanto las llamadas de Pthreads como las llamadas de bibliotecas de software se invocan a través de una API, pero el comportamiento de Pthreads no se puede entender en términos del lenguaje de la llamada. En cambio, las llamadas de Pthreads ponen en juego un modelo de ejecución externo, que se implementa mediante el sistema de ejecución de Pthreads (este sistema de ejecución suele ser el núcleo del sistema operativo).
Como ejemplo extremo, la propia CPU física puede considerarse como una implementación del sistema de ejecución de un lenguaje ensamblador específico. En esta perspectiva, el modelo de ejecución se implementa mediante la CPU física y los sistemas de memoria. Como analogía, los sistemas de ejecución para lenguajes de nivel superior se implementan mediante otros lenguajes. Esto crea una jerarquía de sistemas de ejecución, en la que la propia CPU (o, en realidad, su lógica en la capa de microcódigo o por debajo) actúa 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, 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 las variaciones en los servicios ofrecidos por los diferentes sistemas operativos. Esto también implica que el núcleo del sistema operativo puede considerarse en sí mismo como un sistema de ejecución y que el conjunto de llamadas del sistema operativo que invocan comportamientos del sistema operativo pueden considerarse interacciones con un sistema 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 ocultan incluso el conjunto de instrucciones del procesador . Este es el enfoque seguido por muchos lenguajes interpretados como AWK , y algunos lenguajes como Java , que están destinados a ser compilados 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 las características sofisticadas del lenguaje como la programación reflexiva . También permite que el mismo programa se ejecute 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 a código de máquina.
Un aspecto moderno de los sistemas de ejecución en tiempo real son los comportamientos de ejecución en paralelo, como los comportamientos que exhiben las construcciones de mutex en Pthreads y las construcciones de sección paralela en OpenMP . Un sistema de ejecución en tiempo real con tales comportamientos de ejecución en paralelo puede modularizarse de acuerdo con el enfoque de proto-ejecución en tiempo real.
Ejemplos notables de sistemas de ejecución en tiempo real 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 código de representación intermedia; su sistema de ejecución en tiempo real 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 dinámica de memoria, 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 de tipos dinámicos y de la resolución de referencias de métodos.
El compilador debe cooperar con el sistema operativo y otros programas del sistema para soportar 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
integrado directamente en el disco del programa. Todo lo que tiene que hacer para usar estas aplicaciones es insertar el disco en su
IBM PC
, encender el sistema y estará listo para comenzar. Esto elimina la necesidad de cargar un sistema operativo separado, cambiar los discos y arrancar el programa de aplicaciones. El software SpeedStart de la biblioteca de aplicaciones CP/M también: […] Le proporciona una versión gratuita en tiempo de ejecución de CP/M […] Elimina la necesidad de instalar cada nuevo programa de aplicación […] Le brinda compatibilidad con
el poderoso sistema operativo de 16 bits de
Digital Research ,
CP/M-86
, y el sistema operativo multitarea concurrente
CP/M de
última generación . […]
[…]
Dr. Logo
apareció por primera vez en el mercado minorista en el otoño de 1983 para
IBM PC
y subió a la cima de la
Hot List de Softsel
. La versión minorista incluía
SpeedStart CP/M
, una versión abreviada de
CP/M
que
se inicia automáticamente
cuando se enciende el sistema. […]
[1]
[…] Presentamos
SpeedStart
, el exclusivo sistema de software de carga y listo. La biblioteca de aplicaciones CP/M ofrece más que el mejor software de marca para
IBM PC
del mercado. Cada una de nuestras aplicaciones ofrece la comodidad inigualable de nuestro exclusivo sistema de un solo disco SpeedStart. SpeedStart es una versión especial del potente sistema operativo
CP/M-86
que está integrado en cada uno de nuestros discos de software. Cuando esté listo para trabajar, simplemente cargue el disco, encienda su IBM PC y ¡listo! SpeedStart elimina la tarea que consume mucho tiempo de cargar un disco operativo separado 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 suyo sin ningún coste adicional. Además, se puede omitir SpeedStart para ejecutar software en el sistema operativo IBM PC del futuro: el extraordinario
Concurrent CP/M
multitarea . […]
…] 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 )