Vous êtes sur la page 1sur 79

Etapas finales de un traductor

M.C. Juan Carlos Olivares Rojas

Noviembre 2009

Agenda
Generador de cdigo intermedio (opcional)

Optimizador (puede ser opcional e ir en esta


etapa o hasta despus de haber generado la
traduccin)
Generador de cdigo objeto.

Generacin de Cdigo
Intermedio
Etapas Finales de un Traductor

Agenda
Lenguajes intermedios.

Notaciones.
Infija.
Postfija.
Prefija.

Representacin de cdigo intermedio.


Notacin Polaca.
Codigo P.
Triplos y Cudruplos.

Agenda
Esquemas de generacin.
Expresiones.
Declaracin de variables, constantes
Estatuto de asignacin.
Estatuto condicional.
Estatuto de ciclos
Arreglos.
Funciones.

Cdigo Intermedio
Es una etapa opcional en muchos casos que
ayuda a simplificar la produccin de cdigo
objeto
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.

Generador de Cod. Intermedio


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.

Generador Cod. Intermedio


a := b*-c+b*-c
abc -*bc -*+=

x := y op z
x+y*z
t1:=y*z
t2:=x+t1

Lenguajes intermedios
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.

Lenguajes Intermedios
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 executable
.exe

Lenguajes Intermedios
En sistemas basados en Unix, tambin ocurre
algo similar generndose un archivo .o y el
executable 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)

Lenguajes Intermedios
Otros lenguajes intermedios 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

Notaciones
Las notaciones sirven de base para expresar
sentencias bien definidas.
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.

Notaciones
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.

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 posftfija utiliza una estructura del
tipo LIFO (Last In First Out) pila, la cual es la
ms utilizada para la implementacin.

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 (First In First Out) o cola.
Las estructuras FIFO son ampliamente
utilizadas pero tienen problemas con el
anidamiento aritmtico.

Representacin Cod Int.


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

Cdigo P
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.

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 ms entendible para la
mquina.

Las estructuras de control (if, switch, while, dowhile, for) son realmente etiquetas goto
disfrazadas.

Triplos
El problema de utilizar cudruplos radica en
que se tienen que colocar los valores
temporales en la tabla de smbolo.
Con 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

Triplos
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

Triplos
Se 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.

Triplos
La 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

Cmo resuelven los compiladores


expresiones? Forma Normal disyuntiva

las

Triplos
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.

Intrpretes
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 cuadruplos.

Cuadruplos
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.

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.

Declaracin de variables
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.

Estatutos 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.

Estatuto Condicional
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

Estatuto de Ciclos
Los ciclos se descomponen en un ciclo
genrico, por lo que ciclos while, for y do- while
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.

Arreglos
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;

Funciones
Las funciones pueden reducir a en lnea, lo que
se hace es expander el cdigo original de la
funcin.
Las funciones se descomponen simplificando
los parmetros de manera individual al igual
que el valor de retorno.

Optimizacin
Etapas Finales del Proceso de
Traduccin

Agenda
Tipos de optimizacin.
Locales.
Bucles.
Globales.
De mirilla.

Costos.
Costo de ejecucin.
Criterios para mejorar el cdigo.
Herramientas para el anlisis del flujo de datos.

Tipos de Optimizacin
Las optimizaciones pueden realizarse de
diferentes formas. Las optimizaciones se
realizan en base al alcance ofrecido por el
compilador.

La optimizacin va a depender del lenguaje de


programacin y es directamente proporcional al
tiempo de compilacin; es decir, entre ms
optimizacin mayor tiempo de compilacin.

Tipos de Optimizacin
Como el tiempo de optimizacin es gran
consumidor de tiempo (dado que tiene que
recorrer todo el rbol de posibles soluciones
para el proceso de optimizacin) la
optimizacin se deja hasta la fase de prueba
final.
Algunos editores ofrecen una versin de
depuracin y otra de entrega o final.

Tipos de Optimizacin
La optimizacin es un proceso que tiene a
minimizar o maximizar alguna variable de
rendimiento, generalmente tiempo, espacio,
procesador, etc.

Desafortunamente no existen optimizador que


hagan un programa ms rpido y que ocupe
menor espacio.

Tipos de optimizacin
La optimizacin se realiza reestructurando el
cdigo de tal forma que el nuevo cdigo
generado tenga mayores beneficios.
La mayora de los compiladores tienen una
optimizacin baja, se necesita de compiladores
especiales para realmente optimizar el cdigo.

Optimizacin Local
La optimizacin local se realiza sobre mdulos
del programa. En la mayora de las ocasiones a
travs de funciones, mtodos, procedimientos,
clases, etc.

La caracterstica de las optimizaciones locales


es que slo se ven reflejados en dichas
secciones.

Optimizacin Local
La optimizacin local sirve cuando un bloque
de programa o seccin es crtico por ejemplo:
la E/S, la concurrencia, la rapidez y
confiabilidad de un conjunto de instrucciones.

Como el espacio de soluciones es ms


pequeo la optimizacin local es ms rpida

