# Biblioteca informàtica

Biblioteca informàtica (de l'anglès software library) o programoteca és un conjunt de subprogrames utilitzats per desenvolupar programari. Les biblioteques contenen codi i dades que proporcionen serveis a programes independents, és a dir, passen a formar part d'aquests. Això permet que el codi i les dades es comparteixin i es puguin modificar de forma modular. Alguns programes executables poden ser alhora programes independents i programoteques, però la majoria d'aquestes no són executables. Executables i programoteques fan referències (trucades enllaços) entre si a través d'un procés conegut com a enllaç, que generalment és realitzat per un programari anomenat enllaçador.
La majoria dels sistemes operatius moderns proporcionen programoteques que implementen la majoria dels serveis del sistema. D'aquesta manera, aquests serveis es converteixen en una " matèria primera " que qualsevol aplicació moderna espera que el sistema operatiu ofereixi. Com a tal, la major part del codi utilitzat per les aplicacions modernes s'ofereix en aquestes biblioteques.

## Nota terminològica

Tot sovint es fa servir erròniament el barbarisme llibreria per referir-se a una programoteca o biblioteca informàtica, per la similitud amb l'original anglès library, però aquest ús de la paraula llibreria en català és un absurd. En la seva entrada per a llibreria, l'Enciclopèdia Catalana refereix l'usuari al terme biblioteca per l'accepció informàtica (vegeu llibreria, i biblioteca). El terme "llibreria" no apareix en aquella accepció ni al TermCat (una cerca del terme anglès "software library" dona com a únic resultat en català el terme «programoteca»), ni al Diccionari de l'Institut d'Estudis Catalans (DIEC). Per tant, el terme correcte és «programoteca» o «biblioteca informàtica», la primera perquè és una paraula ideal i nostrada per descriure el concepte, i l'última perquè és la traducció lògica i correcta de software library.
També és habitual referir-s'hi amb el terme d'origen anglosaxó «toolkit» (conjunt, equip, maletí, caixa, estoig, joc (kit) d'eines).
La proposta del TermCat del terme neològic «programoteca» és altament recomanable, ja que ens dona una sola paraula per a definir un concepte inconfusible, mentre que en el terme "biblioteca informàtica" se'n necessiten dues, de paraules, per distingir-la definitivament de la biblioteca convencional, la de llibres. En cap cas no s'hauria d'usar ni el barbarisme "llibreria" ni "llibreter", ja que aquesta última paraula significa, clar i català, la persona que porta una llibreria, és a dir, una botiga on es venen llibres.

## Història

Els primers conceptes de programació similars a les programoteques intentaven separar les definicions de dades de la implementació del programa. El concepte «compool» (Communication Pool) va ser popularitzat per Jovial el 1959, encara que va manllevar la idea del programari dels grans sistemes SAGE. Seguint els principis de les ciències de la computació de "separació de problemes" (aïllar problemes petits fàcils d'abordar) i " ocultació d'informació ", "el propòsit del COMPOOL és permetre l'intercanvi de dades del sistema entre diversos programes, proporcionant una descripció centralitzada dels mateixos".
COBOL va incloure un "sistema primitiu de programoteques" l'any 1959 (Wexelblat 1981:274), però Jean Sammet les va descriure retrospectivament com a "recursos insuficients de programoteques".
Una altra de les grans contribucions al concepte modern de programoteca va ser la innovació de subprograma de FORTRAN. Aquests poden ser compilats amb independència els uns dels altres, el compilador no té un enllaçador, de manera que la revisió de tipus entre els subprogrames resulta impossible (Wilson et. El 1988:126).
Finalment, s'ha de parlar de la influència que Simula 67 va tenir en el concepte de 'programoteca'. Simula és el primer llenguatge de programació orientada a objectes, i les seves classes són gairebé idèntiques que el concepte actual que s'utilitza en Java, C++ i C #. El concepte de classe de Simula va ser també l'origen del "paquet" a Ada i el "mòdul" de Modula-2. Tot i haver estat desenvolupat el 1965, les classes de Simula podien ser incloses en fitxers de programoteca i afegides en temps de compilació.

## Tipus
### Programoteques estàtiques

Històricament, les biblioteques informàtiques només podien ser estàtiques. Una programoteca estàtica, també coneguda com a fitxer, consisteix en un conjunt de rutines que es copien en una aplicació pel compilador o l'enllaçador, produint fitxers amb codi objecte i un fitxer executable independent. Aquest procés, i el fitxer executable, es coneix com una construcció estàtica de l'aplicació objectiu. La direcció real, les referències per a salts i altres crides a rutines s'emmagatzemen en una direcció relativa o simbòlica, que no pot resoldre fins que tot el codi i les programoteques són assignades a adreces estàtiques finals.
L'enllaçador resol totes les adreces no resoltes convertint-les en direccions fixes o relocalitzar (des d'una base comuna) carregant tot el codi i les programoteques en posicions de memòria en temps d'execució. Aquest procés d'enllaçat pot durar fins i tot més temps que el procés de compilació, i ha de ser realitzat cada vegada que algun dels mòduls és recompilar. La majoria dels llenguatges compilats tenen programoteca estàndard (per exemple, la biblioteca estàndard de C), però els programadors també poden crear les seves pròpies programoteques personalitzades. Els compiladors comercials proporcionen tant les programoteques estàndard com les personalitzades.
Un enllaçador pot treballar sobre tipus específics de fitxers objecte i, per tant, requereix tipus específics (compatibles) de biblioteques. Els fitxers objecte recopilats en una programoteca es poden distribuir i utilitzar fàcilment. Un client, ja sigui un programa o una programoteca de subrutines, accedeix a una programoteca objecte referenciant-la només pel seu nom. El procés d'enllaçat resol les referències buscant a les biblioteques de l'ordre donat. En general, no es considera un error si un nom pot trobar-se diverses vegades en un determinat conjunt de progrmoteques.

### Programoteques dinàmiques

Enllaç dinàmic significa que les subrutines d'una programoteca són carregades en un programa en temps d'execució, en lloc de ser enllaçades en temps de compilació, i es mantenen com fitxers independents separats del fitxer executable del programa principal. L'enllaçador realitza una mínima quantitat de treball en temps de compilació, enregistra quines rutines de la biblioteca necessita el programa i l'índex de noms o números de les rutines a la biblioteca. La major part de la tasca d'enllaçat es realitza en el moment en què l'aplicació es carrega (temps de càrrega, o loadtime) o durant l'execució (temps d'execució, o runtime). El necessari codi enllaçat, cridat pel carregador, és de fet part del sistema operatiu subjacent. En el moment adequat el carregador localitza les programoteques en el disc i afegeix les dades rellevants d'aquestes en l'espai de memòria del procés.
Alguns sistemes operatius només poden enllaçar una programoteca en temps de càrrega, abans que el procés comenci la seva execució, altres són capaços d'esperar fins després que el procés hagi començat a executar i enllaçar la biblioteca només quan efectivament es fa referència a ella (és a dir, en temps d'execució). Això últim s'anomena "retard de càrrega". En qualsevol cas, aquesta biblioteca és una biblioteca enllaçada dinàmicament.
L'enllaç dinàmic, per la seva naturalesa, té tan sols les limitacions establertes per les llicències de programari.
Els connectors són d'ús comú en les programoteques enllaçades dinàmicament, i són especialment útils quan unes programoteques poden ser substituïdes per altres amb una interfície similar, però diferent funcionalitat. Es pot dir que un programari té una "arquitectura de plugin" si s'utilitzen programoteques amb una funcionalitat bàsica amb la intenció que puguin ser substituïdes. No obstant això, l'ús de les programoteques enllaçades dinàmicament en l'arquitectura d'una aplicació no vol dir necessàriament que puguin ser substituïdes.
L'enllaç dinàmic es va desenvolupar originalment en els sistemes operatius Multics a partir de 1964. Es tractava d'una característica del MTS (Michigan Terminal System), construït a finals dels 60. En Microsoft Windows, les biblioteques enllaçades dinàmicament s'anomenen DLL (dynamic-link library o biblioteca d'enllaç dinàmic).

