cod. 1009203

Academic year 2023/24
2° year of course - Second semester
Academic discipline
Sistemi di elaborazione delle informazioni (ING-INF/05)
A scelta dello studente
Type of training activity
Student's choice
48 hours
of face-to-face activities
6 credits
hub: PARMA
course unit

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


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


- M. Gabbrielli, S. Martini (2011). Linguaggi di programmazione - Principi e paradigmi. 9788838665738.
- M. Lipovaca (2012). Learn You a Haskell for Great Good. 9781593272838.
- S. Klabnik, C.Nichols (2023) The Rust Programming Language. 9781718503106.
- 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.