Optimizacin de Ciclos
Los ciclos son una de las partes ms
esenciales en el rendimiento de un programa
dado que realizan acciones repetitivas, y si
dichas acciones estn mal realizadas, el
problema se hace N veces ms grandes.
La mayora de las optimizaciones sobre ciclos
tratan de encontrar elementos que no deben
repetirse en un ciclo.

Optimizacin de Ciclos
Sea el ejemplo:

while(a == b) {
int c = a;
c = 5;
;
}
En este caso es mejor pasar el int c =a; fuera
del ciclo de ser posible.

Optimizacin de ciclos
El problema de la optimizacin en ciclos y en
general radica es que muy difcil saber el uso
exacto de algunas instrucciones. As que no
todo cdigo de proceso puede ser optimizado.

Otros uso de la optimizacin pueden ser el


mejoramiento de consultas en SQL o en
aplicaciones remotas (sockets, E/S, etc.)

Optimizacin Global
La optimizacin global se da con respecto a
todo el cdigo.
Este tipo de optimizacin es ms lenta pero
mejora el desempeo general de todo
programa.
Las optimizaciones globales pueden depender
de la arquitectura de la mquina.

Optimizacin Global
En algunos casos es mejor mantener variables
globales para agilizar los procesos (el proceso
de declarar variables y eliminarlas toma su
tiempo) pero consume ms memoria.

Algunas optimizaciones incluyen utilizar como


variables
registros
del
CPU,
utilizar
instrucciones en ensamblador.

Optimizacin de Mirilla
La optimizacin de mirilla trata de estructurar
de manera eficiente el flujo del programa, sobre
todo en instrucciones de bifurcacin como son
las decisiones, ciclos y saltos de rutinas.

La idea es tener los saltos lo ms cerca de las


llamadas, siendo el salto lo ms pequeo
posible

Costos
Los costos son el factor ms importante a
tomar en cuenta a la hora de optimizar ya que
en ocasiones la mejora obtenida puede verse
no reflejada en el programa final pero si ser
perjudicial para el equipo de desarrollo.
La optimizacin de una pequea mejora tal vez
tenga una pequea ganancia en tiempo o en
espacio pero sale muy costosa en tiempo en
generarla.

Costos
Pero en cambio si esa optimizacin se hace por
ejemplo en un ciclo, la mejora obtenida puede
ser N veces mayor por lo cual el costo se
minimiza y es benfico la mejora.

Por ejemplo: for(int i=0; i < 10000; i++); si la


ganancia es de 30 ms 300s

Costos de Ejecucin
Los costos de ejecucin son aquellos que
vienen implcitos al ejecutar el programa.
En algunos programas se tiene un mnimo para
ejecutar el programa, por lo que el espacio y la
velocidad
del
microprocesadores
son
elementos que se deben optimizar para tener
un mercado potencial ms amplio.

Costos de Ejecucin
Las aplicaciones multimedia como los
videojuegos tienen un costo de ejecucin alto
por lo cual la optimizacin de su desempeo es
crtico, la gran mayora de las veces requieren
de procesadores rpidos (e.g. tarjetas de video)
o de mucha memoria.
Otro tipo de aplicaciones que deben
optimizarse son las aplicaciones para
dispositivos mviles.

Costos de Ejecucin
Los dispositivos mviles tiene recursos ms
limitados que un dispositivo de cmputo
convencional razn por la cual, el mejor uso de
memoria y otros recursos de hardware tiene
mayor rendimiento.
En algunos casos es preferible tener la lgica
del negocio ms fuerte en otros dispositivos y
hacer uso de arquitecturas descentralizadas
como cliente/servidor o P2P.

Criterios Mejora de Software


La mejor manera de optimizar el cdigo es
hacer ver a los programadores que optimicen
su cdigo desde el inicio, el problema radica en
que el costo podra ser muy grande ya que
tendra que codificar ms y/o hacer su cdigo
mas legible.
Los criterios de optimizacin siempre estn
definidos por el compilador

Criterios de Optimizacin
Muchos de estos criterios pueden modificarse
con directivas del compilador desde el cdigo o
de manera externa.
Este proceso lo realizan algunas herramientas
del sistema como los ofuscadores para cdigo
mvil y cdigo para dispositivos mviles.

Htas. Anlisis Flujo Datos


Existen algunas herramientas que permiten el
anlisis de los flujos de datos, entre ellas
tenemos los depuradores y desambladores.
La optimizacin al igual que la programacin es
un arte y no se ha podido sistematizar del todo.

Generacin de Cdigo Objeto


Juan Carlos Olivares Rojas

Agenda
Lenguaje mquina.
Caractersticas.
Direccionamiento.

Lenguaje ensamblador.
Caractersticas.
Almacenamiento.

Registros.
Distribucin.
Asignacin.

Administracin de memoria.

Lenguaje Mquina
El lenguaje mquina slo es entendible por las
computadoras. Se basa en una lgica binaria
de 0 y 1, generalmente implementada por
mecanismos elctricos.

En general el lenguaje mquina es difcil de


