Czym są biblioteki dynamiczne?
Większość funkcjonalności aplikacji jest zaimplementowana w bibliotekach kodu wykonywalnego. Gdy aplikacja jest łączona z biblioteką za pomocą statycznego linkera, kod, z którego korzysta aplikacja, jest kopiowany do wygenerowanego pliku wykonywalnego. Statyczny linker zbiera skompilowany kod źródłowy, znany jako kod obiektowy, oraz kod biblioteki w jeden plik wykonywalny, który jest ładowany do pamięci w całości podczas uruchamiania. Rodzaj biblioteki, która staje się częścią pliku wykonywalnego aplikacji, jest znany jako biblioteka statyczna. Biblioteki statyczne to kolekcje lub archiwa plików obiektów.
Gdy aplikacja jest uruchamiana, jej kod – zawierający kod bibliotek statycznych, z którymi została połączona – jest ładowany do przestrzeni adresowej aplikacji. Powiązanie wielu statycznych bibliotek z aplikacją powoduje powstanie dużych plików wykonywalnych aplikacji. Rysunek 1 pokazuje użycie pamięci przez aplikację, która korzysta z funkcjonalności zaimplementowanej w statycznych bibliotekach. Aplikacje z dużymi plikami wykonywalnymi cierpią na powolny czas uruchamiania i duży ślad pamięciowy. Ponadto, gdy biblioteka statyczna jest aktualizowana, aplikacje klienckie nie korzystają z wprowadzonych do niej ulepszeń. Aby uzyskać dostęp do ulepszonej funkcjonalności, programista aplikacji musi połączyć pliki obiektowe aplikacji z nową wersją biblioteki. A użytkownicy aplikacji musieliby wymienić swoją kopię aplikacji na najnowszą wersję. Dlatego utrzymywanie aplikacji na bieżąco z najnowszą funkcjonalnością dostarczaną przez biblioteki statyczne wymaga destrukcyjnej pracy zarówno programistów, jak i użytkowników końcowych.
Lepszym podejściem jest ładowanie przez aplikację kodu do jej przestrzeni adresowej, gdy jest on rzeczywiście potrzebny, albo w czasie uruchamiania, albo w czasie działania. Typ biblioteki, który zapewnia taką elastyczność nazywany jest biblioteką dynamiczną. Biblioteki dynamiczne nie są statycznie łączone z aplikacjami klienckimi, nie stają się częścią pliku wykonywalnego. Zamiast tego, biblioteki dynamiczne mogą być ładowane (i łączone) do aplikacji podczas jej uruchamiania lub w trakcie działania.
Rysunek 2 pokazuje, jak implementacja niektórych funkcji jako biblioteki dynamiczne zamiast jako biblioteki statyczne zmniejsza pamięć używaną przez aplikację po uruchomieniu.
Używając bibliotek dynamicznych, programy mogą korzystać z ulepszeń bibliotek, z których korzystają automatycznie, ponieważ ich połączenie z bibliotekami jest dynamiczne, a nie statyczne. Oznacza to, że funkcjonalność aplikacji klienckich może być poprawiana i rozszerzana bez konieczności ponownej kompilacji aplikacji przez jej twórców. Aplikacje napisane dla systemu OS X korzystają z tej funkcji, ponieważ wszystkie biblioteki systemowe w systemie OS X są bibliotekami dynamicznymi. W ten sposób aplikacje korzystające z technologii Carbon lub Cocoa korzystają z ulepszeń systemu OS X.
Inną zaletą bibliotek dynamicznych jest to, że mogą być inicjowane po załadowaniu i mogą wykonywać zadania czyszczenia, gdy aplikacja kliencka kończy pracę w normalny sposób. Biblioteki statyczne nie mają tej cechy. Aby uzyskać szczegółowe informacje, zobacz Inicjalizatory modułów i Finalizatory.
Jedną z kwestii, o których muszą pamiętać programiści podczas tworzenia bibliotek dynamicznych, jest zachowanie zgodności z aplikacjami klienckimi, gdy biblioteka jest aktualizowana. Ponieważ biblioteka może być aktualizowana bez wiedzy programisty aplikacji klienckiej, aplikacja musi być w stanie używać nowej wersji biblioteki bez zmian w swoim kodzie. W tym celu, API biblioteki nie powinno się zmieniać. Zdarzają się jednak sytuacje, gdy ulepszenia wymagają zmian w API. W takim przypadku poprzednia wersja biblioteki musi pozostać na komputerze użytkownika, aby aplikacja kliencka działała poprawnie. Dynamic Library Design Guidelines zgłębia temat zarządzania kompatybilnością z aplikacjami klienckimi w miarę rozwoju biblioteki dynamicznej.