| INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE CÓMPUTO |

Introducción | Contenido | Bibliografía

Introducción
Contenido
UNIDAD I
UNIDAD II
UNIDAD III
UNIDAD IV
UNIDAD V
UNIDAD VI
UNIDAD VII
UNIDAD VIII
UNIDAD IX Introdución 9.1 Máquina Virtual 9.2 Máquina Objeto 9.3 Administración de la memoria durante la ejecución

9.4 Código de 3 y 4 direcciones

9.5 Estructuras de control de flujo y de repetición (if then else, case, while, for)

PROBLEMARIO
Bibliografía

9.3 Administración de la memoria durante la ejecución

> En los capítulos anteriores vimos que la declaración de un nombre y el uso posterior de este nombre da lugar a manipulaciones de la tabla de símbolos. En el caso de la generación de código, es necesario transformar la información de la tabla de símbolos en direcciones de memoria. La asignación de memoria significa entonces, en función de la generación de código, la asignación de espacio de memoria para el almacenamiento de los nombres, las variables auxiliares definidas por el compilador y la información adicional de los procedimientos, como la dirección de retorno.
> Hay que distinguir entre: asignación estática y
> asignación dinámica.

> Durante la asignación estática, el espacio de memoria para los nombres se asignará cuando se compile el programa fuente. Esto quiere decir que todos los nombres del código fuente estarán unidos a una posición de memoria fija y que existirán mientras dure el programa.

> En cambio, en la asignación dinámica puede asignarse y liberarse el espacio de memoria de un nombre durante la ejecución del programa. Esto significa que los nombres de un procedimiento no están unidos a la misma posición de memoria cada vez que se activa el procedimiento y, sobre todo, que es posible ejecutar procedimientos recursivos. FORTRAN es un ejemplo típico de un lenguaje de programación con asignación estática de memoria; los lenguajes orientados a bloques, como PASCAL, son ejemplos representativos de la asignación dinámica.

> La asignación dinámica de memoria permite usar diferentes técnicas:

> asignación por pila,

> asignación por montículo.

> La primera se usa para procedimientos recursivos, mientras que la asignación por montículo es útil para manejar estructuras dinámicas de datos, como las listas enlazadas o los árboles.

> Asignación estática de memoria

> Con la asignación estática de memoria, en el momento de la compilación se conoce la dirección en ejecución de cada objeto de datos. Esto implica que el compilador sabe exactamente: el número de ocurrencias de todos los objetos, el tipo y, por tanto, el tamaño de todos los objetos.

> Por tanto, es obvio que los lenguajes que sólo permiten la asignación estática de memoria no permiten estructuras de datos dinámicas, como las matrices con límites variables, ni las estructuras recursivas que cambian de tamaño ni las llamadas recursivas a procedimientos.

> En la figura que se muestra a continuación presenta la organización de la memoria de una subrutina hipotética en FORTRAN, usando asignación estática de memoria.

> La parte superior de la memoria contiene el código de la subrutina, mientras que la parte inferior contiene la dirección de retorno y probablemente otra información de enlace, además de la lista de parámetros y las posibles variables auxiliares definidas por el compilador.

> Asignación dinámica de memoria

> La asignación dinámica de memoria es necesaria al manejar matrices dinámicas o estructuras recursivas de datos y programas, ya que no es posible predecir el tamaño de la memoria en el momento de la compilación.

> Asignación por pila

> La organización de la memoria en forma de pila es muy adecuada para la asignación dinámica del memoria (pila de ejecución) y para el manejo de procedimientos recursivos. La estrategia es muy simple: cada bloque del programa tiene su propia área de datos. Al invocar un bloque durante la ejecución (por ejemplo, una llamada a un procedimiento), se asigna espacio para el área de datos (variables locales e información sobre el mecanismo de llamada/retorno del procedimiento) en la pila de ejecución; es decir, se mete el área de datos en la pila. Este espacio es liberado al terminar la ejecución del bloque; o sea, se saca el área de datos de la pila.

> Esta estrategia se ejemplifica con el segmento de programa siguiente, el cual contiene procedimientos definidos recursivamente. El contenido de la pila de ejecución se rastrea en la figura después del programa que sigue.

> Una secuencia posible de llamadas a procedimientos del segmento de programa anterior podría ser P3 Pl P2 P2; esta secuencia está reflejada en la figura siguiente. En la figura mencionada se muestran las áreas de datos del programa principal (Mem_dinámico) y de los procedimientos llamados, para cada etapa de la secuencia P3 Pl P2 P2. Las áreas de datos respectivas se conocen como registros de activación.

> Atrás Siguiente

##### Introducción / Contenido / Unidad I / Unidad II / Unidad III / Unidad IV / Unidad V / Unidad VI / Unidad VII / Unidad VIII / Unidad IX / Problemario / Bibliografía

##### Inicio

##### Créditos

José Sánchez Juárez, Andrés Ortigoza Campos, Fabiola Ocampo Botello