PONTIFICIA UNIVERSIDAD CATÓLICA MADRE Y MAESTRA FACULTAD DE CIENCIAS DE LA INGENIERIA DEPARTAMENTO DE INGENIERÍA EN SISTEMAS Y COMPUTACIÓN PROGRAMA DE ASIGNATURA Asignatura: Código: Programación III Régimen: ISC-314 Año/Período: 3er Año/ 2do Período Horas de Clases Área a la que pertenece: Programación DISTRIBUCION DE HORAS DE CLASES Teóricas Prácticas Total General Horas % Materia Horas % Materia Horas % Materia 42 60% 28 40% 70 100% T P C 3 2 4 I-DESCRIPCIÓN GENERAL 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. Se estudian las diferentes fases de un compilador y sus correspondientes técnicas de implementación. II-OBJETIVOS Objetivos Generales: Objetivos Específicos: Que los estudiantes conozcan el diseño de compiladores así como las técnicas y procesos que intervienen en el proceso de compilación. Que los estudiantes sean capaces de: • Adquirir los conocimientos necesarios para la optimización de código. • Comprender la gestión interna de la memoria. • Comprender las estrategias avanzadas utilizadas por compiladores e intérpretes. • Profundizar en las técnicas de optimización de código intermedio. • Aprovechar mejor las capacidades de los compiladores y ampliar el conocimiento del funcionamiento de los compiladores. • Desarrollar analizadores léxicos, sintácticos y semánticos. III-INTERRELACIÓN CON OTRAS ASIGNATURAS Prerrequisitos: ISC-307 ISC-347 Asignaturas que se aconseja debe haber cursado: IV-PROFESORADO Profesor responsable: Claustro de profesores: V-METODOLOGÍA El curso será impartido a través de cátedras, desarrollo de prácticas y exposiciones que indicará el profesor. El proceso de aprendizaje será controlado a través de las prácticas, tareas y exámenes desarrollados durante el curso. Se aplica como metodología de Aprendizaje basado en Problemas. La distribución porcentual de los puntos asociados a las evaluaciones debe estar distribuido en: 70%(Eval. Parciales) + 30%(Eval. Final). Las evaluaciones que cubran el 50% de los puntos de la asignatura deben realizarse previo a las fechas de retiro parcial y total. Los exámenes parciales tendrán una duración de 3-2 horas, deben ser confeccionados abordando contenidos teóricos y/o prácticos. Las tareas serán orientadas con 15 días de anticipación a la fecha de entrega programada y su evaluación estará dividida en dos partes: la entrega formal del trabajo y la exposición oral en el curso de las soluciones encontradas, valorando su eficiencia y claridad. La evaluación final (30%) deberá ser evaluada a través del desarrollo de un mini-compilador de un lenguaje específico, que le permita aplicar los conocimientos adquiridos. El trabajo debe ser individual o como máximo grupos de 2 estudiantes; debe incluir la entrega de un documento (en el formato definido para la carrera) que describa el trabajo realizado y los ficheros de código fuente; la exposición de los trabajos debe realizarse a puertas abiertas con estudiantes y profesores del departamento como invitados. VI-PERFIL DEL EGRESADO Esta asignatura aporta al egresado los conocimientos teóricos y prácticos para desarrollar software de base como: traductores, cargadores, herramientas, utilerías, generadores de código, etc. Competencias logradas: - Capacidad de análisis y síntesis. - Capacidad de organización y planificación del trabajo. - Capacidad de aplicar los conocimientos en la práctica. - Capacidad para trabajar en equipo. - Habilidad para trabajar de forma autónoma. - Escribir programas más óptimos y legibles. - Programación más abstracta. - Depuración más rápida de programas. VII-CONTENIDO DE LA TEORÍA Tema 1. Introducción a la programación de sistemas. 1. Conceptos y Definiciones. 2. Herramientas desarrolladas con la teoría de programación de sistemas. 3. Lenguajes. a. Lenguajes naturales. b. Lenguajes artificiales. c. Proceso de la comunicación. 4. Traductor y su estructura. a. Ensambladores. b. Compiladores. c. Interpretes. 5. Generadores de código para compiladores (compilador de compilador). Tema 2. Introducción al diseño de los lenguajes de programación. 1. Visión del problema. 2. Consideraciones Preliminares. 3. Objetivos y filosofías del diseño de los lenguajes de programación. 4. Diseño detallado. 5. Caso de estudio. Tema 3. Análisis Léxico. 1. Introducción a los Autómatas finitos y expresiones regulares. 2. Analizador de léxico. 3. Manejo de localidades temporales de memoria (buffers). 4. Creación de tablas de símbolos. 5. Manejo de errores léxicos. 6. Generadores de código léxico: Lex y Flex. Tema 4. Análisis sintáctico. 1. Introducción a las Gramáticas libres de contexto y árboles de derivación. 2. Diagramas de sintaxis. 3. Precedencia de operadores. 4. Analizador sintáctico. a. Analizador descendente (LL). b. Analizador ascendente(LR, LALR). 5. Administración de tablas de símbolos. 6. Manejo de errores sintácticos y su recuperación. 7. Generadores de código para analizadores sintácticos: Yacc, Bison. Tema 5. Análisis semántico. 1. Analizador semántico 2. Verificación de tipos en expresiones. 3. Conversión de tipos. 4. Acciones agregadas en un analizador sintáctico descendente (top-down). 5. Pila semántica en un analizador sintáctico ascendente (bottom-up). 6. Administración de la tabla de símbolos. 7. Manejo de errores semánticos. Tema 6. Generación de código intermedio. 1. Lenguajes intermedios. 2. Notaciones. a. Infija. b. Postfija. c. Prefija. 3. Representación de código intermedio. a. Notación Polaca. b. Código P. c. Triplos. d. Cuádruplos. 4. Esquemas de generación. a. Expresiones. b. Declaración de variables, constantes c. Estatuto de asignación. d. Estatuto condicional. e. Estatuto de ciclos f. Arreglos. g. Funciones. Tema 7. Optimización. 1. Tipos de optimización. a. Locales. b. Bucles. c. Globales. d. De mirilla. 2. Costos. a. Costo de ejecución. b. Criterios para mejorar el código. c. Herramientas para el análisis del flujo de datos. Tema 8. Generación de código objeto. 1. Lenguaje máquina. a. Características. b. Direccionamiento. 2. Lenguaje ensamblador. a. Características. b. Almacenamiento. 3. Registros. a. Distribución. b. Asignación. 4. Administración de memoria. VIII-GUIA DE LAS PRÁCTICAS Las clases de laboratorio tienen como objetivo central la adquisición de habilidades prácticas. Es importante tener en cuenta los objetivos y distribución de contenidos de la teoría, para planificar los laboratorios. Guía para los laboratorios: Tema 1. Introducción a la programación de sistemas. - Analizar diferentes generadores de código que sirvan para desarrollar compiladores. Tema 2. Introducción al diseño de los lenguajes de programación. - Discutir en grupo las condiciones que determinan la funcionalidad del lenguaje tales como: Microestructuras, estructura de las expresiones, estructuras de datos, estructuras de control, estructuras de compilador, estructuras para entradas y salidas. - Analizar un lenguaje computacional como caso estudio para analizar las características que lo define, basándose en los aspectos del diseño de un lenguaje de programación. Tema 3. Análisis Léxico. - Construir un Analizador de Léxico, considerando el reconocimiento de tokens, la administración de un espacio temporal de memoria (buffers), la construcción de la tabla de símbolos, así como el manejo de errores. - Utilizar un generador de código para esta etapa del proceso como puede ser Lex o Flex, etc. Tema 4. Análisis sintáctico. - Construir diagramas de sintaxis a partir de gramáticas. - Agregar dentro de la gramática del lenguaje la precedencia de operadores. - Construir un analizador sintáctico bajo la metodología TOP-DOWN y BOTTOMUP. - Aplicar técnicas para la detección y recuperación de errores en la etapa de sintaxis. - Integrar la etapa del léxico dentro del desarrollo del compilador. - Utilizar un generador de código para esta etapa del proceso como puede ser Yacc o Bison, entre otros. Tema 5. Análisis semántico. - Aplicar reglas para la conversión de tipos (casting) en expresiones. - Agregar acciones semánticas a la estructura de la gramática, tanto en metodología TOP-DOWN como BOTTOM-UP. - Manejar la tabla de símbolos a fin de administrar el almacenamiento de información con su tipo. - Detectar los errores semánticos y la recuperación de los mismos. Tema 6. Generación de código intermedio. - Realizar ejercicios con los diferentes tipos de notaciones para la conversión de expresiones: Infija, prefija y posfija. - Realizar ejercicios de técnicas básicas para la representación de un código intermedio: Código P, Triplos y Cuádruplos. - Desarrollar las acciones que representen la estructura de un lenguaje de programación de alto nivel en un código intermedio. Tema 7. Optimización. - Aplicar las técnicas para la optimización de código sobre el código intermedio generado, evaluando los criterios de tiempo de ejecución o extensión de código generado. - Buscar nuevas técnicas para la optimización de código, sobre todo para aquellos lenguajes que requieren de una máquina virtual para su ejecución sobre multiplataformas. Tema 8. Generación de código objeto. - Tratar las características de un lenguaje ensamblador. - Llevar a cabo dinámicas grupales para recordar las características principales del lenguaje ensamblador, a fin de llevar un código intermedio, independiente de la máquina a un código reconocido por el hardware. - Conocer las técnicas de administración de memoria para el almacenamiento de un programa en momento de ejecución. IX-EVALUACIÓN Normas de evaluación: Guía de Evaluaciones: La calificación final de cada estudiante será calculada sumando las calificaciones obtenidas en las prácticas, tareas, evaluaciones diarias, parciales y examen final. Los aspectos a evaluar en cada caso estarán regidos por: 1. La eficiencia de la solución presentada. 2. El cumplimiento del procedimiento establecido. 3. La entrega en el marco de tiempo fijado. 4. La presentación, claridad y organización a la entrega. 1ra Tarea (10ptos) Desarrollar una investigación sobre los traductores que se utilizan con mayor frecuencia en nuestro tiempo. Proponer y diseñar un lenguaje prototipo. 2da Tarea (15ptos) Desarrollar un analizador de léxico, aplicado a un lenguaje prototipo o comercial, utilizando un generador de código para esta etapa del proceso como puede ser Lex o Flex. 3ra Tarea (15ptos) Desarrollar un analizador de sintáctico, aplicado a un lenguaje prototipo o comercial, utilizando un generador de código para esta etapa del proceso como puede ser Yacc o Bison, entre otros. Examen 1 (15ptos) Examen que evalúe: - Agregar acciones semánticas a la estructura de la gramática, tanto en metodología TOP-DOWN como BOTTOM-UP. - Manejar la tabla de símbolos a fin de administrar el almacenamiento de información con su tipo. - Detectar los errores semánticos y la recuperación de los mismos. Examen 2 (15ptos) Examen que permita evaluar el conocimiento de las características del lenguaje ensamblador; y las técnicas de administración de memoria para el almacenamiento de un programa en momento de ejecución. Proyecto Final (30ptos) Desarrollar un mini-compilador para un lenguaje prototipo, que le permita aplicar los conocimientos adquiridos. X-BIBLIOGRAFÍA Bibliografía Básica: • Kenneth C. Louden. Construcción de compiladores Principios y práctica. Thomson. • Compiladores: principios, técnicas y herramientas / Alfred V. Aho ... [et. al]. (Mexico, D. F.: Pearson Educacion , 2008.) • Compiladores e intérpretes: teoría y práctica / Manuel Alfonseca Moreno ... [et al.]. (Madrid: Pearson Education, 2006.) Bibliografía Complementaria: • Aho, Sethi, Ullman. Compiladores Principios, técnicas y herramientas. Addison Wesley. • Karen A. Lemone. Fundamentos de compiladores Cómo traducir al lenguaje de computadora. Compañía Editorial Continental. • Jesús Salas Parrilla. Sistemas Operativos y Compiladores. McGraw Hill. • Beck. Software de Sistemas, Introducción a la programación de Sistemas. Addison-Wesley Iberoamericana. • Teufel, Schmidt, Teufel. Compiladores Conceptos Fundamentales. Addison-Wesley Iberoamericana. • Kenneth C. Louden. Lenguajes de programación Principios y práctica. Thomson. • Guillermo Levine Gutiérrez. Computación y programación moderna Perspectiva integral de la informática. Pearson Educación. • Ronald Mak. Writing compilers and interpreters. Wiley Computer Publishing. • Fischer, LeBlanc. Crafting a compiler with C. Cummings Publishing Company, Inc. • Thomas Pittman, James Peters. The art of compiler design Theory and practice. Prentice Hall. • Peter Abel. Lenguaje ensamblador y programación para PC IBM y compatibles. Pearson Educación. • Temblay & Sorenson. Compilers Writing. Mc Graw Hill. • John R. Levine, Tony Mason, Doug Brown. Lex y Yacc. O'Reilly & Associates. Biblioteca Internet [005.453 C737pE] [005.453 C737i] Última actualización en fecha 12/01/2014 Biblioteca Internet