Você está na página 1de 11

UNIDAD 5

AMBIENTES DE EJECUCIN
OBJETIVO GENERAL: Dar al participantes las estructuras bsicas de
ejecucin de programas, despus de haber estudiado y entendido las fases de
anlisis de un compilador, para de esta manera pueda optimizar el cdigo.

OBJETIVOS EPECFICOS.
Conocer los ambientes de ejecucin del software de desarrollo
Estudiar la mejor forma de aprovechar los ambientes de ejecucin de los
compiladores actuales
Analizar como se organiza la memoria en el tiempo de ejecucin de un
programa

En unidades anteriores estudiamos las fases de un compilador que realiza


anlisis esttico del lenguaje fuente. Esto incluy anlisis lxico, anlisis
sintctico y anlisis semntico esttico. Este anlisis slo depende de las
propiedades del lenguaje fuente: es independiente por completo del lenguaje
objeto (ensamblador o de mquina) y de las propiedades de la mquina objeto
y su sistema operativo.
En esta quinta unidad volvemos a la tarea de estudiar cmo un compilador
genera cdigo ejecutable. Esto puede involucrar anlisis adicional, como el que
realiza un optimizador, y parte de ste puede ser independiente de la mquina.
Pero gran parte de la tarea de la generacin de cdigo depende de los detalles
de la mquina objeto. No obstante, las caractersticas generales de la
generacin de cdigo permanecen iguales a travs de una amplia variedad de
arquitecturas. Esto es particularmente cierto para el ambiente en tiempo de
ejecucin o ambiente de ejecucin, el cual es la estructura de la memoria y los

registros de la computadora objetivo con los que se administra la memoria y se


mantiene la informacin necesaria para guiar el proceso de la ejecucin. De
hecho, casi todos los lenguajes de programacin utilizan una de tres clases de
ambiente en tiempo de ejecucin, cuya estructura esencial no depende de los
detalles especficos de la mquina objeto.
Estas tres clases de ambientes son: el ambiente completamente esttico
caracterstico de FORTRAN77; el ambiente basado en pila de lenguajes como
C, C++, Pascal, JAVA y Ada; y el ambiente completamente dinmico de
lenguajes funcionales como LISP. Tambin pueden utilizar hbridos a partir de
todos los anteriores.
En esta unidad comentaremos cada una de estas clases de ambientes por
turno, junto con las caractersticas del lenguaje que determinan qu ambientes
son factibles, y cules deben ser sus propiedades. Esto incluye cuestiones de
mbito y asignacin, la naturaleza de llamadas a procedimientos, y las
variedades de mecanismos para paso de parmetros. Aqu, el enfoque se
centrar en la estructura general del ambiente y en el siguiente captulo, en el
cdigo real que es necesario generar para mantener el ambiente. En este
aspecto es importante tomar en cuenta que un compilador puede mantener un
ambiente slo de manera indirecta, ya que debe generar cdigo para realizar
las operaciones de mantenimiento necesarias durante la ejecucin del
programa. En contraste, un intrprete tiene una tarea ms fcil, puesto que
puede mantener el ambiente directamente dentro de sus propias estructuras de
datos.

ORGANIZACIN

DE

MEMORIA

DURANTE

LA

EJECUCIN

DEL

PROGRAMA

La memoria de una computadora tpica est dividida en un rea de registro y


una memoria acceso aleatorio (RAM), ms lenta, que se puede abordar
directamente. El rea de RAM tambin puede dividirse en un rea de cdigo y

un rea de datos. En la mayora de lenguajes compilados no es posible


efectuar cambios al rea de cdigo durante la ejecucin, y el rea de cdigo y
de datos pueden visualizarse como separadas de manera conceptual. Adems,
como e rea de cdigo se fija antes de la ejecucin, todas las direcciones de
cdigo se pueden calcular en tiempo de compilacin, y el rea de cdigo se
puede contemplar de la manera siguiente:

