Que sont les bibliothèques dynamiques?
La plupart des fonctionnalités d’une app sont mises en œuvre dans des bibliothèques de code exécutable. Lorsqu’une app est liée à une bibliothèque à l’aide d’un linker statique, le code que l’app utilise est copié dans le fichier exécutable généré. Un éditeur de liens statiques rassemble le code source compilé, appelé code objet, et le code de la bibliothèque en un seul fichier exécutable qui est chargé en mémoire dans son intégralité au moment de l’exécution. Le type de bibliothèque qui fait partie du fichier exécutable d’une application est appelé bibliothèque statique. Les bibliothèques statiques sont des collections ou des archives de fichiers objets.
Lorsqu’une application est lancée, le code de l’application – qui inclut le code des bibliothèques statiques avec lesquelles elle a été liée – est chargé dans l’espace d’adressage de l’application. L’association de nombreuses bibliothèques statiques à une application produit des fichiers exécutables d’application volumineux. La figure 1 montre l’utilisation de la mémoire d’une application qui utilise des fonctionnalités implémentées dans des bibliothèques statiques. Les applications dont les exécutables sont volumineux souffrent de temps de lancement lents et d’empreintes mémoire importantes. De plus, lorsqu’une bibliothèque statique est mise à jour, ses applications clientes ne bénéficient pas des améliorations qui lui sont apportées. Pour avoir accès à la fonctionnalité améliorée, le développeur de l’application doit lier les fichiers objets de l’application avec la nouvelle version de la bibliothèque. Et les utilisateurs de l’application doivent remplacer leur copie de l’application par la dernière version. Par conséquent, maintenir une app à jour avec la dernière fonctionnalité fournie par les bibliothèques statiques nécessite un travail perturbateur à la fois pour les développeurs et les utilisateurs finaux.
Une meilleure approche consiste pour une app à charger du code dans son espace d’adressage lorsqu’il est réellement nécessaire, soit au moment du lancement, soit au moment de l’exécution. Le type de bibliothèque qui offre cette flexibilité est appelé bibliothèque dynamique. Les bibliothèques dynamiques ne sont pas liées de manière statique aux applications clientes ; elles ne font pas partie du fichier exécutable. Au lieu de cela, les bibliothèques dynamiques peuvent être chargées (et liées) dans une app soit lorsque l’app est lancée, soit pendant son exécution.
La figure 2 montre comment la mise en œuvre de certaines fonctionnalités en tant que bibliothèques dynamiques plutôt qu’en tant que bibliothèques statiques réduit la mémoire utilisée par l’app après le lancement.
En utilisant des bibliothèques dynamiques, les programmes peuvent bénéficier d’améliorations des bibliothèques qu’ils utilisent automatiquement parce que leur lien avec les bibliothèques est dynamique, et non statique. En d’autres termes, la fonctionnalité des applications clientes peut être améliorée et étendue sans que les développeurs d’applications aient à recompiler les applications. Les applications écrites pour OS X bénéficient de cette fonctionnalité car toutes les bibliothèques système d’OS X sont des bibliothèques dynamiques. C’est ainsi que les apps qui utilisent les technologies Carbon ou Cocoa bénéficient des améliorations apportées à OS X.
Un autre avantage qu’offrent les bibliothèques dynamiques est qu’elles peuvent être initialisées lorsqu’elles sont chargées et qu’elles peuvent effectuer des tâches de nettoyage lorsque l’app cliente se termine normalement. Les bibliothèques statiques ne disposent pas de cette fonctionnalité. Pour plus de détails, voir Initialisateurs et finaliseurs de modules.
Un problème que les développeurs doivent garder à l’esprit lors du développement de bibliothèques dynamiques est le maintien de la compatibilité avec les apps clientes lorsqu’une bibliothèque est mise à jour. Étant donné qu’une bibliothèque peut être mise à jour à l’insu du développeur de l’application cliente, l’app doit pouvoir utiliser la nouvelle version de la bibliothèque sans modification de son code. À cette fin, l’API de la bibliothèque ne doit pas changer. Cependant, il arrive que des améliorations nécessitent des changements d’API. Dans ce cas, la version précédente de la bibliothèque doit rester dans l’ordinateur de l’utilisateur pour que l’application cliente fonctionne correctement. Dynamic Library Design Guidelines explore le sujet de la gestion de la compatibilité avec les apps clientes au fur et à mesure de l’évolution d’une bibliothèque dynamique.