Documente Academic
Documente Profesional
Documente Cultură
Noviembre 2009
Agenda
Generador de cdigo intermedio (opcional)
Generacin de Cdigo
Intermedio
Etapas Finales de un Traductor
Agenda
Lenguajes intermedios.
Notaciones.
Infija.
Postfija.
Prefija.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
Direccionamiento
El direccionamiento directo tambin recibe el
nombre de direccionamiento absoluto y el
acceso a las direcciones se hace de manera
directa.
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.
Caractersticas
El programa lee un archivo escrito en lenguaje
ensamblador y sustituye cada uno de los
cdigos mnemotcnicos por su equivalente
cdigo mquina.
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
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.
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.
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?