Beruflich Dokumente
Kultur Dokumente
Definicin de compilador
Historia de los compiladores
Tipos de traductores
Fases de un compilador
Agrupamiento de fases
Compiladores cruzados
Herramientas automticas
Definicin de compilador
Los compiladores son programas de computadora que traducen de un
lenguaje a otro. Un compilador toma como su entrada un programa
escrito en lenguaje fuente y produce un programa equivalente escrito en
lenguaje objeto.
Lenguaje Fuente
Traductor
Mensajes de error
Lenguaje Destino
Definicin de compilador
Generalmente al lenguaje fuente se le asocia como lenguaje de alto nivel,
mientras al lenguaje objeto se el 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.
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 mas de un ao en el proyecto.
Fe 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 mas eficiente.
Aparecen los primeros programas que automatizan los procesos de anlisis lxico y
sintctico. Surgiendo la llamada Torre de Babel debido a la proliferacin de la teora
para la construccin de compiladores.
Tipos de Traductores
Tipos de Traductores
Lenguajes de programacin interpretados Estn diseados para ser
ejecutados por medio de interprete a partir de un cdigo pre-compilado.
Por ejemplo Java es compilado para posteriormente ser ejecutado por un
traductor del lenguaje objeto denominado Java Virtual Machine.
Mientas que los lenguajes de la plataforma .NET compilan en una forma
intermedia (CIL), que posteriormente puede ser recompilado a cdigo de
maquina nativo o interpretado por una maquina virtual.
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.
Tipos de Traductores
Ventajas del compilador
Se compila una vez, se ejecuta n-veces
En bucles, la compilacin genera cdigo equivalente al bucle pero un
interprete 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.
Ventajas del intrprete
Un interprete necesita menos memoria que un compilador
Permite una mayor interactividad con el cdigo en tiempo de desarrollo.
Tipos de Traductores
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 dinmico
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 un de ellas:
Anlisis Lxico
Anlisis Sintctico
Anlisis Semntico
Generacin y Optimizacin de cdigo intermedio
Generacin de cdigo objeto
Fases de Compilacin
Cdigo fuente
Fase de anlisis
Anlisis Lxico
Componentes
lxicos / Tokens
Anlisis Sintctico
Tabla de smbolos
rbol sintctico
Anlisis Semntico
rbol sintctico
con anotaciones
Generacin / Optimizacin
de cdigo intermedio
Gestor de errores
Cdigo intermedio
Generacin / Optimizacin
de cdigo objeto
Fase de sntesis
Cdigo objeto
Fases de Compilacin
a
[
indice
]
=
4
+
2
;
a[indice] = 4 + 2;
identificador
corchete de apertura
Identificador
corchete de cierre
operador de asignacin
numero
operador suma
numero
punto y coma
Fases de Compilacin
Anlisis sintctico: determina si la secuencia de componentes lxicos
sigue la sintaxis del lenguaje y obtiene la estructura jerrquica del
programa en forma de rbol, donde los nodos son las construcciones de
alto nivel del lenguaje.
Se determinan las relaciones estructurales entre los componentes lxicos,
esto es semejante a realizar el anlisis gramatical sobre una frase en
lenguaje natural. La estructura sintctica la definiremos mediante las
gramticas independientes del contexto.
Como ejemplo consideremos la lnea de cdigo C anterior. Representa un
elemento estructural denominado expresin, la cual es una expresin de
asignacin compuesta de una expresin de subndice a la izquierda y una
expresin aritmtica a la derecha (rbol de anlisis gramatical).
Fases de Compilacin
expresin
expresin asignacin
expresin
expresin
expresin subndice
expresin
identificador
a
expresin
identificador
indice
expresin aditiva
expresin
numero
4
expresin
numero
2
Fases de Compilacin
Los nodos internos del rbol de anlisis gramatical estn etiquetados con los
nombres de las estructuras que representan y las hojas del rbol representan
la secuencia de tokens.
identificador
a
identificador
indice
numero
4
numero
2
Fases de Compilacin
Anlisis semntico: realiza las comprobaciones necesarias sobre el rbol
sintctico para determinar el correcto significado del programa.
Las tareas bsicas a realizar son: La verificacin e inferencia de tipos en
asignaciones y expresiones, la declaracin del tipo de variables y funciones
antes de su uso, el correcto uso de operadores, el mbito de las variables y
la correcta llamada a funciones.
Nos limitaremos al anlisis semntico esttico (en tiempo de compilacin),
donde es necesario hacer uso de la Tabla de smbolos, como estructura de
datos para almacenar informacin sobre los identificadores que van
surgiendo a lo largo del programa. El anlisis semntico suele agregar
atributos (como tipos de datos) a la estructura del rbol semntico.
Fases de Compilacin
El analizador semntico registrara el rbol sintctico con los tipos de datos
de las sub-expresiones y verificara que la asignacin tiene sentido para los
tipos, en caso contrario mandara un mensaje de error en correspondencia
de tipos. De esta forma se obtiene un rbol sintctico con anotaciones.
Siguiendo con el ejemplo de la expresin en C, el analizador semntico
extrae la informacin de que a es una arreglo de valores enteros y que
indice es una variable entera.
=
[]
Tipo : entero
a
puntero a enteros
Tipo: entero
indice
Tipo : entero
+
Tipo : entero
4
constante
Tipo : entero
2
constante
Tipo : entero
Fases de Compilacin
Generacin y optimizacin de cdigo intermedio: la optimizacin consiste
en la calibracin del rbol sintctico donde ya no aparecen construcciones
de alto nivel. Generando un cdigo mejorado, ya no estructurado, ms
fcil de traducir directamente a cdigo ensamblador o mquina,
compuesto de un cdigo de tres direcciones (cada instruccin tiene un
operador, y la direccin de dos operndoos y un lugar donde guardar el
resultado), tambin conocida como cdigo intermedio.
La etapa de optimizacin slo dependen del lenguaje fuente (y no de la
mquina), se busca principalmente: eliminar sub-expresiones comunes,
identificar cdigo muerto, sustituir operaciones aritmticas, clculo previo
de constantes, variables de induccin, propagacin de copias o cdigo
inalcanzable. Suele ser una fase lenta y compleja.
Fases de Compilacin
Siguiendo con el ejemplo de la expresin de asignacin, el
generador/optimizador, colapsara la expresin aditiva generando una
constante 6.
En ocasiones estas adecuaciones pueden realizarse en el rbol
directamente, pero generalmente resulta mas fcil hacerlo de manera
lineal en una estructura de cdigo de tres direcciones (cuadruplos).
cdigo optimizado
cdigo intermedio
a[indice] = 6
t1 = indice * elem_size(a)
t2 = &a + t1
*t3 = 6
Fases de Compilacin
Fases de Compilacin
Finalmente para nuestro ejemplo debemos decidir ahora cuantos enteros
se almacenarn para generar el cdigo del arreglo, para este ejemplo
emplearemos modos de direccionamiento propios de C, generando el
cdigo objeto en un lenguaje ensamblador hipottico.
MOV
R0, t1
MOV
R1, &a
;; direccin de a -> R1
ADD
R1, R0
;; sumar R0 a R1
MOV
*R1, 6
Fases de Compilacin
Tabla de Smbolos: es una estructura tipo diccionario con operaciones de
insercin, borrado y bsqueda, que almacena informacin sobre los
smbolos que van apareciendo a lo largo del programa como son:
los identificadores (variables y funciones)
Etiquetas
tipos definidos por el usuario (arreglos, registros, etc.)
Fases de Compilacin
Tabla de Smbolos: es una estructura tipo diccionario con operaciones de
insercin, borrado y bsqueda, que almacena informacin sobre los
smbolos que van apareciendo a lo largo del programa como son:
los identificadores (variables y funciones)
Etiquetas
tipos definidos por el usuario (arreglos, registros, etc.)
Fases de Compilacin
Encuentra errores:
En tiempo de compilacin: errores lxicos (ortogrficos), sintcticos
(construcciones incorrectas) y semnticos (p.ej. errores de tipo)
En tiempo de ejecucin: direccionamiento de vectores fuera de rango, divisiones
por cero, etc.
De especificacin/diseo: compilan correctamente pero no realizan lo que el
programador desea.
Fases de Compilacin
Agrupamiento de fases
Compilador Cruzado
Es un compilador que genera cdigo ejecutable para una plataforma
distinta a aquella en la que se ejecuta
Es muy comn construir un compilador en una plataforma Linux,
empleando un lenguaje ANSI C++ para una sintaxis tipo Basic que genere
cdigo objeto para Windows
ANSI C++
Basic
ANSI C++
Linux
Linux
Windows
Windows
Windows
Basic
Compilador Cruzado
Compilador Cruzado
Principal ventaja de este mtodo:
Si se cambia de lenguaje fuente, entonces se reescribe el front-end. Si se
cambia la mquina objeto, entonces se reescribe el back-end. Si aparece
una nueva arquitectura, basta con desarrollar un traductor del lenguaje
intermedio a esa nueva mquina.
Cdigo fuente
Front-End
Cdigo intermedio
Back-End
Cdigo objeto
Compilador Cruzado
Herramientas Automticas
Son programas de ayuda en el proceso de escritura de compiladores:
sistemas generadores de traductores. Tambin se les conoce como
compiler writing tools, compiler generators, compiler-compilers. A
continuacin mencionaremos los mas conocidos.
Generadores de analizadores lxicos: a partir de una especificacin basada
en expresiones regulares. Lex / Flex.
Generadores de analizadores sintcticos: a partir de una entrada que es la
gramtica independiente del contexto que representa la estructura
sintctica del lenguaje. Yacc / Bison.
Generadores de cdigo: con rutinas para la generacin del rbol de anlisis
sintctico y para su recorrido. En cada nodo se especifican las acciones
para su traduccin a cdigo objeto correspondiente.
Bibliografa
Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, tcnicas
y herramientas, capitulo 1, pginas: 1- 25, 743-747.
Louden, K.C. (1997), Construccin de Compiladores: Principios y prctica,
capitulo 1, pginas: 1- 27.