Articulo de referencia

Biblioteca (informática)

Ilustración de una aplicación que utiliza libvorbisfile para reproducir un archivo Ogg Vorbis. En informática , una biblioteca es un conjunto de recursos que se pueden utilizar ...

Ilustración de una aplicación que utiliza libvorbisfile para reproducir un archivo Ogg Vorbis.

En informática , una biblioteca es un conjunto de recursos que se pueden utilizar durante el desarrollo de software para implementar un programa informático . Generalmente, una biblioteca consta de código ejecutable , como funciones y clases compiladas , o bien, puede ser una colección de código fuente . Una biblioteca de recursos puede contener datos como imágenes y texto .

Una biblioteca puede ser utilizada por múltiples usuarios independientes (programas y otras bibliotecas). Esto difiere de los recursos definidos en un programa, que generalmente solo pueden ser utilizados por ese programa. Cuando un usuario utiliza un recurso de la biblioteca, obtiene su valor sin necesidad de implementarla. Las bibliotecas fomentan la reutilización de software de forma modular . Las bibliotecas pueden utilizar otras bibliotecas, lo que da lugar a una jerarquía de bibliotecas dentro de un programa.

Al escribir código que utiliza una biblioteca, un programador solo necesita saber cómo usar la interfaz de programación de aplicaciones (API) de dicha biblioteca, sin comprender su funcionamiento interno. Por ejemplo, un programa podría usar una biblioteca que abstraiga una llamada al sistema compleja , de modo que el programador pueda usar la función del sistema sin tener que dedicar tiempo a aprender las complejidades de la función.

Historia

La idea de una biblioteca informática se remonta a las primeras computadoras creadas por Charles Babbage . Un artículo de 1888 sobre su Máquina Analítica sugería que las operaciones informáticas podían perforarse en tarjetas separadas de la entrada numérica. Si estas tarjetas perforadas se guardaban para su reutilización, entonces "gradualmente la máquina tendría su propia biblioteca". [ 1 ]

Una mujer trabaja junto a un archivador que contiene la biblioteca de subrutinas en rollos de cinta perforada para la computadora EDSAC.

En 1947, Goldstine y von Neumann especularon que sería útil crear una "biblioteca" de subrutinas para su trabajo en la máquina IAS , una computadora primitiva que aún no estaba operativa en ese momento. [ 2 ] Imaginaron una biblioteca física de grabaciones en cables magnéticos , donde cada cable almacenaría código informático reutilizable. [ 3 ]

Inspirados por von Neumann, Wilkes y su equipo construyeron EDSAC . Un archivador de cinta perforada contenía la biblioteca de subrutinas para esta computadora. [ 4 ] Los programas para EDSAC consistían en un programa principal y una secuencia de subrutinas copiadas de la biblioteca de subrutinas. [ 5 ] En 1951, el equipo publicó el primer libro de texto sobre programación, The Preparation of Programs for an Electronic Digital Computer , que detallaba la creación y el propósito de la biblioteca. [ 6 ]

COBOL incluía "capacidades primitivas para un sistema de biblioteca" en 1959, [ 7 ] pero Jean Sammet las describió retrospectivamente como "instalaciones de biblioteca inadecuadas". [ 8 ]

JOVIAL tiene un grupo de comunicación (COMPOOL), que es básicamente una biblioteca de archivos de cabecera.

Otro factor importante que contribuyó al concepto moderno de biblioteca fue la innovación de los subprogramas de FORTRAN . Los subprogramas de FORTRAN se pueden compilar de forma independiente, pero el compilador carecía de un enlazador . Por lo tanto, antes de la introducción de los módulos en Fortran-90, la verificación de tipos entre subprogramas de FORTRAN [ NB 1 ] era imposible. [ 9 ]

A mediados de la década de 1960, las bibliotecas de copia y macros para ensambladores eran comunes. Con la popularidad del IBM System/360 , también se generalizaron las bibliotecas que contenían otros tipos de elementos de texto, como parámetros del sistema.

