Fases de un 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.
• Un compilador se compone internamente de varias etapas, o fases, que realizan
operaciones lógicas. Es útil pensar en estas fases como piezas separadas dentro
del compilador, y pueden en realidad escribirse como operaciones codificadas
separadamente aunque en la práctica a menudo se integran.
--Análisis Léxico
– Análisis Sintáctico
– Análisis Semántico
– Generación y Optimización de código intermedio
– Generación de código objeto
• Analizador léxico: lee la secuencia de caracteres de izquierda a derecha del
programa fuente y agrupa las secuencias de caracteres en unidades con
significado propio (componentes léxicos o “tokens” en ingles).
• Las palabras clave, identificadores, operadores, constantes numéricas, signos
de puntuación como separadores de sentencias, llaves, paréntesis, etc. , son
diversas clasificaciones de componentes léxicos.
• Análisis sintáctico: determina si la secuencia de componentes léxicos sigue
la sintaxis del lenguaje y obtiene la estructura jerárquica 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 léxicos,
esto es semejante a realizar el análisis gramatical sobre una frase en lenguaje
natural. La estructura sintáctica la definiremos mediante las gramáticas
independientes del contexto.
Análisis semántico: realiza las comprobaciones necesarias sobre el árbol
sintáctico para determinar el correcto significado del programa.
• Las tareas básicas a realizar son: La verificación e inferencia de tipos en
asignaciones y expresiones, la declaración 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 análisis semántico estático (en tiempo de compilación),
donde es necesario hacer uso de la Tabla de símbolos, como estructura de datos
para almacenar información sobre los identificadores que van surgiendo a lo
largo del programa. El análisis semántico suele agregar atributos (como tipos
de datos) a la estructura del árbol semántico.
• Generación y optimización de código intermedio: la optimización consiste en
la calibración del árbol sintáctico donde ya no aparecen construcciones de alto
nivel. Generando un código mejorado, ya no estructurado, más fácil de traducir
directamente a código ensamblador o máquina, compuesto de un código de tres
direcciones (cada instrucción tiene un operador, y la dirección de dos
operandonos y un lugar donde guardar el resultado), también conocida como código
intermedio.
• Generación de código objeto: toma como entrada la representación intermedia y
genera el código objeto. La optimización depende de la máquina, es necesario
conocer el conjunto de instrucciones, la representación de los datos (número de
bytes), modos de direccionamiento, número y propósito de registros, jerarquía
de memoria, encauzamientos, etc.
• Suelen implementarse a mano, y son complejos porque la generación de un buen
código objeto requiere la consideración de muchos casos particulares.
• Tabla de Símbolos: es una estructura tipo diccionario con operaciones de
inserción, borrado y búsqueda, que almacena información sobre los símbolos que
van apareciendo a lo largo del programa como son: – los identificadores
(variables y funciones) – Etiquetas – tipos definidos por el usuario (arreglos,
registros, etc.)
Además almacena el tipo de dato, método de paso de parámetros, tipo de
retorno y de argumentos de una función, el ámbito de referencia de
identificadores y la dirección de memoria. Interacciona tanto con el analizador
léxico, sintáctico y semántico que introducen información conforme se procesa
la entrada. La fase de generación de código y optimización también la usan.
• Gestor de errores: detecta e informa de errores que se produzcan durante la
fase de análisis. Debe generar mensajes significativos y reanudar la
traducción.
Encuentra errores: – En tiempo de compilación: errores léxicos (ortográficos),
sintácticos (construcciones incorrectas) y semánticos (p.ej. errores de tipo) –
En tiempo de ejecución: direccionamiento de vectores fuera de rango, divisiones
por cero, etc. – De especificación/diseño: compilan correctamente pero no
realizan lo que el programador desea.
Se trataran sólo errores estáticos (en tiempo de compilación). Respecto a
los errores en tiempo de ejecución, es necesario que el traductor genere código
para la comprobación de errores específicos, su adecuado tratamiento y los mecanismos
de tratamiento de excepciones para que el programa se continúe ejecutando.
La mayoría de los compiladores son dirigidos por la sintaxis, es decir, el
proceso de traducción es dirigido por el analizador sintáctico. El análisis
sintáctico genera la estructura del programa fuente a través de tokens. El
análisis semántico proporciona el significado del programa basándose de la
estructura del árbol de análisis sintáctico.
• Las fases de análisis léxico y análisis sintáctico se pueden automatizar de manera
relativamente fácil, las verdaderas dificultades en la construcción de
compiladores son el análisis semántico, la generación y la optimización de
código.
• El número de pasadas, es decir, el número de veces que hay que analizar
el código fuente, está en función del grado de optimización. Típicamente se
realiza una pasada para realizar el análisis léxico y sintáctico, otra pasada
para el análisis semántico y optimización del lenguaje intermedio y una tercera
pasada para generación de código y optimizaciones dependientes de la máquina.
Estructuras de datos Empla.
Bibliografia:
Billhardt, H. (2015). Teoria
de automatas y lenguajes formales .
Mata, S. G. (s.f.). Compiladores.
Serna,E.(s.f.).Fases de un compilador.Obtenido de: http://www.paginasprodigy.com/edserna/cursos/compilador/notas/Notas1.pdf
.