Sei sulla pagina 1di 58

GENERACIN DE CDIGO INTERMEDIO

UNIDAD II

COMPILADORES TEORA E IMPLEMENTACION


JACINTO RUIZ CATALN ALFAOMEGA

CONSTRUCCION DE COMPILADORES PRINCIPIOS Y PRACTICA


KENNETH C. LOUDEN THOMSON EDITORES

TRADUCTORES Y COMPILADORES CON LEX YACC JFLEX CUP Y JAVACC


SERGIO GALVES ROJAS MIGUEL ANGEL MORA MATA

Analizar

una mquina virtual que ejecute cdigo intermedio a partir del cdigo fuente de un lenguaje prototipo.

2.1 Notaciones
2.1.1 Prefija 2.1.2 Infija 2.2.3 Postfija

2.2 Representaciones de cdigo Intermedio.

2.2.1 Notacin Polaca 2.2.2 Cdigo P 2.2.3 Triplos 2.2.4 Cudruplos.


2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 Variables y constantes. Expresiones. Instruccin de asignacin. Instrucciones de control. Funciones Estructuras

2.3 Esquema de generacin.


Fases dependientes del lenguaje Fuente e independientes de la Maquina final

Fases independientes del lenguaje Fuente pero dependientes del cdigo Intermedio y de la maquina final

CODIGO FUENTE

CODIGO INTERMEDIO

ANALISIS LEXICO

OPTIMIZACION DE CODIGO INTERMEDIO GENERACION DE CODIGO FINAL OPTIMIZACIN DE CODIGO FINAL

ANALISIS SINTACTICO ANALISIS SEMANTICO GENERACIN DE CODIGO INTERMEDIO

FRONT END

BACK END

CODIGO FINAL / EJECUTABLE

Diferencia

entre cdigo fuente y cdigo

ejecutable.
Diferencia

entre cdigo cdigo ejecutable nativo.

interpretable

Obtencin

de cdigo ejecutable.

Arquitectura bsica de Von Neumann En la memoria se almacena el programa y los datos necesarios para que ste opere

Instrucciones del procesador


Son las instrucciones bsicas que puede realizar la UCP. Con ellas se construyen los programas que puede entender la UCP cdigo mquina Cada instruccin bsica instruccin mquina se especifica mediante un cdigo de instruccin junto con la informacin sobre cmo obtener los operandos necesarios. Todo ello conforma el formato de instruccin. operador operando1 operando2
FORMATO DE INSTRUCCIN

Unidad Central de Proceso CPU Componente encargado de ejecutar las instrucciones que estn en memoria principal. Capaz de ejecutar millones de instrucciones MHz

Las

instrucciones de los programas son almacenados en la memoria primaria. La primer tarea del CPU es leer una instruccin de la memoria.

EL PROCESADOR

La

unidad Prefetch le indica al bus que instruccin o conjunto de instrucciones tiene que leer (direcciones de memoria). Prelectura de la instruccin desde la memoria principal.

EL PROCESADOR

La

Unidad de Decodificacin toma las instrucciones ledas y las traslada a una forma adecuada para el procesamiento interno de CPU. operador operando1 operando2

EL PROCESADOR

FORMATO DE INSTRUCCIN

La

Unidad de Control coordina y organiza cuales elementos del CPU realizarn funciones.

EL PROCESADOR

La

Unidad Aritmtico Lgica (Logic Unit) se encarga de ejecutar las operaciones correspondientes. Incluye registros de 32 o 64 bits generalmente.

EL PROCESADOR

Creacin

y ejecucin de programas en cdigo nativo (Lenguaje C)


Archivo de texto escrito por el programador

Ejecucin de cdigo intermedio (interpretado)

Creacin y ejecucin de programas en cdigo interpretado. (Java) Bite Code


hola.class

El

cdigo intermedio (CI) es la representacin en un lenguaje sencillo de la secuencia real de las operaciones que se harn como resultado de las fases anteriores.
trata de representar de una manera formalizada las operaciones a llevar a cabo en un lenguaje ms cercano a la mquina final, aunque no a una mquina concreta si no a una mquina abstracta.

Se

Ventajas

del cdigo intermedio

Aumenta la portabilidad del compilador de una mquina a otra. EJEMPLO Java Fcil de producir. Reglas claras de construccin. Fcil de traducir al lenguaje objeto.

Las

notaciones son una forma especial en la que se pueden expresar una expresin matemtica y puedan ser de 3 formas: infija, prefija y posfija. Los prefijos, Pre - Pos - In se refieren a la posicin relativa del operador con respecto a los dos operandos.

a
Operando

+
Operador

b
Operando

La

caracterstica distintiva de esta notacin es que coloca los operadores a la izquierda de sus operandos. 2+3 + 2 3

No

requiere de parntesis para indicar el orden de precedencia de operadores. Se evala de izquierda a derecha hasta que se encuentre el primer operador seguido inmediatamente de un par de operandos.