En el sistema operativo OS/360 de IBM y sus sucesores, esto se denomina conjunto de datos particionado .

El primer lenguaje de programación orientado a objetos , Simula , desarrollado en 1965, permitía agregar clases a las bibliotecas a través de su compilador. [ 10 ] [ 11 ]

Enlace

El proceso de enlace resuelve las referencias conocidas como símbolos (o enlaces ) buscándolas en diversas ubicaciones, incluidas las bibliotecas configuradas. Si un enlazador no encuentra un símbolo, falla, pero la presencia de múltiples coincidencias puede o no provocar un fallo.

El enlace estático se realiza durante la compilación , de modo que el código ejecutable de la biblioteca se incluye en el programa. El enlace dinámico se realiza durante la ejecución ; implica compilar el programa con información que permita el enlace en tiempo de ejecución a una biblioteca de enlace dinámico (DLL). Para el enlace dinámico, el programa debe tener disponible un archivo DLL compatible durante la ejecución, mientras que para el enlace estático, el programa es independiente.

La vinculación inteligente la realiza una herramienta de compilación que excluye el código no utilizado durante el proceso. Por ejemplo, un programa que solo utiliza números enteros para operaciones aritméticas, o que no realiza ninguna, puede excluir las rutinas de la biblioteca de punto flotante. Esto puede resultar en un archivo de programa más pequeño y un menor consumo de memoria.

Reubicación

Algunas referencias en un programa o módulo de biblioteca se almacenan de forma relativa o simbólica, lo que impide su resolución hasta que se asignen direcciones estáticas finales a todo el código y las bibliotecas. La reubicación es el proceso de ajustar estas referencias, y la realiza el enlazador o el cargador . En general, no es posible reubicar bibliotecas individuales, ya que sus direcciones en memoria pueden variar según el programa que las utilice y las demás bibliotecas con las que se combinen. El código independiente de la posición evita las referencias a direcciones absolutas y, por lo tanto, no requiere reubicación.

Categorías

Ejecutable

Una biblioteca ejecutable consiste en código que se ha convertido de código fuente a código máquina o a una forma intermedia como el bytecode . Un enlazador permite usar objetos de biblioteca asociando cada referencia con la dirección donde se encuentra el objeto. Por ejemplo, en C , una función de biblioteca se invoca mediante la sintaxis y la semántica de llamada a función normales de C. [ 12 ]

Una variante es una biblioteca que contiene código compilado (código objeto en la nomenclatura de IBM) en un formato que el sistema operativo no puede cargar, pero que el enlazador sí puede leer.

Estático

Una biblioteca estática es una biblioteca ejecutable que se enlaza a un programa en tiempo de compilación mediante un enlazador (o como se llame la herramienta de compilación que realiza el enlace). [ 13 ] [ 14 ] Este proceso, y el archivo independiente resultante, se conoce como compilación estática del programa. Una compilación estática puede no requerir ninguna reubicación adicional si se utiliza memoria virtual y no se desea la aleatorización del espacio de direcciones . [ 15 ]

En los sistemas tipo Unix, una biblioteca estática a veces se denomina archivo .

Dinámica

Una biblioteca dinámica se enlaza cuando se ejecuta el programa , ya sea al cargarlo o al ejecutarlo . La biblioteca dinámica se concibió después de la biblioteca estática para brindar mayor flexibilidad en la implementación del software .

Fuentes

Una biblioteca de código fuente consta de código fuente, no de código compilado.

Compartido

Una biblioteca compartida es una biblioteca que contiene código ejecutable diseñado para ser utilizado por múltiples programas informáticos u otras bibliotecas en tiempo de ejecución , con una sola copia de ese código en memoria, compartida por todos los programas que utilizan el código. [ 16 ] [ 17 ] [ 18 ]

Objeto

