Docente: José María Massa
Contenidos mínimos
Propiedades de los lenguajes de amplia difusión (C++, Java, Rust, Go, Python, R, Perl, Ruby, Haxe, PHP, Javascript, Dart, Hack, Kotlin, entre otros): Modelos de ejecución, Ligadura (Alcance, Tipo, Valor, Almacenamiento y Nombre), Variables, Funciones, Tipos, Objetos, Clases, Prototipos, Lambdas, Closures, Consistencia de Tipos, Seguridad, Gestión de Memoria y Paralelismo, Generación de código. Ingeniería de Compiladores.
Objetivos
Que el estudiante pueda identificar los principales aspectos sintácticos, semánticos y pragmáticos en un conjunto de lenguajes actuales de relevancia. Se pretente que el estudiante tenga la habilidad de identificar las principales construcciones de programación en varios lenguajes, reconociendo similitudes y diferencias. El objetivo final es que el estudiante pueda identificar el lenguaje más adecuado considerando las restricciones impuestas por el problema a tratar.
Descripción de actividades
Se presentarán los conceptos en clases teóricas, se realizarán actividades teórico prácticas para asociar los conceptos a ejercicios concretos en diferentes lenguajes y se realizarán actividades prácticas en las que el alumno resolverá problemas. Se utilizarán intérpretes y compiladores de los lenguajes C++, Java, Rust, Go, Python, R, Perl, Ruby, Haxe, Javascript y Kotlin, entre otros.
Metodología de la Enseñanza
Dependiendo del contenido, en algunos casos se empleará un enfoque de lo abstracto a lo concreto, como en el caso de la paralelización y en otros casos se empleará un enfoque deductivo donde a partir de la observación de los resultados de diferentes ejemplos en diferentes lenguajes se identificarán los conceptos abstractos subyacentes, como por ejemplo: closures, concurrencia, clases y seguridad en memoria, entre otros.
Programa
Unidad 1: Evolución de los Lenguajes de Programación. Evolución conceptual de los lenguajes de programación en relación a los modelos de ejecución, construcciones de abstracción de control y tipos de datos. Perspectivas de futuro: seguridad, características funcionales y reflexividad. Características esenciales de los lenguajes de amplia difusión: C, C++, Java, Delphi, C#, Swift, Go, Rust, Kotlin, R, Python, Julia, Ruby, Dart, PHP, Hack, Haxe, Javascript y otros.
Unidad 2: Modelos de ejecución. Lenguajes compilados. Lenguajes interpretados. Bytecode de las máquinas virtuales más difundidas (JVM, Python, .NET). Modelos híbridos (Clojure, Groovy, JRuby, Jython, Kotlin, Scala y otros). Modelos de ejecución de los principales lenguajes. Dependencia del lenguaje con la arquitectura y con el sistema operativo.
Unidad 3: Tipos de datos. Tipos de datos definidos por su valor y por sus operaciones. Lenguajes con tipos estáticos y dinámicos. Sistemas de tipos fuertes y débiles. Seguridad de tipos. Type checkers en Dart y Hack. Tipos definidos por el usuario y reflexividad de tipos. Tipos en los lenguajes C, C++, Java, Delphi, C#, Swift, Go, Rust, Kotlin, R, Python, Julia, Ruby, Dart, PHP, Hack, Haxe, Javascript y otros.
Unidad 4: Alcance. Alcance dinámico. Ventajas y Desventajas. Alcance Estático. Relación con Clases, Traits, Interfaces y Reflexividad. Alcance mixto, relación con lenguajes orientados a eventos y aspectos.
Unidad 5: Aspectos Funcionales. Closures y Expresiones Lambda. Soporte para Closures en C++, Go, C#, Rust, Java, Python, Perl, Kotlin y otros. Sintaxis, semántica y pragmática de closures en diferentes lenguajes. Relación con el paradigma de programación Funcional.
Unidad 6: Paralelización. Construcciones nativas de Paralelización en lenguajes de alto desempeño y en lenguajes de propósito general C++, Java, Go, Rust, Python y otros. Threads, Co-rutinas. Canales. Relación con la seguridad en Memoria.
Unidad 7: Traducción. Lenguajes orientados a la traducción. El lenguaje Haxe y traducción a lenguajes basados en ECMAScript.
Unidad 8: Eficiencia. Aspectos de optimizaciones del lenguaje y del compilador. Optimización de código en C++. Generación de código para diferentes conjuntos de instrucciones. Generación de código en Rust para plataformas de sistemas embebidos y WebAssembly.
Unidad 9: Ambito de Aplicación. Lenguajes para ciencia de datos (Julia, C++, R y Python). Soporte de tipos de datos. Acceso a bibliotecas. Interoperabilidad. Elección del lenguaje para desarrollo según el ámbito de aplicación.