You are on page 1of 6

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Unidad VI. Generacin de cdigo intermedio.


Despus del anlisis semntico es recomendable generar una representacin intermedia explcita del programa fuente. Esta representacin intermedia debe tener dos propiedades: a) debe ser fcil de producir y, b) fcil de traducir al programa objeto. El cdigo de tres direcciones es la forma ms usada de representacin intermedia y consiste en que cada instruccin tiene como mximo tres operandos.

6.1 Lenguajes intermedios.


No existe un nico lenguaje intermedio para todos los compiladores, cada desarrollador de compiladores suele tener su propio lenguaje intermedio. La utilizacin de un lenguaje intermedio permite construir en menos tiempo un compilador para otra mquina y, tambin permite construir compiladores para otros lenguajes fuente generando cdigos para la misma mquina. La generacin de cdigo intermedio transforma un rbol de anlisis sintctico (semntico) en una representacin en un lenguaje intermedio, que suele ser cdigo sencillo para poder generar el cdigo mquina. Una forma de representacin intermedia es mediante el cdigo de tres direcciones. Una sentencia en cdigo de tres direcciones tiene la forma operando := operando operador operando, donde operando son los operandos y operador es un operador binario. Tambin permite condiciones simples y saltos. Por ejemplo, para la siguiente sentencia: FOR (I=0; I<10; I++){ IF(I/2==0) PAR++; ELSE IMPAR++; } El cdigo intermedio generado (cdigo en tres direcciones) ser: I=0; L1: IF I < 10 GOTO L2 GOTO L6 L2: T1 = I / 2 IF T1 == 0 GOTO L3 GOTO L4 L3: PAR = PAR + 1 GOTO L5 L4: IMPAR= IMPAR + 1 L5: I = I + 1 GOTO L1 L6: . . . . . . . Existen 3 tipos de lenguajes intermedios: Tipo 1.- es una representacin ms abstracta y uniforme que un lenguaje mquina, su funcin es la de 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. Realiza optimizaciones sobre el cdigo intermedio.

Desventajas: Prdida de eficiencia. Introduce en el compilador una nueva fase de traduccin.


Pgina 19

L.I. Vctor Hernndez Rodrguez

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Tipo 2.- son los lenguajes intermedios que utilizan: rbol sintctico. rbol sintctico abstracto. o Todos los nodos del rbol representan smbolos terminales. o Los nodos hijos son operandos y los nodos internos son operadores. Grafo dirigido acclico (GDA). Notacin posfija. Definicin de una mquina abstracta. N-tupla o Cada sentencia del lenguaje intermedio consta de N elementos (Operador, Operando1, Operando2, , Operando N1) o Los ms usuales son los tercetos (tripletas) y los cuartetos (cudruplas), llamados tambin cdigo de tres direcciones. Tipo 3.- se compone nicamente de tripletas y cuartetas. Tripletas: < operador> <operando_1> <operando_2> Ejemplo: d=a+b*c [1] (*, b, c) [2] (+, a, [1]) [3] (=, d, [2]) Cuartetos: Ejemplo:

d=a+b*c (*, b, c, temp1) (+, a, temp1, temp2) (=, temp2, , d)

6.2 Notaciones.
6.2.1 Infija. En esta notacin se escriben los operadores entre los operandos (por ejemplo a+b/c), en la notacin infija en ocasiones es necesario rodear entre parntesis a los grupos de operandos y operadores, para indicar el orden en el cual se deben realizar las operaciones (por ejemplo (a+b)/c). Si no se emplean los parntesis se emplean las reglas de prioridad de operadores que determinan el orden de las operaciones. No se tiene una estructura sencilla para representar esta notacin en la computadora por ello se utilizan otras notaciones. 6.2.2 Postfija. La Notacin Polaca Inversa o notacin postfija es un mtodo alternativo de introduccin de datos, en el que primero estn los operandos y despus viene el operador que va a realizar los clculos sobre ellos (infijo a+b/c postfija abc/+). No necesitan usar parntesis para indicar el orden de las operaciones mientras la aridad del operador sea fija. Esta notacin evala los datos cuando se introducen y los almacena en una estructura del tipo LIFO (Last In First Out), lo que optimiza los procesos de programacin ya que al evaluar los datos directamente al introducirlos no es necesario ordenar la evaluacin de los mismos como sucede en la notacin infija, as, para hacer una suma a+b=c se hara de la forma a b +, dejando el resultado en c directamente. 6.2.3 Prefija. La notacin polaca o notacin prefija, es una forma de notacin cuya caracterstica distintiva es que coloca los operadores a la izquierda de sus operandos (infijo a+b/c prefija +a/bc). 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. La notacin de prefijo es utilizada en las operaciones basadas en pila, debido a que distingue fcilmente el orden de las operaciones sin usar parntesis para evaluar las operaciones, no necesita una jerarqua operacional como en la notacin infija.

