¿Qué son las bibliotecas dinámicas?
La mayor parte de la funcionalidad de una aplicación se implementa en bibliotecas de código ejecutable. Cuando una app se enlaza con una biblioteca utilizando un enlazador estático, el código que utiliza la app se copia en el archivo ejecutable generado. Un enlazador estático reúne el código fuente compilado, conocido como código objeto, y el código de la biblioteca en un archivo ejecutable que se carga en la memoria en su totalidad en tiempo de ejecución. El tipo de biblioteca que pasa a formar parte del archivo ejecutable de una aplicación se conoce como biblioteca estática. Las bibliotecas estáticas son colecciones o archivos de archivos de objetos.
Cuando se lanza una aplicación, el código de la misma -que incluye el código de las bibliotecas estáticas con las que se enlazó- se carga en el espacio de direcciones de la aplicación. La vinculación de muchas bibliotecas estáticas en una aplicación produce archivos ejecutables de gran tamaño. La figura 1 muestra el uso de memoria de una aplicación que utiliza funciones implementadas en bibliotecas estáticas. Las aplicaciones con archivos ejecutables de gran tamaño sufren de tiempos de lanzamiento lentos y grandes huellas de memoria. Además, cuando una biblioteca estática se actualiza, sus aplicaciones cliente no se benefician de las mejoras introducidas. Para acceder a la funcionalidad mejorada, el desarrollador de la aplicación debe enlazar los archivos de objetos de la aplicación con la nueva versión de la biblioteca. Y los usuarios de la aplicación tendrían que sustituir su copia de la misma por la última versión. Por lo tanto, mantener una aplicación actualizada con la última funcionalidad proporcionada por las bibliotecas estáticas requiere un trabajo disruptivo tanto para los desarrolladores como para los usuarios finales.
Un enfoque mejor es que una aplicación cargue el código en su espacio de direcciones cuando realmente se necesita, ya sea en tiempo de lanzamiento o en tiempo de ejecución. El tipo de biblioteca que proporciona esta flexibilidad se llama biblioteca dinámica. Las bibliotecas dinámicas no están vinculadas estáticamente a las aplicaciones cliente; no forman parte del archivo ejecutable. En su lugar, las bibliotecas dinámicas pueden cargarse (y enlazarse) en una aplicación, ya sea cuando se lanza la aplicación o mientras se ejecuta.
La figura 2 muestra cómo la implementación de algunas funcionalidades como bibliotecas dinámicas en lugar de bibliotecas estáticas reduce la memoria utilizada por la aplicación después del lanzamiento.
Al utilizar las bibliotecas dinámicas, los programas pueden beneficiarse de las mejoras de las bibliotecas que utilizan de forma automática porque su enlace con las bibliotecas es dinámico, no estático. Es decir, la funcionalidad de las aplicaciones cliente puede mejorarse y ampliarse sin necesidad de que los desarrolladores de las aplicaciones las recompilen. Las aplicaciones escritas para OS X se benefician de esta característica porque todas las bibliotecas del sistema en OS X son bibliotecas dinámicas. Así es como las aplicaciones que utilizan tecnologías Carbon o Cocoa se benefician de las mejoras de OS X.
Otra de las ventajas que ofrecen las bibliotecas dinámicas es que se pueden inicializar cuando se cargan y pueden realizar tareas de limpieza cuando la aplicación cliente termina normalmente. Las bibliotecas estáticas no tienen esta característica. Para más detalles, consulte Inicializadores y finalizadores de módulos.
Un problema que los desarrolladores deben tener en cuenta al desarrollar bibliotecas dinámicas es mantener la compatibilidad con las aplicaciones cliente cuando se actualiza una biblioteca. Debido a que una biblioteca puede actualizarse sin el conocimiento del desarrollador de la aplicación cliente, la aplicación debe ser capaz de utilizar la nueva versión de la biblioteca sin cambios en su código. Para ello, la API de la biblioteca no debe cambiar. Sin embargo, hay veces que las mejoras requieren cambios en la API. En ese caso, la versión anterior de la biblioteca debe permanecer en el ordenador del usuario para que la app cliente se ejecute correctamente. Dynamic Library Design Guidelines explora el tema de la gestión de la compatibilidad con las aplicaciones cliente a medida que una biblioteca dinámica evoluciona.