You are on page 1of 49

integrantes : Juan Jose Justo Yasmin Cristal Arturo Esequiel Yesenia Gabriel Linarez

generacin de cdigo data desde la existencia de los primeros compiladores. Hasta la aparicin de los primeros generadores de cdigo comerciales u orientados a "usuarios finales"; la generacin de cdigo era exclusividad de programas compiladores especializados. En tiempos ms recientes la generacin de cdigo, gracias al avance de la ingeniera del software, se ha llevado a un nivel diferente; donde se encuentran programas generadores de pantallas, reportes y consultas, estas son herramientas de gran utilidad
La

para

crear un generador de cdigo se deben hacer muchas de las tareas que realizan los compiladores; algunas de estas tareas son: la bsqueda de patrones, la escritura de cdigo, el anlisis sintctico, el anlisis lxico y la optimizacin de cdigo. Estas tareas las realiza el desarrollador una vez para una arquitectura especifica.

debe considerar tanto la memoria esttica como dinmica, y en esta se utilizan generalmente pilas. Los lenguajes intermedios generalmente tienen rboles de derivacin ms pequeos que su contraparte original.
Se

Se

puede representar un rbol sintctico con un Grafo Dirigdo Acclico (GDA).

La

notacin postfija es una manera linealizada de representar un rbol sintctico. EJEMPLO : a := b*-c+b*-c abc -*bc -*+= x := y op z x+y*z t1:=y*z t2:=x+t1

Dado

que el lenguaje puede presentar distintas funciones anidadas, los tercetos los generamos por orden del parser y son almacenados en un sitio u otro dependiendo del contexto en que nos encontremos. Es decir, se almacenan en una lista de tercetos dependiente de la Tabla de Smbolos. Hay tantas listas de tercetos como funciones haya en el cdigo fuente ms una lista de tercetos asociada a la Tabla de Smbolos Global .

En

computacin, un lenguaje intermedio es el lenguaje de una mquina abstracta diseada para ayudar en el anlisis de los programas de computadora. El trmino viene de su uso en los compiladores, donde un compilador primero traduce el cdigo fuente de un programa, en una forma ms apropiada para las transformaciones de mejora del cdigo (forma usualmente llamada bytecode), como un paso intermedio antes de generar el archivo objeto o el cdigo mquina para una mquina especfica.

Una

variante del significado de "lenguaje intermedio" se da en esos lenguajes de alto nivel que no soportan o no generan un archivo objeto o cdigo mquina, pero s generan un lenguaje intermedio. Luego ese lenguaje intermedio se transfiere a un compilador que termina de realizar el archivo objeto o el cdigo mquina. Esto se emplea generalmente por cuestiones de optimizacin y portabilidad.

Los

lenguajes intermedios nos sirven para representar la produccin final de nuestro lenguaje fuente. Existen muchos lenguajes intermedios, la mayora de ellos son una representacin ms simplificada del cdigo original para facilitar la traduccin hacia el cdigo final. Otros lenguajes intermedios sirven de base o como representacin parcial de otros procesos.

Otros

lenguajes intermedios sirven de base o como representacin parcial de otros procesos.

Por

ejemplo al compilar un programa en C en Windows o DOS, se produce un cdigo objeto con extensin .obj para que posteriormente el enlazador cree finalmente el cdigo ejecutable .exe. En sistemas basados en Unix, tambin ocurre algo similar generndose un archivo .o y el ejecutable a.out.

Otros

lenguajes intermedios famosos son los generados para la mquina virtual de Java el bytecode; y para la mquina virtual de .NET el MISL para luego ejecutarse en tiempo de ejecucin JIT (Just in Time) Hay Otros lenguajes intermedios que se utilizan en sistemas distribuidos como RPC, CORBA y su IDL, etc. En este caso estos lenguajes intermedios se encargan de enmascarar toda la heterogeneidad de las comunicaciones distribuidas en una computadora

Es

una representacin ms abstracta y uniforme que un lenguaje mquina concreto. Su misin es descomponer las expresiones complejas en binarias y las sentencias complejas en sentencias simples.

VENTAJAS:

Permite una fase de anlisis (anlisis semntico) independiente de la mquina. Se pueden realizar de optimizaciones sobre el cdigo intermedio (Las complejas rutinas de optimizacin son independientes la mquina).

DESVENTAJAS:

Prdida de eficiencia (no permite una compilacin de una sola pasada). Introduce en el compilador una nueva fase de traduccin.

rbol sintctico abstracto. Todos los nodos del rbol representan smbolos terminales. Los nodos hijos son operandos y los nodos internos son operadores. Grafo dirigido acrlico (GDA). Notacin posfija. Definicin de una mquina abstracta. N-tupla : Cada sentencia del lenguaje intermedio consta de N elementos: (Operador, Operando1, Operando2, , Operando N1) Los ms usuales son los tercetos (tripletas) y los cuartetos (cudruplas), llamados tambin cdigo de tres direcciones.

