Was sind dynamische Bibliotheken?
Die meisten Funktionen einer Anwendung sind in Bibliotheken mit ausführbarem Code implementiert. Wenn eine Anwendung mit einem statischen Linker mit einer Bibliothek verknüpft wird, wird der Code, den die Anwendung verwendet, in die erzeugte ausführbare Datei kopiert. Ein statischer Linker fasst den kompilierten Quellcode, den so genannten Objektcode, und den Bibliothekscode in einer ausführbaren Datei zusammen, die zur Laufzeit vollständig in den Speicher geladen wird. Die Art der Bibliothek, die Teil der ausführbaren Datei einer Anwendung wird, wird als statische Bibliothek bezeichnet. Statische Bibliotheken sind Sammlungen oder Archive von Objektdateien.
Wenn eine Anwendung gestartet wird, wird der Code der Anwendung – der den Code der statischen Bibliotheken enthält, mit denen sie verknüpft wurde – in den Adressraum der Anwendung geladen. Das Verknüpfen vieler statischer Bibliotheken mit einer Anwendung führt zu großen ausführbaren Dateien der Anwendung. Abbildung 1 zeigt die Speichernutzung einer Anwendung, die in statischen Bibliotheken implementierte Funktionen verwendet. Anwendungen mit großen ausführbaren Dateien leiden unter langsamen Startzeiten und großem Speicherbedarf. Wenn eine statische Bibliothek aktualisiert wird, profitieren ihre Client-Anwendungen nicht von den Verbesserungen, die an ihr vorgenommen wurden. Um Zugang zu den verbesserten Funktionen zu erhalten, muss der Entwickler der Anwendung die Objektdateien der Anwendung mit der neuen Version der Bibliothek verknüpfen. Und die Benutzer der Anwendung müssten ihre Kopie der Anwendung durch die neueste Version ersetzen. Daher erfordert die Aktualisierung einer App mit den neuesten Funktionen, die von statischen Bibliotheken bereitgestellt werden, sowohl von den Entwicklern als auch von den Endbenutzern einen hohen Arbeitsaufwand.
Ein besserer Ansatz besteht darin, dass eine App Code in ihren Adressraum lädt, wenn er tatsächlich benötigt wird, entweder beim Start oder zur Laufzeit. Die Art von Bibliothek, die diese Flexibilität bietet, wird als dynamische Bibliothek bezeichnet. Dynamische Bibliotheken werden nicht statisch in Client-Anwendungen eingebunden; sie werden nicht Teil der ausführbaren Datei. Stattdessen können dynamische Bibliotheken in eine Anwendung geladen (und verknüpft) werden, entweder wenn die Anwendung gestartet wird oder während sie läuft.
Abbildung 2 zeigt, wie die Implementierung einiger Funktionen als dynamische Bibliotheken anstelle von statischen Bibliotheken den von der Anwendung nach dem Start verwendeten Speicher reduziert.
Bei der Verwendung von dynamischen Bibliotheken können Programme automatisch von Verbesserungen an den von ihnen verwendeten Bibliotheken profitieren, da ihre Verknüpfung mit den Bibliotheken dynamisch und nicht statisch ist. Das heißt, die Funktionalität der Client-Anwendungen kann verbessert und erweitert werden, ohne dass die Anwendungsentwickler die Anwendungen neu kompilieren müssen. Für OS X geschriebene Anwendungen profitieren von dieser Funktion, da alle Systembibliotheken in OS X dynamische Bibliotheken sind. Auf diese Weise profitieren Anwendungen, die Carbon oder Cocoa-Technologien verwenden, von den Verbesserungen in OS X.
Ein weiterer Vorteil dynamischer Bibliotheken ist, dass sie beim Laden initialisiert werden können und Aufräumarbeiten durchführen können, wenn die Client-Anwendung normal beendet wird. Statische Bibliotheken haben diese Funktion nicht. Einzelheiten finden Sie unter Modulinitialisierer und -finalisierer.
Ein Problem, das Entwickler bei der Entwicklung dynamischer Bibliotheken im Auge behalten müssen, ist die Aufrechterhaltung der Kompatibilität mit Clientanwendungen, wenn eine Bibliothek aktualisiert wird. Da eine Bibliothek ohne Wissen des Entwicklers der Client-Anwendung aktualisiert werden kann, muss die Anwendung in der Lage sein, die neue Version der Bibliothek ohne Änderungen an ihrem Code zu verwenden. Zu diesem Zweck sollte sich die API der Bibliothek nicht ändern. Es gibt jedoch Fälle, in denen Verbesserungen API-Änderungen erfordern. In diesem Fall muss die vorherige Version der Bibliothek auf dem Computer des Benutzers verbleiben, damit die Client-Anwendung ordnungsgemäß ausgeführt werden kann. In den Richtlinien für den Entwurf dynamischer Bibliotheken wird das Thema der Verwaltung der Kompatibilität mit Client-Anwendungen bei der Weiterentwicklung einer dynamischen Bibliothek behandelt.