To analyze in a critical fashion any programming language · to evaluate how choosing a particular language affects development time and costs of an application · to choose the right language in different contexts · to develop strategies for quickly learning new programming languages
· to code in imperative, functional and declarative styles · to improve skills in structuring code and data, also exploiting object orientation · to understand and therefore exploit as much as possible static controls, to lower the risk of bugs · to factor the code, also to support its development in complex working groups · to understand how the evolution of programming languages intertwines with that of applications, compilers and interpreters
In the first half of the course we overview the evolution of programming languages, focusing on their common features and their classification. We briefly present also the theoretical foundations of the equivalence between programming languages, of the problem of automatically finding errors in programs and of the algorithmic undecidability. We review a few concepts of imperative programming, and then focus on functional, declarative and logic programming paradigms. In the second half of the course, instead, we analyze the common factors of all programming languages: · formal syntax and semantics description, · type system, scope and binding, · structured programming, subprograms and encapsulation, · abstract data types, parametric types, overloading, polimorphism · support to object orientation and generic programming, · support to concurrent programming and exceptions handling
During all the course we present examples and we propose short programming excercises, using diverse real world programming languages.