Tietotekniikassa **kirjastot** (mm. ohjelmakirjasto, luokkakirjasto) ovat kokoelmia, aliohjelmia, luokkia ja/tai ohjelmia, joita käytetään tietokoneohjelmien modulaarisessa kehittämisessä sekä ohjelmien suorittamisen aikana. Kirjastoissa olevia (ali)ohjelmia ei yleensä suoriteta itsenäisesti, vaan niissä olevia palveluita käytetään itsenäisesti suoritettavien ohjelmien apuna.

Erityyppisiä kirjastoja ovat:

* jaettu kirjasto
* staattinen kirjasto

Kirjastot pääasiassa jakautuvat kahteen tyyppiin: osana ohjelmaa kiinteästi oleva staattinen kirjasto ja dynaamisesti linkitettävä jaettu kirjasto. Staattinen kirjasto on käännöksen yhteydessä linkitettävä ohjelmamoduuli. Jaettujen kirjastojen tyyppi riippuu tyypillisesti käyttöjärjestelmästä, mutta myös kielen suoritusympäristön (virtuaaliympäristön) ratkaisuista.

Kirjastoihin sijoitettavia ohjelmatoimintoja voi olla yhtä paljon kuin sovellusratkaisujakin: lähes mikä vain ohjelmointiteknisesti mahdollinen toiminto on mahdollista sijoittaa ohjelmakirjastoon.

Kirjastoissa olevia *symboleita* käytetään päättelemään mitkä muuttujat tai ohjelmakoodi on jaettua. Symbolit voivat olla suojattuja käytöltä.

Jaettu kirjasto
---------------

**Jaettu kirjasto** tai **ajonaikainen kirjasto** on tietotekniikassa useiden käyttöjärjestelmien tapa jakaa ohjelmakoodia useiden ohjelmien kesken.

* Microsoft Windows käyttää *Dynamic-link library* -kirjastoja (DLL).
* Useat Unix-tyyppiset käyttöjärjestelmät kuten Linux käyttävät *Shared Object* -kirjastoja (SO).

Jaettujen kirjastojen etuna on keskusmuistin ja levytilan säästö. Levytilaa säästyy koska samaa ohjelmakoodia ei tarvitse linkittää jokaiseen ohjelmaan erikseen, vaan ne ladataan ajonaikana yhteisestä kirjastosta. Keskusmuistia säästyy jos käyttöjärjestelmä osaa jakaa kirjaston myös keskusmuistissa. Tällöin kahden tai useamman ohjelman käyttäessä samaa kirjastoa, ladataan siitä jaettuun muistiin vain yksi kopio ja kaikki käyttävät samaa jaettua muistialuetta.

Jaettujen kirjastojen kanssa voi käyttää kahta tapaa:

* dynaaminen linkitys: käyttöjärjestelmä lataa kirjaston ohjelman käynnistyessä (jos se ei ole jo muistissa)
* dynaaminen lataus: ohjelma lataa tietyn kirjaston (jos se ei ole jo ladattu) ja kutsuu valikoivasti sen toimintoja

Linuxissa on mahdollista:

* päivittää uuteen kirjastoon ja säilyttää vanha versio yhteensopivuuden vuoksi.
* ohittaa tietyt kirjastot tai jopa tietyt funktiot kirjastossa kun tiettyä ohjelmaa suoritetaan.
* nämä ovat mahdollisia samaan aikaan kun toiset ohjelmat käyttävät olemassa olevia.

### Ongelmat

Jaetun kirjaston menetelmällä on haittavaikutuksia liittyen saman kirjaston eri versioiden hallintaan. Eri käyttöjärjestelmät käyttävät eri strategioita kirjastojen hallintaan. Mikäli kirjaston rajapinta muuttuu on säilöttävä sekä edeltävä että seuraava versio jotta eri ohjelmaversiot voivat jatkossakin käyttää samaa kirjastoa.

Windowsin DLL-kirjastojen toteutustavan johdosta siihen liitetään usein termi *DLL-helvetti* (engl. *DLL hell*). Eräs syy ongelmaan on kirjastojen epämääräinen versiointi.
Ongelmaan esitetty ratkaisuja, mutta ne eivät ole aukottomasti välttäneet ongelmia. Ratkaisutavat muun muassa ovat lisänneet levytilan tarvetta, joka oli yksi syy jaettujen kirjastojen käytölle.
Ratkaisuna esitetään DLL-kirjastojen sijaan staattisten kirjastojen käyttöä.

Staattinen kirjasto
-------------------

**Staattinen kirjasto** on yksinkertaisesti joukko objektitiedostoja. Staattisilla kirjastoilla ei ole jaettujen kirjastojen etuja.
Kääntäjän tuottamat objektitiedostot liitetään yhteen tarkoitukseen sopivalla komennolla kuten *ar*.

Staattista kirjastoa tarvitaan vain ohjelman käännöksen aikana sen linkitysvaiheessa (ks. linkkeriohjelma): tämän jälkeen kirjaston sisältämä koodi on ohjelman sisällä. Staattisella linkityksellä jokaisella ohjelmalla on oma kopionsa kirjastosta.

Katso myös
----------

* Standardikirjasto

Lähteet
-------

1. ↑  John Ousterhout: Linkers and Dynamic Linking *web.stanford.edu*.  2016. Viitattu 13.11.2021. (englanniksi)
2. 1 2  Liu Zhipeng, Ban Huaiyun, Guan Xiaofeng, Zhang Qingshan: Part 1 – Introduction to symbol visibility *developer.ibm.com*.  12.6.2013. Viitattu 13.11.2021. (englanniksi)
3. 1 2 3  Anatomy of Linux dynamic libraries *developer.ibm.com*.  Arkistoitu. Viitattu 18.9.2020. (englanniksi)
4. ↑  3. Shared Libraries *tldp.org*. Viitattu 18.9.2020. (englanniksi)
5. ↑  Ron Burk: A Brief History of Windows Programming Revolutions *drdobbs.com*.  1.12.2009. Viitattu 18.9.2020. (englanniksi)
6. 1 2 3  Stefan Worthmuller: No End to DLL Hell! *drdobbs.com*.  2.9.2010. Viitattu 18.9.2020. (englanniksi)
7. 1 2 3  Stefan Worthmuller: No End to DLL Hell! (sivu 2) *drdobbs.com*.  2.9.2010. Viitattu 18.9.2020. (englanniksi)
8. 1 2  2. Static Libraries *tldp.org*. Viitattu 18.9.2020. (englanniksi)
9. ↑  1.3. Building a Static Library from the Command Line *oreilly.com*. Viitattu 18.9.2020. (englanniksi)
10. ↑  10 differences between static and dynamic libraries every C++ developer should know *acodersjourney.com*.  24.3.2019. Viitattu 18.9.2020. (englanniksi)