Wat zijn dynamische bibliotheken?
De meeste functionaliteit van een app is geïmplementeerd in bibliotheken van uitvoerbare code. Wanneer een app met behulp van een statische linker aan een bibliotheek wordt gekoppeld, wordt de code die de app gebruikt naar het gegenereerde uitvoerbare bestand gekopieerd. Een statische linker verzamelt gecompileerde broncode, bekend als objectcode, en bibliotheekcode in één uitvoerbaar bestand dat in zijn geheel in het geheugen wordt geladen tijdens runtime. Het soort bibliotheek dat deel gaat uitmaken van het uitvoerbare bestand van een app staat bekend als een statische bibliotheek. Statische bibliotheken zijn verzamelingen of archieven van objectbestanden.
Wanneer een app wordt gestart, wordt de code van de app – inclusief de code van de statische bibliotheken waarmee de app is gekoppeld – in de adresruimte van de app geladen. Het koppelen van veel statische bibliotheken in een app produceert grote app uitvoerbare bestanden. Figuur 1 toont het geheugengebruik van een app die gebruik maakt van functionaliteit die in statische bibliotheken is geïmplementeerd. Applicaties met grote uitvoerbare bestanden hebben last van trage starttijden en grote geheugensporen. Wanneer een statische bibliotheek wordt bijgewerkt, profiteren de client-apps niet van de verbeteringen die zijn aangebracht. Om toegang te krijgen tot de verbeterde functionaliteit, moet de ontwikkelaar van de app de objectbestanden van de app koppelen aan de nieuwe versie van de bibliotheek. En de gebruikers van de app zouden hun exemplaar van de app moeten vervangen door de nieuwste versie. Daarom vereist het up-to-date houden van een app met de nieuwste functionaliteit die door statische bibliotheken wordt geboden, verstorend werk van zowel ontwikkelaars als eindgebruikers.
Een betere benadering is dat een app code in zijn adresruimte laadt wanneer deze daadwerkelijk nodig is, hetzij tijdens het starten of tijdens runtime. Het type bibliotheek dat deze flexibiliteit biedt, wordt dynamische bibliotheek genoemd. Dynamische bibliotheken worden niet statisch gekoppeld aan client apps; ze worden geen onderdeel van het uitvoerbare bestand. In plaats daarvan kunnen dynamische bibliotheken in een app worden geladen (en gekoppeld) wanneer de app wordt gestart of terwijl deze wordt uitgevoerd.
Figuur 2 laat zien hoe de implementatie van bepaalde functionaliteit als dynamische bibliotheken in plaats van als statische bibliotheken het geheugengebruik van de app na het starten vermindert.
Met dynamische bibliotheken kunnen programma’s profiteren van verbeteringen aan de bibliotheken die ze automatisch gebruiken, omdat hun koppeling aan de bibliotheken dynamisch is en niet statisch. Dat wil zeggen dat de functionaliteit van de client-apps kan worden verbeterd en uitgebreid zonder dat de ontwikkelaars de apps opnieuw hoeven te compileren. Toepassingen die voor OS X zijn geschreven, profiteren van deze functie omdat alle systeembibliotheken in OS X dynamische bibliotheken zijn. Zo profiteren apps die Carbon- of Cocoa-technologieën gebruiken van verbeteringen aan OS X.
Een ander voordeel dat dynamische bibliotheken bieden, is dat ze kunnen worden geïnitialiseerd wanneer ze worden geladen en dat ze opruimtaken kunnen uitvoeren wanneer de client-app normaal wordt beëindigd. Statische bibliotheken hebben deze mogelijkheid niet. Zie Module Initializers and Finalizers voor meer informatie.
Eén kwestie die ontwikkelaars in gedachten moeten houden bij het ontwikkelen van dynamische bibliotheken is het behoud van compatibiliteit met client-apps als een bibliotheek wordt bijgewerkt. Omdat een bibliotheek kan worden bijgewerkt zonder dat de ontwikkelaar van de client-app daarvan op de hoogte is, moet de app de nieuwe versie van de bibliotheek kunnen gebruiken zonder wijzigingen in zijn code. Daartoe mag de API van de bibliotheek niet veranderen. Er zijn echter momenten dat verbeteringen API-wijzigingen vereisen. In dat geval moet de vorige versie van de bibliotheek op de computer van de gebruiker blijven staan, zodat de client-app goed werkt. Ontwerprichtlijnen voor dynamische bibliotheken behandelt het onderwerp van het beheer van compatibiliteit met client-apps terwijl een dynamische bibliotheek zich ontwikkelt.