Você está na página 1de 9

INTRODUCCION Esta fase del compilador no es en realidad una parte separada del compilador, la mayora de los compiladores generan

cdigo como parte del proceso de anlisis sintctico, esto es debido a que requieren del rbol de sintaxis y si este no va a ser construido fsicamente, entonces deber acompaar al analizador sintctico al barrer el rbol implcito. En lugar de generar cdigo ensamblador directamente, 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. Al no generarse cdigo ensamblador el cual es dependiente de la computadora especfica, sino cdigo intermedio, se puede reutilizar la parte del compilador que genera cdigo intermedio en otro compilador para

una computadora con diferente procesador cambiando solamente el generador de cdigo ensamblador al cual llamamos back-end, la desventaja obviamente es la lentitud que esto conlleva.

[Escriba texto]

DESARROLLO El cdigo intermedio es un cdigo abstracto independiente de la mquina para la que se generar el cdigo objeto. El cdigo intermedio ha de cumplir dos requisitos importantes: ser fcil de producir a partir del anlisis sintctico, y ser fcil de traducir al lenguaje objeto. La tarea de sntesis suele comenzar generando un cdigo intermedio. El cdigo intermedio no es el lenguaje de programacin de ninguna mquina real, sino que corresponde a una mquina abstracta, que se debe de definir lo ms general posible, de forma que sea posible traducir este cdigo intermedio a cualquier mquina real. El objetivo del cdigo intermedio es reducir el nmero de programas necesarios para construir traductores, y permitir ms fcilmente la

transportabilidad de unas mquinas a otras. Supngase que se tienen n lenguajes, y se desea construir traductores entre ellos. Sera necesario construir n*(n-1) traductores. Sin embargo si se construye un lenguaje intermedio, tan slo son necesarios 2*n traductores. As por ejemplo un fabricante de compiladores puede construir un compilador para diferentes mquinas objeto con tan slo cambiar las dos ltimas fases de la tarea de sntesis. Aunque un programa fuente se puede traducir directamente al lenguaje objeto, algunas ventajas de utilizar una forma intermedia independiente de la mquina son: Se facilita la redestinacin; se puede crear un compilador para una mquina distinta uniendo una etapa final para la nueva mquina a una etapa inicial ya existente. Se puede aplicar a la representacin intermedia un optimizador de cdigo independiente de la mquina.

[Escriba texto]

Los rboles sintcticos y la notacin postfija son dos clases de representaciones intermedias, tambin se utiliza otra llamada cdigo de tres direcciones. Cdigo de tres direcciones: Las reglas semnticas para generar cdigo de tres direcciones a partir de construcciones de lenguajes de programacin comunes son similares a las reglas para construir arboles sintcticos o para generar notacin postfija. El cdigo de tres direcciones es una secuencia de proposiciones de la forma general X := Y op Z, donde X, Y y Z son nombres, constantes o variables

temporales generadas por el compilador; op representa cualquier operador, como un operador aritmtico de punto fijo o flotante o un operador lgico sobre datos con valores booleanos. Las instrucciones se representan utilizando cuando mucho un solo operador en la parte derecha de la expresin, es decir, una expresin del tipo "X+Y*Z" se representara de la manera "t1=Y*Z y t2=X+t1", donde t1 y t2 son nombres temporales generados por el compilador. Una proposicin de tres direcciones es una forma abstracta de cdigo intermedio. En un compilador estas proposiciones se pueden implementar como registros con campos para el operador y los operandos, hay dos formas principales de implementar el cdigo de tres direcciones: Cudruplas Una cudrupla es una estructura tipo registro con cuatro campos que se llaman (op, resultado, arg1, arg2). El campo op contiene un cdigo interno para el operador. Por ejemplo, la proposicin de tres direcciones X = Y + Z se podra representar mediante la cudrupla (ADD, X, Y, Z). Las proposiciones con operadores unarios no usan el arg2. Los campos que no se usan se dejan vacos o un valor NULL. Como se necesitan cuatro campos se le llama representacin mediante cudruplas.

[Escriba texto]

