Sunteți pe pagina 1din 9

Generacin de cdigo intermedio

LENGUAJES INTERMEDIOS

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 optimizaciones sobre el cdigo intermedio (Las complejas
rutinas de optimizacin son independientes de la mquina).

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

Tipos de lenguajes intermedios:
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 N?1).
o Los ms usuales son los tercetos (tripletas) y los cuartetos (cudruplas),
llamados tambin cdigo de tres direcciones.


Usos del Cdigo Intermedio

Mltiples lenguajes y compiladores: n+m mdulos -> n*m compiladores

Optimizacin: Representacin de fcil modificacin

Modelos de generacin de cdigo o Mquinas abstractas: FAM, G-machine,
mquina de Warren

Compiladores transportables: PASCAL /P-Code, JAVA

Interpretacin rpida: OAKLisp, CLISP

Depuracin: Intrpretes de C u otros lenguajes

2.1 Notaciones

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.

2.1.1 NOTACION INFIJA

La Expresin o Notacin InFija es la forma mas comn que utilizamos para escribir
expresiones matemticas, estas notaciones se refiere a que el operador esta entre
los operandos. La notacin infija puede estar completamente parentizada 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=12


2.1.2 NOTACION PREFIJA

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.

La notacin de prefijo ha visto una amplia aplicacin con las S-expressions, donde
son requeridos los parntesis debido a los operadores aritmticos que tienen
aridad variable. El lenguaje de programacin Ambi usa la notacin polaca para
operaciones aritmticas y la construccin del programa. La posfija notacin polaca
inversa es usada en muchos lenguajes de programacin basados en pila como
PostScript, y es el principio de operacin de ciertas calculadoras, notablemente las
de Hewlett-Packard.

Aunque sea obvio, es importante observar que el nmero de operandos en una
expresin debe igualar al nmero de operadores ms uno, de lo contrario la
sentencia no tiene ningn sentido (asumiendo que solamente son usados
operadores binarios en la expresin). Esto puede ser fcil de pasarlo por alto
cuando se trata con expresiones ms largas y ms complicadas con varios
operadores, as que se debe tener cuidado de comprobar con minuciosidad que
una expresin tiene sentido al usar la notacin de prefijo.


La Expresin o Notacin PreFija 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.


2.1.3 NOTACION POSFIJA

Notacin Polaca Inversa, Notacin de Posfijo o Notacin Posfija. Mtodo
algebraico alternativo de introduccin de datos."Introducida en 1920 por el
matemtico polaco Jan Lukasiewicz, en donde cada operador est antes de sus
operandos.

Es frecuentemente usada en lenguajes de programacin concatenativos y
basados en pila. Tambin es comn en sistemas basados en flujo de datos y
tuberas, incluyendo las tuberas de Unix.
Su funcionamiento
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.
El orden de los operandos es importante cuando se manejan operadores no
conmutativos (como la resta o la divisin), as, si dividimos 10 entre 2, por
ejemplo, en las tres notaciones se debe escribir de la siguiente manera: "10
/ 2", "/ 10 2", "10 2 /".
Operadores
* / + - ^
Operandos
a b c...
1 2 3 4...






Pros y Contras de la Notacin Polaca Inversa

Generacin de cdigo:
Simple
No utiliza registros
Optimizacin
Es difcil de reordenar ya que hay que considerar el
contenido de la pila
Interpretacin rpida
Es muy fcil de interpretar ya que solo necesita una pila
Transportable:
Si, ya que todos los procesadores implementan una pila
2.2 Representaciones de cdigo Intermedio.
Formas de Representacin Intermedia
En la historia de los compiladores han sido utilizadas una amplia variedad de
representaciones intermedias sin embargo la forma ms simple es la notacin
posfija, la cual tambin es conocida en matemticas como notacin libre de
parntesis para expresiones aritmticas que han sido utilizadas mucho tiempo
antes que los compiladores. Como su nombre lo implica la notacin posfija es una
representacin en la cual los operadores aparecen despus que los operandos
para los cuales se aplican.
Una de las atracciones principales de la notacin posfija es la simplicidad en la
traduccin de los procesos, y la consistencia de la representacin. Estos factores
hacen de esta notacin la ms usual como una representacin intermedia para el
manejo de intrpretes. de hecho la notacin posfija no es muy efectiva como
entrada para un optimizador a un generador de cdigo, a menos que el cdigo
objeto a generar tenga una arquitectura en forma de pila.

