Compiladores: Introducción Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. Gloria Inés Alvarez V. (galvarez@puj.edu.co) Basado en [Aho, 2007, chp. 1] Qué es un COMPILADOR? Programa Lenguaje Destino Programa Lenguaje Fuente COMPILADOR Mensajes de Error Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Qué vamos a aprender en este curso? Técnicas sistemáticas para manejar las principales tareas que ocurren durante el proceso de compilación. El desarrollo del primer compilador de Fortran (1950´s) tomó 18 años hombre. Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Contexto de un Compilador Leng. Fuente Preprocessor Leng. Fuente Leng. Destino Compiler Assembler Linker Loader Cod. Maq. Relocalizable Cod.Maq Reloc. Cod.Maq Absoluto Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Diferencia entre Compilador e Interprete Interprete: no realiza la traducción, desarrolla las operaciones que se especifican en el programa fuente. Procesa el programa y la entrada simultáneamente. Compilador. Tiempo de Compilación Tiempo de Ejecución Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Compilador Datos Prog. Fuente Compilación Código Objeto Ejecución Resultados Tiempo de Compilación Tiempo de Ejecución Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Interprete Datos Prog. Fuente Interprete Resultados Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Tarea del Compilador int a,b; main () { a = 5; b = a*a+1; } COMPILADOR STORE #5,0 LOAD 0,R0 MUL 0,R0 ADD #1,R0 STORE R0,4 Como lo hace? Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Compilar se parece a traducir Reconocer los símbolos (letras, dígitos, signos de puntuación). Agrupar los símbolos en palabras. Asociar a cada palabra significado y atributos. Verificar que la estructura de la oración sea correcta. Juntar los significados parciales y asegurarse que la idea resultante tiene sentido. Compilar se parece a traducir Una vez se ha entendido el significado de una oración bien construida, se procede a realizar la acción indicada en ella. Para esto se generan instrucciones en el lenguaje que entiende el computador. El nuevo conjunto de instrucciones se revisa por si puede ser mejorado. Finalmente se ejecutan las instrucciones. Modelo de Compilación Programa Fuente Representación intermedia Análisis Síntesis Mensajes de Error Programa Destino Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Modelo de Compilación Análisis: divide el programa fuente en las partes que lo forman y crea una representación intermedia Síntesis: construye el programa destino a partir de la representación intermedia Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Fases de Análisis Leng. Fuente (Cadena de Caracteres) Análisis Lineal (Análisis Léxico ó Scanning) Cadena de Tokens Análisis Jerárquico (Análisis Sintáctico ó Parsing) Arbol de Análisis Sintáctico (Parse Tree) Análisis Semántico Arbol de Parse decorado Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Fases de Síntesis Arbol de Parse decorado Generación de Código Intermedio Código Intermedio Optimización de Código Generación de Código Final Leng. Destino Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Además Durante todas las fases se usa una Tabla de Símbolos Durante las fases de análisis se hace Detección, Reporte y Recuperación de Errores. Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Análisis Léxico (Scanner) ..... 1 2 . 5 * ( 5 + v a Número flotante (12.5) Espacio Operador de multiplicación Espacio Paréntesis abierto Número entero (5) Operador de suma Identificador (valor) Punto y coma Salto de línea l o r ) ; \n ..... Análisis Sintáctico (Parser) Num_flt ‘*’ ‘(‘ num_int ‘+’ id ‘)’ ‘;’ expresión expresión num_flt ‘*’ expresión ‘(‘ expresión expresión num_int ‘+’ ‘)’ expresión id Análisis Semántico Num_flt ‘*’ ‘(‘ num_int ‘+’ id ‘)’ expresión (float) (float) expresión num_flt (int) ‘*’ expresión (int) ‘(‘ expresión expresión ‘+’ ‘)’ (int) expresión (int) num_int id Generación de código intermendio Código de una máquina virtual. Código de tres direcciones. Cada instrucción consta de sólo tres operandos Sólo hay un operador además de la asignación Debe ser un código fácil de generar y fácil de convertir en instrucciones para el procesador. Optimización de código Busca mejorar el código intermedio para: Hacerlo más rápido Lograr que consuma la menor cantidad de memoria posible. La optimización puede ser desde trivial hasta muy sofisticada. Puede tomar una porción significativa del tiempo total de compilación. Generación de código Se genera código de máquina relocalizable. El código generado realiza la misma tarea que el código de entrada. Un aspecto clave es la asignación de variables a registros. Contexto de la compilación Preprocesamiento Resuelve macros Incluye archivos Puede extender el lenguaje con nuevas estructuras de control o de datos Ensamble Recibe código en lenguaje ensamblador y genera código listo para ejecutarse. Se puede ensamblar en dos pasadas: primero se construye una tabla de símbolos, luego se genera el código de máquina relocalizable. Contexto de la compilación Normalmente el mismo programa realiza carga y encadenamiento. Carga: Transforma código relocalizable en código absoluto. Encadenamiento: Construye un sólo programa a partir de código que está en varios archivos. Resuelve referencias externas. Front-End Leng. Fuente Análisis Léxico Análisis Sintáctico Análisis Semántico Generación de Código Intermedio Código Intermedio Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Back-End Código Intermedio Optimización de Código Generación de Código Final Leng. Destino Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Pasadas 1 Pasada = leer una vez un archivo Se realizan varias fases con una pasada Si se tienen pocas pasadas: Ventaja: Mayor velocidad de respuesta Desventaja: Mayor uso de memoria Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Ejemplo: Un Compilador de 4 Pasadas 1a. Pasada: Preprocesador 2a. Pasada: Front-End 3a. Pasada: Back-End (genera código assembler) 4a. Pasada: Ensamblador Pontificia U. Javeriana Cali - Ingeniería de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón Herramientas útiles Generador de analizadores sintácticos. Generador de analizadores léxicos. Motor de traducción dirigida por sintaxis. Generador automático de código. Motor de flujo de datos.