Generador de Código Objeto Programación II Margarita Álvarez Generador de código objeto Toma como entrada una representación intermedia del programa fuente y produce como salida un programa objeto equivalente. Programa fuente Etapa inicial Código intermedio Optimizador de código intermedio Código intermedio Generador de Código Objeto Programa objeto Tabla de Símbolos 1 Generador de código objeto Programa Objeto: puede tener distintas formas: z z z Programa en lenguaje de máquina absoluto: tiene la ventaja que se puede colocar en una posición fija de memoria y ejecutarse inmediatamente. Programa en lenguaje de máquina relocalizable: permite que los subprogramas se compilen por separado. Un conjunto de módulos objetos relocalizables se pueden enlazar y cargar para su ejecución mediante un cargador enlazador. Programa en lenguaje ensamblador: facilita el proceso de generación de código. Se pueden generar instrucciones simbólicas y utilizar las macros del ensamblador para ayudar a generar el código. Generador de código objeto Administración de memoria: la correspondencia entre los nombres del programa fuente con direcciones de objetos de datos en la memoria durante la ejecución la realiza la etapa inicial en cooperación con el generador de código. Las entradas en la Tabla de Símbolos se van creando conforme se examina las declaraciones de un procedimiento. El tipo en una declaración determina la cantidad de memoria necesaria para el nombre declarado. Según la información de la Tabla de Símbolos se pueden determinar una dirección relativa para el nombre de un área de datos para el procedimiento. Selección de instrucciones: es importante que el conjunto de instrucciones sea uniforme y completo. Las velocidades de las instrucciones es un factor importante. Si no se tiene en cuenta la eficiencia del programa objeto, la selección de instrucciones es sencilla. Para cada tipo de proposición de tres direcciones, se puede diseñar un esqueleto de código. Ejemplo: código de tres direcciones de: x := y + z MOV y, R0 /* cargar y en el registro R0 */ ADD z, R0 /* suma z a R0 */ MOV R0, x /* almacenar R0 en x */ 2 Generador de código objeto Asignación de registros: Las instrucciones que implican operandos en registros son generalmente más rápidas que las de los operandos en memoria. Por lo tanto, utilizar eficientemente los registros es fundamental para generar un buen código. El uso de registros se divide en dos subproblemas: z Durante la asignación de los registros: se selecciona el conjunto de variables que residirá en los registros en un momento del programa. z Durante la fase posterior de asignación a los registros, se escoge el registro específico en el que residirá una variable. Elección del orden de evaluación: el orden en que se realizan los cálculos puede variar la eficiencia del código objeto. Algunos ordenamientos de los cálculos necesitan menos registros que otros para guardar resultados intermedios. Elegir un orden mejor es un problema difícil, NP-completo. 3