L.I. Vctor Hernndez Rodrguez

Pgina 20

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Las expresiones se leen de izquierda a derecha, primero se busca un operador y posteriormente se buscan dos operandos. Si se encuentra otro operador antes de que se localicen los dos operandos, el operador anterior colocado a un lado hasta que el nuevo operador sea resuelto. Este proceso se itera hasta que un operador sea resuelto.

6.3 Representacin de cdigo intermedio.


Se tienen varias formas para representar cdigo intermedio. Estas notaciones simplifican la traduccin del cdigo fuente a cdigo objeto ahorrando y reduciendo smbolos de la tabla de smbolos. 6.3.1 Notacin Polaca. Cuando se realice la reduccin empleando la notacin polaca, se describen las uniones detalladas del paser con el resto del compilador. Un ejemplo claro de notacin polaca con generacin de cdigo intermedio es el lenguaje ensamblador, por ejemplo: Se tiene la expresin R=A+B/C al evaluarla se hara de la siguiente manera, se pasa a notacin polaca =R+A/BC, es necesario usar registros para la evaluacin de la expresin y queda en cdigo intermedio de la siguiente manera: Operacin /BC +Aax =Rbl Cdigo Mov ax, B Div ax,C Mov bl, A Add bl, al Lea cl, R Mov cl, bl

6.3.2 Cdigo P. Se refiere al pre cdigo de la compilacin, es un lenguaje intermedio o cdigo portable que proporciona un formato alternativo binario para cdigo nativo de cualquier compilador binario. Que contenga una mquina virtual para ejecutar cdigo p. La implementacin ms famosa de este cdigo est hecha para cdigo en pascal, pero tambin est presente en los lenguajes desarrollados por Microsoft, en MATLAB, Java y muchos ms. En comparacin con una traduccin directa a cdigo mquina, la traduccin a cdigo p y su ejecucin ofrece ms ventajas. Por su portabilidad es ms fcil escribir un pequeo intrprete de cdigo p, de lo que es modificar un compilador para generar cdigo nativo para la misma mquina. El implementar la generacin de cdigo mquina es una de las partes ms complicadas de escribir un compilador. En comparacin, la generacin de cdigo p es mucho ms fcil. Tiene un tamao compacto debido a que el cdigo p se basa en una mquina virtual ideal, un programa de cdigo p es a menudo ms pequeo que el mismo programa traducido a cdigo mquina. Cuando la depuracin de cdigo p se ejecuta, el intrprete puede aplicar controles adicionales de tiempo de ejecucin que son difciles de implementar con cdigo nativo. En la dcada de 1990, la traduccin al cdigo p se convirti en una estrategia popular para las implementaciones de lenguajes como Python y Java. El lenguaje de estudio para estos apuntes es el Prolog, proveniente del francs Programation et Logique, es un lenguaje de programacin lgico e interpretado, bastante popular en el medio de investigacin en Inteligencia Artificial. Inicialmente se trataba de un lenguaje totalmente interpretado hasta que, a mediados de los 70 se desarroll un compilador capaz de traducir Prolog en un conjunto de instrucciones de una mquina abstracta denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces Prolog es un lenguaje semi-interpretado. Prolog pertenece al paradigma de los lenguajes lgicos, lo que lo hace diferente de otros lenguajes ms populares tales como Fortran, Pascal, C, etc. En los cuales las instrucciones se ejecutan normalmente en orden secuencial, es decir, una a continuacin de otra, en el mismo orden en que estn escritas y slo vara cuando se alcanza una instruccin de control (un bucle o ciclo, una instruccin condicional o una transferencia).

L.I. Vctor Hernndez Rodrguez

