Kirjasto (tietotekniikka)
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:
Kirjastot pääasiassa jakautuvat kahteen tyyppiin: osana ohjelmaa kiinteästi oleva staattinen kirjasto ja dynaamisesti linkitettävä jaettu kirjasto.[1] 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.[2] Symbolit voivat olla suojattuja käytöltä.[2]
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ö.[3] 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:[3]
- 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:[4]
- 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).[5][6] Eräs syy ongelmaan on kirjastojen epämääräinen versiointi.[6] Ongelmaan esitetty ratkaisuja, mutta ne eivät ole aukottomasti välttäneet ongelmia.[6][7] Ratkaisutavat muun muassa ovat lisänneet levytilan tarvetta, joka oli yksi syy jaettujen kirjastojen käytölle.[7] Ratkaisuna esitetään DLL-kirjastojen sijaan staattisten kirjastojen käyttöä.[7]
Staattinen kirjasto
Staattinen kirjasto on yksinkertaisesti joukko objektitiedostoja.[8] Staattisilla kirjastoilla ei ole jaettujen kirjastojen etuja.[8] Kääntäjän tuottamat objektitiedostot liitetään yhteen tarkoitukseen sopivalla komennolla kuten ar.[9]
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ä.[10] Staattisella linkityksellä jokaisella ohjelmalla on oma kopionsa kirjastosta.[3]
Katso myös
Lähteet
- John Ousterhout: Linkers and Dynamic Linking web.stanford.edu. 2016. Viitattu 13.11.2021. (englanniksi)
- 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)
- Anatomy of Linux dynamic libraries developer.ibm.com. Arkistoitu . Viitattu 18.9.2020. (englanniksi)
- 3. Shared Libraries tldp.org. Viitattu 18.9.2020. (englanniksi)
- Ron Burk: A Brief History of Windows Programming Revolutions drdobbs.com. 1.12.2009. Viitattu 18.9.2020. (englanniksi)
- Stefan Worthmuller: No End to DLL Hell! drdobbs.com. 2.9.2010. Viitattu 18.9.2020. (englanniksi)
- Stefan Worthmuller: No End to DLL Hell! (sivu 2) drdobbs.com. 2.9.2010. Viitattu 18.9.2020. (englanniksi)
- 2. Static Libraries tldp.org. Viitattu 18.9.2020. (englanniksi)
- 1.3. Building a Static Library from the Command Line oreilly.com. Viitattu 18.9.2020. (englanniksi)
- 10 differences between static and dynamic libraries every C++ developer should know acodersjourney.com. 24.3.2019. Viitattu 18.9.2020. (englanniksi)