Aunque hoy en día se considera una tecnología obsoleta, una biblioteca de objetos expone recursos para la programación orientada a objetos (POO), y un objeto distribuido es una biblioteca de objetos remota. Algunos ejemplos son: COM /DCOM, SOM /DSOM, DOE , PDO y diversos sistemas basados ​​en CORBA .

La tecnología de bibliotecas de objetos se desarrolló a medida que la programación orientada a objetos (POO) se popularizó, al hacerse evidente que la vinculación en tiempo de ejecución requería información que las bibliotecas contemporáneas no proporcionaban. Además de los nombres y puntos de entrada del código, debido a la herencia, la vinculación en POO también requiere una lista de dependencias , ya que la definición completa de un método puede encontrarse en diferentes lugares. Además, esto requiere más que simplemente indicar que una biblioteca necesita los servicios de otra. En POO, las propias bibliotecas pueden ser desconocidas en tiempo de compilación y varían de un sistema a otro.

La tecnología de objetos remotos se desarrolló paralelamente para dar soporte a programas de múltiples niveles con una aplicación de interfaz de usuario que se ejecuta en un ordenador personal (PC) utilizando servicios de un ordenador central o miniordenador , como el almacenamiento y el procesamiento de datos. Por ejemplo, un programa en un PC enviaría mensajes a un miniordenador mediante una llamada a procedimiento remoto (RPC) para recuperar muestras relativamente pequeñas de un conjunto de datos relativamente grande. En respuesta, se desarrolló la tecnología de objetos distribuidos.

Clase

Una biblioteca de clases contiene clases que se pueden usar para crear objetos . En Java , por ejemplo, las clases se encuentran en archivos JAR y los objetos se crean en tiempo de ejecución a partir de las clases. Sin embargo, en Smalltalk , una biblioteca de clases es el punto de partida para una imagen del sistema que incluye todo el estado del entorno, las clases y todos los objetos instanciados. La mayoría de las bibliotecas de clases se almacenan en un repositorio de paquetes (como Maven Central para Java). El código del cliente especifica explícitamente las dependencias de las bibliotecas externas en los archivos de configuración de compilación (como un Maven Pom en Java). [ 19 ]

Remoto

Una biblioteca remota se ejecuta en otro ordenador y se accede a sus recursos mediante llamadas a procedimientos remotos (RPC) a través de una red. Esta arquitectura distribuida permite minimizar la instalación de la biblioteca y su mantenimiento en cada sistema usuario, además de garantizar un versionado coherente. Una desventaja importante es que cada llamada a la biblioteca implica una sobrecarga considerablemente mayor que la de una biblioteca local.

Tiempo de ejecución

Una biblioteca de tiempo de ejecución proporciona acceso al entorno de ejecución disponible para un programa , adaptado a la plataforma anfitriona .

Estándar de idioma

Muchos lenguajes de programación modernos especifican una biblioteca estándar que proporciona un nivel básico de funcionalidad para el entorno del lenguaje.

Generación de código

Una biblioteca de generación de código tiene una API de alto nivel que genera o transforma código de bytes para Java . Se utilizan en la programación orientada a aspectos , en algunos marcos de acceso a datos y para pruebas con el fin de generar objetos proxy dinámicos. También se utilizan para interceptar el acceso a campos. [ 20 ]

Nomenclatura de archivos

Similar a Unix

En la mayoría de los sistemas modernos tipo Unix , los archivos de biblioteca se almacenan en directorios como /lib, /usr/liby /usr/local/lib. Un nombre de archivo normalmente comienza con lib, y termina con .apara una biblioteca estática ( archivo ) o .sopara un objeto compartido (biblioteca de enlace dinámico). Por ejemplo, libfoo.ay libfoo.so.

A menudo, los archivos de enlace simbólico se utilizan para gestionar el versionado de una biblioteca, proporcionando un archivo de enlace sin versión que enlaza con un archivo con versión. Por ejemplo, libfoo.so.2podría ser la versión 2 de la biblioteca foo y un archivo de enlace con libfoo.soun nombre independiente de la versión para ese archivo al que enlazan los programas. El archivo de enlace podría modificarse para que haga referencia a la versión 3 ( libfoo.so.3), de modo que los programas que la utilicen puedan usar la versión 3 sin tener que modificar el programa.

