COMPILADORES
- Son programas que leen un programa escrito en un
lenguaje de programación (lenguaje fuente), y lo
traduce a otro lenguaje (lenguaje destino).
- El lenguaje destino puede ser lenguaje máquina, o
algún otro lenguaje de programación, como lenguaje
ensamblador.
- Se pueden clasificar según la forma en que han sido
construidos, o en la función que deben cumplir.
- Además de los compiladores a veces se necesita de
otros programas para generar el código destino, como
el preprocesador, el cual se
encarga de adjuntar los
archivos que pueden formar un programa, para que
esté completo antes de la compilación.
MODELO DE COMPILACIÓN
DE ANÁLISIS-SÍNTESIS
La compilación se divide en dos fases.
ANÁLISIS
- Divide el programa fuente en las partes que lo
constituyen y crea una representación intermedia del
programa. Se determinan las operaciones del
programa y
se registran en una estructura de árbol.
SÍNTESIS
- Construye el programa destino con las partes de la
representación intermedia.
ANÁLISIS DEL PROGRAMA FUENTE
El análisis consiste en tres fases:
- Análisis léxico (lineal): se leen los caracteres de
izquierda a derecha y se agrupan en componentes
léxicos
(secuencias de caracteres con significado
collectivo).
- Análisis sintáctico (jerárquico): los componentes léxicos son agrupados
jerárquicamente en colecciones anidadas
con significado colectivo. Junta las palabras de la
fase anterior en frases gramaticales, representadas
con un árbol de análisis sintáctico.
- Análisis semántico: se realizan chequeos para
asegurar que los componentes del programa encajan
significativamente, como por ejemplo chequeo de
tipos.
FASES DEL COMPILADOR
FASES DEL BACK-END
- Generación de código intermedio: Luego del análisis
sintáctico y el semántico, se genera una representación del código intermedia.
- Optimización del código: intenta mejorar el código
intermedio, de modo que el código objeto se ejecute
más rápido, como por ejemplo eliminando instrucciones innecesarias o redundantes.
- Generación del código: se genera el código objeto,
para cada variable del programa se elige una
dirección de memoria y se sustituyen las
instrucciones del lenguaje intermedio en sus
correspondientes instrucciones en lenguaje máquina.
MANEJO DE TABLA DE SÍMBOLOS
- En cada una de las fases de la compilación, el
compilador lleva una tabla de símbolos en la que
se guardan los identificadores del programa fuente
e información de los atributos de esos
identificadores. Esta tabla nos permite encontrar
rápidamente el valor de una variable por ejemplo,
para ser usada en una instrucción.
- Cuando el analizador léxico detecta un identificador, lo
introduce en la tabla, sin embargo los atributos no se pueden determinar
durante el análisis léxico por lo que las fases restantes introducen tal
información.
DETECCIÓN E INFORMACIÓN DE ERRORES
- En cada fase, se lleva a cabo detección y reporte de errores para que después puedan ser corregidos.
- Las fases de análisis sintáctico y semántico manejan una gran
porción de los errores detectables por el compilador.
- En el análisis léxico se pueden detectar errores donde los
caracteres restantes de la entrada no forman ningún componente léxico del
lenguaje.
- En el análisis sintáctico se detectan los errores donde la
cadena de componentes léxicos violan las reglas de estructura del lenguaje
(sintaxis).
- En el análisis semántico se detectan construcciones que tienen
la sintaxis correcta, pero que no tienen significado para la operación
implicada, como sumar un entero y un string.
TRADUCCIÓN DE UNA PROPOSICIÓN