Cuando un programa se ejecuta sobre un sistema operativo existe un proceso previo
llamado cargador que suministra al programa un bloque contiguo de memoria sobre el
cual ha de ejecutarse. El programa resultante de la compilación debe organizarse de
forma que haga uso de este bloque. Para ello el compilador incorpora al programa objeto
el código necesario.
Las técnicas de gestión de la memoria durante la ejecución del programa difieren de unos lenguajes a otros, e incluso de unos compiladores a otros.
Para lenguajes imperativos, los compiladores generan programas que tendrán en tiempo
de ejecución una organización de la memoria similar (a grandes rasgos) a la que aparece
en la figura 1.

En este esquema se distinguen las secciones de:
- El Código
- La Memoria Estática.
- La Pila.
- El Montón.
El código:Es la zona donde se almacenan las instrucciones del programa ejecutable en código
máquina, y también el código correspondiente a los procedimientos y funciones que
utiliza. Su tamaño puede fijarse en tiempo de compilación.
La memoria estáticaLa forma más fácil de almacenar el contenido de una variable en memoria en tiempo de
ejecución es en memoria estática o permanente a lo largo de toda la ejecución del
programa. No todos los objetos (variables) pueden ser almacenados estáticamente. Para
que un objeto pueda ser almacenado en memoria estática su tamaño ( número de bytes
necesarios para su almacenamiento) ha de ser conocido en tiempo de compilación. Como
consecuencia de esta condición no podrán almacenarse en memoria estática:
• Los objetos correspondientes a procedimientos o funciones recursivas, ya que en tiempo
de compilación no se sabe el número de variables que serán necesarias.
• Las estructuras dinámicas de datos tales como listas, árboles, etc. ya que el número de
elementos que la forman no es conocido hasta que el programa se ejecuta.
La PilaLa aparición de lenguajes con estructura de bloque trajo consigo la necesidad de técnicas
de alojamiento en memoria más flexibles, que pudieran adaptarse a las demandas de
memoria durante la ejecución del programa. En estos lenguajes, cada vez que comienza
la ejecución de un procedimiento se crea un registro de activación para contener los
objetos necesarios para su ejecución, eliminandolo una vez terminada ésta.
Dado que los bloques o procedimientos están organizados jerárquicamente, los distintos
registros de activación asociados a cada bloque deberán colocarse en una pila en la que
entrarán cuando comience la ejecución del bloque y saldrán al terminar el mismo. (Fig.
5b) La estructura de los registros de activación varía de unos lenguajes a otros, e incluso
de unos compiladores a otros. Este es uno de los problemas por los que a veces resulta
difícil enlazar los códigos generados por dos compiladores diferentes. En general, los
registros de activación de los procedimientos suelen tener algunos de los campos que
pueden verse en la fig.
5a.