Support for Development and Maintenance of Generic Libraries
Licentiate thesis, 2006
Software libraries have emerged as one of the most common ways of providing
reusable, organized collections of software. Practically every software
project nowadays uses a number of software libraries for the most basic tasks
as well as for domain-specific programming tasks. As the number, complexity,
and importance of libraries increases, the need for support in development and
maintenance becomes apparent. Yet, only little assistance exists for the
developers and maintainers of libraries.
In this thesis we are concerned with the large class of libraries known as
generic libraries, that is, libraries in the philosophy of the Standard
Template Library (STL). Specifically, we tackle two issues, one related to
the development and one related to the use of generic libraries.
The first issue, particularly important for a library developer, is
determining the impact of a change. Since STL, generic libraries in C++
rely on concepts to precisely specify the requirements of generic
algorithms (function templates) on their parameters (template arguments).
Modifying the definition of a concept even slightly, can have a potentially
large impact on the (interfaces of the) entire library. In particular the
non-local effects of a change, however, make its impact difficult to determine
by hand. In this thesis we propose a conceptual change impact
analysis (CCIA), which determines the impact of changes of the conceptual
specification of a generic library. In a case study, we apply CCIA to a new
proposal for STL iterator concepts, which is under review by the C++
standardization committee, and show a number of unexpected incompatibilities.
The second issue, component composition, is important for the user of a
library. A generic library typically provides multiple implementations that
fulfill the requirements of the same concept, but differ with respect to
properties that a concept does not completely determine, for example, the
performance of an implementation component. Therefore, there exists often a
quite large number of ways to (type-) correctly combine a set of libraries
components. At the same time, it is non-trivial to see how to combine them
"best." We present a component composition tool, which, based on accumulated
empirical data, automatically selects and composes the combination of library
components that performs best for a specific task in a specific environment.
Performance prediction uses an off-the-shelf, external machine learning
algorithm, which is trained on the empirical data, combined with a declarative
description of performance factors. Using trait classes and metaprogramming
techniques, the prediction is then mapped to a correctly configured, final
Change Impact Analysis