entender para los humanos por este motivo
hacemos uso de lenguajes ms parecidos a los
lenguajes naturales.

Caractersticas
El lenguaje mquina realiza un conjunto de
operaciones
predeterminadas
llamadas
microoperaciones.
Las
microoperaciones
slo
realizan
operaciones del tipo aritmtica (+,-,*, /), lgicas
(AND, OR, NOT) y de control (secuencial,
decisin, repetitiva)

Caractersticas
El lenguaje mquina es dependiente del tipo de
arquitectura. As un programa mquina para
una arquitectura intel x86 no se ejecutar en
una arquitectura Power PC de IBM (al menos
de manera nativa).
Algunos microprocesadores implementan ms
funcionalidades llamado CISC, pero son ms
lentos que los RISC ya que estos tienen
registros ms grandes.

Direccionamiento
Es la forma en como se accede a la memoria.
Recordar que un programa no puede
ejecutarse sino se encuentra en memoria
principal.

La forma de acceder a la memoria depende del


microprocesador, pero en general existen dos
tipos de direccionamiento: directo e indirecto.

Direccionamiento
El direccionamiento directo tambin recibe el
nombre de direccionamiento absoluto y el
acceso a las direcciones se hace de manera
directa.

El direccionamiento indirecto tambin recibe el


nombre de direccionamiento relativo y se basa
a partir de una direccin genrica,
generalmente el inicio del programa.

Direccionamiento
Para acceder a una direccin relativa se suma
a la direccin base el nmero de espacios de
memorias necesarias.
El direccionamiento relativo hace a los
programas relocalizables e independientes.
Si la direccin base es el inicio de la memoria
fija el direccionamiento pasa a ser un variante
de direccionamiento absoluto.

Lenguaje Ensamblador
El ensamblador (del ingls assembler) es un
traductor de un cdigo de bajo nivel a un
cdigo, ejecutable directamente por la mquina
para la que se ha generado.

Fue la primera abstraccin de un lenguaje de


programacin, posteriormente aparecieron los
compiladores.

Caractersticas
El programa lee un archivo escrito en lenguaje
ensamblador y sustituye cada uno de los
cdigos mnemotcnicos por su equivalente
cdigo mquina.

Los programas se hacen fcilmente portables


de mquina a mquina y el clculo de
bifurcaciones se hace de manera fcil.

Ensambladores
Ensambladores bsicos. Son de muy bajo
nivel, y su tarea consiste bsicamente en
ofrecer nombres simblicos a las distintas
instrucciones, parmetros y cosas tales como
los modos de direccionamiento.

Ensambladores
Ensambladores
modulares,
o
macro
ensambladores.
Descendientes
de
los
ensambladores bsicos, fueron muy populares
en las dcadas de los 50 y los 60, antes de la
generalizacin de los lenguajes de alto nivel.
Una macroinstruccin es el equivalente a una
funcin en un lenguaje de alto nivel.

Almacenamiento
Una de las principales ventajas del uso del
ensamblador, es que se encarga de administrar
de manera transparente para el usuario la
creacin de memoria, las bifurcaciones y el
paso de parmetros. Adems nos permite
acceder directamente a los recursos de la
mquina para un mejor desempeo.

Registros
Los registros son la memoria principal de la
computadora. Existen diversos registros de
propsito general y otros de uso exclusivo.
Algunos registros de propsito general son
utilizados para cierto tipo de funciones.
Existen registros acumuladores, puntero de
instruccin, de pila, etc.

Distribucin
La distribucin es el proceso en el que el
programa generado puede ejecutarse en otras
mquinas.
Con respecto al ensamblador, la mayora del
direccionamiento se hace relativo para que el
programa sea relocalizable por un programa
llamado cargador

Distribucin
En el caso de programas compilados
necesitan de las libreras, si son estticas
incluyen en el ejecutable por lo que
programa se hace grfico, si son dinmicas
pero el programa es ms pequeo.

se
se
el
no

Debido a la complejidad del software actual se


necesitan de asistentes para poder instalar y
ejecutar un programa

Asignacin
La asignacin de valores a variables se hace a
travs de un proceso de mover el contenido de
memoria a registro, o de registro a memoria,
pero nunca de memoria a memoria.

Cuando se trata de memoria dinmica se debe


seguir el rastro de los datos

Administracin memoria
La administracin de la memoria e sun proceso
hoy en da muy importante, de tal modo que su
mal o buen uso tiene una accin directa sobre
el desempeo de memoria.

En general un ensamblador tiene un


administrador de memoria ms limitado que un
compilador.

Administracin de Memoria
En la mayora de los lenguajes de
programacin el uso de punteros no estaba
vigilado por lo que se tienen muchos problemas
con el uso de memoria. Los lenguajes ms
recientes controlan el uso de punteros y tienen
un programa denominado recolector de basura
que se encarga de limpiar la memoria no
utilizada mejorando el desempeo.

Referencias
Aho (2006), et. al. Compiladores: Principios y
Tcnicas. Segunda Edicin.

Preguntas?

Vous aimerez peut-être aussi