You are on page 1of 31

COMPILADORE

S
UNIDAD
COMPONENTES DE UN
COMPILADOR

Que es un Compilador?
Los compiladores son programas o herramientas encargadas de
compilar. Un compilador toma un texto (cdigo fuente) escrito en
un lenguaje de alto nivel y lo traduce a un lenguaje comprensible
por
las
computadoras
(cdigo
objeto).
Un programa informtico que traduce un programa escrito en un
lenguaje de programacin a otro lenguaje de programacin,
generando un programa equivalente que la mquina ser capaz
de interpretar. El segundo lenguaje es lenguaje de mquina, pero
tambin puede ser simplemente texto. Este proceso de
traduccin se conoce como compilacin. Un compilador es un
programa que permite traducir el cdigo fuente de un programa
en lenguaje de alto nivel

Tipos de Compiladores
Compiladores cruzados : generan cdigo para un sistema
distinto del que estn funcionando.
Compiladores optimizadores : realizan cambios en el cdigo
para mejorar su eficiencia, pero manteniendo la funcionalidad
del programa original.
Compiladores de una sola pasada : generan el cdigo
mquina a partir de una nica lectura del cdigo fuente.
Compiladores de varias pasadas : necesitan leer el cdigo
fuente varias veces antes de poder producir el cdigo mquina.
Compiladores JIT (Just In Time): forman parte de un intrprete
y compilan partes del cdigo segn se necesitan.

Caractersticas
Generalmente un compilador se divide en dos partes:
* Front End: parte que analiza el cdigo fuente, comprueba su validez,
genera el rbol de derivacin y rellena los valores de la tabla de smbolos.
Parte que suele ser independiente de la plataforma o sistema operativo para
el que funcionar.
* Back End: parte en donde se genera el cdigo mquina exclusivo para
una plataforma a partir de lo analizado en el front end.
Por lo general el resultado del back end no puede ser ejecutado
directamente, se necesita pasar por un proceso de enlazado (linker).

