Anda di halaman 1dari 8

1

DISEO Y DESARROLLO DE COMPILADORES

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.

Ing. Pablo Marcelo Flores Jara - 2015

DISEO Y DESARROLLO DE COMPILADORES

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.

Figura 1: Pasos a seguir para disear un Compilador


Al final tendremos un nico programa que sera el traductor. Este traductor tendra un analizador
sintctico, y a su vez el analizador sintctico tendra un analizador lxico.
Partes de la compilacin
En la compilacin hay dos partes: anlisis y sntesis. La parte del anlisis divide al programa fuente en sus
elementos componentes y crea una representacin intermedia del programa fuente. La parte de sntesis
construye el programa objeto deseado a partir de la representacin intermedia.

ANLISIS (Etapa Inicial):


o Divide al Programa Fuente en sus elementos componentes y crea una representacin
intermedia.
o Se determinan las operaciones y se registran en una estructura de rbol (ej. rbol
sintctico)
SNTESIS (Etapa Final):
o Construye el Programa Objeto deseado a partir de la representacin Intermedia (requiere
tcnicas ms especializadas)

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 una pasada o de mltiples pasadas


De carga y de ejecucin

Ing. Pablo Marcelo Flores Jara - 2015

DISEO Y DESARROLLO DE COMPILADORES

De depuracin o de optimizacin

Historia de los Compiladores


A finales de la dcada de 1940, comenzaron a construirse las primeras computadoras digitales y
fue necesario implementar un lenguaje de capas para realizar los clculos, es aqu donde aparece
el lenguaje de mquina que representaba secuencias de cdigos numricos:
C7 06 0000 0002 (instruccin que mueve el nmero dos a la ubicacin 0000)
Desafortunadamente este lenguaje era tedioso de seguir y complicado de mantener, por lo que
esta forma de codificacin fue reemplazada por el lenguaje ensamblador, en el cual las
instrucciones y las localidades de memoria son formas simblicas. Un ensamblador traduce de los
cdigos simblicos a lenguaje de mquina. An con esta mejora, el lenguaje ensamblador sigue
siendo demasiado difcil de mantener:
MOV X, 2 (instruccin en ensamblador equivalente a la anterior)
En este punto se presenta la necesidad de lenguajes que permitan escribir los programas de forma
concisa, similar a una notacin matemtica, y que se pudieran traducir a cdigo ejecutable para
una mquina dada:
X=2
En 1950, G. M. Hooper acua el trmino compilador y aparecen los pri meros trabajos sobre
compiladores relacionados con la traduccin de frmulas aritmticas a cdigo de mquina.
John Backus lider un grupo de trabajo en IBM para realizar de un traductor de cdigo mquina a
frmulas matemticas. Resultando con gran xito: la especificacin de un lenguaje de alto nivel
(FORTRAN, FORmule TRANslation) Trabajaron 18 personas durante ms de un ao en el proyecto.
Fue un compilador hecho ad-hoc (a puro corazn), pues no exista una teora formal, sino que se iban
resolviendo las construcciones una a una, para cada situacin particular.
Noam Chomsky comienza sus estudios sobre la estructura del lenguaje natural. Sus estudios lo
condujeron a la clasificacin de los lenguajes de acuerdo a una jerarqua de sus gramticas, adems
sus estudios sobre los algoritmos de reconocimiento derivaron en una automatizacin del proceso de
traduccin ms eficiente.
1960, se disea el lenguaje LISP. En un principio, el cdigo LISP se traduca manualmente a cdigo
mquina. Se escribi en LISP un programa capaz de interpretar programas LISP, que se tradujo
manualmente a cdigo de mquina, construyendo de este modo un intrprete ejecutable de LISP.
Knuth desarrolla la mayora de las tcnicas de anlisis sintctico.
1970, se presentan los mayores avances en el rea de lenguajes de programacin.
Aparecen los primeros programas que automatizan los procesos de anlisi s lxico y sintctico.
Surgiendo la llamada Torre de Babel debido a la proliferacin de la teora para la construccin de
compiladores.

