La ejecución en ingeniería informática y de software es el proceso mediante el cual una computadora o máquina virtual interpreta y actúa según las instrucciones de un programa informático . Cada instrucción de un programa es una descripción de una acción particular que debe llevarse a cabo para resolver un problema específico. La ejecución implica seguir repetidamente un ciclo de " búsqueda-decodificación-ejecución " para cada instrucción realizada por la unidad de control . A medida que la máquina ejecutora sigue las instrucciones, se producen efectos específicos de acuerdo con la semántica de esas instrucciones.
Los programas de una computadora pueden ejecutarse en un proceso por lotes sin interacción humana o un usuario puede escribir comandos en una sesión interactiva de un intérprete . En este caso, los "comandos" son simplemente instrucciones de programa, cuya ejecución está encadenada.
El término ejecutar se utiliza casi como sinónimo. Un significado relacionado de "ejecutar" y "ejecutar" se refiere a la acción específica de un usuario que inicia (o lanza o invoca ) un programa, como en "Ejecute la aplicación".
Antes de ejecutar un programa, primero debe escribirse. Esto generalmente se hace en código fuente , que luego se compila en tiempo de compilación (y se vincula estáticamente en tiempo de enlace ) para producir un ejecutable. Luego, este ejecutable se invoca, con mayor frecuencia por un sistema operativo, que carga el programa en la memoria ( tiempo de carga ), posiblemente realiza un enlace dinámico y luego comienza la ejecución moviendo el control al punto de entrada del programa; todos estos pasos dependen de la Interfaz binaria de aplicación del sistema operativo. En este punto, comienza la ejecución y el programa ingresa al tiempo de ejecución . Luego, el programa se ejecuta hasta que finaliza, ya sea en una terminación normal o en un bloqueo .
Un código ejecutable , un archivo ejecutable o un programa ejecutable , a veces denominado simplemente ejecutable o binario , es una lista de instrucciones y datos para hacer que una computadora "realice tareas indicadas de acuerdo con instrucciones codificadas ", [1] a diferencia de un archivo de datos que debe ser interpretado ( analizado ) por un programa para que tenga significado.
La interpretación exacta depende del uso. Tradicionalmente, "Instrucciones" se refiere a instrucciones de código de máquina para una CPU física . [2] En algunos contextos, un archivo que contiene instrucciones de script (como bytecode ) también puede considerarse ejecutable.
El contexto en el que se lleva a cabo la ejecución es crucial. Muy pocos programas se ejecutan en una máquina vacía . Los programas suelen contener suposiciones implícitas y explícitas sobre los recursos disponibles en el momento de la ejecución. La mayoría de los programas se ejecutan dentro de un sistema operativo multitarea y bibliotecas de tiempo de ejecución específicas del lenguaje de origen que proporcionan servicios cruciales que no proporciona directamente la computadora. Este entorno de apoyo, por ejemplo, suele desvincular un programa de la manipulación directa de los periféricos de la computadora, proporcionando en su lugar servicios más generales y abstractos.
Para que los programas y los controladores de interrupciones funcionen sin interferencias y compartan la misma memoria de hardware y acceso al sistema de E/S, en un sistema operativo multitarea que se ejecuta en un sistema digital con una sola CPU/MCU, se requiere tener algún tipo de facilidades de software y hardware para realizar un seguimiento de los datos de un proceso en ejecución (direcciones de páginas de memoria, registros, etc.) y para guardarlos y recuperarlos al estado en el que estaban antes de que se suspendieran. Esto se logra mediante un cambio de contexto. [3] : 3.3 [4] A los programas en ejecución a menudo se les asigna un Identificador de contexto de proceso (PCID).
En los sistemas operativos basados en Linux, un conjunto de datos almacenados en registros generalmente se guarda en un descriptor de proceso en la memoria para implementar el cambio de contexto. [3] También se utilizan PCID.
El tiempo de ejecución , runtime o tiempo de ejecución es la fase final del ciclo de vida de un programa informático , en la que el código se ejecuta en la unidad central de procesamiento (CPU) del ordenador como código de máquina . En otras palabras, el "tiempo de ejecución" es la fase de ejecución de un programa.
Un error de tiempo de ejecución se detecta después o durante la ejecución (estado de ejecución) de un programa, mientras que un error de tiempo de compilación es detectado por el compilador antes de que el programa se ejecute. La comprobación de tipos , la asignación de registros , la generación de código y la optimización de código se realizan normalmente en tiempo de compilación, pero pueden realizarse en tiempo de ejecución según el lenguaje y el compilador en particular. Existen muchos otros errores de tiempo de ejecución y se manejan de manera diferente por diferentes lenguajes de programación , como errores de división por cero , errores de dominio, errores de subíndice de matriz fuera de límites , errores de desbordamiento aritmético , varios tipos de errores de desbordamiento y subdesbordamiento , y muchos otros errores de tiempo de ejecución generalmente considerados como errores de software que pueden o no ser detectados y manejados por cualquier lenguaje de computadora en particular.
Cuando se va a ejecutar un programa, un cargador primero realiza la configuración de memoria necesaria y vincula el programa con cualquier biblioteca vinculada dinámicamente que necesite, y luego la ejecución comienza a partir del punto de entrada del programa . En algunos casos, un lenguaje o implementación hará que estas tareas las realice el entorno de ejecución del lenguaje, aunque esto es inusual en lenguajes convencionales en sistemas operativos de consumo comunes.
Algunas depuraciones de programas solo se pueden realizar (o son más eficientes o precisas cuando se realizan) en tiempo de ejecución. Los errores lógicos y la comprobación de límites de matriz son ejemplos. Por este motivo, algunos errores de programación no se descubren hasta que el programa se prueba en un entorno de producción con datos reales, a pesar de las comprobaciones sofisticadas en tiempo de compilación y las pruebas previas al lanzamiento. En este caso, el usuario final puede encontrar un mensaje de "error en tiempo de ejecución".
El manejo de excepciones es una característica del lenguaje diseñada para manejar errores en tiempo de ejecución, proporcionando una forma estructurada de detectar situaciones completamente inesperadas, así como errores predecibles o resultados inusuales sin la cantidad de comprobación de errores en línea que requieren los lenguajes que no lo tienen. Los avances más recientes en los motores de ejecución permiten el manejo automatizado de excepciones , que proporciona información de depuración de "causa raíz" para cada excepción de interés y se implementa independientemente del código fuente, adjuntando un producto de software especial al motor de ejecución.
Un sistema de ejecución , también llamado entorno de ejecución , implementa principalmente partes de un modelo de ejecución . [ aclaración necesaria ] Esto no debe confundirse con la fase del ciclo de vida de ejecución de un programa, durante la cual el sistema de ejecución está en funcionamiento. Al tratar el sistema de ejecución como algo distinto del entorno de ejecución (RTE), el primero puede definirse como una parte específica del software de aplicación (IDE) utilizado para la programación , una pieza de software que proporciona al programador un entorno más conveniente para ejecutar programas durante su producción ( pruebas y similares), mientras que el segundo (RTE) sería la instancia misma de un modelo de ejecución que se aplica al programa desarrollado que luego se ejecuta en el sistema de ejecución antes mencionado .
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 y 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 la configuración y la gestión de 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. [5]
El ciclo de instrucción (también conocido como ciclo de búsqueda-decodificación-ejecución , o simplemente ciclo de búsqueda-ejecución ) es el ciclo que sigue la unidad central de procesamiento (CPU) desde el arranque hasta que se apaga el ordenador para procesar instrucciones. Está compuesto de tres etapas principales: la etapa de búsqueda, la etapa de decodificación y la etapa de ejecución.
En las CPU más simples, el ciclo de instrucciones se ejecuta de manera secuencial, y cada instrucción se procesa antes de que comience la siguiente. En la mayoría de las CPU modernas, los ciclos de instrucciones se ejecutan en forma concurrente , y a menudo en paralelo , a través de una secuencia de instrucciones : la siguiente instrucción comienza a procesarse antes de que finalice la instrucción anterior, lo que es posible porque el ciclo se divide en pasos separados. [6]
Un sistema que ejecuta un programa se denomina intérprete del programa. En términos generales, un intérprete ejecuta directamente un programa. Esto contrasta con un traductor de lenguaje que convierte un programa de un lenguaje a otro antes de ejecutarlo.
Una máquina virtual ( VM ) es la virtualización / emulación de un sistema informático . Las máquinas virtuales se basan en arquitecturas informáticas y proporcionan la funcionalidad de una computadora física. Sus implementaciones pueden implicar hardware o software especializados, o una combinación de ambos.
Las máquinas virtuales se diferencian y están organizadas según su función, que se muestra aquí:
Algunos emuladores de máquinas virtuales, como QEMU y los emuladores de consolas de videojuegos , están diseñados para emular (o "imitar virtualmente") diferentes arquitecturas de sistemas, lo que permite la ejecución de aplicaciones de software y sistemas operativos escritos para otra CPU o arquitectura. La virtualización a nivel de SO permite que los recursos de una computadora se particionen a través del núcleo . Los términos no son universalmente intercambiables.