Compiladores de JAVA
El lenguaje de programacin Java , fue diseado por la
compaa Sun Microsystems Inc, con el propsito de crear
un
lenguaje
que
pudiera
funcionar
en
redes
computacionales heterogneas ( redes de computadoras
formadas por ms de un tipo de computadora, ya sean PC,
MAC's, estaciones de trabajo , etc.),y que fuera
independiente de la plataforma en la que se vaya a ejecutar.
Esto significa que un programa de Java puede ejecutarse
en cualquier mquina o plataforma.

Caractersticas de compiladores
de JAVA
Evitar errores de memoria
Imposibilitar acceso al SO
Evitar que caiga la mquina sobre la que
corre
Ausencia de punteros: Protege frente a
imitacin de objetos, violacin de
encapsulacin, acceso a reas protegidas
de memoria, ya que el programador no
podr referenciar posiciones de memoria
especficas no reservadas, a diferencia de lo
que se puede hacer en C y C++.

Compiladores de C#
Es un lenguaje de programacin orientado a
objetos desarrollado y estandarizado por
Microsoft como parte de su plataforma .NET .
Esta es una interfaz de programacin de
aplicaciones ( API ), mientras que C es un
lenguaje de programacin independiente
diseado para generar programas sobre dicha
plataforma

Tipos de Compiladores
Microsoft.NET framework SDK (siglas en ingls de
software development kit) es generalmente un conjunto de
herramientas de desarrollo de software que le permite al
programador crear aplicaciones para un sistema concreto,
por ejemplo ciertos paquetes de software, frameworks,
plataformas de hardware, computadoras, videoconsolas,
sistemas operativos, etc. incluye un compilador de C
Microsoft Visual Studio versin 2002, 2003, 2005, 2008 y
2010
Mono
.NET desarrollado por Novell . Como parte de esta
implementacin se incluye un compilador de C.
Delphi 2006, de Borland Software Corporation. dotGNU
Portable.NET , de la Free Software Foundation .

Caractersticas compiladores C
#
Un ncleo del lenguaje simple, con funcionalidades aadidas
importantes, como funciones matemticas y de manejo de archivos,
proporcionadas por bibliotecas .
Es un lenguaje muy flexible que permite programar con mltiples estilos.
Un sistema de tipos que impide operaciones sin sentido.
Usa un lenguaje de pre procesado , el preprocesador de C , para tareas
como definir macros e incluir mltiples archivos de cdigo fuente .
Acceso a memoria de bajo nivel mediante el uso de punteros .
Interrupciones al procesador con uniones .
Un conjunto reducido de palabras clave

Compiladores vs Interpretes
Cualquier lenguaje puede ser ejecutado tanto va intrprete o va
compilador, pero algunos lenguajes suelen asociarse ms a una va que a
la otra, y por esto son llamados "lenguajes interpretados" o "lenguajes
compilados" respectivamente.
Tambin existen intrpretes que incluyen cierta "compilacin" en el medio.
Son aquellos que compilan a un cdigo intermedio llamado bytecode, que
es ms eficiente de ejecutar que hacerlo directamente desde el cdigo
fuente.
En general, la principal desventaja de los intrpretes, es que cuando un
programa es interpretado, suele ejecutarse ms lento que si el mismo
programa estuviese compilado. Esto se debe a que el intrprete debe
analizar cada sentencia en el programa en cada ejecucin (un anlisis en
tiempo real). Tambin el acceso a variables es ms lento en un intrprete,
porque mapear los identificadores para almacenar las localizaciones debe
hacerse repetidas veces en tiempo real.

ANALISIS LEXICO
Un analizador lxico o analizador lexicogrfico (en
ingls scanner) es la primera fase de un compilador
consistente en un programa que recibe como entrada el
cdigo fuente de otro programa (secuencia de
caracteres) y produce una salida compuesta de tokens
(componentes lxicos) o smbolos. Estos tokens sirven
para una posterior etapa del proceso de traduccin,
siendo la entrada para el analizador sintctico (en ingls
parser).
Sin embargo, un analizador lxico tambin es la parte
del traductor que maneja la entrada del cdigo fuente, y
puesto que esta entrada a menudo involucra un
importante gasto de tiempo, el analizador lxico debe
funcionar de manera tan eficiente como sea posible.

GRAMTICA LXICA
La especificacin de un lenguaje de programacin a menudo incluye un
conjunto de reglas que definen el lxico. Estas reglas consisten comnmente
en expresiones regulares que indican el conjunto de posibles secuencias de
caracteres que definen un Token o lexema.
En algunos lenguajes de programacin es necesario establecer patrones
para caracteres especiales (como el espacio en blanco) que la gramtica
pueda reconocer sin que constituya un Token en s.
ANLISIS
Esta etapa est basada usualmente en una mquina de estados finitos. Esta
mquina contiene la informacin de las posibles secuencias de caracteres
que puede conformar cualquier Token que sea parte del lenguaje (las
instancias individuales de estas secuencias de caracteres son denominados
lexemas). Por ejemplo, un Token de naturaleza entero puede contener
cualquier secuencia de caracteres numricos.

ANALISIS SINTACTICO
El anlisis sintctico convierte el texto de entrada en otras
estructuras (comnmente rboles), que son ms tiles para el
posterior anlisis y capturan la jerarqua implcita de la entrada. Un
analizador lxico crea tokens de una secuencia de caracteres de
entrada y son estos tokens los que son procesados por el
analizador sintctico para construir la estructura de datos, por
ejemplo un rbol de anlisis o rboles de sintaxis abstracta.
El anlisis sintctico tambin es un estado inicial del anlisis de
frases de lenguaje natural. Los lenguajes habitualmente
reconocidos por los analizadores sintcticos son los lenguajes
libres de contexto.

Tipos generales
gramticas:

de

analizadores

sintcticos

para

a) Anlisis sintctico descendente. Construye rboles de anlisis


sintctico desde arriba (raz) hacia abajo (hojas). El anlisis se
realiza de lo general a lo particular.
b) Anlisis sintctico ascendente. Construyen rboles de anlisis
sintctico comenzando en las hojas y suben hacia la raz. El
anlisis se realiza de lo particular a lo general.
En ambos casos, se examina la entrada al analizador lxico de
izquierda
a
derecha,
un
smbolo
a
la
vez.

ANALISIS SINTACTICO DESCENDENTE


