02_Introducción a la Compilación

19

Transcript of 02_Introducción a la Compilación

Page 1: 02_Introducción a la Compilación
Page 2: 02_Introducción a la Compilación

Compiladores: Definición

Page 3: 02_Introducción a la Compilación

Compiladores: Clasificación Como fueron construidos:

De una pasada De múltiples pasadas De carga y ejecución.

Función que realizan: De depuración o de optimización.

Page 4: 02_Introducción a la Compilación

Las Fases del Compilador

Page 5: 02_Introducción a la Compilación

Agrupamiento de Fases (1/2) Etapa Inicial (de análisis ó front-end):

incluye fases que dependen principalmente del lenguaje fuente Análisis Léxico Análisis Sintáctico Creación de la tabla de símbolos Análisis Semántico Generación de código intermedio

Page 6: 02_Introducción a la Compilación

Agrupamiento de Fases (2/2) Etapa Final (síntesis ó back-end):

incluye las fases que dependen del lenguaje intermedio y la maquina objeto. Optimización de Código Generación de Código Manejo de Errores Operaciones con la tabla de símbolos

Page 7: 02_Introducción a la Compilación

Fases

Análisis léxico, la cadena de caracteres que constituye el programa fuente y los agrupa en secuencias significativas (lexemas). Para cada lexema el analizador produce como salida un token.

Análisis sintáctico, utiliza los tokens producidos por el analizador léxico para crear una representación intermedia en forma de árbol que describa la estructura gramatical del flujo de tokens.

Page 8: 02_Introducción a la Compilación

Fases

Análisis semántico, utiliza el árbol y tabla de símbolos para comprobar la consistencia semántica del programa fuente con la definición del lenguaje.

Generación de código intermedio: Entrega una representación intermedia (código de tres direcciones) que la podemos considerar como un programa para una máquina abstracta

Page 9: 02_Introducción a la Compilación

Fases

Optimización de código, Independiente de la maquina virtual trata de mejorar el código intermedio de manera que se produzca un código destino más eficiente.

Generación de código: Recibe la representación intermedia y la transforma al lenguaje destino. Primero asigna las direcciones de memoria de c/u de las variables y luego traduce las instrucciones intermedias en secuencias de instrucciones de máquina que realizan la misma tarea.

Page 10: 02_Introducción a la Compilación

Por Ejemplo:

Analicemos la siguiente cadena:

Posición := inicial + velocidad * 60

Page 11: 02_Introducción a la Compilación

Análisis léxico

Componentes léxicos: Identificadores: posición, inicial,

velocidad Símbolos: (:=), (+), (*). Número: 60

Los espacios en blanco que separan a los componentes léxicos se eliminan

Page 12: 02_Introducción a la Compilación

Análisis sintáctico: Árbol Sintáctico

:= /   \ id1 +     /   \   id2 *         /   \   id3   60

Page 13: 02_Introducción a la Compilación

Análisis semántico

Utiliza el árbol sintáctico para identificar operadores, operando de expresiones y proposiciones.

Otra parte importante es la verificación de tipos de cada operador.

¿Qué pasaría si todos los identificadores del ejemplo fueran de tipo real?

Page 14: 02_Introducción a la Compilación
Page 15: 02_Introducción a la Compilación

Pasadas

Las actividades de varias fases se pueden agrupar en una sola pasada. 1era. Pasada, fases de análisis 2da. Pasada, Optimización de Código

(Opcional). 3ra. Pasada, Generación del código para

una máquina destino específica.

Page 16: 02_Introducción a la Compilación

Reducción del número de pasadas Pocas pasadas debido al tiempo de

lectura y escritura de archivos intermedios.

Si se agrupan muchas fases dentro de una pasada, puede ser necesario tener todo el programa en memoria; debido a que alguna fase puede necesitar información.

Page 17: 02_Introducción a la Compilación

Herramientas de Construcción de Compiladores.- Características Herramientas que utilizan lenguajes

especializados para especificar e implementar componentes específicos.

Las más exitosas son la que ocultan los detalles del algoritmo de generación y producen componentes que se integran fácilmente al resto del compilador

Page 18: 02_Introducción a la Compilación

Herramientas de Construcción de Compiladores

Generadores de escaners.- Producen analizadores de léxicos a partir de una descripción de tokens de un lenguaje utilizando expresiones regulares.

Generadores de analizadores sintácticos (parsers).- Producen analizadores sintácticos a partir de la gramática del lenguaje de programación.

Motores de traducción orientados a la sintaxis.- Producen rutinas para recorrer árboles sintácticos y generar código intermedio

Page 19: 02_Introducción a la Compilación

Herramientas de Construcción de Compiladores Generadores de generadores de código.- Producen un generador de código a partir de una colección de reglas para traducir cada operación del lenguaje intermedio en lenguaje de máquina.

Motores de análisis de flujo de datos.- Analizan el flujo de información en un programa. Es vital para la optimización de código