110 likes | 364 Views
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 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.
E N D
Compiladores eintérpretes Generación de código Profesor: Eridan Otto
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 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 • 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 , R0, R1,...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 • 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 • 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 a c c b b
Compiladores e intérpretes Generación de código :Uso de Arboles de sintaxis Abstracta • Optimizando := := 1 Mov b, R0 2 Mul c,R0 /*en R0 b*c */ 3 mov R0,R1 4 add a,R1 /*en R1 a+b*c */ 5 Mov R1,x 6 Add #3,R0 /*en R0 3+b*c */ 7 Mov R0,y x + y + * 3 a c b
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*+:=$ • $S ABC*+:=$ • $SA BC*+:=$ • $SAB C*+:=$ • $SABC *+:=$ 1 mov C,R0 • 2 mult B,R0 • $SA T1 +:=$ 3 Add A,R0 • $ST2 :=$ 4 mov R0 S • $ $
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,R0 • (2) mul B,R0 • (2) + A (1) (3) add, A,R0 • (3) := (2) S (4) mov R0,S • IF A<B THEN X:=B (1) < A B (1) mov A,R0 • (2) sub B,R0 • (2) IFF (4) (3) Cj>= (5) • (3) := B X (4) mov B,X /*puede ser unbloque*/ (4) (,,) (5)
Compiladores e intérpretes Generación de código :Uso de códigos de tres direcciones • Tercetos, ejemplos • Expresión tercetos otra representación • S:= A+ B * C (1) * B C (1) mov C,R0 • (2) mul A,R0 • X:= A+ B * C (2) + A (1) (3) add, A,R0 • (3) := (2) S (4) mov R0,S • (4) := (2) X (5) mov R0,X • WHILE X<B DO (1) < X B (1) mov X,R0 • X:=X+1; (2) mov R0,R1 • (3) sub B,R0 • (2) IFF (6) (4) cj>= (8) • (3) + X 1 (5) add #1,R1 • (4) := (3) X (6) mov R1,R0 • (5) GOTO (1) (7) goto 3 • (6) (8) En los ciclos se deben cuidar las variables que se ocupan en las expresiones