1. TITULACIÓN Ingeniero en Informática 2. NOMBRE DE LA ASIGNATURA Procesadores de lenguaje 3. CÓDIGO DE LA ASIGNATURA 78205 4. CARÁCTER Troncal 5. CURSO Tercero 6. PERIODO Segundo Cuatrimestre 7. Nº DE CRÉDITOS 9 (6 Teoría, 3 Práctica) 8. DEPARTAMENTO Ciencias de la Computación 9. ÁREA DE CONOCIMIENTO Lenguajes y Sistemas Informáticos 10. PROFESORADO Salvador Sánchez Alonso - despacho O246 http://www.cc.uah.es/ssalonso/ ([email protected]) Daniel Rodríguez García - despacho O243 http://www.cc.uah.es/drg/ ([email protected]) 11. HORARIO Teoría Turno Mañana: Martes (08-10) y Viernes (10-12) Turno Tarde: Martes (15-17) y Viernes (17-19) Práctica Mañanas: Miércoles (10-12) y Miércoles (12-14) Tardes: Martes (17-19) y Miércoles (17-19) **este último grupo puede sufrir cambios** 12. LUGAR DE IMPARTICIÓN Teoría Todos los grupos: Edificio Norte A6 Práctica Laboratorios Norte L3 y L6 13. OBJETIVOS DOCENTES DE LA ASIGNATURA Conocer los fundamentos teóricos y prácticos, así como las técnicas y herramientas básicas, para el diseño e implementación de un compilador de un lenguaje. - Ser capaz de aplicar las ideas y técnicas propias del diseño de compiladores, en otros campos de la informática. - Aprender a construir los módulos de un compilador encargados de las fases de análisis léxico, sintáctico, semántico, de generación de código intermedio, y de generación y optimización de código. - Aprender a utilizar herramientas de construcción automática de traductores (JLex/CUP). - Construir pequeños procesadores de lenguajes para distintas aplicaciones: compiladores e intérpretes para lenguajes de programación, intérpretes de comandos, lenguajes de consulta a bases de datos, procesadores de texto, formatos de intercambio gráfico, etc. 14. CONTENIDO (PROGRAMA) Parte Teórica TEMA 1.- INTRODUCCIÓN A LOS COMPILADORES. Traductores. Estructura de un compilador. Fase de análisis. Fase de síntesis. Agrupamiento de las fases. TEMA 2.- ANÁLISIS LÉXICO. Descripción de un compilador léxico: Gestión de la entrada. Formalismos de especificación léxica: Expresiones regulares, autómatas finitos. Construcción de un analizador léxico. Manipulación de errores léxicos. Generadores automáticos de analizadores léxicos. TEMA 3.- ANÁLISIS SINTÁCTICO. Formalismos de especificación sintáctica: Gramáticas independientes del contexto, autómatas a pila. Introducción general al análisis sintáctico. Análisis sintáctico descendente: Condición LL(1), transformación de gramáticas, analizador sintáctico descendente. Analizadores ascendentes LR: LR(0), SLR(1), LALR(1). Generadores automáticos de analizadores sintácticos. TEMA 4.- ANALIZADORES SEMÁNTICOS: GRAMÁTICAS DE ATRIBUTOS. Especificación semántica: Formalismos de especificación semántica, gramática de atributos. Evaluación de atributos. Gramáticas S-atribuidas. Gramáticas L-atribuidas. Esquemas de traducción dirigidos por sintaxis. Construcción de un traductor descendente recursivo. TEMA 5.- ANÁLISIS SEMÁNTICO: COMPROBACIÓN DE TIPOS. Expresiones de tipo y sistemas de tipos. Equivalencia de tipos. Sobrecarga, polimorfismo y conversiones implícitas. TEMA 6.- DISEÑO Y GESTIÓN DE LA TABLA DE SÍMBOLOS. La tabla de símbolos TDS. Requerimientos de información de la TDS. Diseño de la TDS: Listas, árboles, tablas hash. Gestión de la TDS en un lenguaje con estructura de bloques. TEMA 7.- GESTIÓN DE LA MEMORIA EN TIEMPO DE EJECUCIÓN. Organización de la memoria en tiempo de ejecución. El problema de la recogida de basura. Registros de activación: Estructura, carga y descarga, acceso a los elementos. TEMA 8.- GENERACIÓN DE CÓDIGO INTERMEDIO. Representaciones intermedias. Declaraciones de variables y subprogramas. Instrucciones de asignación y expresiones numéricas. Expresiones lógicas e instrucciones de control de flujo. Acceso a los elementos de un array y de un registro. Llamadas a subprogramas. TEMA 9.- OPTIMIZACIONES DE CÓDIGO INTERMEDIO. Bloques básicos: Grafos dirigidos acíclicos, grafos de flujo. Optimizaciones locales: transformaciones que preservan la estructura, transformaciones algebraicas. Optimizaciones globales: detección de bucles, optimización de bucles. TEMA 10.- GENERACIÓN Y OPTIMIZACIÓN DE CÓDIGO. Generación de código objeto: algoritmos de generación de código, selección y ordenación de instrucciones, asignación de registros. Optimización de código. Parte Práctica Se realizarán distintas prácticas en el laboratorio sobre los contenidos expuestos en la parte de teoría, utilizando como herramientas las aplicaciones JLex y CUP. 15. BIBLIOGRAFÍA Bibliografía Básica AHO, A.V., LAM, M.S., SETHI, R. y ULLMAN, J.D. 2008. Compiladores: Principios, técnicas y herramientas (segunda edición). Ed. Pearson/Addison–Wesley. LOUDEN, K. C. 2004. Construcción de compiladores. Principios y práctica. Ed. Thomson-Paraninfo. 16. CONOCIMIENTOS PREVIOS RECOMENDADOS Es muy recomendable haber cursado previamente la asignatura de segundo curso Autómatas, lenguajes formales y gramáticas I. Es necesario conocer el lenguaje Java para realizar las prácticas. El alumno debe además tener conocimientos de programación y de estructuras de datos. 17. METODOLOGÍA DE IMPARTICIÓN Parte Teórica Se impartirán clases magistrales utilizando pizarra y medios audiovisuales (proyector y transparencias). Las transparencias utilizadas estarán a disposición de los alumnos. Parte Práctica Se realizarán 3 bloques de prácticas que se corregirán en clase y se entregarán en el tiempo marcado en cada una: - Análisis léxico con JLex - Introducción al análisis sintáctico (interconexión JLex – CUP) - Análisis sintáctico y semántico con CUP 18. MÉTODOS Y CRITERIOS DE EVALUACIÓN La calificación final de la asignatura se obtiene a partir de: • • Un examen de teoría, que contendrá fundamentalmente preguntas sobre la parte teórica pero que también incluirá preguntas de la parte práctica. La realización de las prácticas de laboratorio. La nota final se obtendrá del promedio de la nota de teoría con la del laboratorio ponderándola de la siguiente manera: 30% laboratorio y 70% teoría, siendo necesario obtener un mínimo de 4 en cada una de las partes para poder superar la asignatura. El 30% de la nota de la asignatura correspondiente al laboratorio se calcula evaluando la entrega de las prácticas y su defensa ante los profesores de prácticas. Ni la nota de laboratorio ni la de teoría se guardan para cursos subsiguientes. El alumno que apruebe en el examen de junio la parte de laboratorio sin haber entregado las prácticas, sólo tendría que entregar y defender las prácticas en septiembre. Estas prácticas consistirán realizar un conjunto de las realizadas durante el curso más una nueva especial para dicha convocatoria. Si se ha suspendido la teoría y aprobado el laboratorio, sólo tendrá que presentarse al examen. En junio aquellos alumnos que figuren con la teoría aprobada sin tener el laboratorio aprobado aparecerán en las actas de junio como no presentados pero en septiembre aparecerán ya como suspensos si no han recuperado el laboratorio. Si se suspende la teoría en junio aparecerán como suspensos.