|
In den vorherigen Absätzen wurden schon etliche Gründe genannt,
warum Bibliotheken sinnvoll sind. Man kann Funktionen so
bereitstellen, dass andere Anwendungen oder Komponenten diese
verwenden. Änderungen oder Erweiterungen müssen nur an einer
zentralen Stelle (in der Bibliothek) vorgenommen werden. Die
Wahrscheinlichkeit von Programmfehlern ist geringer, da man durch
die häufige Verwendung derselben Funktionen Fehler schneller
finden kann. Das Entwickeln von Anwendungen ist einfacher und
schneller, wenn man auf komfortable Schnittstellen von
Bibliotheksfunktionen zurückgreifen kann. In der Praxis geht man
noch einen Schritt weiter: Es gibt Bibliotheken mit identischen
Schnittstellen für verschiedenste Systeme. Beispielsweise
unterscheiden sich die Kernel von Unix- und Windows-Systemen
erheblich, jedoch sind die gleichen C-Bibliotheksfunktionen
vorhanden. Das C-Programm, das nur C-Bibliotheksfunktionen
verwendet, kann auf Windows und Linux übersetzen werden, ohne dass
man es anpassen muss, selbst wenn indirekt unterschiedliche
Kernelfunktionen von der C-Bibliothek verwendet werden. Man
benötigt eben nur eine passende Bibliothek.
Die Verwendung von Bibliotheken kann weitere Vorteile haben. So
spart man beispielsweise Speicherplatz, wenn man die Funktionen
nur einmal hat, anstatt in jeder Programmdatei. Auch bei
Aktualisierungen wie zum Beispiel Sicherheitslücken ist das
Hilfreich: Man aktualisiert die betroffene Bibliothek, und alle
Programme, die diese verwenden, verwenden automatisch die neue,
sicherere Funktion.
|
Es gibt sehr viele Arten von Bibliotheken. Diese lassen sich
unter verschiedenen Gesichtspunkten einteilen. Man kann sie nach
Funktionsart einteilen. So gibt es zum Beispiel Bibliotheken für
grafische und mathematische Funktionen. Man kann sie auch nach
der Programmiersprache einteilen. Bisher bezogen sich alle
Beispiele auf Systembibliotheken, die aus C heraus sehr
bequem, aber auch aus anderen Sprachen heraus aufgerufen werden können.
Es gibt aber auch Sprachbibliotheken, die nur für bestimmte
Sprachen zur Verfügung stehen. So gibt es beispielsweise sehr
viele Bibliotheken für Perl oder Java,
die man aus anderen Sprachen heraus kaum verwenden kann.
Dieser Artikel beschäftigt sich mit Systembibliotheken. Auch
diese kann man in verschiedene Klassen einteilen, ein Beispiel
gab es bereits. Eine weitere Einteilung ist etwas schwieriger zu
verstehen: Man unterscheidet Bibliotheken danach, wann sie zu
einem Programm hinzugebunden werden. Hier gibt es drei
Zeitpunktklassen: direkt nach der Programmübersetzung, bei jedem
Programmstart oder zu einem beliebigen Zeitpunkt während der
Programmlaufzeit (also den Zeitpunkten, an denen das Programm
läuft). Analog unterscheidet man drei Bindungsarten, die im
folgenden kurz genannt werden. Die Namen dieser Bindungsarten
mögen etwas verwirrend erscheinen, hiervon sollte man sich nicht
beeindrucken lassen.
Die erste Möglichkeit wurde bisher etwas unterschlagen: Das
Binden von Programmen und Bibliotheken zur Entwicklungszeit. In
diesem Fall wird das Programm und die Bibliothek fest verbunden.
Anschließend wird die Bibliotheksdatei nicht mehr für das Programm
benötigt, da die verwendeten Funktionen in die Datei kopiert
werden. Man spricht hier vom statischen Linken (engl. to link:
verbinden).
Programme, die statisch mit Bibliotheken verbunden sind, nutzen
einige der oben genannten Vorteile nicht. So sind sie zum Beispiel
größer, und die Bibliotheken können vom Anwender nicht so ohne weiteres
aktualisiert werden. Deshalb verwendet man dieses Verfahren meist
nur für sehr spezielle Programmbibliotheken, die nur von diesem
Programm verwendet werden oder die man aus verschiedenen anderen
Gründen fest mit dem Programm verbinden möchte.
Diese Bibliotheken sind technisch gesehen einfache Archive, die
viele Objekt-Dateien enthalten können. So ein Archiv ist in etwa
mit einem tar oder jar Archiv vergleichbar (aber
üblicherweise unkomprimiert). Die Bezeichnung Archiv sollte
hier aber nicht verwendet werden. Sie ist irreführend, da man
heutzutage sofort an allgemeine Archive wie tar oder
Zip-Archive denkt.
|
Eleganter ist die Möglichkeit, Programme bei deren Start mit der
passenden Bibliothek zu verbinden. Dies nennt man dynamisches
Binden. Dies ist ein komplizierterer Vorgang. Beim Start führt
ein besonderes Programm die Verbindung unmittelbar vor dem
eigentlichen Programmstart aus. Dazu muss die Bibliothek geladen
werden, Einsprungadressen geprüft und weitere Aktionen
durchgeführt werden. Dieses Vorgehen ermöglicht es, dass mehrere
verschiedene Anwendungen eine Bibliothek gemeinsam nutzen. Die
Bibliotheken, die so verwendet werden, nennt man gemeinsam
nutzbare Bibliotheken (eng: shared libraries). Auch wenn es
sich technisch gesehen um dynamisch verbundene Bibliotheken
handelt, und sie auch manchmal DLLs (dynamically linked
libraries) genannt werden, nennt man sie üblicherweise nicht
dynamische Bibliothek, da dieser Begriff für das folgende
Vorgehen reserviert ist.
|
Richtig dynamisch wird es, wenn ein Programm erst zur Laufzeit
Bibliotheken lädt und verwendet. Dies ermöglicht eine sehr hohe
Flexibilität. Zum Beispiel kann ein Programm unter Umständen
teilweise funktionieren, wenn nicht alle benötigten Bibliotheken
installiert sind, oder es kann Bibliotheken erst dann laden, wenn
sie tatsächlich benötigt werden. Hier spricht man von dynamischen
Bibliotheken, oder von dynamisch ladbaren Bibliotheken (eng:
dynamically loaded libraries)
Unter Linux (und anderen Systemen) sind die shared libraries
bzw. dynamically linked libraries und
dynamically loaded libraries die gleichen Dateien und
sich sehr ähnlich. Nur die Art der Verwendung unterscheidet sich.
Daher kommt vermutlich auch die unklare Namensabgrenzung: Meint
man mit "Bibliotheken" bestimmte Dateien für eine dieser beiden
Bindungsarten, so sind das eben dynamische Bibliotheken.
Interessant ist hier ein weiteres Detail. Da jedes Programm,
welches dynamisch Bibliotheken laden möchte, sehr ähnliche
Funktionen verwenden muss, gibt es auch hierfür eine Bibliothek:
eine Bibliothek zum Laden von Bibliotheken. Diese heißt libdl
(engl. dl: dynamic loading). Diese Bibliothek wird dynamisch
gelinkt und ermöglicht komfortables dynamisches Laden (diese
Bibliothek dynamisch zu laden, macht verständlicherweise kaum
Sinn).
|
Die bereits erwähnte C-Systembibliothek, die kurz als libc oder
C-Lib bezeichnet wird, ist fast immer eine dynamische
Bibliothek, die dynamisch gelinkt (und nicht geladen!) wird. In
der Praxis werden die meisten C-Bibliotheken dynamisch gelinkt,
und nur in sehr wenigen, speziellen Fällen macht man vom
dynamischen Laden Gebrauch.
Die Bibliotheken, die Zugriff auf X-Window-System-Funktionen
gestatten (X-Lib genannt), fallen ebenso in diese Kategorie wie
die Mathematikbibliothek math, die Funktionen wie Sinus und
Cosinus bereitstellt.
|
|
|