Un programa como código fuente es sólo una colección de texto (código, declaraciones, etc. ) y que lo viva, que exige la adopción de medidas que se deben realizar en la máquina de destino. Un programa necesita recursos de memoria para ejecutar las instrucciones. El programa contiene los nombres de los procedimientos, los identificadores, etc., que requieren la asignación de la ubicación de memoria real en tiempo de ejecución.
De motor en tiempo de ejecución, nos referimos a un programa en ejecución. Entorno de tiempo de ejecución es un estado de la máquina de destino, que pueden incluir las bibliotecas de software, las variables de entorno, etc., para proporcionar servicios a los procesos que se ejecutan en el sistema.
Compatibilidad con Common Language Runtime system es un paquete, en su mayoría generados con el programa ejecutable y facilita la comunicación entre el proceso y el entorno en tiempo de ejecución. Éste se encarga de asignación de memoria y asignación mientras el programa se ejecuta.
Un programa es una secuencia de instrucciones en un número de procedimientos. Las instrucciones de un procedimiento se ejecutan de forma secuencial. El procedimiento tiene un inicio y un delimitador de fin y todo lo que hay en su interior se llama el cuerpo del procedimiento. El procedimiento identificador y la secuencia finita de instrucciones dentro que componen el cuerpo del procedimiento.
La ejecución de un procedimiento que se denomina su activación. Un registro de activación contiene toda la información necesaria para llamar a un procedimiento. Un registro de activación puede contener las siguientes unidades (dependiendo del idioma de origen usa).
Temporales | Almacenes temporales y valores intermedios de una expresión. |
Datos locales | Almacena los datos locales del procedimiento llamado. |
Estado de la máquina | Almacena estado de la máquina, tales como registros, contador de programa, etc., antes de que el procedimiento se denomina. |
Brazo de Control | Almacena la dirección de registro de activación de la persona que llama. |
Enlace de acceso | Almacena la información de los datos que se encuentran fuera del ámbito local. |
Parámetros reales | Almacena los parámetros reales, es decir, los parámetros que se utilizan para enviar información al procedimiento llamado. |
Valor de retorno | Almacena valores de retorno. |
Cuando un procedimiento se ejecuta, su registro de activación se almacena en la pila, también conocida como pila de control. Cuando un procedimiento llama a otro procedimiento, la ejecución de la persona que llama se suspende hasta que el procedimiento llamado finaliza la ejecución. En este momento, el registro de activación del procedimiento llamado se almacena en la pila.
Vamos a asumir que el control del programa pasa de una manera secuencial y cuando un procedimiento se llama, su control se transfiere al procedimiento llamado. Cuando una llamada se ejecuta el procedimiento, se devuelve el control a la persona que llama. Este tipo de flujo de control hace que sea más fácil de representar una serie de activaciones en forma de árbol, conocido como el árbol de activación.
Para entender este concepto, nos tomamos un trozo de código como ejemplo:
. . . printf(“Enter Your Name: “); scanf(“%s”, username); show_data(username); printf(“Press any key to continue…”); . . . int show_data(char *user) { printf(“Your name is %s”, username); return 0; } . . .
A continuación, se muestra el árbol de activación del código.
Ahora nos enteramos de que los procedimientos se ejecutan en profundidad, asignación de espacio de pila es la mejor forma de almacenamiento las activaciones para el procedimiento.
Entorno de tiempo de ejecución ejecución administra requisitos de memoria para las siguientes entidades:
Código: es conocido como el texto parte de un programa que no cambia en tiempo de ejecución. Sus requisitos de memoria son conocidos en el tiempo de compilación.
Procedimientos: Su texto es estático, sino que están llamados de modo aleatorio. Es por ello que, de apilamiento se utiliza para gestionar llamadas de procedimiento y las activaciones.
Variables: Las variables son conocidos en el tiempo de ejecución, a no ser que son globales o constante. Montón de asignación de memoria se utiliza para la gestión y asignación de asignación de memoria para las variables en el tiempo de ejecución.
En este esquema de asignación y de la recopilación de datos se enlaza a una ubicación fija en la memoria y que no cambie cuando se ejecuta el programa. Como los requisitos de memoria y los lugares de almacenamiento son conocidos de antemano, paquete compatibilidad en tiempo de ejecución para la asignación de memoria y de asignación no es necesario.
Llamadas de Procedimiento y las activaciones son administrados por medio de asignación de memoria de pila. Funciona en last-in-first-out (LIFO) método y de esta estrategia de asignación es muy útil para llamadas a procedimiento recursivo.
Las variables locales de un procedimiento se asignar y desasignar sólo en tiempo de ejecución. Asignación del montón se utiliza para asignar memoria dinámicamente para las variables y reclamar su devolución cuando las variables no son más necesarios.
Salvo memoria reservada estáticamente, tanto memoria de pila y montón pueden ampliar y reducir dinámicamente e inesperadamente. Por lo tanto, no pueden ser proporcionados con una cantidad fija de memoria en el sistema.
Tal como se muestra en la imagen de arriba, la parte de texto del código se asigna una cantidad fija de memoria. Memoria de pila y montón se organizan en los extremos de memoria total asignada al programa. Tanto disminuir y aumentar uno contra el otro.
El medio de comunicación entre los procedimientos se conoce como paso de parámetros. Los valores de las variables de un procedimiento de llamada se transfieren al procedimiento llamado por algún mecanismo. Antes de seguir adelante, en primer lugar ir a través de alguna terminología básica relativa a los valores de un programa.
El valor de una expresión se denomina r-valor. El valor contenido en una sola variable se convierte también en un valor de r si aparece en el lado derecho del operador de asignación, valores siempre se puede asignar a alguna otra variable.
La ubicación de la memoria (dirección) donde la expresión se almacena es conocida como la l-valor de la expresión. Siempre aparece en la parte izquierda de un operador de asignación.
Por ejemplo:
day = 1; week = day * 7; month = 1; year = month * 12;
En este ejemplo, tenemos entendido que los valores de las constantes como 1, 7, 12, y variables como día, semana, mes y año, todas tienen valores r. Sólo las variables que l-valores como son, además, la ubicación de la memoria que se les han asignado.
Por ejemplo:
7 = x + y;
Es un valor l error, ya que la constante 7 no representa un lugar de la memoria.
Las variables que tome la información que pasa por la persona que llama se llama parámetros formales. Estas variables son declaradas en la definición de la función llamada.
Las variables cuyos valores o direcciones se pasan al procedimiento llamado se denominan parámetros reales. Estas variables son especificados en la llamada a la función como argumentos.
Ejemplo:
fun_one() { int actual_parameter = 10; call fun_two(int actual_parameter); } fun_two(int formal_parameter) { print formal_parameter; }
Los parámetros formales cuentan con la información del parámetro real, dependiendo del parámetro técnica utilizada. Puede ser un valor o una dirección.
En el paso por valor, el procedimiento de llamada pasa el valor de r de parámetros reales y el compilador lo pone en el llamado procedimiento de registro de activación. Parámetros formales, a continuación, mantener los valores pasados por el procedimiento de llamada. Si los valores de los parámetros formales se cambian, no debería afectar a los parámetros reales.
En el paso por mecanismo de referencia, el valor l de el parámetro real se copian en el registro de activación del procedimiento llamado. Esta manera, el procedimiento llamado tiene ahora la dirección (la ubicación de la memoria) del parámetro real y el parámetro formal se refiere a la misma ubicación de la memoria. Por tanto, si el valor indicado por el parámetro formal ha cambiado, el impacto debe considerarse en el parámetro real que también con el mismo valor.
Este paso de parámetros mecanismo funciona de forma similar a "pasar por referencia", excepto que los cambios en los parámetros reales se realizan cuando el procedimiento llamado extremos. Una llamada a la función, los valores de los parámetros reales se copian en el registro de activación del procedimiento llamado. Los parámetros formales si manipulan no tienen efecto en tiempo de real de los parámetros reales (como l-se pasan los valores), pero cuando el procedimiento llamado termina, el l-valores de los parámetros formales se copian en el l-valores de parámetros reales.
Ejemplo:
int y; calling_procedure() { y = 10; copy_restore(y); //l-value of y is passed printf y; //prints 99 } copy_restore(int x) { x = 99; // y still has value 10 (unaffected) y = 0; // y is now 0 }
Cuando la función termina, el l-valor de parámetro formal x se copia en el parámetro real. Incluso si el valor de y se cambia antes de que el proceso se termina, el l-valor de x se copia en el l-valor de y hacer que se comporte como llamada por referencia.
Lenguajes como Algol proporcionar un nuevo tipo de paso de parámetros que funciona como mecanismo preprocesador en lenguaje C. En el paso por su nombre, el nombre del procedimiento que se llama sea reemplazado por su cuerpo real. Pasar por nombre textualmente las expresiones sustituye el argumento en una llamada a procedimiento para los parámetros correspondientes en el cuerpo del procedimiento, a fin de que ya se puede trabajar en parámetros reales, como pasar por referencia.