Punto de entrada mediante el procedimiento 1

cdigo para el
procedimiento 1

Punto de entrada mediante el procedimiento 2

cdigo para
el procedimiento 2
.
.
.

Punto de entrada mediante el procedimiento n

cdigo para el
procedimiento n

Cdigo en memoria
En particular, el punto de entrada de cada procedimiento y funcin se conoce
en tiempo de compilacin. No se puede decir lo mismo de la asignacin de
datos, ya que solamente pequea parte de la misma puede asignarse en
ubicaciones fijas en memoria antes de que comience la ejecucin. Gran parte
del resto de la unidad se dedica a cmo manejar la asignacin de datos que no
es fija, o bien, que es dinmica.
Existe una clase de datos que pueden ser fijados en memoria antes de la
ejecucin y que comprenden los datos globales y/o estticos de un programa.

(En FORTRAN77, a diferencia de la mayora de los lenguajes, todos los datos


son de esta clase.) Tales datos por lo regular se asignan de manera separada
en un rea fija de manera similar al cdigo. En Pascal, las variables globales se
encuentran en esta clase, lo mismo que las variables estticas y externas de C.
Una cuestin que surge en la organizacin del rea global/esttica involucra
constantes que son conocidas en tiempo de compilacin. stas incluyen las
declaraciones const de C y Pascal, adems de valores de literales utilizadas en
el cdigo mismo, tal como la cadena Hello%d\n y el valor entero 12345 en la
sentencia C
printf(Hello %d\n,12345);
Las constantes pequeas de tiempo de compilacin, tales como O y 1, por lo
regular se insertan directamente en el cdigo por medio del compilador y no se
les asigna ningn espacio de da tos. Tampoco se necesita asignar espacio en
el rea de datos global para procedimientos o funciones globales, puesto que el
compilador conoce sus puntos de entrada y tambin se pueden insertar
directamente en el cdigo. Sin embargo, a los valores enteros grandes, los
valores de punto flotante y, en particular, las literales de cadena se les asigna
por lo regular memoria en el rea global/esttica, se almacenan una vez en el
inicio y posteriormente se buscan en esas ubicaciones mediante el cdigo de
ejecucin. (En realidad, en las literales de cadena C son visualizados como
apuntadores, de modo que deben ser almacenadas de esta manera.)
El rea de memoria utilizada para la asignacin de datos dinmicos puede ser
organizada de muchas maneras diferentes. Una organizacin tpica divide esta
memoria en un rea de pila y un rea de apilamiento o montculo (heap), donde
el rea de pila es utilizada para los datos cuya asignacin se presenta en modo
LIFO (por las siglas del trmino en ingls ltimo en entrar, primero en salir, es
decir, last-in, first-out) y el rea de apilamiento es empleada para la
asignacin dinmica que no cumple con un protocolo LIFO (la asignacin de
apuntadores en C, por ejemplo). A menudo la arquitectura de la mquina
objetivo incluir una pila de procesador, y al usar esta pila permitir emplear

soporte de procesador para llamadas de procedimiento y retornos (el


mecanismo principal que utiliza asignacin de memoria basada en pila). En
ocasiones, un compilador tendr que hacer preparativos para la asignacin
explcita de la pila del procesador en un lugar apropiado en la memoria.
Una organizacin general de almacenamiento en tiempo de ejecucin que tiene
todas las categoras de memoria descritas puede tener el aspecto que se
presenta a continuacin:

rea de cdigo

rea
global/esttica

pila

espacio libre

apilamiento o
montculo (heap)

Las flechas en esta imagen indican la direccin de crecimiento de la pila y el


