**II** This course focuses on the theoretical foundations of programming languages, as well as on practical aspects of their design and implementation, covering a wide range of advanced topics. Specifically, it examines: \* **Semantics of Programming Languages**: The formal mathematical description of how programming languages behave. \* **Type Systems**: The role of types in language design, with emphasis on advanced type systems. \* **Program Correctness**: Formal program specifications and proof techniques for verifying program correctness. \* **Program Transformations**: Techniques for code optimization and restructuring, while preserving its semantics. \* **Program Analysis**: Static and dynamic methods for understanding program behavior and ensuring its reliability. \* **Language Safety**: Language abstractions that ensure memory safety and prevent common errors. The course includes both a theoretical component, delving into these concepts and their mathematical underpinnings, and a practical component, which emphasizes applying these ideas in modern technologies and programming languages (e.g., Haskell, Rust, WebAssembly) to develop secure and reliable software systems.