Knihovna (programování)

Z Multimediaexpo.cz

Knihovna (angl. library) v programování je programový modul, který může být sdílen více programy. Obvykle obsahují především procedury, funkce, datové typy, třídy a zdroje (resources). Knihovna poskytuje aplikační rozhraní zvané API, které definuje, jak ji mohou programy používat.

Obsah

Typy knihoven

Z technického hlediska je možné rozdělit knihovny podle způsobu propojení s programem, který je bude využívat:

  • statická knihovna (static linking library)
  • dynamická knihovna (dynamic linking library)

Statické knihovny

Statické knihovny jsou spojovány linkerem v době sestavování programu. Linker do výsledného spustitelného souboru vloží všechen knihovní kód odkazovaný z kódu vlastního programu (tj. volané funkce) a rekurzivně funkce volané z těchto funkcí. Po technické stránce je statická knihovna archivem jednoho nebo více objektových souborů. Výsledkem je tedy jeden spustitelný soubor, který v sobě obsahuje část statické knihovny, která je nezbytná pro chod daného programu. Typickou příponou souboru statické knihovny je .lib nebo .a. Přípona závisí na použitém operačním systému a linkeru.

Dynamické knihovny

Při linkování programu s dynamickou knihovnu se do výsledného spustitelného souboru ukládají pouze tabulky odkazů na symboly definované v dynamické knihovně. Pro chod programu je pak nutno kromě vlastního programu mít na počítači nainstalovánu i příslušnou dynamickou knihovnu. Je také možné, aby dynamická knihovna využívala ke své činnosti jiné dynamické knihovny. Vzniká pak řetězec závislostí - všechny potřebné knihovny musí být přítomny. Při spouštění programu pak operační systém provádí tzv. dynamické linkování. Během tohoto procesu operační systém načítá do operační paměti jak kód vlastního programu (spustitelný soubor), tak i kód dynamické knihovny, kterou program vyžaduje ke své činnosti. Někdy je třeba provést tzv. relokaci, t. j. přemístění knihovny v adresovém prostoru programu. Relokace je nutná v případě, že dvě knihovny indikují stejné preferované místo v paměti; to vyžaduje opravu příslušných offsetů v tabulce odkazů, což zpomaluje načítání knihovny. Proto je třeba relokaci pokud možno předcházet volbou správných výchozích adres dynamických knihoven. Většina dnešních operačních systému dále umožňuje programům načítat knihovny do paměti až za běhu programu. Toho se dá využít například k implementaci plug-inů. Typickou příponou souboru obsahujících dynamickou knihovnu je .dll v Microsoft Windows a .so v různých Unixech a v Linuxu.

Srovnání statické a dynamické knihovny

  • Statická knihovna se spojuje se spustitelným souborem v době linkování programu, zatímco dynamická knihovna se spojuje se spustitelným souborem v době spuštění programu nebo až za jeho běhu.
  • Pokud se spustí několik programů, které využívají jednu statickou knihovnu, je tato knihovna v operační paměti opakovaně (v každé instanci programu). Kód dynamické knihovny naproti tomu může být v paměti sdílen všemi instancemi.
  • Staticky slinkovaný program je lépe přenosný, stačí přenést jeden soubor. U dynamicky slinkovaného programu je nutno zajistit, aby na počítači byly nainstalovány správné verze požadovaných dynamických knihoven nebo při přenosu přidat správné verze jako další soubory. Toto pravidlo platí rekurzivně (dynamické knihovny mohou vyžadovat další dynamické knihovny).
  • Pokud je chyba ve statické knihovně, je nutné po jejím opravení znovu sestavit všechny programy, které danou knihovnu používají. U dynamické knihovny stačí nahradit jediný soubor dynamické knihovny její novější (opravenou) verzí. Všechny programy používající tuto dynamickou pak automaticky pracují s opravenou knihovnou.
  • Automatické použití novější verze knihovny lze využít i jindy než při opravě chyby, novější verze může obsahovat například optimalizace a v některých případech i novou funkčnost pro nové programy (za předpokladu, že knihovna zachová funkčnost starého rozhraní pro staré programy).
  • Spuštění staticky slinkovaného programu typicky trvá o něco kratší dobu, protože při spouštění dynamicky linkovaného programu operační systém musí zajistit načtení dynamické knihovny do paměti zvlášť a provést relokaci, tedy nahradit odkazy na data v knihovně jejich výslednou adresou.
  • Dynamicky slinkovaný program je výrazně menší. Pokud knihovnu používá více než jeden program, ušetříme tedy místo i na disku.

Návrh knihovny

Součástí návrhu většího softwarového projektu je obvykle i oddělení části funkčnosti do jedné nebo několika samostatných knihoven. Při návrhu knihovny se berou v úvahu především některé vlastnosti známé (na nižší úrovni) z objektově orientovaného programování:

  • Zapouzdřenost – komplexní funkčnost knihovny by měla být dostupná přes jednoduché a snadno použitelné rozhraní. Na hotovou knihovnu se pak dá dívat jako na černou skříňku.
  • Znovupoužitelnost – dobře navržená knihovna může dobře posloužit při vývoji budoucích projektů, kdy bude potřeba stejná nebo podobná funkčnost.

Příklady různých knihoven