Se considera un intento de encontrar una derivacin por la izquierda para
una cadena de entrada. Tambin se puede considerar como un intento de
construir un rbol de anlisis sintctico para la entrada comenzando desde
la raz y creando nodos del rbol en orden previo.
ANALISIS SINTACTICO ASCENDENTE
El anlisis sintctico ascendente intenta construir un rbol para la cadena
de entrada que comienza por las hojas (el fondo) y avanza hacia la raz (la
cima).
ANLISIS SINTCTICO POR PRECEDENCIA DE OPERADORES
Para una pequea clase de gramticas se puede construir con facilidad a
mano eficientes analizadores sintcticos ascendentes. Ests gramticas,
por precedencia de operadores, tienen la propiedad de que ningn lado
derecho de la produccin es ni tiene 2 terminales adyacentes.
Una gramtica con esta ltima propiedad de denomina gramtica de
operadores.

ANALIZADORES SINTCTICOS IZQUIERDA-DERECHA


Es una tcnica eficiente de anlisis sintctico ascendente que se puede
utilizar para analizar una amplia clase de gramticas independientes de
contexto, denominada Anlisis sintctico LR(k)
L es por el examen de la entrada de izquierda a derecha (left to right)
R por construir una derivacin por la derecha (right most derivation) en
orden inverso.
K por el nmero de smbolos de entrada de examen por anticipado
utilizados para tomar decisiones del anlisis sintctico. Cuando se omite,
se asume que k es 1.
Este anlisis es atractivo por varias razones:
Reconocen prcticamente todas las construcciones de los lenguajes de
programacin para los que se pueden escribir gramticas independientes
del contexto.
Puede detectar un error sintctico tan pronto como sea posible hacerlo en
un examen de izquierda a derecha de la entrada.

ANALISIS SEMANTICO
Que es la semntica?
Se refiere a los aspectos del significado, sentido o interpretacin
del significado de un determinado elemento, smbolo, palabra,
expresin o representacin formal.
Anlisis semntico
Se trata de determinar el tipo de los resultados intermedios,
comprobar que los argumentos que tiene un operador
pertenecen al conjunto de los operadores posibles, y si son
compatibles entre s, etc. En definitiva, comprobar que el
significado de lo que se va leyendo es vlido.

Que es un rbol semntico?

Es una estructura jerrquica en la cual se registran las


operaciones que implica u operan dentro del programa fuente
En cada una de las ramas del rbol semntico se registra el
valor o significado que este debe tener, y el anlisis semntico
se
encarga
de
terminar
cual
de
los valores registrados en las ramas es aplicable.
Ejemplo:
Suponiendo que tenemos esta lnea de cdigo en C:
res=valor1+valor2;
El anlisis semntico se va a encargar que tanto el valor1 como el
valor2 tengan datos que son compatibles en comn y que adems
se les pueda aplicar dicho operador.
En C el smbolo (+) implica una suma de valores o una unin de las
cadenas

Tabla de smbolos
Un compilador necesita guardar y usar la informacin de
los objetos que se va encontrando en el texto fuente, como
variables, etiquetas, declaraciones de tipos, etc.
Esta informacin se almacena en una estructura de datos
interna
conocida
como
tabla
de
smbolos.
El compilador debe desarrollar una serie de funciones
relativas a la manipulacin de esta tabla como insertar un
nuevo elemento en ella, consultar la informacin
relacionada con un smbolo, borrar un elemento, etc.
Como se tiene que acceder mucho a la tabla de smbolos
los accesos deben ser lo ms rpidos posible para que la
compilacin
sea
eficiente.

GENERACION DE CODIGO INTERMEDIO

OPTIMIZACION DE CODIGO

Generacin de cdigo
Se realiza mientras se analiza el programa
Libre del contexto

Optimizacin
Se realiza despus de la generacin de cdigo de
todo el programa o de un elemento ejecutable del
programa (funcin, procedimiento, etc).
Dependiente del contexto

Generacin de Cdigo y Optimizacin

Se ejecuta todo
junto. Mientras
se analiza se
genera cdigo

