TEMA 1: INTRODUCCIN
Qu es un Compilador?
Un compilador no es ms que un traductor, es decir, un programa que nos permite pasar informacin de
un lenguaje a otro. Por ejemplo, un compilador de C nos permite traducir ficheros escritos en lenguaje C
a un lenguaje legible para la mquina (ensamblador).
El proceso de compilacin no siempre es directo. Esto quiere decir que si partimos de un lenguaje A y
queremos traducir a un lenguaje B, no siempre ser recomendable traducir directamente de A a B, si no
que puede ser conveniente usar un lenguaje intermedio (llammosle X) y entonces disearamos un
traductor de A a X, y otro de X a B. En este caso, el primer traductor recibe el nombre d e front-end
mientras que el segundo se llama back-end. El lenguaje A es el lenguaje fuente y el lenguaje B es el
lenguaje objeto o destino.
Un compilador es un programa que lee un programa en un lenguaje y lo traduce a un programa
equivalente en otro lenguaje, y adems informa al usuario sobre la presencia de errores en el programa
de entrada.
PROGRAMA
FUENTE
COMPILADOR
PROGRAMA
OBJETO
MENSAJES
DE ERROR
Generalmente al lenguaje fuente se le asocia como lenguaje de alto nivel, mientras al lenguaje objeto se
le conoce como cdigo objeto (cdigo de maquina) escrito especficamente para una maquina objeto. A
lo largo del proceso de traduccin el compilador debe informar la presencia de errores en el lenguaje
fuente.
Disear y desarrollar un compilador, no es tarea fcil, y quizs pocos profesionales de la computacin se
vean involucrados en esta tarea.
No obstante, los compiladores se utilizan en casi todas las formas de la computacin y cualquiera
involucrado en esta rea debera conocer la organizacin y el funcionamiento bsico de un compilador.
Diseo de un compilador
A continuacin mostramos un diagrama de bloques que representa las fases a seguir en el proceso de
diseo de un compilador adems de los elementos auxiliares que necesitamos en cada fase.
Contexto de un compilador
Adems de un compilador, se pueden necesitar otros programas para crear un programa objeto
ejecutable. Un programa fuente se puede dividir en mdulos almacenados en archivos distintos. La tarea
de reunir el programa fuente a menudo se confa a un programa distinto, llamado preprocesador.
Clasificacin de los Compiladores
Los compiladores presentan la siguiente clasificacin general:
De depuracin o de optimizacin
Hombre
CDIGO
MQUINA
ENSAMBLADOR
LENGUAJE
ENSAMBLADOR
CDIGO
MQUINA
ENSAMBLADOR
CDIGO
MQUINA
COMPILADOR
LENGUAJE
ENSAMBLADOR
A futuro se busca:
LENGUAJE DE
ALTO NIVEL
Fuente
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Intermedio
Generador de cdigo
Cdigo relocalizable
Enlazador
Objeto
Figura 3: Ambiente General de Compilacin
ENSAMBLADOR
o Traducen programas escritos en lenguaje ensamblador a cdigo mquina.
o Programa que convierte de lenguaje mnemnico a lenguaje mquina, generando un
archivo con el cdigo objeto equivalente al cdigo fuente completo, junto con
informacin necesaria para el montaje.
COMPILADOR
o Traducen programas escritos en lenguaje de alto nivel a cdigo intermedio o a cdigo
mquina.
o Programa que convierte un archivo de lenguaje de programacin a su correspondiente en
lenguaje objeto. Siendo en realidad es un tipo especfico de traductor.
INTERPRETE
o No genera cdigo objeto, analiza y ejecuta directamente cada proposicin del Programa
Fuente (PF).
o Los intrpretes ejecutan las instrucciones del programa segn se vayan presentando.
Necesitan menos memoria, pero son ms lentos que los compiladores (LISP, Prolog).
Histricamente, se pusieron de moda en los primeros aos porque los recursos de
memoria eran escasos.
o Permiten aadir cdigo dinmicamente durante la ejecucin.
PREPROCESADOR
o Sustituyen macros, incluyen archivos o extensin del lenguaje.
FORMADORES DE TEXTO
o Toman como entrada una cadena de caracteres que incluye el texto a componer y
rdenes (TAGs) para indicar captulos, secciones, prrafos, enumeraciones, figuras,
formulas, tablas, etc. (Latex, Html).
LENGUAJES DE PROGRAMACIN INTERPRETADOS
o Estn diseados para ser ejecutados por medio de intrprete a partir de un cdigo precompilado.
o Por ejemplo Java es compilado para posteriormente ser ejecutado por un traductor del
lenguaje objeto denominado Java Virtual Machine.
o Mientas que los lenguajes de la plataforma .NET compilan en una forma intermedia (CIL),
que posteriormente puede ser recompilado a cdigo de mquina nativo o interpretado
por una mquina virtual.
o Lenguajes como Python y Java emplean representaciones intermedias de cdigo para ser
ejecutadas, mientras que lenguajes como Ruby emplean un rbol de sintaxis abstracta
como representacin intermedia.
Fases de un Compilador
Un compilador se compone internamente de varias etapas, o fases, que realizan operaciones lgicas.
Es til pensar en estas fases como piezas separadas dentro del compilador, y pueden en realidad escribirse
como operaciones codificadas separadamente aunque en la prctica a menudo se integran.
A continuacin describiremos brevemente cada una de ellas:
Anlisis Lxico
Anlisis Sintctico
Anlisis Semntico
Generacin y Optimizacin de cdigo intermedio
Generacin de cdigo objeto
Anlisis lxico.- Fase en la cual se leen las cadenas de caracteres del programa fuente y se agrupan en
componentes lxicos, que son secuencias de caracteres que tienen un significado colectivo. Los espacios
en blanco que separan los caracteres de estos componentes lxicos normalmente se eliminan durante
este anlisis.
Anlisis sintctico.- Fase en la cual los caracteres o componentes lxicos se agrupan jerrquicamente en
colecciones anidadas con un significado colectivo. Se agrupan los componentes lxicos del programa
fuente en frases gramaticales que el compilador utiliza para sintetizar la salida. Estas frases gramaticales
se representan con un rbol de anlisis sintctico.
Anlisis semntico.- Fase en la cual se realizan ciertas revisiones para asegurar que los componentes de
un programa se ajustan de un modo significativo. Esta fase revisa el programa fuente para tratar de
encontrar errores semnticos y rene la informacin sobre los tipos para la fase posterior de generacin
de cdigo. Verifica si cada operador tiene operandos permitidos por el lenguaje fuente.
Generacin de cdigo intermedio.- Algunos compiladores generan una representacin intermedia
explcita del programa fuente. Esta representacin intermedia debe tener dos propiedades: debe ser fcil
de producir y fcil de traducir al programa objeto.
Optimacin de cdigo.- La fase de optimacin de cdigo trata de mejorar el cdigo intermedio, de modo
que resulte un cdigo de mquina ms rpido de ejecutar.
Generacin de cdigo.- La fase final de un compilador es la generacin de cdigo objeto, que por lo
general consiste en cdigo de mquina relocalizable o cdigo ensamblador.
Administrador de la tabla de smbolos.- Una funcin esencial de un compilador es registrar los
identificadores utilizados en el programa fuente y reunir informacin sobre los distintos atributos de cada
identificador. Una tabla de smbolos es una estructura de datos que contiene un registro por cada
identificador, con los campos para los atributos del identificador.
Deteccin e informacin de errores.- Cada fase puede encontrar errores. Sin embargo, despus de
detectar un error, cada fase debe tratar de alguna forma ese error, para poder continuar la compilacin,
permitiendo la deteccin de ms errores en el programa fuente.