You are on page 1of 28

Generacin de cdigo Intermedio

La administracin de la memoria se da en esta etapa. Se debe considerar tanto la memoria esttica como dinmica, y en esta se utilizan generalmente pilas. Los compiladores generan un cdigo intermedio que es ms parecido al cdigo ensamblador, las operaciones por ejemplo nunca se hacen con ms de dos operandos.

Los lenguajes intermedios generalmente tienen rboles de derivacin ms pequeos que su contraparte original. Se puede representar un rbol sintctico con un Grafo Dirigido Acclico (GDA). La notacin postfija es una manera linealizada de representar un rbol sintctico.

Reduce el nmero de programas necesarios para construir traductores, y permitir ms fcilmente la transportabilidad de unas mquinas a otras.

Generacin de cdigo intermedio

Notaciones
Las notaciones sirven de sentencias bien definidas. base para expresar

El uso ms extendido de las notaciones sirve para expresar operaciones aritmticas. Las expresiones aritmticas se pueden expresar de tres formas distintas: infija, prefija y postfija.

La diversidad de notaciones corresponde en que para algunos casos es ms sencillo un tipo de notacin.

Las notaciones tambin dependen de cmo se recorrer el rbol sintctico, el cual puede ser en inorden, preorden o postorden; teniendo una relacin de uno a uno con la notacin de los operadores.

Prefija
La notacin prefija pone el operador primero que los dos operandos, por lo que la expresin anterior queda: +ab-5. Esto se representa con una estructura del tipo FIFO (Primero en entrar primero en salir) o cola.
Las estructuras FIFO son ampliamente utilizadas pero tienen problemas con el anidamiento aritmtico.

Los operandos conservan el mismo orden que la notacin infija equivalente.


No requiere de parntesis para indicar el orden de precedencia de operadores ya que el es una operacin. Se evala de izquierda a derecha hasta que encontrmosle primer operador seguido inmediatamente de un par de operandos. Se evala la expresin binaria y el resultado se cambia como un nuevo operando. Se repite este hasta que nos quede un solo resultado. +A B C (A+B)*C

Infija
La notacin infija es la ms utilizada por los humanos por que es la ms comprensible ya que ponen el operador entre los dos operandos. Por ejemplo a+b-5. No existe una estructura simple para representar este tipo de notacin en la computadora por esta razn se utilizan otras notaciones.

Postfija
La notacin postfija pone el operador al final de los dos operandos, por lo que la expresin queda: ab+5-

La notacin postfija utiliza una estructura del tipo LIFO (Ultimo en entrar primero en salir) pila, la cual es la ms utilizada para la implementacin.

El orden de los operandos se conserva igual que la expresin infija equivalente no utiliza parntesis ya que no es una operacin ambigua. Para ejecutar un comando, primero se deben introducir todos sus argumentos, para hacer una suma 'a+b=c' el RPN lo manejara a b +, dejando el resultado 'c' directamente.

EJEMPLO:
(2+(3*4)) = x Notacin prefija = + 2 * 3 4 x Notacin infija 2+3*4 = x ((2+3)*4) = x =*+234x (2+3)*4 = x

Notacin postfija

234*+x=

23+4*x=

Representacin de cdigo intermedio

Existen maneras intermedio.

formales

para

representar

cdigo

Estas notaciones simplifican la traduccin de nuestro cdigo fuente a nuestro cdigo objeto ya que ahorran y acotan smbolos de la tabla de smbolos.

Notacin polaca
Esta notacin debe su nombre al matemtico polaco Jan Lukasiewicz, y esto se refiere a que el smbolo operador se coloca delante de sus operandos.

Tambin llamada prefija o postfija, uno utiliza para este el orden de precedencias que existen como lo son parntesis, potencia multiplicacin y divisin, suma y resta.

