jueves, 31 de marzo de 2016

Contexto de un compilador

Compilar es traducir. Podemos modelar el proceso de traducción entre dos lenguajes como el resultado de dos etapas. En la primera etapa se analiza la entrada para averiguar qué es lo que se intenta comunicar. Esto es lo que se conoce como análisis. El fruto de esta etapa es una representación de la entrada que permite que la siguiente etapa se desarrolle con facilidad. La segunda etapa, la síntesis, toma la representación obtenida en el análisis y la transforma en su equivalente en el lenguaje destino.
Análisis
El objetivo de esta etapa es obtener una representación de la entrada que nos permita realizar la síntesis o la interpretación con comodidad. La representación que nosotros utilizaremos es la que se llama árbol de sintaxis abstracta.
El paso de la entrada al árbol de sintaxis abstracta no es trivial. Para facilitarlo, se divide la tarea en varias partes. Supón que tuvieras que describir un lenguaje de programación. Una manera de hacerlo será comenzando por describir cuales son las unidades elementales tales como identificadores, palabras reservadas, operadores, etc. que se encuentran en la entrada. Después podrás describir cómo se pueden combinar esas unidades en estructuras mayores tales como expresiones, asignaciones, bucles y demás. Finalmente, especificaras una serie de normas que deben cumplirse para que el programa, además de estar bien escrito, tenga significado. Estas normas se refieren a aspectos tales como que las variables deben declararse o las reglas que se siguen para decidir los tipos de las expresiones.
Las tres fases que hemos mencionado tienen su reflejo en las tres fases en que se divide el análisis:
  • Análisis léxico: se encarga de la división de la entrada en componentes léxicos.
  • Análisis sintáctico: se encarga de encontrar las estructuras presentes en la entrada.
  • Análisis semántico: se encarga de comprobar que se cumplen las restricciones semánticas del lenguaje.
Síntesis
Una vez analizado el programa de entrada, es necesario generar código, a ser posible eficiente, para la maquina objetivo.
  • Generación de código intermedio: se traduce la entrada a una representación independiente de la maquina pero fácilmente traducible a lenguaje ensamblador
  • Generación de código objeto: traduce el código intermedio a código de maquina
  • Optimización de los códigos anteriores.

No hay comentarios.:

Publicar un comentario