Tripletas Para evitar tener que introducir nombres temporales en la tabla de smbolos, se hace referencia a un valor temporal segn la posicin de la proposicin que lo calcula. Las propias instrucciones representan el valor del nombre temporal. La implementacin se hace mediante registros de solo tres campos (op, arg1, arg2). En la notacin de tripletes se necesita menor espacio y el compilador no necesita generar los nombres temporales. Sin embargo, en esta notacin, trasladar una proposicin que defina un valor temporal exige que se modifiquen todas las referencias a esa proposicin. Lo cual supone un inconveniente a la hora de optimizar el cdigo, pues a menudo es necesario cambiar proposiciones de lugar. Una forma de solucionar esto consiste en listar las posiciones a las tripletas en lugar de listar las tripletas mismas. De esta manera, un optimizador podra mover una instruccin reordenando la lista, sin tener que mover las tripletas en s. Control de flujo En los lenguajes de programacin hay estructuras y operadores que permiten controlar el flujo de la ejecucin, estos pueden ser ciclos, saltos, condiciones entre otros. Expresiones booleanas Las expresiones booleanas tienen dos propsitos principales. Se utilizan para calcular valores lgicos y como expresiones condicionales en proposiciones que alteran el flujo del control, como las proposiciones if-then, if-then-else, o while-do. Estas tambin se componen de los operadores booleanos (and, or y not) aplicados a los elementos que son variables booleanas o expresiones relacionales. Algunos lenguajes permiten expresiones ms generales donde se pueden aplicar operadores booleanos, aritmticos y relacionales a expresiones de cualquier tipo, sin diferenciar valores booleanos de aritmticos; si es necesario se realiza una coercin.
[Escriba texto]

Saltos o cdigos en cortocircuito Tambin se puede traducir una expresin booleana a cdigo de tres direcciones sin generar cdigo para ninguno de los operadores booleanos y sin que haya que evaluar necesariamente la expresin completa. Este estilo de evaluacin a veces se denomina cdigo en corto circuito o cdigo saltado. Se puede evaluar las expresiones booleanas sin generar cdigo para los operadores booleanos and, or, not. Si se representa el valor de una expresin mediante la posicin de la secuencia de cdigo. 100: if a<b goto 103 101: t1:=0 102: goto 104 103: t1:=1 104: if c<b goto 107 105: t:=0 106: goto 108 107: t2:=1 108: if e<f goto 111 109: t3:=0 110: goto 112 111: t3:=1 112: t4:=t2 and t3 113: t5:=t1 or t4

En el ejemplo anterior se puede saber qu valor tendr t1 por el hecho de si se alcanza la proposicin 101 o la 103, as que el valor de t1 es redundante. Paras muchas expresiones booleanas, se puede determinar el valor de la expresin sin tener que evaluar completamente. Llamadas a funciones/procedimientos Es fundamental que un compilador genere buen cdigo para llamadas y retornos defunciones. La traduccin de una llamada incluye una secuencia de llamada,

que es una secuencia de acciones que se toman a la entrada y a la salida de cada funcin / procedimiento. Aunque las secuencias de llamada difieren, incluso en aplicaciones del mismo lenguaje, habitualmente tienen lugar las siguientes acciones: Cuando ocurre la llamada a una funcin, se debe asignar espacio para el registro de activacin del procedimiento llamado. Los argumentos de la funcin llamada se deben evaluar y poner a disposicin de la funcin llamada en un lugar
[Escriba texto]

conocido. Se deben establecer los apuntadores de ambiente para permitir que la funcin llamada tenga acceso a los datos de las funciones abarcadoras. Se debe guardar el estado de la funcin que efecta la llamada para que pueda reanudar la ejecucin despus de la llamada. Tambin se guarda en un lugar conocido la direccin de retorno, que es la posicin a la que la rutina llamada debe transferir el control cuando finalice. La direccin de retorno normalmente es la posicin de la instruccin que sigue la llamada en la funcin autor de la llamada. Por ltimo, se debe generar un salto al principio del cdigo de la funcin llamada. No existe una divisin exacta de las tareas en el momento de la ejecucin entre la funcin que hace la llamada y la funcin que recibe la llamada. A menudo, el lenguaje fuente, la mquina objeto y el sistema operativo imponen requisitos que favorecen una solucin sobre otra.

[Escriba texto]

CONCLUSIONES La generacin de cdigo intermedio permite abstraer la mquina, separar

operaciones de alto nivel de su implementacin a bajo nivel, permite la reutilizacin de los front-ends y back-ends; y permite optimizaciones generales. Teniendo en cuenta que implica una pasada ms para el compilador (no se puede utilizar el modelo de una pasada), dificulta llevar a cabo optimizaciones especficas de la arquitectura destino; y suele ser ortogonal a la mquina destino, la traduccin a una arquitectura especfica ser ms larga e ineficiente.

[Escriba texto]

Datos de los autores

Br. Juan Carlos Canales Jarqun. Egresado en el ao 2010 del Colegio Pblico Bello Amanecer. juanjarquin8@yahoo.es

Br. Lesther Jeovanni Loaisiga Lpez. Egresado en el ao 2008 del Instituto Nacional Autnomo de Mulukuk. loaisiga9291@yahoo.es

[Escriba texto]

BIBLIOGRAFIA

Compila

WEBGRAFIA
http://seminariodecompiladoresii.blogspot.com/p/generacion-de-codigo-intermedio.html http://cursocompiladoresuaeh.blogspot.com/2010/11/unidad-viii-generacion-de-codigo.html

[Escriba texto]

Você também pode gostar