La siguiente clase de representacin de cdigo intermedio se refiere a un rbol de
3 direcciones, 2 para los operandos y una para la ubicacin del resultado. Esta
clase incluye un amplio nmero de representaciones diferentes entre las cuales
encontramos cudruplos y triples. la principal diferencia entre estas notaciones y la
notacin posfija es que ellos incluyen referencias explicitas para los resultados de
los clculos intermedios. Mientras que la notacin posfija los resultados son
implcitos al representarlos en una pila.
La diferencia entre triples y cudruplos es que con los triples es referenciado el
valor intermedio hacia el nmero del triple que lo creo, pero en los cudruplos
requiere que ellos tengan nombre implcitos.
Los triples tienen una ventaja obvia de ser ms consistente, pero ellos dependen
de su posicin, y hacen que la optimizacin presente cambios de cdigo mucho
ms compleja.

Aspectos de Diseo de un Generador de Cdigo Entrada al generador de
cdigo

La entrada para la generacin de cdigo consta de una representacin intermedia
del programa fuente, junto con la informacin de la tabla de smbolos que se utiliza
para determinar las direcciones durante la ejecucin de los datos denotados por
los nombres de la representacin intermedia. El cdigo se puede generar desde el
punto de vista del cdigo de 3 direcciones, notacin posfija, cudruplos, triples,
etc.
Se asume que antes de la generacin de cdigo la etapa inicial a hecho los
anlisis lxico, semntico, sintctico y se ha traducido el programa fuente a una
representacin intermedia razonablemente detallada, as que los valores de los
nombres que aparecen en el lenguaje intermedio pueden ser representados por
cantidades que la maquina objeto puede manipular directamente. Por lo tanto, la
fase de generacin de cdigo puede proseguir con la hiptesis de que su entrada
no contiene errores.
Programas objeto: La salida del generador de cdigo es el programa objeto. Al
igual que el cdigo intermedio esta salida puede adoptar una variedad de formas:
Lenguajes de maquina absoluto, lenguaje de maquina relocalizable o lenguaje
ensamblador

Lenguaje Mquina Absoluto
Para producir como salida un programa en lenguaje absoluto tiene la ventaja de
que se puede colocar en una posicin fija de memoria y ejecutarse
inmediatamente. Un programa pequeo se puede compilar y ejecuta.

Lenguaje Mquina Relocalizable
Producir como salida un lenguaje maquina relocalizable (modulo objeto) permiten
que los programas se compilen por separado .Un conjunto de mdulos objeto
relocalizables se pueden enlazar. Aunque se tenga que pagar costo de enlazar y
cargar si se producen mdulos objetos relocalizables, se gana mucha flexibilidad
al poder compilar subrutinas por separado y llamar desde el modulo objeto a otros
programas previamente compilados.

Lenguaje Ensamblador
Producir Como la salida un programa en lenguaje ensamblador facilita la
generacin de cdigo. Se pueden generar instrucciones simblicas y utilizar las
macros del ensamblador para ayudar a generar el cdigo, el precio que se paga
es el paso de ensamble despus de la generacin de cdigo.
Como producir cdigo ensamblador no duplica la tarea completa del compilador
esta eleccin es otra alternativa razonable, especialmente para una maquina con
memoria pequea, donde un compilador debe utilizar varias pasadas.


2.2.1 NOTACION POLACA
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.
Fue explicada en los temas anteriores

