Compiladores e intrpretes Generacin de cdigo Profesor Eridan

  • Slides: 10
Download presentation
Compiladores e intérpretes Generación de código Profesor: Eridan Otto

Compiladores e intérpretes Generación de código Profesor: Eridan Otto

Generación de código • • • Introducción Máquina objeto y juego de instrucciones Uso

Generación de código • • • Introducción Máquina objeto y juego de instrucciones Uso de ASA Uso de Notación Polaca Uso de códigos de tres direcciones

Compiladores e intérpretes Generación de código : Introducción – Es un proceso de tradución

Compiladores e intérpretes Generación de código : Introducción – Es un proceso de tradución de la representación intermedia a código objeto: – Normalmente ensamblador, con referencias relativas a memoria. – Se debe tener en cuenta la arquitectura de la máquina para realizar una gestión eficiente de la memoria y de los registros. – Primero se generan las directivas para reservar memoria para las variables y los datos – Por ejemplo, los árboles de sintaxis abstracta, se recorren para generar código directamente – Hay que tener en cuenta – Los lenguajes fuente y objeto – Gestión de Memoria y de registros – Juego de instrucciones – Orden de evaluación

Compiladores e intérpretes Generación de código : Máquina Objeto y juego de instrucciones –

Compiladores e intérpretes Generación de código : Máquina Objeto y juego de instrucciones – – La familiaridad con la máquina objeto y su juego de instrucciones es un prerequisito para diseñar un buen generador de código Sin embargo, se para realizar una discusión sobre los principios básicos de la geneneración de código, se usa sólo un modelo genérico. El modelo es el siguiente: – Direccionamiento de un byte relativo, es decir que se pueden usar símbolos para referirse a las direcciones en memoria. – n Registros de CPU , R 0, R 1, . . . Rn-1 Todo programa parte en la dirección 0 y las instrucciones tienen la forma: [dirección] operador fuente, destino – Donde operador es la instrucción en si que se ejecuta sobre las dos direcciones, dejendo el resultado en la dirección de destino: – Fuente: dirección, constante(# seguida de un numro), registro – Destino: dirección, registro. – La idea es usar las variables temporales del código intermedio en los registros, de la manera más óptima posible, en la fase enterior – Es más optimo hacer operaciones con un registro que con dos direciones de memoria

Compiladores e intérpretes Generación de código : Máquina Objeto y juego de instrucciones –

Compiladores e intérpretes Generación de código : Máquina Objeto y juego de instrucciones – Juego de instrucciones: – Mov , mueve fuente a destino – Add, suma fuente y destino, dejando resultado en destino – Sub, resta fuente al destino, dejando resultado en destino – Mul, multiplica fuente y destino, dejando resultado en destino – Div, resta fuente del destino, dejando resultado en destino – Goto, salta a la dirección fuente – Cj<rel>, salta a la dirección fuente si el resultado del último cálculo o movimiento a un registro es negativo, cero o positivo deacuerdo con: – <rel>: <=, el resultado es negativo o 0 – <rel>: =, el resultado es 0 – <rel>: >=, el resultado es positivo o 0 – <rel>: <, el resultado es negativo – <rel>: >, el resultado es positivo – <rel>: <>, el resultado no es 0

Compiladores e intérpretes Generación de código : Uso de Arboles de sintaxis Abstracta –

Compiladores e intérpretes Generación de código : Uso de Arboles de sintaxis Abstracta – – Para generar código, se debe recorrer en profundidad el árbol y por cada operación ir generando una instrucción en código de máquina. – No olvidar los movimientos desde y hacia los registros. – Las operaciones deben hacerse con al menos un registro. – Intentar optimizar el ASA, antes de generar el código. Ejemplo: Genere código objeto a partir del siguiente ASA : = x + + x * a b * a c b c

Compiladores e intérpretes Generación de código : Uso de Arboles de sintaxis Abstracta –

Compiladores e intérpretes Generación de código : Uso de Arboles de sintaxis Abstracta – Optimizando : = x + y + * a b 3 c 1 Mov b, R 0 2 Mul c, R 0 /*en R 0 b*c */ 3 mov R 0, R 1 4 add a, R 1 /*en R 1 a+b*c */ 5 Mov R 1, x 6 Add #3, R 0 /*en R 0 3+b*c */ 7 Mov R 0, y

Compiladores e intérpretes Generación de código : Uso de notación polaca – – –

Compiladores e intérpretes Generación de código : Uso de notación polaca – – – Uso práctico en expresiones matemáticas El código se genera cuando se encuentra el operador Ejemplo: SABC*+: = Pila Entrada Godigo Generado $ SABC*+: =$ $SA BC*+: =$ $SABC *+: =$ 1 mov C, R 0 2 mult B, R 0 $SAT 1 +: =$ 3 Add A, R 0 $ST 2 : =$ 4 mov R 0 S $ $

Compiladores e intérpretes Generación de código : Uso de códigos de tres direcciones –

Compiladores e intérpretes Generación de código : Uso de códigos de tres direcciones – – Una vez derivados los cuartetos de la generación de código intermedio dirigida por sintaxis, derive el código de tercetos, para lo cual, derivar código final es casi directo. O derive manualmente los tercetos. Estrategias de generación de código a partir de tercetos. Ejemplos: Expresión tercetos codigo de máquina S: = A+ B * C (1) * B C (1) mov C, R 0 (2) mul B, R 0 (2) + A (1) (3) add, A, R 0 (3) : = (2) S (4) mov R 0, S IF A<B THEN X: =B (1) < A B (2) IFF (4) (3) : = B X (4) (, , ) (1) mov A, R 0 (2) sub B, R 0 (3) Cj>= (5) (4) mov B, X /*puede ser un bloque*/ (5)

Compiladores e intérpretes Generación de código : Uso de códigos de tres direcciones –

Compiladores e intérpretes Generación de código : Uso de códigos de tres direcciones – Tercetos, ejemplos Expresión S: = A+ B * C tercetos (1) * B C X: = A+ B * C (2) + A (1) (3) : = (2) S (4) : = (2) X WHILE X<B DO X: =X+1; (1) < X B otra representación (1) mov C, R 0 (2) mul A, R 0 (3) add, A, R 0 (4) mov R 0, S (5) mov R 0, X (1) mov X, R 0 (2) mov R 0, R 1 (3) sub B, R 0 (2) IFF (6) (4) cj>= (8) (3) + X 1 (5) add #1, R 1 (4) : = (3) X (6) mov R 1, R 0 (5) GOTO (1) (7) goto 3 (6) (8) En los ciclos se deben cuidar las variables que se ocupan en las expresiones