Descripción
El objetivo principal de la asignatura es la enseñanza del proceso de la compilación de lenguajes de programación de alto nivel. Se estudian las fases de análisis semántico, generación de código y optimización de un compilador y sus correspondientes técnicas de implementación. Para el estudio de cada fase se detallan las características correspondientes de diferentes lenguajes de programación imperativos. En la práctica se implementan las fases de análisis semántico y generación de código de un compilador de una sola pasada para un lenguaje imperativo.
Tipo asignatura
Optativa
Semestre
Segundo
Créditos
5.00
Conocimientos previos

Estructuras de datos, programación imperativa y programación orientada a objetos.
Diseño de lenguajes de programación.

Objetivos

Los formalismos de la teoría de la compilación pueden ser aplicados a otros campos y áreas de la informática. El estudio del proceso de la compilación requiere un conocimiento profundo de los elementos que constituyen un lenguaje de programación. Por lo tanto, esta asignatura ayuda al estudiante a reforzar sus conocimientos y a adquirir nuevos criterios para la programación, diseño, implementación y evaluación de lenguajes de programación.

Los alumnos que cursan la asignatura adquieren los conocimientos y desarrollan las habilidades que se indican a continuación:

1. Conocimientos generales básicos de la teoría de la compilación y conocimentos específicos de análisis semántico, generación de código y optimización
2. Capacidad de análisis y síntesis
3. Capacidad de organización y planificación del trabajo a realizar entre los diferentes miembros del grupo de prácticas así como del trabajo individual de cada alumno.
4. Mejora de la comunicación escrita en la lengua utilizada por los alumnos en los diferentes exámenes presentados y en la realización de los informes de las diferentes fases de la práctica.
5. Conocimientos de herramientas informáticas.
6. Capacidad de resolución de problemas.
7. Habilidad de trabajar en equipo.
8. Habilidad de trabajar en equipo utilizando medios telemáticos.
9. Desarrollo de habilidades interpersonales a la hora de defender argumentos propios delante de los compañeros de grupo.
10. Capacidad de aplicación de los conocimientos adquiridos de la teoría de la compilación en la realización de la práctica.
11. Capacidad para generar nuevas ideas a partir de los conceptos teóricos estudiados en clase.
12. Habilidad de trabajo en entornos telemáticos.
13. Utilización de textos en inglés en la bibliografía básica.
14. Capacidad de autoaprendizaje.
15. Toma de decisiones para continuar avanzando en el desarrollo de la práctica.
16. Diseño y gestión de proyectos.

Contenidos

1 Análisis semántico
1.1 El analizador semántico
1.2 Identificadores, atributos y verificaciones
1.3 La Tabla de símbolos
1.4 Análisis semántico de tipos
1.5 Análisis semántico en declaraciones
1.6 Análisis semántico de expresiones
1.7 Análisis semántico de instrucciones
1.8 Otros Análisis semánticos

2 Generación de código
2.1 Introducción
2.2 Organización de la memoria
2.3 Representación de los datos
2.4 Generación de código para expresiones
2.5 Generación de código para instrucciones simples
2.6 Generación de código para instrucciones condicionales y lazos
2.7 Generación de código para funciones y procedimientos
2.8 Acceso a variables

3 Optimización
3.1 Introducción
3.2 Estructura del compilador con optimización
3.3 Lenguajes intermedios
3.4 El lenguaje MIR
3.5 De Babel a MIR
3.6 Un ejemplo
3.7 Tipos de código y orden de las optimizaciones
3.8 Etapas de un optimizador
3.9 Optimizaciones early
3.10 Transformaciones preservando funcionalidad
3..11 Optimización de lazos
3.12 Contando operaciones
3.13 Casos de estudio

Metodología

Esta asignatura puede cursarse en dos formatos, según la preferencia del alumno, presencial y semipresencial. La principal diferencia entre las dos modalidades se basa en la diferente asistencia física de los alumnos a las aulas.

A lo largo del curso se combinan diferentes maneras de impartir la asignatura:

1. Clases magistrales.

En la modalidad presencial, el profesor imparte a lo largo del curso los conceptos teóricos de la asignatura mediante clases magistrales. En estas clases el profesor también resuelve ejercicios de aplicación directa de los conceptos explicados. En la modalidad semipresencial, el alumno asume un papel más activo en su aprendizaje. Dispone de los contenidos del curso en el campus virtual donde hay una guía de estudio que: explica los conceptos de la asignatura, da referencias a la bibliografía para poder ampliar estos conceptos, contiene enunciados de problemas y contiene preguntas autoevaluativas donde el alumno puede tener una indicación de su grado de aprendizaje. En este formato, se realizan al menos tres encuentros presenciales en al año donde los alumnos y los profesores se reúnen para realizar clases magistrales, problemas, prácticas o debates.

