Statische vs. Dynamische Bibliotheken: Grundlagen und Vorteile
Eingeordnet in Informatik
Geschrieben am in
Deutsch mit einer Größe von 5,38 KB
Frühe Bindung (Statische Verknüpfung)
Eine Bibliothek, die statisch verknüpft ist, wird zur Kompilierzeit gebunden (im Gegensatz zur dynamischen Verknüpfung, die zur Laufzeit erfolgt). Der Vorteil dieser Bindungsart ist, dass ein Programm keine externe Bibliothek zur Laufzeit benötigt (da sie zur Kompilierzeit eingebunden wurde), was die Verteilung vereinfacht.
Die Verknüpfung ermöglicht es dem Programmierer und dem Betriebssystem, ein Programm in mehrere Dateien, sogenannte Module, zu unterteilen, die separat kompiliert und zu einem späteren Zeitpunkt zusammengeführt werden können. Der Link kann statischer oder dynamischer Natur sein. Das Ergebnis einer statischen Verknüpfung ist eine ausführbare Datei, die alle Symbole und die entsprechenden Module enthält.
Dynamische Verknüpfung (Dynamic Link)
Ein dynamischer Link liegt vor, wenn eine Code-Bibliothek erst zur Ausführungszeit eines bestimmten Programms verbunden wird (im Gegensatz zur statischen Verknüpfung, die während der Kompilierung erfolgt). Der Vorteil dieser Bindungsart ist, dass die Anwendung schlanker ist und Code-Redundanz vermieden wird (z.B. wenn zwei Programme dieselbe Bibliothek benötigen, wird nur eine Kopie davon genutzt).
Die Dynamic Link Libraries (DLLs) oder Shared Libraries werden typischerweise in betriebssystemspezifischen Verzeichnissen abgelegt. Jedes Mal, wenn ein Programm sie benötigt, weiß das Betriebssystem, wo sie sich befinden, und kann sie verknüpfen. Dies kann jedoch zu Problemen mit Abhängigkeiten führen, insbesondere bei verschiedenen Versionen derselben Bibliothek.
Viele Programme rufen bestimmte Verfahren nur in Ausnahmefällen auf. Durch Dynamic Link Libraries können wir nach der Installation jedes Verfahren bei Bedarf verknüpfen.
Statische und Dynamische Bibliotheken im Detail
Eine statische Bibliothek wird beim Kompilieren in unser Programm „kopiert“. Sobald das ausführbare Programm erstellt ist, ist die Bibliothek (im übertragenen Sinne) für andere zukünftige Projekte nicht mehr relevant. Wir könnten sie löschen, und unser Programm würde weiterhin funktionieren, da es Kopien von allem Notwendigen enthält. Es wird nur der benötigte Teil der Bibliothek kopiert. Wenn Ihre Bibliothek beispielsweise zwei Funktionen hat und unser Programm nur eine davon aufruft, wird nur diese eine Funktion kopiert.
Eine dynamische Bibliothek wird beim Kompilieren nicht in unser Programm kopiert. Wenn wir das Programm ausführen, muss es jedes Mal, wenn es Code aus der Bibliothek benötigt, darauf zugreifen. Löschen Sie die Bibliothek, gibt unser Programm einen Fehler aus, da es nicht gefunden wird.
Was sind die Vor- und Nachteile jeder dieser Bibliotheksarten?
- Ein Programm, das mit statischen Bibliotheken kompiliert wird, ist größer, da es alles Notwendige enthält.
- Ein Programm, das mit statischen Bibliotheken kompiliert wird, kann auf einem anderen Computer ausgeführt werden, ohne dass die Bibliotheken dort installiert sein müssen.
- Ein Programm, das mit statischen Bibliotheken kompiliert wird, läuft im Prinzip schneller. Beim Aufruf einer Bibliotheksfunktion ist diese im eigenen Code vorhanden und muss nicht erst aus der Datei der dynamischen Bibliothek geladen werden.
- Wenn wir eine statische Bibliothek ändern, wird die ausführbare Datei nicht beeinflusst. Wenn wir eine dynamische Bibliothek ändern, sind die ausführbaren Dateien betroffen. Dies ist ein Vorteil, wenn wir die Bibliothek zur Fehlerbehebung ändern (alle ausführbaren Dateien werden automatisch korrigiert), aber umständlich, wenn wir die ausführbare Datei neu erstellen müssen (z.B. wenn wir einen weiteren Parameter zu einer Funktion hinzugefügt haben, was dazu führen kann, dass die alten ausführbaren Dateien nicht mehr funktionieren).
Vorteile von Dynamic Link Libraries (DLLs)
DLLs können wie statische Bibliotheken betrachtet werden, enthalten jedoch Funktionen oder Ressourcen, die von anderen Anwendungen genutzt werden können. Ihr Einsatz bietet mehrere Vorteile:
- Reduzierung der Größe ausführbarer Dateien: Ein großer Teil des Codes kann in Bibliotheken gespeichert werden und muss nicht in die eigentliche ausführbare Datei. Dies führt zu einer besseren Modularisierung.
- Teilbarkeit zwischen mehreren Anwendungen: Wenn der Code generisch genug ist, kann er von mehreren Anwendungen genutzt werden (z.B. die MFC, eine dynamische Bibliothek mit generischen Klassen, die die Windows-Grafik-API abdeckt und von den meisten Anwendungen verwendet wird).
- Erleichterung der Verwaltung und Nutzung des Speichersystems: Die dynamische Ladung ermöglicht es dem Betriebssystem, Algorithmen zur Optimierung der Leistung beim Laden von Bibliotheken zu implementieren. Darüber hinaus wird bei gemeinsamer Nutzung nur eine Kopie im Speicher für alle Programme gehalten.
- Flexiblere Reaktion auf Änderungen: Es ist möglich, die Leistung zu verbessern oder kleinere Fehler zu beheben, indem nur eine neue Version der dynamischen Bibliothek verteilt wird. Diese Korrektur oder Verbesserung gilt dann automatisch für alle Anwendungen, die diese Bibliothek nutzen.