5.13. CS113. Programación Orientada a Objetos II (Obligatorio)
- Semestre: 3er Sem. Créditos: 4
- Horas del curso: Teoría: 2 horas; Práctica: 2 horas; Laboratorio: 2 horas;
-
Prerrequisitos:
- CS112. Programación Orientada a Objetos I (2do Sem)
5.13.1. Justificación
Este es el tercer curso en la secuencia de cursos introductorios en ciencia de la computación. Este curso explora características avanzadas de C++17/C++20 centrándose en el desarrollo de sistemas de alto rendimiento. Los temas clave incluyen metaprogramación con plantillas, semántica de movimiento, reenvío perfecto, optimización RAII, patrones de herencia múltiple/virtual, concurrencia con std::thread y async/await, programación sin bloqueo, paradigmas modernos de C++ como CRTP y plantillas de expresión, e interfaz de C++ con otros lenguajes. El curso prepara a los estudiantes para motores de juego, computación de alto rendimiento y desarrollo embebido donde C++ es dominante.
5.13.2. Objetivos Generales
- 1.
- Dominar características avanzadas de C++17/C++20, incluyendo plantillas y metaprogramación.
- 2.
- Desarrollar habilidades en programación concurrente y de sistemas.
- 3.
- Comprender técnicas de optimización de rendimiento.
- 4.
- Prepararse para aplicaciones de computación de alto rendimiento.
- 5.
- Dominar la metaprogramación con plantillas y el cómputo en tiempo de compilación.
5.13.3. Contribución a los resultados (Outcomes)
-
AG-C09) Diseño y Desarrollo de Soluciones: Diseña, implementa y evalúa soluciones para problemas complejos de computación. (Usage)
-
AG-C12) Aplica la teoría de la ciencia de la computación y los fundamentos de desarrollo de software para producir soluciones basadas en computadora. (Assessment)
5.13.4. Contenido
5.13.4.1. Programación Orientada a Objetos II: Encapsulación, Subtipado y Reflexión (8 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Josuttis, 2019, Vandevoorde et al., 2017a]
Temas
- 1.
- Clases de colecciones, iteradores y otros componentes comunes de biblioteca.
- 2.
- Contenedores asociativos (std::set, std::map, variantes no ordenadas).
- 3.
- Adaptadores de contenedor (stack, queue, priority_queue).
- 4.
- Algoritmos avanzados de STL.
- 5.
- Funtores y predicados.
- 6.
- Categorías de iteradores y rasgos.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Usar clases de colecciones e iteradores efectivamente para resolver un problema [Usar]
- 2.
- Definir y usar iteradores y otras operaciones en agregados, incluyendo operaciones que toman funciones como argumentos, en múltiples lenguajes de programación, seleccionando los idiomas más naturales para cada lenguaje [Evaluar]
- 3.
- Comparar y contrastar los beneficios y costos/impacto de usar herencia (subclases) y composición (específicamente, cómo basar la composición en funciones de orden superior) [Usar]
- 4.
- Implementar asignadores personalizados para contenedores STL [Usar].
5.13.4.2. Sistemas de Tipos II: Polimorfismo y Tipado Complementario (12 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Vandevoorde et al., 2017a, Stroustrup, 2022]
Temas
- 1.
- Tipos genéricos (polimorfismo paramétrico):
- a)
- Definición y ventajas del polimorfismo: paramétrico, de subtipado (subtyping), de sobrecarga (overloading) y de coerción
- b)
- Comparación de tipos monomórficos y polimórficos
- c)
- Comparación con polimorfismo ad-hoc (sobrecarga) y polimorfismo de subtipos
- d)
- Parámetros genéricos y tipado
- e)
- Uso de bibliotecas genéricas como colecciones
- f )
- Comparación con polimorfismo ad hoc (sobrecarga) y polimorfismo de subtipos
- g)
- Polimorfismo prescriptivo vs descriptivo
- h)
- Modelos de implementación de tipos polimórficos
- i)
- Subtipado
- 2.
- SFINAE (Fallo de Sustitución No es un Error): fundamento histórico de la programación genérica restringida en C++, base de bibliotecas anteriores a C++20.
- 3.
- Concepts (C++20): sintaxis declarativa para restringir parámetros de plantilla, sucesor moderno de SFINAE con mejores diagnósticos de error.
- 4.
- if constexpr (C++17): ramificación en tiempo de compilación, reemplazo de gran parte del despacho por etiquetas (tag dispatch) antes resuelto con SFINAE.
- 5.
- Reenvío perfecto y referencias universales.
- 6.
- Plantillas variádicas.
- 7.
- Cómputo en tiempo de compilación con constexpr y consteval.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Definir y usar piezas de programa (como funciones, clases, métodos) que usen tipos genéricos, incluyendo para colecciones [Evaluar]
- 2.
- Discutir las diferencias entre genéricos, subtipado y sobrecarga [Evaluar]
- 3.
- Aplicar Concepts para restringir parámetros de plantilla y mejorar diagnósticos de error [Usar].
- 4.
- Distinguir cuándo usar Concepts, if constexpr o SFINAE heredado al mantener código C++ existente [Evaluar].
- 5.
- Implementar reenvío perfecto para paso eficiente de argumentos [Usar].
5.13.4.3. Gestión de Memoria (8 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Meyers, 2014, Stroustrup, 2013]
Temas
- 1.
- Asignación y acceso de bajo nivel a estructuras de datos de alto nivel como tipos de datos básicos, arreglos n-dimensionales, vectores, registros y objetos
- 2.
- Retorno de procedimiento como mecanismo de desasignación automática para elementos de datos locales en la pila
- 3.
- Gestión manual de memoria: asignar, desasignar y reutilizar memoria del montón
- 4.
- Gestión automática de memoria: recolección de basura (garbage collection) como técnica automatizada usando la noción de alcanzabilidad (reachability)
- 5.
- Lvalues y rvalues en C++11/14/17/20.
- 6.
- Constructores de movimiento y operadores de asignación de movimiento.
- 7.
- Referencias a valor-r y colapso de referencias.
- 8.
- Patrón RAII (Adquisición de Recursos es Inicialización).
- 9.
- Personalización de punteros inteligentes.
- 10.
- Detección y prevención de fugas de memoria.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Explicar por qué ocurren las fugas de memoria (memory leaks) y los problemas de punteros colgantes (dangling pointers), y qué puede hacer un programador para evitarlos/corregirlos [Usar]
- 2.
- Explicar cómo las implementaciones de lenguajes de programación típicamente organizan la memoria en secciones de datos globales, texto, montón y pila, y cómo características como recursión y gestión de memoria se mapean a este modelo de memoria [Evaluar]
- 3.
- Explicar cómo se ejecuta una construcción central del lenguaje, como abstracciones de datos y abstracciones de control [Evaluar]
- 4.
- Implementar semántica de movimiento para optimización de recursos [Usar].
- 5.
- Diseñar clases RAII para gestión de recursos segura ante excepciones [Usar].
5.13.4.4. Computación Paralela y Distribuida (12 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Williams, 2019, Stroustrup, 2013]
Temas
- 1.
- Seguridad (safety) y vivacidad (liveness):
- a)
- Condiciones de carrera (race conditions)
- b)
- Dependencias/precondiciones
- c)
- Modelos de fallos (fault models)
- d)
- Terminación
- 2.
- Modelos de programación:
- a)
- Modelo de actores (actor models)
- b)
- Modelos procedurales y reactivos
- c)
- Modelos de programación síncrona/asíncrona
- d)
- Paralelismo de datos (data parallelism)
- 3.
- Comunicación y coordinación:
- a)
- Mutexes
- b)
- Paso de mensajes (message-passing)
-
c)
- Memoria compartida (shared memory)
- d)
- Cobegin-coend
- e)
- Monitores
- f )
- Canales (channels)
- g)
- Hilos (threads)
- h)
- Guardas (guards)
- 4.
- std::thread y gestión de hilos.
- 5.
- std::jthread (C++20): unión automática (RAII) y cancelación cooperativa vía stop_token.
- 6.
- Mutexes, candados y variables de condición.
- 7.
- Mecanismos de sincronización de C++20: std::latch, std::barrier, std::counting_semaphore.
- 8.
- Operaciones atómicas y programación sin bloqueo.
- 9.
- std::async y futures.
- 10.
- std::execution y el modelo de senders-receivers (C++26, experimental): panorama hacia dónde evoluciona la concurrencia estándar en C++, presentado a nivel conceptual, sin evaluación en laboratorio dada su disponibilidad limitada (parcial en GCC).
- 11.
- Patrones de diseño seguros para hilos.
- 12.
- Carreras de datos y prevención de interbloqueos.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Implementar programas concurrentes correctos usando múltiples modelos de programación, como memoria compartida, actores, futuros, construcciones de sincronización y primitivas de paralelismo de datos [Usar]
- 2.
- Usar construcciones de sincronización como métodos monitorizados/sincronizados en un programa simple [Usar]
- 3.
- Usar un modelo de paso de mensajes para analizar un protocolo de comunicación [Evaluar]
- 4.
- Implementar estructuras de datos sin bloqueo usando operaciones atómicas [Usar].
- 5.
- Diferenciar std::thread de std::jthread y justificar cuándo usar cada uno [Usar].
- 6.
- Analizar la seguridad en hilos de algoritmos concurrentes [Evaluar].
5.13.4.5. Construcciones de Programación Avanzadas (8 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Vandevoorde et al., 2017b]
Temas
- 1.
- Abstracciones orientadas a objetos: herencia múltiple, mixins, rasgos (traits), multimétodos
(multimethods)
- 2.
- Metaprogramación: macros, programación generativa, desarrollo basado en modelos (model-based development)
- 3.
- Herencia múltiple y herencia virtual.
- 4.
- Patrón CRTP (Patrón de Plantilla Curiosamente Recursivo).
- 5.
- deducing this (C++23): simplifica CRTP al eliminar la necesidad de static_cast<Derived&>(*this) para polimorfismo estático.
- 6.
- Plantillas de expresión.
- 7.
- Rasgos de tipos e introspección en tiempo de compilación.
- 8.
- Diseño basado en políticas.
- 9.
- Diseño de interfaz para bibliotecas.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Usar varias construcciones e idiomas de programación avanzados correctamente [Usar]
- 2.
- Discutir cómo varias construcciones de programación avanzadas tienen como objetivo mejorar la estructura del programa, la calidad del software y la productividad del programador [Evaluar]
- 3.
- Discutir cómo varias construcciones de programación avanzadas interactúan con la definición e implementación de otras características del lenguaje [Evaluar]
- 4.
- Implementar CRTP para polimorfismo estático [Usar].
- 5.
- Diseñar interfaces de biblioteca extensibles usando diseño basado en políticas [Usar].
5.13.4.6. Modelo de Ejecución y Memoria de Sistemas (8 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Williams, 2019]
Temas
- 1.
- Representación en tiempo de ejecución de abstracciones de datos como variables, arreglos, vectores, registros, elementos de datos basados en punteros como listas enlazadas y árboles, y objetos
- 2.
- Estructuras de datos para traducción, ejecución, traducción y movilidad de código como pila, montón (heap), alias (compartición usando punteros), secuencia indexada y cadena
- 3.
- Implementación del despacho dinámico introducido en POO I: tabla de funciones virtuales (vtable), puntero vtable (vptr), y su costo en memoria y rendimiento frente al despacho estático.
- 4.
- Interfaz de C++ con otros lenguajes (FFI).
- 5.
- Llamadas al sistema e interacción con el SO.
- 6.
- E/S mapeada en memoria.
- 7.
- Perfilado de rendimiento y evaluación comparativa.
- 8.
- Técnicas de optimización para HPC.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Explicar cómo se ejecuta una construcción central del lenguaje, como abstracciones de datos y abstracciones de control [Usar]
- 2.
- Explicar cómo las implementaciones de lenguajes de programación típicamente organizan la memoria en secciones de datos globales, texto, montón y pila, y cómo características como recursión y gestión de memoria se mapean a este modelo de memoria [Evaluar]
- 3.
- Explicar por qué ocurren las fugas de memoria (memory leaks) y los problemas de punteros colgantes (dangling pointers), y qué puede hacer un programador para evitarlos/corregirlos [Usar]
- 4.
- Perfilar y optimizar programas C++ para rendimiento [Usar].
- 5.
- Explicar cómo el compilador implementa el polimorfismo en tiempo de ejecución mediante vtables [Evaluar].
- 6.
- Interfazar código C++ con bibliotecas C [Usar].
5.13.4.7. Construcciones de Programación Avanzadas (6 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Gamma et al., 1994a, Stroustrup, 2013]
Temas
- 1.
- Abstracciones orientadas a objetos: herencia múltiple, mixins, rasgos (traits), multimétodos (multimethods)
- 2.
- Patrones creacionales, estructurales y de comportamiento.
- 3.
- Patrones singleton seguros para hilos.
- 4.
- Modismos de diseño modernos en C++.
- 5.
- Inyección de dependencias e inversión de control.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Usar varias construcciones e idiomas de programación avanzados correctamente [Usar]
- 2.
- Discutir cómo varias construcciones de programación avanzadas tienen como objetivo mejorar la estructura del programa, la calidad del software y la productividad del programador [Evaluar]
- 3.
- Discutir cómo varias construcciones de programación avanzadas interactúan con la definición e implementación de otras características del lenguaje [Familiarizarse]
- 4.
- Implementar patrones de diseño seguros para hilos [Usar].
- 5.
- Evaluar compensaciones arquitectónicas en sistemas C++ [Evaluar].
5.13.4.8. Construcciones de Programación Avanzadas (6 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Meyers, 2014, Stroustrup, 2013]
Temas
- 1.
- Abstracciones de control: manejo de excepciones, continuaciones (continuations), mónadas (monads).
- 2.
- Optimizaciones del compilador y banderas.
- 3.
- Metodologías de evaluación comparativa.
- 4.
- Estructuras de datos amigables con la caché.
- 5.
- Predicción de bifurcación y alineación.
- 6.
- Reducción del tiempo de compilación.
- 7.
- Integración continua para pruebas de rendimiento.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Usar varias construcciones e idiomas de programación avanzados correctamente [Usar]
- 2.
- Discutir cómo varias construcciones de programación avanzadas tienen como objetivo mejorar la estructura del programa, la calidad del software y la productividad del programador [Evaluar]
- 3.
- Discutir cómo varias construcciones de programación avanzadas interactúan con la definición e implementación de otras características del lenguaje [Familiarizarse]
- 4.
- Aplicar técnicas de optimización para mejorar el rendimiento del programa [Usar].
- 5.
- Interpretar resultados de evaluación comparativa para guiar decisiones de optimización [Usar].
5.13.4.9. Control de Versiones y CI/CD (4 horas) [Habilidades AG-C09,AG-C12]
Referencias Bibliográficas: [Stroustrup, 2013, Stroustrup, 2022]
Temas
- 1.
- Automatización de procesos de software:
- a)
- Sistemas de construcción (build systems): el valor de builds rápidos, herméticos y reproducibles, comparar/contrastar enfoques para construir un proyecto.
- b)
- Integración Continua (CI): el uso de automatización y pruebas automatizadas para hacer una validación preliminar de que la revisión actual del tronco se construye y pasa las pruebas (básicas).
- c)
- Despliegue Continuo (CD): el uso de automatización para liberar de forma automática cada cambio que supera las pruebas hacia el entorno de producción, garantizando entregas frecuentes y confiables.
- d)
- Gestión de dependencias: actualización de dependencias externas/aguas arriba, gestión de paquetes, SemVer.
- 2.
- Sistemas de construcción para C++: CMake, el estándar de facto de la industria.
- 3.
- Alternativas modernas: xmake, Meson y Bazel – comparación de enfoques declarativos frente a basados en Lua/Python.
- 4.
- Organización de proyectos multi-archivo: unidades de traducción, cabeceras, bibliotecas estáticas y dinámicas.
- 5.
- Gestión de dependencias en C++ (vcpkg, Conan).
Aprendizaje esperado (Learning Outcomes)
- 1.
- Comprender el uso de sistemas de CI/CD como una fuente de verdad para el estado del código compartido del equipo (éxito en la construcción y pruebas) [Familiarizarse]
- 2.
- Configurar un proyecto C++ multi-archivo usando un sistema de construcción declarativo [Usar].
- 3.
- Comparar CMake con al menos una alternativa moderna (xmake, Meson o Bazel) en velocidad de compilación y reproducibilidad [Evaluar].
5.13.5. Referencias Bibliográficas