Generador de Código Objeto

Anuncio
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
Descargar