Académique Documents
Professionnel Documents
Culture Documents
Universidad Distrital
Francisco Jos de Caldas
Ciencias de la Computacin III
Definicin
Un compilador es un programa que traduce un programa escrito en lenguaje
fuente y produce otro equivalente escrito en un lenguaje destino
Programa fuente
La entrada de un compilador es un
programa que esta escrito en lenguaje
de programacin como:
Programa objeto
La salida de un compilador es un programa que puede estar escrito en:
Lenguaje de alto nivel: Se caracteriza por expresar los algoritmos de una manera
adecuada a la capacidad cognitiva humana, en lugar de la capacidad ejecutora de las
mquinas.
Mensajes de error
Una de las misiones ms importantes de un compilador, es manejar los errores aunque, al
mismo tiempo, es lo que ms dificulta su realizacin. Donde ms se utiliza es en las etapas de
anlisis sintctico y semntico, aunque los errores se pueden descubrir en cualquier fase de
un compilador. Es una tarea difcil, por dos motivos:
A veces un error provoca una avalancha de muchos errores que se solucionan con el
primero.
Fases de un compilador
1. Anlisis: El cual se trata de la escritura correcta del cdigo fuente. Esta a su vez
comprende varias fases:
Anlisis lxico: esta fase es la encargada de leer el cdigo fuente y separarlo en lotes
para poder ser ledo por el anlisis sintctico.
Anlisis sintctico: esta fase evala los lotes de cdigo con el fin de que este cumpla
con los requerimientos definidos por el compilador.
Anlisis semntico: en esta fase se busca establecer que el cdigo fuente cumpla con
la semntica solicitada por el compilador, es decir que el cdigo este correctamente
escrito para poder ser interpretado.
Generacin de cdigo intermedio: este cdigo se genera con el fin de mejorar el uso
de la memoria con el fin de optimizar cdigo fuente.
Optimizacin de cdigo: el objeto de esta fase es mejorar el cdigo para que sea ms
rpido ejecutarlo.
Generacin de cdigo: Aqu se crea el cdigo final de salida que va a ser interpretado
por la mquina.
detectan la mayora de los errores, cada etapa del proceso puede encontrar errores
Anlisis (front-end)
Anlisis lexicogrfico
Se examina el programa fuente de izquierda a derecha, reconociendo las unidades bsicas de
informacin pertenecientes al lenguaje. Estas unidades bsicas se denominan unidades lxicas o
tokens. Un token es un elemento o cadena (secuencia de caracteres) que tiene un significado propio
en el lenguaje.
Adems de reconocer cada token, almacena en la tabla de smbolos aquella informacin del smbolo
que pueda ser necesaria para las restantes fases de compilacin.
En el caso de que no existan errores en este primer anlisis, se obtiene una representacin del
programa formada por:
La descripcin de smbolos en la tabla de smbolos.
Una secuencia de smbolos en la que se incluye, junto a cada smbolo, una referencia a la ubicacin
de dicho smbolo en la tabla de smbolos. Esta secuencia es denominada tira de tokens.
En esta nueva representacin, se ha eliminado previamente toda la informacin superflua, como
comentarios, tabulaciones y espacios en blanco no significativos.
Los errores que pueden ser reconocidos se deben a la deteccin de cadenas de caracteres del
programa fuente que no se ajustan al patrn de ningn token, como identificadores de variables
incorrectos, nmeros expresados incorrectamente, cadenas de caracteres mal delimitadas, etc.
Anlisis (front-end)
Anlisis sintctico
La sintaxis de un lenguaje de programacin especifica cmo deben escribirse los
programas basndose en un conjunto de reglas sintcticas que determinan la gramtica
del lenguaje. Un programa es sintcticamente correcto cuando sus estructuras
(expresiones, sentencias, asignaciones, etc.) aparecen dispuestas de forma correcta de
acuerdo a la gramtica del lenguaje.
El anlisis sintctico recibe la tira de tokens del analizador lexicogrfico e investiga en
ella los posibles errores sintcticos que aparezcan, como expresiones estructuradas
incorrectamente, falta de algn token dentro de una sentencia, formato incorrecto en
una asignacin, etc.
En caso de no encontrar errores, se agrupan los componentes lxicos en frases
gramaticales que sern utilizadas en la sntesis del programa objeto. Estas frases
gramaticales se suelen representar mediante un rbol sintctico que pone de manifiesto
la estructura jerrquica de los componentes de un programa.
Anlisis (front-end)
Anlisis semntico
Una construccin de un lenguaje de programacin puede ser sintcticamente
correcta y carecer de significado. Por tanto, si queremos generar cdigo en lenguaje
mquina con el mismo significado que el cdigo fuente, tendremos que determinar
la validez semntica de las construcciones del cdigo fuente.
El anlisis semntico se encarga de estudiar la coherencia semntica del cdigo
fuente a partir de la identificacin de las construcciones sintcticas y de la
informacin almacenada en la tabla de smbolos. El anlisis semntico debe ser
capaz de detectar construcciones sin un significado correcto. Por ejemplo, asignar a
una variable de tipo entero un valor de tipo cadena de caracteres, sumar dos valores
booleanos, etc.
Sntesis (back-end)
Generacin de cdigo intermedio
Se traduce el resultado de la etapa de anlisis (en el caso de ausencia de errores) a
un lenguaje intermedio propio del compilador. Esta representacin intermedia (cdigo
intermedio) debe poseer las siguientes caractersticas:
Sntesis (back-end)
Optimizacin de cdigo
Esta fase se suele introducir para mejorar la eficiencia del cdigo producido por el
compilador. Se toma el cdigo intermedio de forma global y se optimiza, adaptndolo
a las caractersticas del procesador al que va dirigido para mejorar los resultados de
su ejecucin.
La optimizacin se realiza en cualquier parte del programa, pero es en los bucles
donde se consiguen los mejores resultados; por ejemplo, sacar una sentencia que se
repite fuera del bucle, consiguiendo que slo se ejecute una vez. De esta forma, se
consigue un programa igualmente correcto, pero que consume menos tiempo de
ejecucin.
Un problema de la optimizacin es que incrementa el tamao y la complejidad del
compilador.
Sntesis (back-end)
Generacin de cdigo destino
Se traduce el cdigo intermedio optimizado a cdigo final, es decir, al lenguaje
mquina (en algunos casos a ensamblador) del procesador al que va dirigido el
compilador. Para ello, se reserva la memoria necesaria para cada elemento del
cdigo intermedio, y cada instruccin en lenguaje intermedio es traducida a
varias instrucciones en lenguaje mquina.
Diagnstico del error: Trata de buscar su localizacin exacta y la posible causa del mismo, para ofrecer
al programador un mensaje de diagnstico, que ser incluido en el listado de compilacin.
Recuperacin del error: Despus de detectado un error, cada fase debe tratarlo de alguna forma para
poder continuar con la compilacin y permitir la deteccin de ms errores, aunque no se genere cdigo
objeto.
Los tipos de errores que puede tener un programa son los siguientes:
Errores lexicogrficos: Se producen por la aparicin de tokens no reconocibles, es decir, cadenas que no
se ajustan al patrn de ningn smbolo elemental del lenguaje.
Errores sintcticos: Aparecen cuando se violan las reglas de sintaxis del lenguaje.
Errores semnticos: Se detectan cuando aparece una secuencia sintcticamente correcta, pero que
carece de sentido dentro del contexto del programa fuente.
Errores lgicos: Son debidos a la utilizacin de un algoritmo o expresin incorrecta para el problema que
se trata de resolver.
Yacc es un programa para generar analizadores sintcticos. Las siglas del nombre
significan Yet Another Compiler-Compiler, es decir, "Otro generador de compiladores
ms". Genera un analizador sintctico (la parte de un compilador que comprueba que
la estructura del cdigo fuente se ajusta a la especificacin sintctica del lenguaje)
basado en una gramtica analtica escrita en una notacin similar a la BNF. Yacc
genera el cdigo para el analizador sintctico en el Lenguaje de programacin C.
Generadores de escneres
Un analizador lxico tambin es conocido como escner; pues su funcionalidad es la de analizar el
lexema de las palabras o cadenas de caracteres sobre un patrn definido.
Es decir, el proceso de anlisis lxico se refiere al trabajo que realiza el scanner con relacin al
proceso de compilacin. El scanner representa una interfaz entre el programa fuente y el
analizador sintctico o parser.
Ejemplos:
JAX: Cdigo generado: Java, No soporta entornos, est basado en expresiones regulares, No
soporta Unicode.
JLEX: Cdigo generado: Java, Similar a lex, Diseado para ser usado junto con CUP.
JFLEX: Cdigo generado: Java, Diseado para ser usado junto con CUP
Referencias Bibliogrficas