Lenguajes de Programación I (CI-3641)

En curso Abril-Julio 2017

Bibliografía

El curso estará basado sobre el libro

   Scott, Michael
   Programming Language Pragmatics
   Morgan Kaufmann
   ISBN 0-12-633951-1

Pueden usar la Tercera (tapa blanca, como el que muestro el primer día de clase), la Edición (tapa negra) o primera edición por igual. En los cronogramas y material de apoyo hago referencia a la tercera edición de ese libro como [Scott].

La lectura de este libro es imprescindible para aprovechar el curso y tener buenos resultados. Esta es, probablemente, la materia que requiere más lectura de todas las de la carrera y el volumen de material es importante, por lo que una «lectura ligera» no será suficiente ni siquiera para aprobar con lo justo. Les recomiendo leer anticipadamente el material que se cubrirá en las clases siguientes, y después de clase releer el material y verificar los ejemplos prácticos que yo haya hecho en clases (estudiar y correr los programas, posiblemente completando lo que haga falta en los lenguajes particulares).

En caso de no haber sido claro en mi descripción: si Ud. no lee constante y consistentemente el libro y completa los ejercicios, no va a poder aprobar la materia..

A lo largo de las clases se presentarán ejemplos en varios lenguajes de programación. El código fuente de los ejemplos siempre está disponible en la página correspondiente a la instancia particular del curso.

Evaluación

La evaluación consiste en tres (3) exámenes escritos presenciales. Consulte la página correspondiente al trimestre en curso para saber las fechas en que serán presentados, la proporción de cada examen sobre la calificación definitiva y las calificaciones parciales o definitivas. Generalmente:

  • Primer Examen (Semana 03) — 25%
  • Segundo Examen (Semana 08) — 35%
  • Tercer Examen (Semana 12) — 40%

El contenido de los exámenes puede incluir cualquier aspecto de los contenidos en el libro en los capítulos indicados para estudio, independientemente de que los haya discutido en clase o cuan profundo los haya desarrollado.

Los exámenes deberán ser tomados en las fechas indicadas en el cronograma de clases. Para ser excusado de un examen es indispensable obtener todas las autorizaciones y documentación por escrito que exige el Departamento, y en ese caso el estudiante presentará un examen diferente pero equivalente al efectuado en la fecha original.

Copiar durante el examen desde el libro, notas de clase, otro compañero o cualquier otra fuente de información será sancionado con el aplazamiento de la materia con uno (1) y una amonestación en la Coordinación de la carrera que puede llevar a la expulsión de la Universidad.

Durante cualquier examen estará terminantemente prohibido tener en su escritorio otra cosa que no sea el papel del examen, las hojas para escribir sus respuestas y los implementos para escribir. Cualquier otra pertenencia personal deberá estar guardada en su morral, bolso, maletín o debajo de su pupitre; esto incluye calculadoras, computadores portátiles, computadores de mano, reproductores de música y teléfonos celulares.

En los exámenes siempre habrá preguntas de programación, típicamente en Java, C, Haskell y Prolog, sin excluir otros e incluyendo «pseudo-lenguajes» convenientes para cada tópico. Además de las restricciones específicas de cada pregunta, sujeta a los conceptos particulares que se están evaluando, la calificación de las mismas tomará en cuenta el uso correcto del lenguaje particular (sintaxis y formas frecuentes), así como la eficiencia en tiempo y posiblemente en espacio de su solución. No basta que su solución «funcione», sino que debe funcionar eficientemente desde el punto de vista algorítmico.

Cronograma y Notas de Clase

Las láminas y programas de ejemplo que utilizo en clase para presentar el material estarán disponibles aquí, el mismo día o el día siguiente de la presentación del contenido. Las láminas cambian muy poco entre trimestre y trimestre, al igual que los ejemplos. Así, aquí encontrarán solamente la última versión disponible de láminas para imprimir y programas de ejemplo. Las láminas que uso en clase no están disponibles.

Las notas se entregan «como están» sin ninguna garantía adicional, ni compromiso de ayuda extra (salvo para los estudiantes). Si Ud. es visitante de este sitio y desea utilizar las láminas o los ejemplos para sus propias presentaciones, siéntase en la libertad de hacerlo, siempre y cuando tenga la cortesía de citar apropiadamente el origen y el autor.

