principles of programming
Programming languages are one of the most important and direct tools for the construction of a computer system: in a modern computer different languages are routinely used for different levels of abstraction. Aspects related to writing an operating system or a device driver are generally very different from those of writing high level applications. Moreover, in some typical complex applications, different levels (and thus languages) coexist and inter-operate, from the "core" logic written e.g. in C++ or Java, to the level of scripting, or to the level of "gluing" different applications, usually defined by an interpreted high level language (e.g. Python). Like natural languages, Programming languages are a fundamental means of expression. Algorithms implemented using different programming languages may exhibit very different characteristics, that can be of aesthetic character, as higher level languages can be very synthetic and are usually very expressive; or in terms of performance, as relatively lower level languages allow a more direct management of memory and in general of the performance of the generated code.
This course presents the salient features in the landscape of programming languages, by analyzing similarities and differences; traditional and recent approaches and paradigms. We will show significant fragments of some important programming languages, given as examples of those paradigms considered in class.
The course aims to provide the means to better understand the essence of defining concepts of programming languages, so to allow critical choice about the level of abstraction, and consequently the language necessary to implement a particular system. Also, the student must attain a good mental flexibility before of an aspect, i.e. the choice of a language, that is constantly changing in computer science and software. Last, we will provide those basis required from designing language constructs "in the small", going to entire languages (e.g. a Domain Specific Language).
Program
- Motivations and Preliminaries
- Basic Abstraction Mechanisms
- Variables, Binding, and Scoping
- Expressions and statements
- Procedures and recursion
- Macros
- Parameter Passing: call by value, by reference, and by name
- Types: basic data types; pointers; dynamic and static type checking; type inference; parametric polymorphism
- Exception Handling - issues and variants
- Main Programming Paradigms
- Introduction: the Procedural Paradigm
- Functional Programming
- History
- Functional programming concepts: referential transparency, functions as a first-class entity, higher-order functions
- Evaluation order and type systems
- Purity and Monads
- Continuations
- Object-Oriented Programming
- History and variants
- Main issues and relation with Abstract Data Types
- Dynamic Method Binding and "ad hoc" polymorphism
- Encapsulation and Inheritance
- Class vs Prototype-based inheritance
- Concurrent Programming
- History, background, and motivation
- The Actor model
- General issues on Communication and Synchronization
- Variants and usages
- General Considerations and Other Paradigms
- Multi-paradigm languages
- Meta-programming facilities
- Domain Specific Languages
- Logic programming

Comments
Post a Comment