Cosa sono le librerie dinamiche?
La maggior parte delle funzionalità di un’applicazione è implementata in librerie di codice eseguibile. Quando un’applicazione viene collegata a una libreria usando un linker statico, il codice che l’applicazione usa viene copiato nel file eseguibile generato. Un linker statico raccoglie il codice sorgente compilato, noto come codice oggetto, e il codice della libreria in un unico file eseguibile che viene caricato in memoria nella sua interezza in fase di esecuzione. Il tipo di libreria che diventa parte del file eseguibile di un’applicazione è noto come libreria statica. Le librerie statiche sono collezioni o archivi di file oggetto.
Quando un’app viene lanciata, il codice dell’app – che include il codice delle librerie statiche con cui è stata collegata – viene caricato nello spazio degli indirizzi dell’app. Il collegamento di molte librerie statiche in un’app produce file eseguibili di grandi dimensioni. La Figura 1 mostra l’uso della memoria di un’app che usa funzionalità implementate in librerie statiche. Le applicazioni con grandi eseguibili soffrono di tempi di lancio lenti e di grandi impronte di memoria. Inoltre, quando una libreria statica viene aggiornata, le sue app client non beneficiano dei miglioramenti apportati. Per avere accesso alle funzionalità migliorate, lo sviluppatore dell’app deve collegare i file oggetto dell’app con la nuova versione della libreria. E gli utenti delle app dovrebbero sostituire la loro copia dell’app con l’ultima versione. Quindi, mantenere un’app aggiornata con le ultime funzionalità fornite dalle librerie statiche richiede un lavoro dirompente sia da parte degli sviluppatori che degli utenti finali.
Un approccio migliore è che un’app carichi il codice nel suo spazio di indirizzamento quando è effettivamente necessario, o al momento del lancio o in fase di esecuzione. Il tipo di libreria che fornisce questa flessibilità è chiamata libreria dinamica. Le librerie dinamiche non sono collegate staticamente nelle applicazioni client; non diventano parte del file eseguibile. Invece, le librerie dinamiche possono essere caricate (e collegate) in un’app sia quando l’app viene lanciata che durante la sua esecuzione.
La figura 2 mostra come l’implementazione di alcune funzionalità come librerie dinamiche invece che come librerie statiche riduce la memoria usata dall’app dopo il lancio.
Utilizzando le librerie dinamiche, i programmi possono beneficiare di miglioramenti alle librerie che usano automaticamente perché il loro collegamento alle librerie è dinamico, non statico. Cioè, la funzionalità delle applicazioni client può essere migliorata ed estesa senza richiedere agli sviluppatori di app di ricompilare le applicazioni. Le app scritte per OS X beneficiano di questa caratteristica perché tutte le librerie di sistema in OS X sono librerie dinamiche. Questo è il modo in cui le app che usano le tecnologie Carbon o Cocoa beneficiano dei miglioramenti di OS X.
Un altro vantaggio che le librerie dinamiche offrono è che possono essere inizializzate quando vengono caricate e possono eseguire compiti di pulizia quando l’app client termina normalmente. Le librerie statiche non hanno questa caratteristica. Per i dettagli, vedere Inizializzatori e finalizzatori di moduli.
Un problema che gli sviluppatori devono tenere a mente quando sviluppano librerie dinamiche è mantenere la compatibilità con le applicazioni client quando una libreria viene aggiornata. Poiché una libreria può essere aggiornata senza che lo sviluppatore dell’applicazione client ne sia a conoscenza, l’applicazione deve essere in grado di utilizzare la nuova versione della libreria senza modifiche al suo codice. A tal fine, l’API della libreria non dovrebbe cambiare. Tuttavia, ci sono volte in cui i miglioramenti richiedono modifiche alle API. In questo caso, la versione precedente della libreria deve rimanere nel computer dell’utente affinché l’applicazione client funzioni correttamente. Dynamic Library Design Guidelines esplora l’argomento della gestione della compatibilità con le app client quando una libreria dinamica si evolve.