apilamiento (heap). Tradicionalmente, la pila se representa incrementndose
hacia abajo en la memoria de manera que su tope o parte superior en realidad
est en la parte inferior de su rea ilustrada.
El apilamiento tambin se representa de manera similar a la pila, pero no es
una estructura. LIFO, y su incremento y decremento son ms complicados de
lo que indica la flecha. En algunas organizaciones se asigna a la pila y al
apilamiento secciones paradas de memoria, en vez de ocupar la misma rea.
Una unidad importante de la asignacin de memoria es el registro de activacin
procedimiento, el cual contiene la memoria asignada a los datos locales de un
procedimiento o funcin cuando son llamados o activados. Un registro de
activacin, como mnimo debe contener las secciones siguientes:

espacio para argumentos (parmetros)


espacio para informacin de administracin,
incluyendo direcciones de retorno
espacio para datos locales
espacio para temporales locales

Aqu hacemos nfasis, en que esta imagen slo ilustra la organizacin general
de un registro de activacin. Los detalles especficos, incluyendo el orden de
los datos que contiene, dependern de la arquitectura la mquina objetivo, de
las propiedades del lenguaje que se est compilando, e incluso de las
preferencias del escritor del compilador.

Algunas partes de un registro de activacin tienen el mismo tamao para todos


los procedimientos; el espacio para la informacin de administracin, por
ejemplo. Otras partes como el espacio para los argumentos y datos locales,
pueden permanecer fijas para cada procedimiento individual, pero variarn
entre un procedimiento y otro. Algunas partes del registro de activacin tambin
pueden ser asignadas de manera automtica mediante el procesador o
llamadas de procedimiento (el almacenamiento de la direccin de retomo, por
ejemplo). Otras partes (como el espacio temporal local) pueden necesitar ser
asignadas de manera explcita mediante instrucciones generadas por el
compilador.
Dependiendo del lenguaje, los registros de activacin pueden ser asignados en
el rea esttica (FORTRAN77 - el rea de la pila (C, Pascal, JAVA) o el rea de
apilamiento (LISP). Cuando los registros de activacin se conservan en la pila,
en ocasiones se hace referencia a ellos como marcos de pila.
Los registros de procesador tambin forman parte de la estructura del ambiente
de ejecucin. Los registros pueden ser utilizados para almacenar elementos
temporales, variables locales o incluso variables globales. Cuando un
procesador tiene muchos registros, como e el caso en los procesadores RISC
ms recientes, toda el rea esttica y los registros de activacin completos
pueden ser conservados por completo en registros. Los procesadores tambin
tienen registros de propsito especfico para mantenerse al tanto de la
ejecucin, tales como el contador de programa (pc, program counter) y el
apuntador de pila (sp, stack pointer) en la mayora de las arquitecturas.
Tambin puede haber registros especficamente diseados para mantenerse al
tanto de las activaciones de procedimiento. Algunos registros tpicos de esta
naturaleza son el apuntador de marco (fp, frame pointerli, que apunta al registro
de activacin actual, y el apuntador de argumento (ap, argument pointer), que
apunta al rea del registro de activacin reservado para argumentos (valores
de parmetro).

Una parte particularmente importante del diseo de un ambiente de ejecucin


es la determinacin de la secuencia de operaciones que deben ocurrir cuando
se llama a un procedimiento o funcin. Tales operaciones pueden incluir la
asignacin de memoria para el registro de activacin, el clculo y
almacenamiento de los argumentos, y el almacenamiento y establecimiento de
los registros necesarios para efectuar la llamada. Estas operaciones por lo
regular se conocen como secuencia de llamada. Las operaciones adicionales
necesarias cuando un procedimiento, o una funcin, es devuelto, tal como la
ubicacin del valor de re torno al que se puede tener acceso mediante el
elemento que llama, el reajuste de los registros y la posible liberacin de la
memoria del registro de activacin, por lo general tambin se consideran parte
de la secuencia de llamada. Si es necesario, haremos referencia a la parte de
la secuencia de llamada que se realiza durante una llamada como la secuencia
de llamada y la parte que es efectuada al regreso como la secuencia de
retorno.
Los aspectos importantes del diseo de la secuencia de llamada son 1) cmo
dividir las operaciones de la secuencia de llamada entre el elemento que llama
y el elemento llamado (es decir, cunto cdigo de la secuencia de llamada
colocar en el punto de llamada y cunto colocar al principio del cdigo de cada
procedimiento) y 2) hasta qu punto depender del soporte del procesador de
llamadas en vez de generar cdigo explcito para cada paso de la secuencia de
llamada. El punto 1) es un asunto particularmente espinoso, puesto que por lo
regular es ms fcil generar el cdigo de la secuencia de llamada en el punto
de llamada en vez de hacerlo desde el interior del elemento llamado, pero al
hacerlo as se provoca que crezca el tamao del cdigo generado, puesto que
el mismo cdigo debe ser duplicado en cada sitio de llamada. Ms adelante se
tratarn estas cuestiones con ms detalle.
Como mnimo, el elemento que llama es responsable de calcular los
argumentos y colocarlos en ubicaciones donde puedan ser encontrados por el
elemento llamado (quizs directamente en el registro de activacin del
elemento llamado). Adems, el estado de la mquina en el punto de llamada,
incluyendo la direccin de retorno y, posiblemente, los registros que se

