Generische Programmierung ist ein mächtiges Paradigma zum Trennen von Daten-Repräsentation (also Datenstrukturen) und Algorithmen, und ermöglicht so universell verwendbare Implementierungen.

Generische Programmierung

Bahnsignal © HPW Fotolia.de

Das Paradigma der Generischen Programmierung trat mit der Publikation der C++ Standard Template Library (STL) 1995 ins Bewusstsein der Software-Industrie und gewinnt seit der Aufnahme der STL in den C++ Standard C++98 zunehmend an Popularität, was etwa am Erfolg der Boost-Bibliotheken beobachtet werden kann. Mit der verbesserten Unterstützung für generische Programmierung im neuesten Standard C++11 dürfte die praktische Bedeutung dieses Ansatzes weiter zunehmen.

Was ist es?

Die Generische Programmierung entkoppelt algorithmische Logik von der Darstellung der Daten, garantiert aber gleichzeitig die Wahl des jeweils effizientesten Ansatzes. Die Standard Template Library etwa befasst sich mit Sequenzen (also Arrays, Listen, Queues) und den darauf operierenden Algorithmen (Suchen, Sortieren, Permutieren). Um etwa ein maximales Element einer solchen Sequenz zu finden, spielt es von einem abstrakten "mathematischen" Standpunkt aus keine Rolle, ob die Daten als Array oder Liste vorliegen oder ob sie gar eins nach dem anderen eingelesen werden.

Bei einer herkömmlichen Implementierung etwa in C muss aber für jede dieser Varianten eine separate Routine geschrieben werden. Die STL schafft es nun, durch geeignet definierte Abstraktionen (hier sog. Iteratoren) und Einsatz von C++ Templates (wörtlich "Schablonen") mit einer einzigen Implementierung auszukommen. Wenn für Daten in einer speziellen Darstellung aber doch eine effizientere Implementierung existiert, etwa für binäre Suche auf sortierten Arrays, wird diese ausgewählt.

Was bringt es?

Dieses Vorgehen vermeidet eine kombinatorische Explosion von Implementierungen, die sich jeweils nur durch die Details der Darstellungen unterscheiden. Damit kann die Wiederverwendung und Produktivität deutlich erhöht werden; Adobe setzt Generische Programmierung bereits sehr erfolgreich ein. Sean Parent von Adobe schätzt, dass je nach Anwendung bis zu 85% des Quellcodes durch geeignete Abstraktion eingespart werden kann.

Mittlerweile gibt es eine ganze Reihe generischer Implementierungen für viele verschiedene Anwendungsgebiete. Ein Beispiel mit besonderem Bezug zu CMM ist die von mir entwickelte Grid Algorithms Library GrAL, eine Bibliothek für geometrischen Daten (Gitter) und Algorithmen, die auch Unterstützung für parallele Implementierung solcher Algorithmen anbietet.

Besonders interessant wird der generische Ansatz nämlich durch die aktuellen Trends bei der Hardware-Entwicklung hin zu parallelen und heterogenen Architekturen (Stichworte Multicore und GPU-Programmierung). Performanz-kritische Software muss moderne Hardware voll ausnutzen, um konkurrenzfähig zu bleiben. Gleichzeitig besteht ein großes Risiko darin, Software zu stark an eine spezielle Architektur zu ketten, etwa durch Hersteller- oder Hardware-spezifische Schnittstellen zur Parallelisierung. Die Generische Programmierung bietet hier interessante Lösungen, indem strukturell gleiche Ansätze mit ein- und derselben generischen parallelen Komponente implementiert werden können. Dieser Gedanke steht etwa hinter Intels Threading Building Blocks.

Schnellzug © lassedesignen Fotolia.de

Wie funktioniert es?

Auf meinen Seiten finden Sie weitergehende Informationen zur Generischen Programmierung, etwa eine etwas ausführlichere Motivation der generischen Programmierung, meiner eigenen Definition dieses Paradigmas, und ein kleines Tutorial. Hier können Sie anhand eines einfaches Beispiels die generische Programmierung in C++ von der Pike auf lernen, mit allen Haken und Ösen. Für die Vertiefung habe ich einige Ressourcen zusammengestellt und diskutiere modellhafte Beispiele generischer Software.

Wenn Sie mehr darüber erfahren möchten, wie Sie Generische Programmierung produktiv für sich einsetzen können, beachten Sie auch mein Schulungsangebot!