Programa
- Estructura de un compilador. Fases de un compilador, compilación vs. interpretación.
- Análisis léxico. Lenguajes regulares, expresiones regulares, autómatas finitos.
- Análisis sintáctico. Gramáticas independientes del contexto, árboles de sintaxis, parsers descendentes y ascendentes, generadores de parsers.
- Interpretación. Ejemplos de interpretación para lenguajes imperativos, funcionales, orientados a objetos.
- Análisis semántico. Tablas de símbolos, inferencia de tipos, unificación.
- Generación de código intermedio. Máquinas de pila, máquinas de registros, análisis y síntesis de atributos.
- Análisis estático. Grafos de flujo, análisis de flujo de datos local hacia adelante y hacia atrás.
- Optimización. Eliminación de código muerto, propagación de constantes, loop unrolling.
- Soporte en tiempo de ejecución. Representaciones tagged vs. tagless, registros de activación, garbage collection.
- Generación de código. Register allocation y spilling, selección de instrucciones.
Bibliografía
Básica
- Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools (2nd Edition). Addison Wesley, 2006.
- Andrew W. Appel. Modern Compiler Implementation in C. Cambridge University Press, 1998.
Complementaria
Lenguajes formales
- John E. Hopcroft, Rajeev Motwani, Jeffrey D. Ullman. *Introduction to Automata Theory, Languages and Computation*.
Compilación de lenguajes funcionales y orientados a objetos
- Simon Peyton Jones. The Implementation of Functional Programming Languages. Prentice Hall, 1987.
- Christian Queinnec. LiSP in Small Pieces.
- Guy L. Steele. RABBIT: A Compiler for SCHEME.
- Adele Goldberg, David Rodson. Smalltalk-80: The Language and Its Implementation.
Sistemas de tipos
Benjamin Pierce. Types and Programming Languages.
Manejo automático de memoria
Richard Jones, Antony Hosking, Eliot Moss. The Garbage Collection Handbook: The Art of Automatic Memory Management.