Los archivos con esta extensión .lason archivos de libtool ; el sistema no puede utilizarlos.

macOS

El sistema macOS hereda las convenciones de bibliotecas estáticas de BSD , con la biblioteca almacenada en un .aarchivo. Utiliza .soo .dylibpara bibliotecas dinámicas. Sin embargo, la mayoría de las bibliotecas en macOS consisten en "frameworks", ubicados dentro de directorios especiales llamados " bundles " que encapsulan los archivos y metadatos necesarios de la biblioteca. Por ejemplo, un framework llamado Abcse implementaría en un bundle llamado Abc.framework, donde Abc.framework/Abces el archivo de biblioteca vinculado dinámicamente o un enlace simbólico al archivo de biblioteca vinculado dinámicamente en Abc.framework/Versions/Current/Abc.

Windows

A menudo, una biblioteca de vínculos dinámicos (DLL) de Windows tiene la extensión de archivo , [ 21 ] aunque a veces se utilizan diferentes extensiones para indicar contenido general, por ejemplo, para una biblioteca OLE ..dll.ocx

Un .libarchivo puede ser una biblioteca estática o contener la información necesaria para compilar una aplicación que utilice la DLL asociada. En este último caso, el archivo DLL asociado debe estar presente en tiempo de ejecución.

Véase también

Notas

  1. Anteriormente era posible entre, por ejemplo, subprogramas de Ada.