Optimizacin
Objetivo
Obtener cdigo que se ejecuta ms eficientemente segn los
criterios
Tiempo de ejecucin (optimizacin temporal)
Espacio de memoria utilizado (optimizacin espacial)
Funcionamiento
Revisa el cdigo generado a varios niveles de abstraccin y
realiza las optimizaciones aplicables al nivel de abstraccin
Representaciones de cdigo intermedio de ms a menos
Abstractas
rbol sintctico abstracto: optimizar subexpresiones
redundantes, reduccin de frecuencia, etc.
Ensamblador/Cdigo mquina: convertir saltos
cortos,reordenar instrucciones

saltos

Optimizacin
Funcionamiento (continuacin)
Representaciones de cdigo para extraer informacin.
Condiciones que se han de cumplir
El cdigo optimizado se ha de comportar igual que el cdigo
de partida excepto por ser ms rpido o ocupar menos
espacio.
Hay que buscar transformaciones que no modifiquen el
comportamiento del cdigo segn el comportamiento
definido para el lenguaje de programacin. Ejemplo
Si no se ha definido el orden de evaluacin de los operandos
la siguiente optimizacin es vlida
B=2*A+(A=c*d);
Pasar a
A=c*d;
B=A*2;

BLOQUE BSICO
Un bloque bsico es un fragmento de cdigo que tiene una
nica entrada y salida, y cuyas instrucciones se ejecutan
secuencialmente. Implicaciones:
Si se ejecuta una instruccin del bloque se ejecutan todas
en un orden conocido en tiempo de compilacin.
La idea del bloque bsico es encontrar partes del programa
cuyo anlisis necesario para la optimizacin sea lo ms
simple posible.

MANEJO DE ERRORES

El compilador tiene que:


Reportar clara y exactamente la presencia de
errores
Recuperarse de cada error lo suficientemente
rpido para poder detectar errores subsiguientes
Tratar de evitar mensajes falsos de error
Tipos de Errores
Lxicos
Sintcticos
Semnticos
Lgicos

Errores Lxicos
Un error que produce un token errneo
Errores lxicos posibles
Un identificador, palabra reservada u operador mal escrito
(typo)

Errores Sintcticos
Un error de sintaxis se detecta cuando el analizador sintctico
espera un smbolo que no corresponde al que se acaba de
leer. Los analizadores sintcticos tienen la ventaja de que
pueden detectar errores sintcticos lo ms pronto posible, es
decir, se genera un mensaje de error en cuanto el smbolo
analizado no sigue la secuencia de los smbolos analizados
hasta ese momento.
Expresin aritmtica con parntesis no balanceados
Un punto y coma faltante

Errores Semnticos
Un error que necesita informacin sensitiva al contexto para ser
identificado
Ejemplos
Un operador aplicado a un tipo incompatible de operando
Accesar una variable no declarada

Errores Lgicos
Errores en el modelo de ejecucin
Ejemplos
Recursin infinita
Accesar un arreglo fuera de los lmites
Diferenciar un null

MANEJO DE SIMBOLOS O TABLA DE


SIMBOLOS
Una tabla de smbolos es una estructura de datos que usa el proceso de
traduccin de un lenguaje de programacin, por un compilador o un
intrprete, donde cada smbolo en el cdigo fuente de un programa est
asociado con informacin tal como la ubicacin, el tipo de datos y el
mbito de cada variable, constante o procedimiento.
Puede tratarse como una estructura transitoria o voltil, que sea utilizada
nicamente en el proceso de traduccin de un lenguaje de programacin,
para luego ser descartada, o integrada en la salida del proceso de
compilacin para una explotacin posterior, como puede ser por ejemplo,
durante una sesin de depuracin, o como recurso para obtener un
informe de diagnstico durante o despus la ejecucin de un programa.
Los smbolos en la tabla de smbolos pueden referirse a constantes, a
funciones o a tipos de datos en el cdigo fuente de un programa.

La siguiente representa una serie de atributos que no es necesaria


para todos los compiladores, sin embargo cada uno de ellos se
puede utilizar en la implementacin de un compilador particular.
Nombre del identificador.
Direccin en tiempo de ejecucin a partir del cual se almacenara
el identificador si es una variable.
Tipo del identificador. Si es una funcin el tipo que devuelve la
funcin.
Nmero de dimensiones del array (arreglo), o nmero de
miembros de una estructura o clase, o nmeros de parmetros si
se trata de una funcin.
Tamao mximo o rango de cada una de las dimensiones de los
array, si tiene dimensin esttica.
Etc.

You might also like