#### Relocalització

Un dels problemes que el carregador ha de gestionar és que la localització real de les dades de la biblioteca no es pot conèixer fins que l'executable i totes les biblioteques dinàmiques que s'han enllaçat han estat carregades en memòria. Això és degut al fet que les localitzacions en memòria depenen de quines programoteques dinàmiques s'han carregat. No és possible dependre de la direcció absoluta de les dades en el programa, ni fins i tot a la programoteca, ja que podria sorgir un conflicte entre les diferents programoteques: si dues d'elles utilitzessin les mateixes adreces o les seves adreces es solaparen, seria impossible utilitzar totes dues al mateix programa.
No obstant això, en la pràctica, en molts dels sistemes les programoteques no canvien freqüentment. Per tant, és possible calcular una adreça de càrrega probable per a cada programoteca compartida en el sistema abans que sigui utilitzada, i emmagatzemar aquesta informació a programoteques i executables. Si cada programoteca que és carregada és tractada així, llavors cadascuna d'elles serà carregada en direccions predeterminades, el que accelera el procés d'enllaç dinàmic. Aquesta optimització es coneix com a Prebinding en Mac OS X i Prelinking a Linux. Els desavantatges d'aquesta tècnica són el temps requerit de càlcul preliminar de les adreces cada vegada que les programoteques compartides canvien, la incapacitat d'utilitzar tècniques com l'aleatorització dels espais d'adreces, i el consum d'espai virtual d'adreces (un problema que queda mitigat per l'ús d'arquitectures de 64 bits, si més no en l'actualitat).
Un antic mètode era examinar el programa en temps de càrrega. Una vegada que totes les programoteques fossin carregades, es reemplaçaven totes les referències a dades a les programoteques, amb punters a localitats de memòria apropiats. Al Windows 3.1 (i en alguns sistemes encastats com les calculadores Texas Instruments), les referències eren manejades com a llistes lligades, permetent la fàcil enumeració i reemplaçament. Ara, la majoria de les programoteques dinàmiques lliguen una taula de símbols amb adreces en blanc dins del programa en temps de compilació. Totes les referències a codis o dades a la programoteca passen a través d'aquesta taula. En temps de càrrega, la taula és modificada amb la direcció de les dades/codi pel linker. Aquest procés és lent i afecta significativament la velocitat dels programes que diuen contínuament a altres programes, tal com alguns scripts de shell.
La programoteca conté una taula de salts de tots els mètodes que conté, anomenats punts d'entrada. Les trucades dins de la programoteca "salten al llarg" de la taula, buscant la ubicació del codi en memòria, i a continuació sol·licitant. Aquestes sol·licituds suposen un sobre-esforç, però el retard és habitualment tan petit que és menyspreable.

#### Localització de programoteques en temps d'execució

Els enllaçadors/carregadors dinàmics tenen una funcionalitat molt àmplia. Alguns depenen de rutes explícites a les programoteques emmagatzemades en els executables. Qualsevol canvi en la nomenclatura o el disseny del sistema de fitxers farà que aquests sistemes fallin. Normalment només s'emmagatzema en l'executable el nom de la programoteca (no la ruta), i el sistema operatiu el que proporciona el mecanisme per trobar la programoteca en el disc mitjançant certs algorismes.
Un dels desavantatges de l'enllaç dinàmic és que el funcionament correcte dels executables depèn d'una sèrie de programoteques emmagatzemades de forma aïllada. Si la programoteca és esborrada, moguda o reanomenada, o si una versió incompatible de DLL és copiada en una ubicació que apareix abans en la ruta de cerca, el programa no es podrà carregar. Al Windows això es coneix en anglès com a DLL hell ("Infern de DLL").

##### Sistemes Unix

La major part dels sistemes tipus Unix disposen d'una "ruta de cerca" que especifica els directoris del sistema de fitxers en què buscar les programoteques dinàmiques. En alguns sistemes, la ruta per defecte és especificada en un fitxer de configuració, en altres, està codificada a foc (hard coded) al carregador dinàmic. Alguns formats de fitxer executable trobareu directoris addicionals en els de buscar les programoteques d'un determinat programa. Això pot ser normalment alterat per una variable d'entorn, encara que és deshabilitat per a programes que tinguin setuid o setgid, de manera que l'usuari no pot forçar a aquest programa a executar un codi arbitrari. És aconsellable que els desenvolupadors de programoteques posin les seves programoteques dinàmiques en directoris que es troben en la ruta de cerca per defecte. Per contra, això pot fer problemàtica la instal·lació de noves programoteques, ja que fa que aquests directoris creixin molt fent complicada la seva gestió.

### Llibreries remotes

Una altra solució al problema de les programoteques és utilitzar executables completament separats (often in some lightweight form) i anomenar-les usant una trucada de procedència remota (RPC) sobre la xarxa a una altra ordinador

## Referències

* ↑ Enciclopèdia catalana. «Definició de llibreria».
* ↑ «Biblioteca informàtica». Gran Enciclopèdia Catalana. Barcelona: Grup Enciclopèdia Catalana.
* ↑ Una cerca del terme anglès "software library" dona com a únic resultat en català el terme "programoteca".
* ↑ Accepcions pel terme "llibreria" al DIEC
* ↑ Wexelblat, 1981, p. 369.
* ↑ Wexelblat, 1981, p. 258.
* ↑ Wilson i Clark, 1988, p. 52.
* ↑ Wexelblat, 1981, p. 716.
* ↑ «Static Libraries». TLDP. [Consulta: 3 octubre 2013].
* ↑ «A History of MTS». Information Technology Digest, 5, núm. 5.

## Vegeu també

* Biblioteca d'algoritmes de geometria computacional
* C standard library
* OpenCV

## Bibliografia

* Wexelblat, Richard. History of Programming Languages. Nova York, NY: Academic Press (A subsidiary of Harcourt Brace), 1981, p. 369. ISBN 0-12-745040-8.
* Wilson, Leslie B.; Clark, Robert G. Comparative Programming Languages. Wokingham, England: Addison-Wesley, 1988, p. 126. ISBN 0-201-18483-4.