2.2.2 CODIGO P
Cdigo P
Un tipo de lenguaje interpretado. idiomas P-cdigo son una especie de hbrido,
que caen entre lenguajes compilados y lenguajes interpretados de la manera que
se ejecuten. Al igual que un lenguaje interpretado, la programacin del P-cdigo
se convierte en una forma binaria de forma automtica cuando se ejecuta, en lugar
de tener que ser compilado. Sin embargo, a diferencia de un lenguaje compilado el
archivo binario ejecutable se almacena en pseudo-cdigo, no en lenguaje de
mquina. Adems, a diferencia de un lenguaje interpretado, el programa no tiene
que ser convertida a binario cada vez que se ejecute. Despus de que se
convierte en P-cdigo la primera vez, la versin pseudo-cdigo se utiliza para cada
ejecucin adicionales.
Cdigo P (y por tanto sus programas) tienden a ser ms lento que los lenguajes
compilados y programas, pero ms rpido que lenguajes interpretados, y por lo
general tienen autorizacin para algunas funciones del sistema operativo de bajo
nivel, pero no el acceso directo al hardware. No requieren compiladores a veces
costosos, a menudo se incluyen junto con los sistemas operativos, y algunos
lenguajes de cdigo p-son ms fciles de programar que lenguajes compilados.
Ejemplos de lenguas Pcode son Java, Python y REXX / REXX objetos.

2.2.Triplos
En la historia de los compiladores han sido utilizadas una amplia variedad de
representaciones intermedias como lo es la siguiente clase de representacin de
cdigo intermedio de un rbol de 3 direcciones,2 para los operandos y una para la
ubicacin del resultado. esta clase incluye un amplio numero de representaciones
diferentes entre las cuales encontramos cuadruplos y triples. la principal diferencia
entre estas notaciones y la notacin postfija es que ellos incluyen referencias
explicitas para los resultados de los clculos intermedios, mientras que la notacin
posfija los resultados son implcitos al representarlos en una pila.
La diferencia entre triples y cuadruplos es que con los triples es
referenciado el valor intermedio hacia el numero del triple que lo creo, pero en los
cudruplos requiere que ellos tengan nombre implcitos.
Los triples tienen una ventaja obvia de ser mas consistente, pero ellos
dependen de su posicin, y hacen que la optimizacin presente cambios de cdigo
mucho mas compleja.
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 si





2.2.4 Cudruplos
Es una estructura tipo registro con cuatros campos que se llaman:
Donde operando1, operando2 y resultado pueden ser constantes,
identificadores y variables temporales definidos por el compilador mientras que
operador representa una operacin arbitraria.





EJEMPLO:
A := B + C * D

Esquemas de generacin.
Que son?
Los esquemas de generacin son las estrategias o acciones que debern
realizarse y tomarse en cuenta en el momento de generar cdigo intermedio.
Declaracin de 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; intc; respectivamente.

Operador Operando1 Operando2
Operador Operando1 Operando2 Resultado
* C D T1
+ B T1 T2
= T2 A
Las variables utilizadas en los programas se clasifican en dos tipos:
variables locales y variables globales.


Variables locales:
Aquella que est declarada para el programa o algoritmo completo.

Para definir variables locales, la definicin debe hacerse inmediatamente
despus de una llave de inicio ({), y la variable deja de existir fuera de la llave de
fin(}) que corresponde a la llave de inicio despus del cul fue definida la variable.
Ejemplo:
{
int a,b;
a=5;
b=a + 100;
}

Variables globales:
Aquella que est declarada y definida dentro de una funcin y slo es vlida
dentro de la misma funcin y no podr utilizarse en otra parte del programa.
Una variable global se declara fuera de cualquier funcin y primero que
cualquier funcin que requiera de ella. Una variable se declara de la
siguiente forma:
tipo identificador1, identificador2..ident n;

Ejemplos:
Algunos ejemplos de cmo definir variables son los siguientes:
int alumnos, contador;
float A,B,C;
char Letra;

S-ar putea să vă placă și