Ing. Pablo Marcelo Flores Jara - 2015

DISEO Y DESARROLLO DE COMPILADORES

Niklaus Wirth, disea Pascal, pensado para la enseanza.


Wirth propone el concepto de representacin intermedia de cdigo, separando el proceso de
traduccin en dos fases: el front-end encargada de analizar el programa fuente (operaciones
dependientes slo del lenguaje fuente) y el back-end encargada de generar el cdigo para la mquina
objeto.
1980, comienzan a proliferar las tcnicas de mejoramiento de cdigo (optimizacin), se consolida
y prolifera el concepto de asignacin y liberacin de memoria dinmica. La programacin
orientada a objetos es extensamente utilizada y madura.
1990, los lenguajes de programacin y compiladores son muy similares a lo que tenemos
actualmente, surgen los ambientes de desarrollo, los lenguajes interpretados comienza a ganar
terreno en aplicaciones de Internet y el cdigo intermedio se vuelve a poner de moda.
A continuacin vemos una figura que ilustra la evolucin de los compiladores:
Computadoras

Hombre

CDIGO
MQUINA

ENSAMBLADOR
LENGUAJE
ENSAMBLADOR

CDIGO
MQUINA
ENSAMBLADOR

CDIGO
MQUINA

COMPILADOR

LENGUAJE
ENSAMBLADOR

Figura 2: Evolucin de los Compiladores


El Diseo de un compilador surge como resultado de:

Desarrollo de un nuevo lenguaje de programacin


Adicin de extensiones a los ya existentes
Explotacin de las caractersticas del hardware

A futuro se busca:

Extensin para el cmputo paralelo y distribuido

Ing. Pablo Marcelo Flores Jara - 2015

LENGUAJE DE
ALTO NIVEL

DISEO Y DESARROLLO DE COMPILADORES

Ambiente General de Compilacin


La siguiente imagen nos muestra el proceso de Compilacin, desde el Programa Fuente, la etapa de
Anlisis (Lxico, Sintctico, Semntico), la generacin de Cdigo Intermedio, el Enlace y Relocalizacin en
memoria, y finalmente la Generacin de Cdigo o Programa Objeto.

Fuente

Anlisis lxico
Anlisis sintctico
Anlisis semntico

Intermedio

Generador de cdigo

Cdigo relocalizable

Enlazador

Objeto
Figura 3: Ambiente General de Compilacin

Ing. Pablo Marcelo Flores Jara - 2015

DISEO Y DESARROLLO DE COMPILADORES

Tipos de Sistemas 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.

Ventajas del compilador

Se compila una vez, se ejecuta n-veces.


En bucles, la compilacin genera cdigo equivalente al bucle pero un intrprete se traduce tantas
veces una lnea como veces se repite el bucle.
El compilador tiene una visin global del programa, por lo que la informacin de mensajes de
errores es ms detallada.

Ing. Pablo Marcelo Flores Jara - 2015

DISEO Y DESARROLLO DE COMPILADORES

Ventajas del intrprete

Un intrprete necesita menos memoria que un compilador.


Permite una mayor interactividad con el cdigo en tiempo de desarrollo.

Ventajas del compilador - intrprete

Proporcionan algo de flexibilidad extra.


Son independientes de la plataforma en la que se ejecuten.
Permiten un mecanismo de reflexin.
Tipos de datos altamente dinmicos.
Gestin de memoria dinmica.
Fcilmente depurables y reducidos en tamao.

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

Figura 4: Fases de la Compilacin

Ing. Pablo Marcelo Flores Jara - 2015

DISEO Y DESARROLLO DE COMPILADORES

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.

Ing. Pablo Marcelo Flores Jara - 2015

Anda mungkin juga menyukai