Learning objectives
The aim of the course is to provide students with the capacity of understanding the principles of programming languages and the modern programming techniques, according to different paradigms:
- Functional programming
- Object-oriented programming
- Generic programming
- Metaprogramming
The capacity of applying the listed knowledge is related to multi-paradigm development, fit for the context of of distributed, heterogeneous and parallel systems:
- Recognize and use features shared by multiple languages
- Use static analysis to obtain robust and efficient code
- Use polymorphism and metaprogramming to raise the level of abstraction
- Use functional programming to for result consistency and parallel computing
Prerequisites
No propedeutic knowledge is formally required. However, the student is supposed to have good understanding of structured and object-oriented programming.
Course unit content
1. Introduction to the course
2. Introduction to formal languages
3. Functional programming
4. Object-oriented programming
Full programme
1. Introduction to the course (4 hours of lessons)
1.1 Programming paradigms and languages
1.2. Concepts and classification of languages
1.3. Development of the main languages and their relations
2. Introduction to formal languages (8 hours of lessons and 4 of exercises)
2.1. Chomsky Classification
2.2. Regular expressions
2.3. Context-free grammars
2.4. Syntactic analysis and parser generators
2.5.Syntactic trees and code generation
3. Functional programming (12 hours of lessons and 6 of exercises)
3.1. Presentation of the Haskell language
3.2. Haskell type-classes
3.3. Recursive functions and tail-recursion
3.4. Higher order function, currying
3.5. Mapping, filtering, folding
3.6. Polymorphism at compile time and run time
3.7. Haskell I/O actions
3.8. Functional features of Python and other languages
4. Object-oriented programming (12 hours of lessons and 6 of exercises)
4.1. Encapsulation, composition, inheritance, polymorphism
4.2. Techniques for compiling and running C++ programs
4.3. Presentation of Rust language
4.4. Memory management with ownership
4.5. Generic programming
4.6. Dynamic and scripting languages
4.7. Python Metaprogramming
4.8. Comparison among various languages: C++, Java, Python, Go, Rust
Bibliography
- M. Gabbrielli, S. Martini (2011). Linguaggi di programmazione - Principi e paradigmi. 9788838665738.
- M. Lipovaca (2012). Learn You a Haskell for Great Good. 9781593272838. http://learnyouahaskell.com/
- S. Klabnik, C.Nichols (2023) The Rust Programming Language. 9781718503106. https://doc.rust-lang.org/book/
- S. B. Lippman, J. Lajole, B. E. Moo (2013). C++ Primer. 9780321714111
Teaching methods
Lessons in classroom, with slides provided to students beforehand. Possible adoption of Flipped Classroom and seminars about some topics. Programming exercises in classroom or in lab.
Assessment methods and criteria
The examination consists of a programming test and a theory test, which can be passed also gradually during the exercise hours, and the presentation of a final project, which applies multi-paradigm development to a real use case.
Other information
Alternative and auxiliary texts:
- J. E. Hopcroft (2009). Automi, linguaggi e calcolabilità. 9788871925523.
- A. V. Aho, M. S. Lam, R. Sethi, J. D. Ullman (2009). Compilatori - Principi, tecniche e strumenti. 9788871925592.
- B. Stroustrup (2015). C++ - Linguaggio, libreria standard, principi di programmazione. 9788865184486.
2030 agenda goals for sustainable development
- - -