Las notas de clase y los ejemplos suelen incluir enlaces explícitos o referencias implícitas a sitios con más detalles sobre el contenido discutido en clase. Se espera de los estudiantes leerlos para afirmar sus conocimientos.

El cronograma habitual es:

Semana 1

  • Introducción[Scott] 1.1 a 1.6

    • Administratrivia.
    • Relevancia de la materia.
  • Nombres y Asociación[Scott] 3.1 y 3.2

    • Definiciones.
    • Disposición y manejo de memoria.
    • Espacio estático, pila y dinámico.

Semana 2

  • Nombres y Alcance[Scott] 3.3 y 3.4

    • Alcance Estático y Dinámico.
    • Gestión del Alcance.
  • Sobrenombres[Scott] 3.5 y 3.6

    • Clausuras.
    • Aliases.
    • Sobrecarga.

Semana 3

  • Primer Examen (Clases 1 a 4)

  • Flujo de Control[Scott] 6.1

    • Formas de Flujo de Control.
    • Expresiones.

Semana 4

Semana 5

Semana 6

  • Tipos de Datos[Scott] 7.3 a 7.5

    • Registros.
    • Arreglos.
    • Cadenas.
  • Tipos de Datos[Scott] 7.6 y 7.7

    • Conjuntos.
    • Tipos Recursivos.
    • Apuntadores.
    • Recolección de Basura.

Semana 7

  • Tipos de Datos[Scott] 7.8 a 7.10

    • Listas.
    • Entrada y Salida.
    • Asignación y Comparación.
  • Segundo Examen (Clases 5 a 12).

Semana 8

  • Subrutinas[Scott] 8.1 a 8.3

    • Secuencia de Llamada.
    • Pasaje de parámetros.
    • Retorno de resultados.
  • Otras abstracciones de Control[Scott] 8.4 a 8.6

    • Subrutinas Genéricas.
    • Excepciones.
    • Co-rutinas.

Semana 9

Semana 10

Los ejemplos de código que presento en clase también están disponibles y le sugiero que los haga funcionar por su cuenta, y luego proceda a explorarlos y resolver problemas similares en el mismo lenguaje de programación.

  • Introducción Algoritmo de Euclides para calcular el Máximo Común Divisor, escrito en varios lenguajes de programación.

  • Ubicación en Memoria El mismo programa presentado en clase. Investigue las opciones adecuadas para el compilador, de manera que se genere código ensamblable, y examínelo para observar la disposición en memoria de cada elemento.

  • Exploración de Alcance Algunos programas en Perl con los cuales se puede probar la diferencia entre alcance estático y dinámico.

  • Aliasing, clausuras y sobrecarga

    • Programas en C y Perl para mostrar aliasing.
    • Programa en Perl para demostrar clausuras modernas.
    • Programa en Perl para mostrar la combinación de clausuras y aliasing, para generar caching automático.
  • Iteradores y Recursión

    • Programas en C y Haskell para exhibir el uso de recursión y recursión de cola, en presencia de compiladores optimizadores.
    • Demostración de iterador «casi verdadero» en Ruby.
    • Simulación de estructuras infinitas en Perl usando clausuras.
  • Unicode Programas en Haskell, Ruby y Perl para mostrar el soporte correcto para Unicode en lenguajes modernos.

  • Alineación de Estructuras Programas en C para estudiar cómo se alinean struct, union y su combinación.

  • Pasaje de Parámetros Programas en C, Perl y Racket para demostrar diferentes maneras de pasar un número variable de argumentos a una subrutina.

  • Abstracciones de Control

    • Programa en C para exhibir setjmp y longjmp.
    • Programas en Racket para demostrar como construir excepciones y co-rutinas usando continuaciones.
  • Monkey Patching Programa en Perl para parchar un método de un objeto, eliminarle el parche, para luego parchar toda la clase.

  • Orientación a Objeto No-Jerárquica

    • Programa en Ruby para exhibir despacho dinámico.
    • Programa en Ruby para exhibir mixins.
    • Programa en Perl para exhibir despacho múltiple.
  • Programación Funcional Programas de ejemplo en Racket.

  • Programación Lógica Programas de ejemplo en Prolog.

Ediciones Anteriores