(3*6)/

(2+4)

EVALUACIN

LECTURA FINAL

/*36+24
EVALUACIN

EVALUACIN

(3*6)/ (2+4)
4 2 + 6 3 * /

LECTURA FINAL

/*36+24

+
) ) E /

)
/

* / E

/*36+24
EVALUACIN

3 2 6 6 18 6 3

2+4

3*6

18/6

Nodo,

Hijo_izquierdo, Hijo_derecho expexp op exp|num


/ * +

(3*6)/ (2+4)

/*36+24
4

Es

la notacin comn de frmulas aritmticas y lgicas, en la cual se escriben los operadores entre los operandos en que estn actuando: 2+2 No es tan simple de analizar por las computadoras, como la notacin prefija o la notacin postfija, aunque muchos lenguajes de programacin la utilizan debido a su familiaridad.

Hijo_izquierdo,

Nodo, Hijo_derecho expexp op exp|num (3*6)/ (2+4)


/ * +

3*6 / 2+4

Se refiere a que el operador ocupa la posicin despus de los operandos.

S=A+B*C S A B C * + =

Su principio es el de evaluar los datos directamente cuando se introducen y manejarlos dentro de una estructura LIFO (Last In First Out), lo que optimiza los procesos a la hora de programar.

(3*6)/

(2+4)
EVALUACIN

LECTURA FINAL

36*24+/
EVALUACIN

(3*6)/

(2+4)
2 4 + /

EVALUACIN

LECTURA FINAL

36*24+/

*
( ( E /

(
/

(
/ E

36*24+/
EVALUACIN

4 6 3 3 18 2 18 2 18 6 18 3

3*6

4+2

18/6

Hijo_izquierdo,

Hijo_derecho, Nodo expexp op exp|num


/ * +

(3*6)/ (2+4)

36*24+/
4

Generacin

de cdigo:

Simple No utiliza registros

Optimizacin

Es difcil de reordenar ya que hay que considerar el contenido de la pila (Polaca Inversa)

Interpretacin

rpida

Es muy fcil de interpretar ya que solo necesita una pila Si, ya que todos los procesadores implementan una pila.

Transportable:

Su principio es el de evaluar los datos directamente cuando se introducen y manejarlos dentro de una estructura LIFO (Last In First Out), lo que optimiza los procesos.

if <cond> then <instr1> else <instr2>

No se puede traducir a <cond> <instr1> <instr2> If Cdigo generado <cond> Salta Si falso Etiqueta1 <Instr1> Salta Etiqueta2 Etiqueta1: <Instr2>

Es

una especificacin de una Unidad Central de Procesamiento donde las instrucciones estn diseadas a ser ejecutadas por software (interpretadas) en lugar de Hardware.

El

cdigo P comenz como un cdigo ensamblador objetivo estndar producido por varios compiladores Pascal en la dcada de 1970.

Fue

diseado para una maquina de pila hipottica la idea era hacer que los compiladores de Pascal se transportaran fcilmente.

En la creacin de cdigo intermedio se utilizan instrucciones simblicas para representar los datos (variables, parmetros, etc.) que posteriormente se trasladarn a direcciones reales en el mapa fsico de memoria.

Cada instruccin de tres direcciones tiene a lo sumo un operador. El compilador debe generar un nombre temporal para guardar los valores calculados por cada instruccin. Algunas instrucciones de "tres direcciones" tiene menos de tres operadores.

Cudruplos Triplos

Ejemplo:
x=x+1; //Supongamos que x representa un entero
Pasos para generar el CI R1= valor (x) R2= valor (1) R3= R1 + R2 x=R3

CARGAR x null R1 CARGAR 1 null R2 SUMAR R1 R2 R3 CARGAR R3 null x

CODIGO DE TRES DIRECCIONES

CDIGO DE TRES DIRECCIONES

CARGAR 0 null 10000 CARGAR 10000 null 9000 CARGAR 9000 null 10001 CARGAR 1 null 10002 SUMAR 10001 10002 10003 CARGAR 10003 null 9000

posteriormente se trasladarn a direcciones reales en el mapa fsico de memoria

CDIGOS DE TRES DIRECCIONES

int x main(){ x=0; x=x+1; }

CI CARGAR x null R1 CARGAR 0 null R1 CARGAR 1 null R2 SUMAR R1 R2 R3 CARGAR R3 null x

OTROS ARGUMENTOS DEL CI RESTAR, MULTIPLICAR, DIVIDIR OR, AND MAYOR, MENOR (Si se cumple coloca 1 en el res) IGUAL, DISTINTO ETIQUETA Salto incondicional SALTAR_ETIQUETA null null etiq Saltos condicionales SALTAR_CONDICION

op1 null etiq //SOLO SI ES FALSA

IMPRIMIR_ENTERO 7 null null IMPRIMIR_CADENA cad null null Llamada al procedimiento p(x 1,x 2,...,x n).

param x1 ... param xn Call p,n

EL CI es muy prximo a un lenguaje ensamblador

If a<b then x=b CARGAR A NULL R1 CARGAR B NULL R2 MAYOR R1 R2 R3 SALTAR_CONDICION R3 E1 E1 NULL NULL E1

CDIGOS DE TRES DIRECCIONES

<operador> , <operando1>, <operando2>


El resultado se asocia al nmero de tripleta

Ejemplo: W*X+(Y+Z)

1( *, W, X) 2( +, Y, Z) 3 (+, (1), (2))

Control

de flujo:

IF X>Y THEN Z=X ELSE Z=Y+1 1 (>, X, Y) 2 (Saltar si falso, (1), 5) 3 (=, Z, X) 4 (Saltar, , 7) 5 (+, Y, 1) 6. (=, Z, (5)) 7. ...

SI FALSO

EJERCICIO:
A=B+C*D/E F=C*D Operaciones 1. (1) 2. (2) 3. (3) 4. (4) 5. (1) 6. (5)

Tripletas (1) *, C, D (2) /, (1), E (3) +, B (2) (4) =, A, (3) (5) =, F, (1)

Los cuartetos son la herramienta ms general Inconvenientes

Ocupan

demasiado espacio Requieren muchas variables auxiliares para almacenar los resultados intermedios

Los tercetos resuelven este problema suprimiendo el operando del resultado, queda implcito y asociado a dicho terceto Inconvenientes

La optimizacin supone mover tripletas y hay que recalcular las referencias

int x = 10; int y = 0; main(){ while(x>0){ y =y+x;

x=x-1;
} print(Si leer); if(x==0 && y>54){ print(Si leer); }else{ print(No leer); } }

CARGAR 10 null 10001 CARGAR 0 null 10002 ETIQUETA null null BUCLE_1 CARGAR 10001 null 10003 CARGAR 0 null 10004 MAYOR 10003 10004 10005 SALTAR_CONDICION 10005 null FIN_BUCLE_1 CARGAR 10002 null 10006 CARGAR 10001 null 10007 SUMAR 10006 10007 10008 CARGAR 10008 null 10002 CARGAR 10001 null 10009 CARGAR 1null 10010 RESTAR 10009 10010 10011 CARGAR 10011 null 10001 SALTAR_ETIQUETA null null BUCLE_1 ETIQUETA null null FINBUCLE_1 IMPRIMIR_CADENA cadena1 null null

int x = 10; int y = 0; main(){ while(x>0){ y =y+x; CARGAR 10001 null 10013 CARGAR 0 null10014 IGUAL 10013 10014 10015 CARGAR 10002 null 10016 CARGAR 54 null10017 MAYOR 10016 10017 10018 AND 10015 10018 10019 SALTAR_CONDICION 10019 null ELSE_1 IMPRIMIR_CADENA cadena2 null null ETIQUETA null null ELSE_1 IMPRIMIR_CADENA cadena3 null null

x=x-1;
} print(Si leer); if(x==0 && y>54){ print(Si leer); }else{ print(No leer); } }

int x=10; int y=20; while (x*2<y){ while(y>x*4){ x=x+1; } }

CARGAR 10 null 10001 CARGAR 20 null 10002 ETIQUETA null null BUCLE_1 CARGAR 10001 null 10003 CARGAR 2 null 10004 MULTIPLICAR 10003 10004 10005 CARGAR 10002 null 10006 MENOR 10005 10006 10007 SALTAR_CONDICION 10007 null FIN_BUCLE_1 ETIQUETA null null BUCLE_2 CARGAR 10002 null 10008 CARGAR 10001 null 10009 CARGAR 4 null 10010 MULTIPLICAR 10009 10010 10011 MAYOR 10008 10011 10012 SALTAR_CONDICION 10012 null FIN_BUCLE_2 CARGAR 10001 null 10013 CARGAR 1 null 10014 SUMAR 10013 10014 10015 CARGAR 10001 null 10015 SALTAR_ETIQUETA null null BUCLE_2 SALTAR_ETIQUETA null null BUCLE_1 ETIQUETA null null FIN_BUCLE_2 ETIQUETA null null FIN_BUCLE_1

int x=1-12; TAREA int y=x*32 CUADRUPLOS main(){ Y TRIPLOS x=1-12; y=x*32; x=(32/12)*y; if(x>7){ while(y>0){ y=y-1; if(y>1){ print(y); } } } }

COMPILADORES TEORA E IMPLEMENTACION


JACINTO RUIZ CATALN ALFAOMEGA

CONSTRUCCION DE COMPILADORES PRINCIPIOS Y PRACTICA


KENNETH C. LOUDEN THOMSON EDITORES

TRADUCTORES Y COMPILADORES CON LEX YACC JFLEX CUP Y JAVACC


SERGIO GALVES ROJAS MIGUEL ANGEL MORA MATA

GENERACIN DE CDIGO INTERMEDIO.


UNIDAD II