Vous êtes sur la page 1sur 18

Que es un compilador

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:

Lenguajes de alto nivel: C++, Java,


C#

Lenguajes especializados para


alguna disciplina especfica:
simulink de Matlab

Programa objeto
La salida de un compilador es un programa que puede estar escrito en:

Cdigo Asembler: Implementa una representacin simblica de los cdigos de mquina


binarios y otras constantes necesarias para programar una arquitectura dada de CPU y
constituye la representacin ms directa del cdigo mquina especfico para cada
arquitectura legible por un programador.

Cdigo de mquina: Cdigo con el que trabaja el microprocesador; para reaccionar y


efectuar la operacin que se desea, necesita de una secuencia de seales elctricas
almacenadas como "unos" y "ceros" en las posiciones de la memoria.

Cdigo binario: Sistema numrico usado para la representacin de textos, o procesadores


de instrucciones de computadora, utilizando el sistema binario (sistema numrico de dos
dgitos, o bit: el "0" /cerrado/ y el "1" /abierto/).

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 unos errores ocultan otros.

A veces un error provoca una avalancha de muchos errores que se solucionan con el
primero.

Hay dos criterios a seguir a la hora de manejar errores:

Pararse al detectar el primer error.

Detectar todos los errores de una pasada.

Anlisis de un programa fuente


Consiste en un proceso compuesto por dos fases:
Anlisis: Durante esta etapa, el programa fuente se divide en sus elementos
componentes, crendose una representacin intermedia del mismo. Durante
este proceso, es posible detectar posibles errores en la escritura del programa.
Sntesis: Como resultado de esta etapa se obtiene la sntesis del programa
objeto.

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.

2. Sntesis: Despus del proceso de anlisis se procede a generar grupos de los


componentes que conforman el programa, para generar una salida.

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.

3. Deteccin y tratamiento de errores: Aunque es en la etapa de anlisis donde se

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:

Debe ser independiente de la mquina.

Debe ser fcil de producir.

Debe ser fcil de traducir a un lenguaje mquina.

Esta fase aparece, generalmente, en aquellos compiladores construidos para su


implantacin en distintas mquinas, ya que su existencia hace que todos los mdulos
de anlisis del compilador sean comunes para todas las mquinas (aumenta la
portabilidad del compilador y se abaratan sus costes de construccin).

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.

Deteccin y tratamiento de errores


Aunque es en la etapa de anlisis donde se detectan la mayora de los errores, cada etapa del proceso puede
encontrar errores. Para tratar adecuadamente un error, interviene el mdulo de tratamiento de errores que
comprende generalmente la realizacin de dos acciones:

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.

Errores de ejecucin: Son errores relacionados con desbordamientos, operaciones matemticamente


irresolubles, etc.

Herramientas para construir un


compilador

Generadores de analizadores sintcticos (parsers): que producen analizadores


sintcticos a partir de descripcin gramatical.

Generadores de escneres: que producen analizadores lxicos a partir de tokens.

Motores de traduccin orientados a la sintaxis: que producen colecciones de


rutinas para recorrer un rbol de anlisis sintctico.

Generadores de generadores de cdigo: que producen un generador de cdigo a


partir de una coleccin de reglas.

Motores de anlisis de flujos de datos: que facilitan la recopilacin de


informacin de cmo se transmiten los valores de una parte del programa a cada
una de las otras partes.

Kits de herramientas para a construccin de compiladores: que proporcionan un


conjunto integrado de rutinas para construir fases de un compilador

Generadores de analizadores sintcticos


(parsers)
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.
Ejemplo:

JavaCC (Java Compiler Compiler) es un generador de analizadores sintcticos de


cdigo abierto para el lenguaje de programacin Java.

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:

LEX: Cdigo generado: C.

FLEX: Cdigo generado: C++.

ZLEX: Cdigo generado: C., Soporta cdigos de caracteres de 16 bits.

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

Compiladores. principios, tcnicas y herramientas. Segunda edicin. Alfred V.


Aho, Monica S. Lam. Ravi Sethi. Jeffrey D. Ullman. Pearson.

Compiladores e intrpretes: teora y prctica. Manuel Alfonseca Moreno,


Marina de la Cruz Echeanda, Alfonso Ortega de la Puente, Estrella Pulido
Caabate. Departamento de Ingeniera Informtica. Universidad Autnoma de
Madrid. Pearson

Compiladores, Traductores y Compiladores con Lex/Yacc, JFlex/cup y JavaCC.


Sergio Glvez Rojas, Miguel ngel Mora Mata. Universidad de Mlaga

Vous aimerez peut-être aussi