2. Horas de clase dedicadas a resolver ejercicios teóricos, individualmente o en grupos.

Durante algunas horas de clase el profesor plantea ejercicios teóricos para que sean resueltos por los alumnos en aquel momento. Estos ejercicios puede ser resueltos individualmente o en grupo.

3. Ejercicios a resolver en casa.

A parte de los ejercicios resueltos en clase, el alumno ha de resolver otros en casa. La finalidad de estos ejercicios es afianzar las ideas teóricas. Los alumnos disponen de un problemario con ejercicios. Algunos de los ejercicios están resueltos.

4. Trabajo en grupo en horas de clase.

Al final de la asignatura se dedican 2 horas de clase al estudio de un lenguaje de programación usando su documentación técnica. El objetivo es evaluar su complejidad a la hora de implementarlo.

5. Prácticas

A lo largo del curso los alumnos implementan parcialmente (analizador semántico y generación de código) un lenguaje de programación (Babel) definido por el profesor de la asignatura con fines académicos a partir de un analizador lexicográfico y un analizador sintáctico ya programado. Las clases teóricas se imparten en el orden necesario para poder realizar las diferentes fases de la práctica dentro de las fechas establecidas.

La práctica se realiza en grupos de 2. La entrega se realiza por fases. Cada fase se corrige y se le informa al estudiante de los resultados haciéndoles sugerencias para mejorarla. En la última fase se realiza una entrevista personalizada a cada integrante del grupo para que defiendan oralmente su trabajo.

A continuación se dan las fases en las que está dividida la práctica y el objetivo principal de cada una de ellas:

Fase 1. Análisis Semántico del lenguaje BABEL
Implementación de un analizador semántico mediante la técnica de esquemas de traducción haciendo uso de atributos

Fase 2. Generación de Código del lenguaje BABEL
Generar código en lenguaje ensamblador (MIPS) mediante la técnica de traducción dirigida por sintaxis

Evaluación

La asignatura se divide en dos partes claramente diferenciadas: una parte teórica (40%) y una parte práctica (60%). Cada una de estas partes se evalúan por separado y han de aprobarse por separado para poder aprobar la asignatura.

Si se aprueban las dos partes, la nota final de la asignatura es la suma aritmética de la nota de teoría y de la nota de práctica.

Con la finalidad de evaluar si el alumno a alcanzado en un grado adecuado los objetivos de la asignatura se hacen servir diferentes pruebas:

A. Exámenes
Durante el curso se hacen exámenes presenciales.

B. Exámenes orales
Se realiza un examen oral presencial en la entrega de la última fase de la práctica realizada por los alumnos.

F. Informes correspondientes a las prácticas realizadas en grupo.
Para evaluar cada informe de cada una de las fases de la práctica el profesor hace servir un formulario donde tiene marcados y cuantificados los diferentes aspectos que se han de valorar.

G. Trabajos prácticos con ordenador
La implementación de la práctica se hace en lenguaje Java. Para cada fase el profesor dispone de un formulario para su evaluación exhaustiva.

J. Participación en clase o en el campus virtual.
El profesor de la modalidad presencial dispone de una lista de observaciones posibles donde anota los diferentes comportamientos y actitudes presentadas por los alumnos durante la clase. En el sistema semipresencial, estas actitudes de reflejan en la actuación y participación de los alumnos en los forums y en las reuniones a través del aula virtual.

Criterios evaluación

El estudiante ha de demostrar que ha adquirido un conocimiento adecuado de los conceptos estudiados durante el curso. [A, B, C, F].

Objetivo 2: Capacidad de análisis y síntesis.
El estudiante ha de ser capaz de analizar los problemas con los cuales se enfrenta y ha de demostrar capacidad de síntesis en la generación de soluciones. [A, B, G, J].

Objetivo 3: Capacidad de organización y planificación del trabajo a realizar entre los diferentes miembros del grupo de prácticas así como del trabajo individual de cada alumno.
El estudiante ha de planificar y organizar su trabajo individual así como el trabajo a realizar en grupo. [G]

Objetivo 4: Mejora de la comunicación escrita en la lengua utilizada por los alumnos en los diferentes exámenes presentados y en la realización de los informes de las diferentes fases de la práctica.
El estudiante ha de presentar los exámenes e informes sin faltas de ortografía y con el estilo y el orden adecuado según las especificaciones dadas. [A,F]

