Bibliothek (Library)
Kurz: Eine Sammlung von vorgefertigtem Code (Funktionen, Klassen), die in eigene Programme eingebunden werden kann, statt gängige Funktionalität selbst neu zu schreiben.
Genauer: Im Gegensatz zu einem Framework, das die Struktur der eigenen Anwendung vorgibt, wird eine Bibliothek aktiv vom eigenen Code aus aufgerufen — die Kontrolle bleibt beim Entwickler. Beispiele reichen von kleinen Hilfsbibliotheken bis zu umfangreichen Paketen für Mathematik, Netzwerk oder UI.
Im Detail
Der Unterschied zwischen Bibliothek und Framework wird oft mit dem Prinzip “Inversion of Control” erklärt: Bei einer Bibliothek ruft der eigene Code die Bibliotheksfunktionen auf (“ich rufe dich”), bei einem Framework ruft das Framework den eigenen Code auf (“du rufst mich”, z. B. wenn ein Web-Framework bei einer eingehenden Anfrage die passende Handler-Funktion aufruft). Eine Bibliothek lässt sich deshalb meist punktuell in bestehenden Code einbauen, ein Framework bestimmt dagegen von Anfang an die Grundstruktur des Projekts.
Bibliotheken werden üblicherweise über Paketmanager installiert und verwaltet, statt manuell heruntergeladen zu werden — bei JavaScript/Node.js z. B. per npm:
npm install lodashDanach lässt sich die Bibliothek direkt im eigenen Code importieren und verwenden. Gute Bibliotheken lösen genau ein Problem gut (z. B. Datumsverarbeitung, HTTP-Requests) und lassen sich beliebig mit anderen Bibliotheken kombinieren — das ist ihr zentraler Vorteil gegenüber monolithischen Frameworks, die oft ihre eigene Lösung für vieles mitbringen.
Statisch vs. dynamisch gebunden
Technisch unterscheidet man, WANN eine Bibliothek mit dem eigenen Programm verbunden wird. Bei statischer Bindung wird der Bibliothekscode direkt in die fertige ausführbare Datei hineinkopiert (größere Datei, aber keine externen Abhängigkeiten zur Laufzeit). Bei dynamischer Bindung (z. B. .dll-Dateien unter Windows, .so unter Linux) bleibt die Bibliothek eine separate Datei, die erst beim Programmstart nachgeladen wird — mehrere Programme können sich dieselbe dynamische Bibliothek im Speicher teilen, was Platz spart, aber auch bedeutet, dass eine fehlende oder falsche Version der Bibliothek das Programm zum Absturz bringen kann (“DLL Hell”).
Abhängigkeits-Hölle und Versionskonflikte
Je mehr Bibliotheken ein Projekt einbindet, desto komplexer wird der Abhängigkeitsbaum: Bibliothek A braucht Version 2 von Bibliothek C, Bibliothek B aber Version 3 — ein klassisches Problem, das moderne Paketmanager (npm, pip, Maven) mit Lock-Dateien (package-lock.json, poetry.lock) und teils isolierten Abhängigkeitsbäumen pro Projekt (statt globaler Installation) in den Griff zu bekommen versuchen. Sicherheitslücken in weit verbreiteten Bibliotheken (etwa die log4j-Schwachstelle 2021) zeigen zusätzlich, wie stark moderne Software von Drittanbieter-Code abhängt — ein einzelnes fehlerhaftes Paket kann tausende Anwendungen gleichzeitig betreffen.
Bibliothek, Framework und Package — Begriffsabgrenzung
In der Praxis werden die Begriffe oft unscharf verwendet: Ein “Package” ist meist einfach die Verteilungsform (das, was der Paketmanager installiert) und kann sowohl eine Bibliothek als auch ein Framework enthalten. Ein Framework unterscheidet sich von einer reinen Bibliothek dadurch, dass es die Grundarchitektur der Anwendung vorschreibt (siehe Inversion-of-Control oben) — React etwa wird oft als Bibliothek bezeichnet, weil man es punktuell in bestehende Seiten einbauen kann, während Angular als vollständiges Framework die gesamte Projektstruktur bestimmt.