Tripletas:

Ejemplo: d = a + b * c [1] (*, b, c) [2] (+, a, [1]) [3] (=, d, [2]) <operador>, <operando_1>, <operando_2> Cuartetos: Ejemplo: d = a + b * c (*, b, c, temp1) (+, a, temp1, temp2) (=, temp2, , d)

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.

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.

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.

Es la forma mas comn que utilizamos para escribir expresiones matemticas, estas notaciones se refiere a que el operador esta entre los operadnos. La notacin infija puede estar completamente patentizada o puede basarse en un esquema de precedencia de operadores as como el uso de parntesis para invalidar los arreglos al expresar el orden de evaluacin de una expresin:

3*4=12

3*4+2=14 3*(4+2)=18

Como

su nombre lo indica se refiere a que el operador ocupa la posicin despus de los operandos sus caractersticas principales son: el orden de los operandos se conserva igual que la expresin infija equivalente no utiliza parntesis ya que no es una operacin ambigua. La operacin posfija no es exactamente lo inverso a la operacin prefija equivalente: (A+B)*C AB+C*

La

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

notacin posfija utiliza una estructura del tipo LIFO (Last In First Out) pila, la cual es la ms utilizada para la implementacin.

Nos

indica que el operador va antes de los operandos sus caractersticas principales son: -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

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 (First In First Out) o cola.
Las

estructuras FIFO son ampliamente utilizadas pero tienen problemas con el anidamiento aritmtico.

Si

deseamos representar las expresiones (2+(3*4)) = x y ((2+3)*4)= x en las tres notaciones mencionadas, el resultado sera:
(2+(3*4)) = x Notacin prefija =+2*34x ((2+3)*4) = x =*+234x (2+3)*4 = x 23+4*x=

Notacin infija 2+3*4 = x Notacin postfija 234*+x=

Existen

maneras formales para representar cdigo intermedio. Estas notaciones simplifican la traduccin de nuestro cdigo fuente a nuestro cdigo objeto ya que ahorran y acotan smbolos de la tabla de smbolos

Tambin

conocida como notacin de prefijo o notacin prefija, es una forma de notacin para la lgica, la aritmtica, y el lgebra. Su caracterstica distintiva es que coloca los operadores a la izquierda de sus operandos. Si la aridad de los operadores es fija, el resultado es una sintaxis que carece de parntesis u otros signos de agrupacin, y todava puede ser analizada sin ambigedad. El lgico polaco Jan ukasiewicz invent esta notacin alrededor de 1920 para simplificar la lgica proposicional.

Pascal a+b-c a+b*c a+b*c+d (a+b)*c a+(b-c) a*b+c a+b/c (a+b)/c

Notacin Polaca ab+cabc*+ abc*+d+ ab+c* abc-+ ab*c+ abc/+ ab+c/

El

cdigo P hace referencia a mquinas 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 mquina se pueda ejecutar en otras.

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.

proposiciones de tres direcciones se parece mucho al ensamblador, el cual es un lenguaje intermedio ms entendible para la mquina. Las estructuras de control (if, switch, while, do-while, for) son realmente etiquetas goto disfrazadas.

Las

El

problema de utilizar cudruplos radica en que se tienen que colocar los valores temporales en la tabla de smbolo. una estructura de tres campos se pueden omitir los valores temporales, dicha estructura recibe el nombre de triples y tiene los siguientes campos: op, arg1 y arg2

Con

Generalmente

el cdigo que generan los triples 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 triples. * b t1 t2 //cudruplos * b (0) //triple

debe tener en cuenta el proceso de asignacin, de declaracin, expresiones booleanas. Las expresiones lgicas tambin pueden pasarse a cdigo de tres direcciones, utilizando para ello expresiones en corto circuito.

Se

evaluacin de expresiones en corto circuito implica que se evalan condiciones revisando valores anteriores; por ejemplo, para el operador AND con una condicin que se detecte como falsa toda la expresin es falsa, en el caso del operador OR si se encuentra una condicin verdadera todo ser verdadera

La

La

notacin de tres direcciones es una forma abstracta de cdigo intermedio. Esta notacin se puede implementar como registros con campos para el operador y operadores.

Los

interpretes generalmente utilizan este triplos para generar el cdigo intermedio para ejecutarse una vez considerado la instruccin como vlido. En este sentido, un compilador es ms difcil de implementar ya que tendr que mantener todas las estructuras generadas que en muchas ocasiones sern cudruplos.

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.

Es

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.

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.

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 inta; int b; intc; respectivamente.

Las operaciones de asignacin deben quedar expresadas por una expresin sencilla, si est 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.

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

Los ciclos se descomponen en un ciclo genico, por lo que ciclos while, for y dowhile tienen la misma representacin interna. En el caso de C, todo queda en forma de while. Las condiciones lgicas tambin pueden ser evaluadas en cortocircuito y reducidas.

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;

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.

You might also like