Objetivo 5: Conocimientos de herramientas informáticas.
El estudiante ha de demostrar que ha adquirido los conocimientos necesarios de Java y de JavaCC para la implementación de la práctica. [F,G]

Objetivo 6: Capacidad de resolución de problemas.
El estudiante ha de demostrar que sabe proponer soluciones adecuadas tanto para los ejercicios teóricos como para la implementación de las diferentes fases de la práctica. [A,B,F,G]

Objetivo 7: Habilidad de trabajar en equipo.
El estudiante ha de ser capaz de trabajar con los compañeros de grupo y llegar a proponer soluciones a los diferentes problemas presentados. [F,G]

Objetivo 8: Habilidad de trabajar en equipo utilizando medios telemáticos.
Especialmente los alumnos semipresenciales, y en menor grado, los presenciales, han de ser capaces de formar un grupo de trabajo en un entorno virtual utilizando los forums, gestionando documentos de diferentes versiones y dominar las herramientas de comunicación síncrona remota.[G,J]

Objetivo 9: Desarrollo de habilidades interpersonales a la hora de defender argumentos propios delante de los compañeros de grupo.
El estudiante ha de mantener una comunicación fluida con sus compañeros de grupo de práctica.[F,G]

Objetivo 10: Capacidad de aplicación de los conocimientos adquiridos de la teoría de la compilación en la realización de la práctica.
El estudiante ha de identificar los formalismos y las técnicas adecuadas de la teoría para implementar las diferentes fases de la práctica con la orientación del profesor y la ayuda de sus compañeros de grupo [F,G]

Objetivo 11: Capacidad para generar nuevas ideas a partir de los conceptos teóricos estudiados en clase.
El estudiante ha de demostrar que es capaz de aplicar en contextos diferentes las técnicas de la construcción de compiladores que ha aprendido en la teoría . Particularmente en la realización de la práctica. [A,B,F,G]

Objetivo 12: Habilidad de trabajo en entornos telemáticos.
Todos los alumnos semipresenciales basan su estudio en diferentes herramientas dentro de un campus virtual. Estas competencias quedan implícitamente evaluadas. [A,B,C,G]

Objetivo 13: Utilización de textos en inglés en la bibliografía básica.
Algunos de los conceptos de la asignatura se encuentran referenciados directamente en inglés. Estos conceptos también son evaluados. [A,G]

Objetivo 14: Capacidad de autoaprendizaje.
El estudiante ha de demostrar que es capaz de adquirir conocimientos por él mismo.[A,C]

Objetivo 15: Toma de decisiones para continuar avanzando en el desarrollo de la práctica.
El estudiante ha de demostrar que es capaz de decidir cuando ha alcanzado los objetivos básicos de cada una de las fases de la práctica. [F,G]

Objetivo 16: Diseño y gestión de proyectos.
El estudiante ha de demostrar que es capaz de hacer un diseño modular de la práctica y gestionarla adecuadamente para poder terminarla con garantías y dentro del plazo pedido. [F,G]

Bibliografía básica

- Aho, Afred V.; Sethi, Ravi; Ullman, Jefrey D. Compilers. Principles, Techniques and Tools. Addison-Wesley Publishing Company, 1985

- Muchnick, Steven S. Advanced Compiler Design and Implementation. Morgan Kaufmann Publishers, 1997

- Elder, John. Compiler Construction. A Recursive Descent Model. Prentice Hall, 1994

- Mozota i Coloma, Maria Antònia. Problemes i Solucions. Departament d´informàtica. Escola d´enginyeria i arquitectura La Salle. Barcelona, 2007

- Taula de símbols per Babel. Departament d´informàtica. Escola d´enginyeria i arquitectura La Salle. Barcelona, 2007

- Mozota i Coloma, Maria Antònia. BABEL 2007: Part II. Especificació de la pràctica. Departament d´informàtica. Escola d´enginyeria i arquitectura La Salle. Barcelona, 2007

- Larus, R. James. Assemblers, Linkers and the SPIM Simulator. Morgan Kaufmann Publishers. Computer Science Departament, University of Wisconsin-Madison, 1998

- Larus, R. James. SPIM S20: A MIPS R2000 SIMULATOR. Computer Science Departament, University of Wisconsin-Madison, 1997

Material complementario

- Pratt, Terrence W.; Zelkowitz, Marvin V.. Lenguajes de Programación. Diseño e Implementación. Prentice Hall, 1998

- Java. Una introducció. Departament d´informàtica. Escola d´enginyeria i arquitectura La Salle. Barcelona, 1999