Ministerio de Educación, Ciencia y Tecnología
Universidad Nacional de San Luis
FACULTAD DE CS. FISICO MAT. Y NAT.

ANEXO II

PROGRAMA DEL CURSO: DISEÑO Y CONSTRUCCION DE COMPILADORES

DEPARTAMENTO DE:   INFORMATICA
AREA: Automatas y LenguajesAÑO: 2002 (Id: 1580)
Estado: En tramite de Aprobación

 

I - OFERTA ACADÉMICA

CARRERAS PARA LAS QUE SE OFRECE EL MISMO CURSO

PLAN DE ESTUDIOS
ORD. Nº

CRÉDITO HORARIO

   

SEM.

TOTAL

LIC. EN CIENCIAS DE LA COMPUTACION11/9810140

II - EQUIPO DOCENTE

Funciones

Apellido y Nombre

Total hs en
este curso

Cargo y Dedic.

Carácter

Responsable

DNL10  hs.PROFESOR ASOCIADO EXC.Efectivo
Auxiliar de 1ºMUCHUT, ALFREDO RUBEN 10  hs.AYUDANTE DE 1RA. SEMI. Temporal
Auxiliar de 1ºMOLINA, SILVIA MARTA 10  hs.AYUDANTE DE 1RA. SEMI. Temporal

DNL: Docente no listado

III - CARACTERÍSTICAS DEL CURSO

CREDITO HORARIO SEMANAL
MODALIDAD
REGIMEN

Teórico/

Práctico

Teóricas

Prácticas de

Aula

Práct. de lab/ camp/

Resid/ PIP, etc.

2c
10 Hs.
3 Hs.
2 Hs.
5 Hs.
Asignatura
Otro: 
Duración: 14 semanas
Período del 12/08/02 al 15/11/02

IV.- FUNDAMENTACION

El diseño y construcción de compiladores deben formar parte del conocimiento general de un Licenciado en Ciencias de la Computación, con el perfil requerido por el correspondiente plan de estudios.
Esta materia profundiza los conocimientos introductorios dados en la materia Análisis Comparativo de Lenguajes y aplica conceptos ya adquiridos en Autómatas y Lenguajes.
Además las técnicas involucradas en la construcción de un compilador pueden aplicarse en el ámbito del desarrollo de software de base como en el desarrollo de software de aplicación.
Los contenidos del curso se corresponden con las propuestas curriculares recomendadas por la ACM/IEEE Computer Society Joint Curriculum Task Force en 2001, para el área de compiladores.


V.- OBJETIVOS

Desarrollar en el alumno la capacidad de diseñar e implementar un compilador para un subconjunto del Lenguaje de Programación C++.

 


VI. - CONTENIDOS

BOLILLA 1: INTRODUCCION

Concepto y tipos de traductores. Compiladores de una o más pasadas.Estructura Clásica de un Compilador: Modelo de Análisis y Síntesis de un compilador. Sintaxis y Semántica.

BOLILLA 2: ANALIZADOR LEXICOGRAFICO O SCANNER

Breve recapitulación de los conceptos fundamentales.

BOLILLA 3: TABLA DE SIMBOLOS

Finalidad. Entradas de la tabla de símbolos. Descripción de objetos en la tabla de símbolos. Tratamiento de nombres de longitud fija y variable. Posibles implementaciones: lista, hash, árbol, otras. Representación de la información sobre tipos. Manipulaciones básicas. Control de bloques y de amplitud.


BOLILLA 4: PARSING TOP DOWN DETERMINISTICO

Definiciones de gramáticas LL(k) y LL(k) fuerte. Condición de LL(k) fuerte. Conjuntos FIRSTk, FOLLOWk, algoritmos de construcción de dichos conjuntos. Teoremas Fundamentales. Análisis top down por medio de tablas para k = 1. Análisis sintáctico top-down por el método recursivo descendente. Generalidades. Algoritmos de implementación de un parser descendente recursivo.

BOLILLA 5: DETECCION Y RECUPERACION DE ERRORES

Errores en las etapas lexicográfica, sintáctica, semántica y de ejecución. Esquema de recuperación de errores en entornos de parsing top-down.

BOLILLA 6: AMBIENTES DE TIEMPO DE EJECUCION

Revisión de las características básicas de los lenguajes de programación. Representación de tiempo de ejecución de objetos computacionales estáticos, semidinámicos y dinámicos. Organización de la memoria en tiempo de ejecución. Administración dinámica de la memoria como stack: activación de procedimientos, referenciación local, registros de activación, referenciación global, vector display. Administración dinámica de la memoria como heap: organización, administración del heap con elementos de tamaño fijo y variable, asignación inicial y reuso.

BOLILLA 7: REPRESENTACIONES INTERMEDIAS DE LOS PROGRAMAS FUENTES

Notación polaca, de n-uplas, de árboles de sintaxis abstracta. Código de máquina abstracta. Portabilidad.

BOLILLA 8: SISTEMA DE EJECUCION BASICO Y EXTENDIDO

Representación interna de los objetos en tiempo de ejecución: lógicos, caracteres, enteros, reales, arreglos. Análisis y traducción de expresiones aritméticas y lógicas, asignaciones, estructuras de control a nivel de sentencias, entrada-salida, estructuras de control a nivel de procedimientos, pasaje de parámetros por dirección y por valor. Referenciación global y local. Variables subindicadas: acceso, pasaje de arreglos y elementos de arreglos como parámetros.

BOLILLA 9: TRADUCCION DIRIGIDA POR LA SINTAXIS