Ejemplo
Suponga que queremos evaluar la siguiente expresin aritmtica sin parntesis: 23 + 5 x 22 12 / 6 Primero evaluamos las potencias para obtener 8 + 5 x 4 12 / 6 Entonces evaluamos la multiplicacin y divisin y se obtiene 8+20-2 Evaluamos la suma y la resta y e obtiene 26 realizndola en 3 niveles de precedencia.

Cdigo P
El cdigo P hace referencia a maquinas que utilizan o se auxilian de pilas para generar cdigo objeto.

En muchos caso la P se asociado a cdigo portable el cual garantiza que el cdigo compilado en una maquina se pueda ejecutar en otras.

Cdigo P
Para garantizar la portabilidad del cdigo se necesita que el lenguaje este estandarizado por algn instituto y que dicho cdigo no tenga extensiones particulares.

Tambin se recomienda la no utilizacin de caractersticas especiales exclusivas de alguna arquitectura de computadoras en particular.

Triplos
Las proposiciones de tres direcciones se parece mucho al ensamblador, el cual es un lenguaje intermedio mas entendible para la maquina.

El problema de utilizar cudruplos radica en que se tienen que colocar los valores temporales en la tabla de smbolo.

Triplos
Con una estructura de tres campos se pueden omitir los valores temporales, dicha estructura recibe el nombre de triplos y tiene los siguientes campos: op, arg1 y arg2.

Las expresiones lgicas tambin pueden pasarse a cdigo de tres direcciones, utilizando para ello expresiones en corto circuito.

Triplos
Generalmente el cdigo que generan los triplos recibe el nombre de cdigo de dos direcciones, aunque en ocasiones puede variar.

Cuando se utilizan triples se ocupan punteros a la misma estructura de los triplos.

* b t1 t2 //cudruplos

* b (0) //triple

Cudruplos
Es una estructura tipo registro con cuatros campos que se llaman: op, arg1, arg2 y resultado. OP tiene un cdigo intermedio.

Los operadores unarios como x:=-y no utilizan arg2. Generalmente arg1, arg2 y resultado son valores de tipo puntero y apuntan a una entrada en la tabla de smbolos.

Esquemas de generacin
Los esquemas de generacin son las estrategias o acciones que se debern realizarse y tomarse en cuenta en el momento de generar cdigo intermedio.

Los esquemas de generacin dependen de cada lenguaje. Tomaremos algunos esquemas de generacin del lenguaje C.

Variables y constantes
Las declaraciones de variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple. Por ejemplo:
int a,b,c; se descompone a int a;

int b;
int c; respectivamente.

Expresiones
Para generar expresiones estas deben representarse de manera ms simple y ms literal para que su conversin sea ms rpida.

Por ejemplo la traduccin de operaciones aritmticas debe especificarse una por una, de tal forma que una expresin sea lo ms mnimo posible.

Instruccin de asignacin
Las operaciones de asignacin deben quedar expresadas por una expresin sencilla, si esta es compleja se debe reducir hasta quedar un operador sencillo. Por ejemplo: x = a + b/5; debe quedar de la forma y = b/5; z = a + y; x=z;

Instrucciones de control
Las condiciones deben expresarse de manera lo ms sencilla posible de tal forma que puedan evaluarse en cortocircuito. Por ejemplo una instruccin como: if (a == b && f!=5 && f%3==0) se evala primero x = (a==b && f!=5) y = x && f%3==0; if (y)

Las instrucciones de decisin compleja como switch se reducen a una versin complejas de ifs.

Funciones
Las funciones pueden reducir a en lnea, lo que se hace es expandir el cdigo original de la funcin.

Las funciones se descomponen simplificando los parmetros de manera individual al igual que el valor de retorno.

Estructuras
Los arreglos se descomponen en estructuras bsicas de manejo de manera simple, as por ejemplo: char *a=Hola; se reduce a: a[0]=H; a[1]=o; a[2]=l; a[3]=a;

a[4]=\0;

You might also like