encuentran en uso, deben ser guardados, ya sea por el elemento que llama o
por el elemento llamado, o de manera parcial por ambos. Finalmente, tambin
debe ser establecida cualquier informacin adicional de administracin, de
nueva cuenta, quiz de alguna manera en la que intervengan tanto el elemento
que llama como el elemento llamado.
AMBIENTES DE EJECUCIN COMPLETAMENTE ESTTICOS
La clase ms simple de un ambiente de ejecucin es aquella en la cual todos
los datos son estticos y permanecen fijos en la memoria mientras dure la
ejecucin del programa. Un ambiente de esta clase puede utilizarse para
implementar un lenguaje en el cual no hay apuntadores o asignacin dinmica,
y en el cual los procedimientos no puedan ser llamados de manera recursiva.
El ejemplo estndar de un lenguaje as es FORTRAN77.
En un ambiente completamente esttico no slo las variables globales, sino
todas las variables, son asignadas de manera esttica. As, cada procedimiento
tiene slo un registro de activacin nico, que es asignado estticamente antes
de la ejecucin. Se puede tener acceso directamente a todas las variables, ya
sean locales o globales, mediante direcciones fijas, y la memoria completa del
programa se puede visualizar como sigue:

cdigo para el procedimiento


principal

cdigo para el procedimiento 1

cdigo para el procedimiento n

rea de datos globales

registro de activacin
del procedimiento principal

registro de activacin
del procedimiento 1

registro de activacin
del procedimiento n

En un ambiente as hay relativamente poco gasto general en trminos de


administracin informacin a mantener en cada registro de activacin, y no es
necesario mantener informacin extra acerca del ambiente (aparte de, tal vez,
la direccin de retorno) en un registro activacin. La secuencia de llamada para
un ambiente de esta naturaleza tambin es particularmente simple. Cuando se
llama a un procedimiento, cada argumento es calculado y almacenado en su
ubicacin de parmetro apropiada en la activacin del procedimiento que est
llamando. Entonces la direccin de retomo en el cdigo del elemento que llama
se graba, y se efecta un salto al inicio del cdigo del procedimiento llamado. Al
regreso se hace un simple salto a la direccin de retomo.

ACTIVIDADES
1. Realice un programa en un lenguaje de programacin que conozca, con
la estructura de ejecucin del mismo, mostrando paso a paso cada una
de las actividades que realiza el compilador.
Envi para revisin de su tutor el seudocdigo y una impresin de
pasada del mismo.
Esta actividad debe estar acompaada de un documento donde usted
explique cada una de las tareas, procesos, etc. , que realiza el
programa.

Você também pode gostar