Referencias

  1. Babbage, HP (1888-09-12). "La máquina analítica" . Actas de la Asociación Británica . Bath.
  2. Goldstine, Herman H. (31 de diciembre de 2008). La computadora de Pascal a von Neumann . Princeton: Princeton University Press. doi : 10.1515/9781400820139 . ISBN 978-1-4008-2013-9.
  3. Goldstine, Herman ; von Neumann, John (1947). Planificación y codificación de problemas para un instrumento de computación electrónica (Informe). Instituto de Estudios Avanzados. págs. 3, 21–22 . OCLC 26239859. Probablemente será muy importante desarrollar una extensa "biblioteca" de subrutinas .  
  4. Wilkes, MV (1951). "The EDSAC Computer" . 1951 International Workshop on Managing Requirements Knowledge . 1951 International Workshop on Managing Requirements Knowledge. IEEE. p. 79. doi : 10.1109/afips.1951.13 . 
  5. Campbell-Kelly, Martin (septiembre de 2011). "Elogio de 'Wilkes, Wheeler y Gill'"" . Communications of the ACM . 54 (9): 25– 27. doi : 10.1145/1995376.1995386 . S2CID 20261972 . 
  6. Wilkes, Maurice ; Wheeler, David ; Gill, Stanley (1951). La preparación de programas para una computadora digital electrónica . Addison-Wesley. págs. 45, 80–91 , 100. OCLC 641145988 .  
  7. Wexelblat, Richard (1981). Historia de los lenguajes de programación . Serie de monografías de la ACM. Nueva York, NY: Academic Press (una subsidiaria de Harcourt Brace ). pág . 274. ISBN  0-12-745040-8.
  8. Wexelblat, op. cit. , pag. 258
  9. Wilson, Leslie B.; Clark, Robert G. (1988). Lenguajes de programación comparativos . Wokingham, Inglaterra: Addison-Wesley. pág. 126. ISBN  0-201-18483-4.
  10. Wilson y Clark, op. cit. , pág. 52
  11. Wexelblat, op. cit. , pag. 716
  12. Deshpande, Prasad (2013). Detección metamórfica mediante análisis de grafos de llamadas a funciones (Tesis). Biblioteca de la Universidad Estatal de San José. doi : 10.31979/etd.t9xm-ahsc .
  13. "Bibliotecas estáticas" . TLDP. Archivado del original el 3 de julio de 2013. Consultado el 3 de octubre de 2013 .
  14. Kaminsky, Dan (2008). «Capítulo 3: Formatos de ejecutables portátiles y de enlace» . Ingeniería inversa de código con IDA Pro . Elsevier. págs. 37–66 . doi : 10.1016/b978-1-59749-237-9.00003-x . ISBN  978-1-59749-237-9. Consultado el 27 de mayo de 2021 .
  15. Collberg, Christian; Hartman, John H.; Babu, Sridivya; Udupa, Sharath K. (2003). SLINKY: Enlace estático recargado . USENIX '05. Departamento de Ciencias de la Computación, Universidad de Arizona . Archivado del original el 23 de marzo de 2016. Recuperado el 17 de marzo de 2016 .
  16. Levine, John R. (2000). "9. Bibliotecas compartidas". Enlazadores y cargadores . ISBN 1-55860-496-0.
  17. Guía del programador del sistema UNIX V/386 versión 3.2, vol. 1 (PDF) . Prentice Hall. 1989. págs . 8-2 . ISBN  0-13-944877-2.
  18. "Bibliotecas compartidas en SunOS" (PDF) . págs. 1, 3. 
  19. Dietrich, Jens; Pearce, David; Stringer, Jacob; Tahir, Amjed; Blincoe, Kelly (2019). "Control de versiones de dependencias en entornos reales". 2019 IEEE/ACM 16.ª Conferencia Internacional sobre Minería de Repositorios de Software (MSR) . págs. 349–359 . Bibcode : 2019msr..conf...67D . doi : 10.1109/MSR.2019.00061 . ISBN  978-1-7281-3412-3.
  20. "Biblioteca de generación de código" . SourceForge . Archivado del original el 12/01/2010 . Consultado el 03/03/2010 . La biblioteca de generación de código de bytes es una API de alto nivel para generar y transformar código de bytes de Java. Se utiliza en marcos de trabajo de AOP, pruebas y acceso a datos para generar objetos proxy dinámicos e interceptar el acceso a campos.
  21. Bresnahan, Christine; Blum, Richard (27 de abril de 2015). Guía de estudio para la certificación LPIC-1 del Linux Professional Institute: Examen 101-400 y examen 102-400 . John Wiley & Sons (publicado en 2015). pág. 82. ISBN  9781119021186Archivado del original el 24/09/2015 . Consultado el 03/09/2015 . Las bibliotecas compartidas de Linux son similares a las bibliotecas de vínculos dinámicos (DLL) de Windows. Las DLL de Windows suelen identificarse mediante .dllextensiones de archivo.

Lecturas adicionales

  • Levine, John R. (2000) [octubre de 1999]. «Capítulo 9: Bibliotecas compartidas y Capítulo 10: Enlace y carga dinámicos». Enlazadores y cargadores . Serie Morgan Kaufmann de ingeniería de software y programación (1.ª  ed.). San Francisco, EE. UU.: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC 42413382 . Consultado el 12 de enero de 2020 . {{cite book}}: CS1 maint: servicio de archivado obsoleto ( enlace ) Código:Errata:
  • Artículo Guía para principiantes sobre conectores por David Drysdale
  • Artículo " Inicio más rápido de programas C++ mediante la mejora de la eficiencia del enlace en tiempo de ejecución" por Léon Bottou y John Ryland
  • Cómo crear bibliotecas de programas por Baris Simsek
  • BFD - la biblioteca de descriptores de archivos binarios
  • Primer taller de diseño de software centrado en bibliotecas LCSD'05 Archivado el 28/08/2019 en Wayback Machine en OOPSLA'05
  • Segundo taller de diseño de software centrado en bibliotecas LCSD'06 en OOPSLA'06
  • Cómo crear una biblioteca compartida por Ulrich Drepper (con mucha información de contexto)
  • Anatomía de las bibliotecas dinámicas de Linux en IBM.com