Compiladores II ( /04/ :03) Tema 2. Generación de Código para Estructuras Complejas Lecciones 3 y 4
Compiladores II ( /04/ :03) Arrays de tamaño variable Un array se considera de tamaño variable cuando en tiempo de ejecución se establecen sus dimensiones. Cuestiones –Donde guardarlo –Cálculo de la posición de los elementos del array Arrays locales de Tamaño variable int f(int n) { int a[n]; float b[2*n];... } –Como guardar el array de tamaño variable Un array de tamaño variable se guarda con una cabecera que contiene sus dimensiones y un apuntador al espacio de la pila que contiene sus elementos.
Compiladores II ( /04/ :03) Arrays de Tamaño Variable en la Pila Los elementos del array se guardan al final del bloque de activación de la función n n*2 Otras variables Elementos del array a Elementos del array b ED PC Argumentos B SP No varía el código de salida de la función SP=B B=*SP++ Ret
Compiladores II ( /04/ :03) Case. Selección por: –Seleccionar una rama de ejecución a partir de ver si un valor de una expresión es igual a una constante. Formas de implementación: –Comparaciones secuenciales –Tabla de saltos Indice como selector Pares valor-dirección –Arbol de selección –Otras: tabla hash, etc.
Compiladores II ( /04/ :03) Goto y Otros Saltos Salto local sin modificar la pila –Salto a etiqueta –Salida de estructuras de control Salto no local –Salto a etiqueta predeclarada –Salto sin declaración de etiqueta Excepciones –Bloques de excepción –Tabla de intervalos de código Salto local sin modificar la pila –El tamaño de la pila es el mismo para el código fuente como el código destino –Código generado: Instrucción de salto incondicional del procesador El destino del salto es una etiqueta –Hay que verificar que la etiqueta exista –Y que el tamaño de la pila no varie para el código fuente y destino Modificación del tamaño de la pila –Declaración de variables locales void f() { goto mal; if (…) { int j=10; mal:... – Poner un argumento en la pila –Instrucciones Try Catch –Etc.
Compiladores II ( /04/ :03) Salto Local sin Modificar la Pila Condición a verificar –El tamaño de la pila es el mismo para el código fuente como el código destino Código generado –Instrucción de salto incondicional del procesador Salto a etiqueta –Considerar que el ámbito donde es válida una etiqueta no puede haber variaciones del tamaño de la pila. Ámbitos válidos en C: –función –instrucción Ámbitos válidos en LISP: –Ninguno. Razón: en medio del cálculo de los argumentos de una función se puede producir un salto.
Compiladores II ( /04/ :03) Salida de estructuras de control Instrucciones –break –continue Normalmente el tamaño de la pila es el mismo para el código fuente como el código destino Problema: –Ha donde hay que saltar –Uso de la tabla de símbolo u otra pila para guardar las etiquetas de salto.
Compiladores II ( /04/ :03) Detección de la Modificación del Tamaño de la Pila Etiquetas predeclaradas –Cada instrucción que modifica el tamaño de la pila pone en la tabla de símbolos una marca.
Compiladores II ( /04/ :03) Salto local con modificación de la pila –La pila se menor para el código destino que para el código fuente, pero se mantiene la misma base del bloque de activación
Compiladores II ( /04/ :03) Salto entre funciones –La pila se menor para el código destino que para el código fuente y puede variar la base del bloque de activación
Compiladores II ( /04/ :03) Goto asignado, calculado
Compiladores II ( /04/ :03) Excepciones