Escuela de Ing. en Computacin, TEC y Universidad Cenfotec itrejos@ucenfotec.ac.cr 1 Introduccin
Un curso sobre compiladores es frecuente en carreras de grado en Computacin. La carrera de Ingeniera en Computacin del Instituto Tecnolgico de Costa Rica ha contado, desde hace ms de tres dcadas, con algn curso donde se estudian los problemas relacionados con la implementacin de lenguajes de programacin. En 1997, antes de un cambio curricular, se discuti la posibilidad de eliminar tal curso, pero este prevaleci con el nombre Compiladores e intrpretes. El curso se ubica en el quinto semestre de la carrera.
La descripcin del curso reza: Este curso estudia principios y tcnicas necesarios para la construccin de procesadores de lenguajes de programacin, con nfasis en compiladores e intrpretes. y contina (nfasis nuestro): El aprendizaje permite aplicar modelos abstractos (lenguajes formales y autmatas), enfrentar problemas de manipulacin de informacin simblica, realizar programacin modular avanzada, analizar sistemas complejos de software y hacer modificaciones sistemticas, y ampliar el repertorio de mtodos para resolucin de problemas informticos..
El desarrollo de un compilador es una de las primeras experiencias que tendr un estudiante de Computacin para disear y escribir programas de un tamao superior a 2,000 lneas de cdigo, de mediana complejidad, y con el respaldo de desarrollos conceptuales y tericos slidos para sus decisiones de diseo y construccin. Antes de esto, los estudiantes habrn tenido unos seis cursos relacionados con programacin, algortmica, estructura de datos y lenguajes de programacin. Un curso en que desarrolle el procesador de un lenguaje de programacin es un lugar propicio para estudiar y aplicar buenas prcticas de Ingeniera del software.
Hay buenos libros para apoyar un curso que verse sobre compiladores, tales como el clsico denominado del dragn (Aho, Lam, Sethi, & Ullman, 2007). Muchos profesores usan partes de este extenso libro, cuyos alcances desbordan lo que pueda desarrollarse en un semestre. El autor decidi usar otra fuente, el libro Programming Language Processors in Java: Compilers and Interpreters (Watt & Brown, 2000), que es una edicin moderna de un libro que haba utilizado anteriormente (Watt, 1993). Estos libros exponen principios y tcnicas para la construccin de un compilador y una mquina abstracta, y cuentan con la implementacin completa de un pequeo lenguaje imperativo y su mquina abstracta. Ambos estn diseados sistemticamente a partir de tcnicas de compilacin e interpretacin expuestas en los libros, junto con prcticas de programacin modulares (en Pascal) u orientadas a objetos (Java), segn la edicin.
2 Metodologa
El profesor desarrolla de manera magistral los aspectos tericos y prcticos de los diferentes temas. Esto se complementa con otras lecturas y cdigo ejemplo. El libro de (Watt & Brown, 2000) es la base para la mayor parte de curso, pero el profesor ha desarrollado intrpretes ilustrativos escritos en Standard ML, para explicar la construccin de prototipos de lenguajes de programacin basada en principios semnticos.
El profesor explica el proceso general de compilacin y las posibles arquitecturas de software para resolverlo, haciendo nfasis en la conexin entre las fases del procesador, las tcnicas disponibles y los componentes de software por construir. La teora se hace corresponder con el compilador y los intrpretes que ejemplifican los mtodos de solucin, para lenguajes representativos de los paradigmas imperativo y funcional.
El componente esencial del aprendizaje y de la evaluacin del curso son los proyectos de programacin. Estos, por lo general, son cuatro: Un compilador y dos intrpretes. El compilador es construido en dos proyectos: 1) fases de anlisis lxico, sintctico y contextual; 2) fases de generacin e interpretacin del cdigo. Un intrprete implementa un lenguaje funcional, mientras que el otro interpreta un lenguaje imperativo.
Al contar con bases previamente construidas, el profesor plantea extensiones a los lenguajes fuente originales, de manera que todos los aspectos de compilacin e interpretacin deban ser resueltos, pero sin necesidad de escribir desde cero la totalidad del procesador del lenguaje. El desarrollo de los proyectos promueve el aprendizaje de tcnicas de desarrollo y mantenimiento de software.
3 Evaluacin
Variantes de este curso han sido impartidas por el autor desde 1994. Con la ayuda de asistentes, se implementaron pequeos ambientes de desarrollo interactivos (IDE), a los que los estudiantes onectan sus compiladores. Los IDE dan un sentido de realismo a los proyectos relacionados con compilacin y resultan muy motivadores.
Los proyectos generalmente incluyen retos adicionales, que dan puntos extra. Cerca de un 30% de los estudiantes abordan exitosamente la solucin de los problemas adicionales. El profesor desestimula que los estudiantes hagan nuevos IDE, para evitar que se distraigan con temas fuera de los alcances del curso.
Los estudiantes primero reaccionan adversamente al enfrentarse a modificar cdigo escrito por terceros. Luego se dan cuenta de que el cdigo est bien estructurado y que las tcnicas explicadas en clase y el libro dan buen fundamento a las partes de compilador o el intrprete que debern modificar. El profesor insiste en que primero estudien las tcnicas y el cdigo, de manera anloga a como un cirujano (que sabe de anatoma) planea previamente una intervencin quirrgica. Hay intencin en esto, el profesor desea que los estudiantes aprendan de buenas prcticas mediante su observacin y diseccin, que se enfrenten a modismos y estilos distintos de los propios, que prueben (a pequea escala) algunas de las dificultades que conlleva el mantenimiento de software y reflexionen sobre las caractersticas de un producto de software que podran obstaculizar su comprensin, modificacin, extensin o evolucin.
En el caso de los intrpretes, los proyectos son menores en envergadura y no estn anclados a un IDE. El nfasis aqu es en la semntica de los lenguajes por interpretar y en el uso del intrprete para hacer un prototipo del lenguaje que permita explorar sus propiedades
Al finalizar el curso, los estudiantes mayoritariamente admiten que han aprendido no solamente de compilacin e interpretacin, sino que han comprendido en mayor profundidad los lenguajes de programacin (y sus paradigmas), han experimentado con tcnicas de diseo (patrones diversos), comprendido los rudimentos de la arquitectura de software, enfrentado la construccin de extensiones significativas y no triviales a programas de ms de 5,000 lneas de cdigo, resolviendo las tensiones que esto conlleva.
Con la ayuda de asistentes, se ha construido (en el lenguaje OCaML) un prototipo parcial de una familia de compiladores modulares, que ilustra mejor la sustituibilidad de los componentes a cargo de las tareas de compilacin e interpretacin en el marco de una arquitectura definida mediante interfaces especificadas precisamente. Algunos de los componentes admiten su construccin mediante diversas tcnicas y hasta ser generados automticamente (anlisis lxico, anlisis sintctico). Este trabajo no ha sido concluido, pero abrira el espacio para una futura edicin de este curso.
4 Bibliografa Aho, A., Lam, M., Sethi, R., & Ullman, J. (2007). Compilers: Principles, techniques and tools, 2nd. Ed. Boston: Addison-Wesley. Watt, D. (1993). Programming language processors. Londres: Prentice Hall. Watt, D., & Brown, D. (2000). Programming Language Processors in Java: Compilers and Interpreters. Harlow: Prentice Hall.