CASTAÑÓN DE JESÚS JUAN JOSÉ. No. CONTROL: 15321030
AULA: 7SA HORA: 13:00 – 14:00 H
FECHA DE ENTREGA: 28/SEPTIEMBRE/2018
Construcción de Compiladores Principios y Práctica (Kenneth Louden) Esto puede requerir análisis extra, como el que realiza un optimizador, y parte de éste puede ser independiente de la máquina. Pero gran parte de la tarea de la generación de código depende de los detalles de la máquina objetivo. No obstante, las características generales de la generación de código permanecen iguales a través de una amplia variedad de arquitecturas. Esto es particularmente cierto para el ambiente en tiempo de ejecución o ambiente de ejecución, 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 información necesaria para guiar el proceso de la ejecución. De hecho, casi todos los lenguajes de programación utilizan una de tres clases de ambiente en tiempo de ejecución, cuya estructura esencial no depende de los detalles específicos de la máquina objetivo. Estas tres clases de ambientes son: el ambiente completamente estático característico de FORTRAN77; el ambiente basado en pila de lenguajes como C. C+ +, Pascal y Ada; y el ambiente completamente dinámico de lenguajes funcionales como LISP. También pueden utilizar híbridos a partir de todos los anteriores. Se comenta que cada una de estas clases de ambientes por turno, junto con las características del lenguaje que determinan qué ambientes son factibles, y cuáles deben ser sus propiedades. Esto incluye cuestiones de ámbito y asignación, la naturaleza de llamadas a procedimientos, y las variedades de mecanismos para paso de parámetros. Las constantes pequeñas de tiempo de compilación, tales como O y 1, por lo regular se insertan directamente en el código por medio del compilador y no se les asigna ningún 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 también se pueden insertar directamente en el código. 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 estática, se almacenan una vez en el inicio y posteriormente se buscan en esas ubicaciones mediante el código de ejecución. (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 asignación de datos dinámicos puede ser organiza- da de muchas maneras diferentes. Una organización típica divide esta memoria en un área de pila y un área de apilamiento o montículo (heap), donde el área de pila es utilizada para los datos cuya asignación se presenta en modo LIFO (por las siglas del término en inglés "último en entrar, primero en salir", es decir, "last- in, first-out") y el área de apilamiento es empleada para la asignación dinámica que no cumple con un protocolo LIFO.