Definiciones dirigidas por la sintaxis: atributos, atributos sintetizados y heredados, forma general de una definición dirigida por la sintaxis, grafo de dependencia de atributos. Definiciones S-atribuidas: traductores bottom up. Definiciones L-atribuidas. Esquemas de traducción dirigidos por la sintaxis. Restricciones para el cálculo de los valores de los atributos. Implementación de definiciones L-atribuidas en un entorno de parser top down. Eliminación de recursividad a izquierda en los esquemas de traducción. Parsing descendente recursivo que implementa definiciones L-atribuidas.

BOLILLA 10: CONTROL DE TIPOS

Introducción. Expresiones de tipo. Sistema de tipos. Salvaguarda de información del tipo asociado a los identificadores. Chequeo de tipo de expresiones y sentencias. Equivalencia de expresiones de tipo estructural.

BOLILLA 11: GENERACION DE CODIGO INTERMEDIO

Ubicación del generador de código dentro del proceso de compilación. Esquemas de traducción dirigidos por la sintaxis para la generación de código intermedio para expresiones, asignaciones, estructuras de control a nivel de sentencias y unidades. Generación de código intermedio embebido en un parser descendente recursivo.


VII. - PLAN DE TRABAJOS PRÁCTICOS

1. Plan de trabajos prácticos de aula


PRACTICO 1: Tabla de Símbolos.

PRACTICO 2: Gramáticas LL(k).

PRACTICO 3: Parsing Descendente Recursivo.

PRACTICO 4: Recuperación de errores.

PRACTICO 6: Sistema de Ejecución Básico.

PRACTICO 7: Soporte de Tiempo de Ejecución.

PRACTICO 8: Traducción dirigida por la sintaxis en entorno top down.

PRACTICO 9: Chequeo de tipos y Generación de Código.

2. Plan de trabajos prácticos de laboratorio


1. Completar unidad de Tabla de Símbolos.
2. Completar código del parser descendente recursivo.
3. Diseño e implementación de un esquema de recuperación de errores.
4. Diseño e implementación de un chequeador de tipos.
5. Generación de código en una representación intermedia.


VIII - RÉGIMEN DE APROBACIÓN

F.1. Regimen para alumnos promocionales

Para promocionar la materia los alumnos deberán aprobar:

1. Los prácticos de programación propuestos (fuente y ejecutable) incluyendo un informe del trabajo realizado.
2. Dos exámenes parciales 1 teórico y 1 práctico o sus respectivas recuperaciones. Ochenta por ciento (80%) es el porcentaje mínimo, de los ejercicios y/o preguntas a resolver, necesario para aprobar cada parcial.
3.Tener aprobado el examen final de Análisis Comparativo de Lenguajes y regularizada Autómatas y Lenguajes y aprobado su examen final no más allá del 31 de Julio de año inmediato siguiente al del presente programa.

La nota final se computará promediando las notas obtenidas en los puntos 1 a 2.

F.2. Regimen para alumnos regulares

Para regularizar la materia los alumnos deberán aprobar:

1.Los prácticos de programación propuestos (fuente y ejecutable) incluyendo un informe del trabajo realizado.
2.Un examen parcial práctico o su respectiva recuperación, con un porcentaje de ejercicos correctos del 70%.


F.3. Regimen de alumnos libres

Dadas las características de los trabajos prácticos de máquina durante el desarrollo de la materia y la imposibilidad de suplantarlos por un único práctico de examen libre, la Profesora Responsable decide la no admisión de alumnos libres.
EXCEPCION: Aquellos alumnos que habiendo cursado la materia, optando por el régimen promocional o regular y hayan aprobado los prácticos de máquina, pero no así alguno de los otros requisitos, podrán rendir la materia como alumnos libres.
Para ello primero deberán rendir un examen escrito sobre temas de los prácticos de aula y, de ser éste aprobado, podrán rendir un examen posterior el cual podrá ser oral o escrito.
El plazo de que dispone el alumno, que se acoja a esta excepción, para rendir la materia será el mismo del que dispone un alumno regular, según las reglamentaciones vigentes.



IX.a - BIBLIOGRAFÍA BÁSICA

[1] Aho, A. y Ullman, J. : \"The Theory of Parsing, Translation and Compiling\", Vol. I y II, Prentice Hall.

[2] Aho, A. y Ullman, J. : \"Principles of Compiler Design\", Addison Wesley.

[3] Aho, Setti y Ullman : \"Compilers. Principles, Techniques and Tools\", Addison Wesley.



IX b - BIBLIOGRAFÍA COMPLEMENTARIA

[1] Gries, Davis : \"Compilers Construction\", John Wiley.

[2] Backhouse, R.C. : \"Syntax of Programming Language\", Prentice Hall.

[3] Davie, A. et al. : \"Recursive Descendent Compiling\", John Wiley.

[4] Barret y Coch : \"Compiler Construction: Theory and Practice\", Chicago SRA.

[5] Bauer et. al. : \"An Advanced Course on Compilers\", Springer Verlag.

[6] Waite y Goos : \"Compiler Construction\", Springer Verlag.

[7] Holub Allen : \"Compiler Design in C\", Prentice Hall

[8] Tremblay y Sorenson : “The Theory and Practice of Compiler Writing”, Mc Graw Hill, Computer Science Series.



COMPLEMENTO DE DIVULGACION


OBJETIVOS DEL CURSO

Desarrollar en el alumno la capacidad de diseñar e implementar un compilador para un subconjunto del Lenguaje de Programación C++.

 

 

PROGRAMA SINTETICO

Descripción de los módulos de un compilador. Análisis Lexicográfico.Tabla de Símbolos. Análisis Sintáctico. Recuperación de errores. Análisis Semántico.Traducción dirigida por la sintaxis. Chequeo de tipos. Generación de código.

 


IMPREVISTOS