Introduction

Applications sometimes need complex algorithms. But we notice that these algorithms are often conceived by assembling and adapting basic and well-known algorithms. These simple algorithms can be implemented and collected in algorithm software libraries. These libraries provide components to help the developer program complex algorithms. In this class, we will mostly concentrate on libraries that have a focus on algorithms and data structures (such as the examples given below), and applications of scientific nature (for instance, symbolic, algebraic, numeric, or geometric).

There are several major issues with these libraries:

Abstract data types (ADT) are one answer to these problems. Object-oriented design is another. In this seminar, I will present a few techniques extending ADTs to will help us design better software libraries for applications. Mostly, we will explore generic programming as a great paradigm for writing generic, reusable code. We will use generic programming to craft component technology. Another technique we will cover is the use od design patterns.

A majority of these libraries are in C++. Therefore, the class will teach some advanced C++ technique (templates, metaprogramming, expression templates, generic components). We will also learn the fundamentals of library design in a Unix environment (autoconf, make, documentation).

For examples, we will look at a few successful libraries:

The class will be in the forms of seminars. If you are a developer, you are invited to present your own problems, libraries and discuss them in class. I will be very flexible since this is a class in development, and I will accomodate any special wish you may have.