Mathematical foundations of computer science:
The course provides the formal tools and the notions that are fundamental to study the problems that are or are not solvable by means of computers. The course begins with the presentation of the theory of automata and formal languages: this is the foundation of the description and implementation of programming languages. This is followed by the illustration of the concepts and the nature of the problems that admit effective solution, that is, of those problem that can be solved by computers.
Principles and paradigms of programming languages:
The interaction with computers takes place in several ways: when the sought behavior is simple or already encoded, simple and intuitive mechanisms can be used. For a more sophisticate communication the use of highly expressive formalisms is mandatory. Programming languages offer a wide range of notations for the specification of the behaviors that are required from a computer. The study of programming languages is important and fascinating. First, because the study of the fundamental principles (values, bindings, control, abstraction, encapsulation, objects, modules, nondeterminism, types, ...) and their realization in various languages (C, C++, Fortran, Pascal, OCaml, Java, Python, ...) makes one appreciate what really matters in the choice of a programming language, well beyond the "fashion" of the moment. Secondly, the comparative study of programming languages induces the gradual refinement of programming skills and styles independently from the programming languages that, in a given moment of an individual's professional life, are more frequently used. Finally, more often than a student could imagine, the proper solution of a problem in ICT requires the definition of a language and the realization of a "machine" that interprets it.