Pgina 21

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Los programas en Prolog se componen de clusulas que constituyen reglas del tipo si es verdad el antecedente, entonces es verdad el consecuente. Pero en Prolog primero se debe de escribir el consecuente y luego el antecedente, el antecedente puede ser una conjuncin de condiciones que se denomina secuencia de objetivos. Cada objetivo se separa con una coma y puede considerarse similar a una instruccin o llamada a procedimiento de los lenguajes imperativos. Por ejemplo: esmejorque(100, 70). Se lee de la siguiente manera: 100 es mejor que 70. Prolog utiliza tambin listas, estas son colecciones de elementos y se dividen en dos partes: a) Cabeza.- es el primer elemento de la lista y, b) Cola.- es una lista con el resto de los elementos de la lista. La cabeza y la cola de una lista se separan con el smbolo |, un % indica un comentario. Ejemplo de Cdigo Prolog % declaraciones fabrica(intel, pentium). % Intel fabrica pentium fabrica(intel, celeron). % Intel fabrica celeron fabrica(intel, centrino). % Intel fabrica centrino % dual core es posterior de pentium si pentium es anterior a dual core esposteriora(dual core, pentium):- esanteriora(pentium, dual core). % pentium es anterior a core duo si core dou es posterior de dual core y pentium es anterior a dual core esanteriora(pentium, core dou):- esposteriora(core dou, dual core), esanteriora(pentium, dual core). % celeron y centrino son de la misma familia si el fabricante de celeron es tambin de centrino y si celeron % no es lo mismo que centrino esfamiliade(celeron, centrino):- celeron \== centrino. % core dou es familiar de pentium si core dou pertenece a centrino o Intel fabrica core duo esfamiliarde(core duo, pentium):- pertenecea(core duo, centrino). esfamiliarde(core duo, pentium):- fabrica(intel, core duo). % consultas % celeron es familia de pentium ?- esfamiliade(celeron, pentium). si % core dou es posterior a pentium ?- esposteriora(core duo, pentium). si % dual core es anterior a core duo? ?- esanteriora(dual core, core duo). no % Ejemplo sobre Listas Prolog % las listas se encuentran entre []. % para determinar que una lista vaca es 0 se hace de la manera. longitud([], 0). % para lograr obtener la cantidad de elementos en una lista se hace de la manera. longitud([H|T], N):- longitud(T, N0), N is N0 + 1. ?- longitud([a,b,c], L). 3
L.I. Vctor Hernndez Rodrguez Pgina 22

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

?- longitud([a,b,c],4). No % un elemento pertenece a la lista si coincide con la cabeza o si se encuentra en la cola de la lista. pertenece(X, [X|_]). pertenece(X, [_|R]):- pertenece(X, R). ?- pertenece(1, [1, 2, 3]). si ?- pertenece(2, [1, [2, 3]]). no ?- pertenece([2, 3], [1, [2, 3]]). si 6.3.3 Triplos.

Es una notacin compuesta de 3 elementos: <operador>, <operando1>, <operando2> el resultado se asocia al nmero de tripleta. Por ejemplo: W*X+(Y+Z) quedara de la manera: [1] *, W, X [2] +, Y, Z [3] +, [1], [2] Observe que toda expresin o instruccin, se debe descomponer en partes ms pequeas, de manera que solo estn formadas por 3 componentes o elementos. Un ejemplo de una condicin seria: if a>10 THEN r=a else r=10+1 [1] >, a, 10 2. saltar si falso, [1], 5 3. =, r, a 4. saltar, , 7 [5] +, 10, 1 6. =, r, [5] 7. ... El problema de las tripletas radica en que la optimizacin supone mover tripletas y hay que recalcular las referencias. Esto sucede en las tripletas indirectas y la solucin al problema de la reordenacin se logra mediante la indireccin. Esto se puede observar en el siguiente ejemplo: A=B+C*D/E F=C*D sin optimizar [1] *, C, D [2] /, [1], E [3] +, B, [2] [4] =, A, [3] [5] *, C, D [6] =, F, [1] 6.3.4 Cudruplos. Las cudruplas se componen como su nombre lo dice de 4 elementos, <operacin>, <operando1>, <operando2>, <resultado> un ejemplo seria: (A+B)*(C+D)-E
L.I. Vctor Hernndez Rodrguez Pgina 23

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

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

(+, A, B, T1) (+, C, D, T2) (*, T1, T2, T3) (-, T3, E, T4) Donde T1, T2, T3, T4 son variables temporales. Las cudruplas facilitan la aplicacin de muchas optimizaciones, pero hay que tener un algoritmo para la reutilizacin de las variables temporales (reutilizacin de registros del procesador).

6.4 Esquemas de generacin.


Los esquemas es una representacin bsica de las operaciones que se pueden realizar por el lenguaje programacin, utilizando arboles de anlisis para la generacin de cdigo intermedio. Y se asocia a un grupo instrucciones a aplicar a la expresin como se observ en el apartado de notacin polaca. Los esquemas generacin son las estrategias o acciones que se debern realizarse y tomarse en cuenta en el momento generar cdigo intermedio. 6.4.1 Expresiones. Toda expresin debe reducirse a sus partes mnimas y de esa manera obtener una plantilla o esquema de cmo solucionar la instruccin. Por ejemplo: a=b+c*d/e Se descompone en las operaciones prefijas: [1] *, c, d [2] /, [1], e [3] +, b, [2] 4. =, a, [3] El esquema de instrucciones queda de la manera: Operador Operando, Operando 6.4.2 Declaracin de variables, 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 en: int a; int b; int c; 6.4.3 Estatuto de asignacin. 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.
L.I. Vctor Hernndez Rodrguez Pgina 24

de de de de

You might also like