70089 - Programming Paradigms

Academic Year 2015/2016

  • Teaching Mode: In-person learning (entirely or partially)
  • Campus: Cesena
  • Corso: Second cycle degree programme (LM) in Computer Science and Engineering (cod. 8614)

Learning outcomes

The course introduces the main aspects concerning advanced programming paradigms that are relevant nowadays for software development and problem solving, besides the object-oriented one. In particular upon completing this course, a student will have a basic knowledge of declarative paradigms - functional programming and logic programming - and a solid knowledge of concurrent programming (multi-threaded, based on message passing, actor-based).

Course contents

The course is organized in the following main parts:

PART 1:
- Overview on programming paradigms:
-- imperative, functional, logic, object-oriented, aspect-oriented
-- concurrent programming: multi-threaded, event-driven/reactive, actors
- Focus on functional programming
-- Overview of the main characteristics and features of functional programming and related programming languages
-- Haskell as reference
- Foundations: lambda calculus - introduction
- Integration with OOP
-- mainstream language support (C#, Java 8, JavaScript, Scala) - Java, JavaScript, Scala as main case studies
In lab:
- functional programming Haskell
- OOP and functional programming in Java 8

PART 2 - Concurrent programming - base concepts and models
- introduction - main concepts and aspects
- modelling a concurrent program/system
-- specifying liveness and safety properties in LTL
-- verifying properties with model-checking - pragmatics
- design and development of concurrent programs
-- methods, architectures
- interaction models and mechanisms
-- shared memory
--- semaphores, monitors
In lab:
- multi-threaded programming in Java
-- basic mechanisms and libraries
-- implementing monitors in Java

PART 3 - Task-oriented design and development
- task-oriented patterns and architectures for the design and development of concurrent programs 
- visual formalism - Petri Nets, Statecharts 
In lab:
- framework task-oriented in Java - Executors

PART 4 - Concurrent  programming - advanced   
- message passing 
-- channels, actors  
-- asynchronous and synchronous
- asynchronous programming  
-- based on future/task
-- based on Continuation Passing style (CPS): events and event-loop 
--- promise mechanism 
- reactive programming e reactive extension (Rx)
-  data parallelism 
-- based on GPGPU  
-- for BigData - MapReduce, Lambda Architecture
In lab:
- programming actors with Akka framework
- asynchronous programming in JavaScript
- Reactive Programming in RxJava

Readings/Bibliography

- Concepts, Techniques and Models of Computer Programming (Van Roy, Haridi) - MIT Press 
- Principle of Concurrent and Distributed Programming (Ben-Ari) - Addison Wesley 
- Programming Languages: Principles and Paradigms - Gabbrielli, Martini - Springer
- Concepts in Programming Languages - Mitchell - MIT Press
- Java Concurrency in Practice - Brian Goetz, Doug Lea et al - Addison Wesley
- Foundations of Multithreaded, Parallel, and Distributed Programming - Gregory R. Andrews - Addison-Wesley
- Concurrency - State Models & Java Programs - Jeff Magee & Jeff Kramer - Wiley
- Introduction to Functional Programming using Haskell - Richard Bird - Prentice Hall
- Seven Concurrency Models in Seven Weeks - Paul Butcher

Teaching methods

Three credits (about 30 hours) are devoted to theory and exercises in the classroom and three credits (about 30 hours) to practice in the lab.

Assessment methods

The final assessment is composed by due parts:

  • a set of programming assignments, assigned during the course  
  • oral discussion, with questions about the theory and the lab

Teaching tools

- slides projected during the lectures, available on the course web site
- scientific papers and articles, available on the Internet

Links to further information

https://elearning-cds.unibo.it/course/view.php?id=4063

Office hours

See the website of Alessandro Ricci