Programbibliotek
Den här artikeln behöver källhänvisningar för att kunna verifieras. (2020-04) Åtgärda genom att lägga till pålitliga källor (gärna som fotnoter). Uppgifter utan källhänvisning kan ifrågasättas och tas bort utan att det behöver diskuteras på diskussionssidan. |
Inom datatekniken är ett programbibliotek (engelska: library) en samling subrutiner som används för att utveckla mjukvara. De bibliotek som ingår i plattformens grundläggande infrastruktur kallas systembibliotek. Programbibliotek innehåller stöd i form av programkod och datastrukturer som tillsammans tillhandahåller tjänster för separat användarprogram (ofta kallade "klientprogram" eller "klienter"). Detta möjliggör distribution och modifikation av biblioteket på ett modulärt sätt. Några exekverbara filer är både självständiga program men även programbibliotek, men de flesta programbibliotek kan inte exekveras för sig själva. I stället binds klientprogram till programbibliotek genom en process som kallas länkning.
De flesta moderna operativsystem erbjuder programbibliotek som innefattar huvuddelen av systemets funktioner. I de flesta moderna program består stora delar av programmet av funktionsanrop till diverse programbibliotek. En del funktioner kräver speciella privilegier och måste därför skötas som systemanrop, i allmänhet via systembibliotek.
Exempel
[redigera | redigera wikitext]Exempel på hur ett bibliotek eller headerfil kan se ut:
#ifndef _HEJ_H_
#define _HEJ_H_
#include <windows.h>
void fonster()
{
MessageBox(NULL, L"Hej, här är ett fönster!", L"Florevo", NULL);
}
#endif
Och så programmet som kallar på headerfilen:
#include "hej.h" //headerfilens namn, att jag använder "" visar att filen ligger i samma mapp som
//programmet, om jag hade använt <> hade vi fått ett error som säger att
//kompilatorn inte kan hitta filen, det är för att den inte letat i projektmappen
//utan bara där kompilatorn är angiven att hitta headerfiler.
int main()
{
fonster(); //Nu kallar vi på funktionen fonster och får upp en lite windowsruta med titeln:
//"Florevo", och texten: "Hej, här är ett windowsfönster!".
}
Detta var ett relativt litet exempel eftersom en headerfil oftast är väldigt lång och komplex, men detta visar grunderna hur det funkar.
Olika typer av programbibliotek
[redigera | redigera wikitext]Den primära fördelen med programbibliotek är att koden kan skrivas och underhållas skilt från enskilda tillämpningsprogram. Den som skriver ett tillämpningsprogram kan alltså utnyttja den färdiga koden och programbiblioteken kan uppdateras skilt från tillämpningsprogrammen.
Statiskt länkade programbibliotek inkluderas i programkoden i samband med att ett program kompileras (men som ett särskilt steg). Det färdiga programmet innehåller i sig programbibliotekets kod.
Dynamiskt länkade programbibliotek inkluderas i programkoden först då programmet körs, antingen då programmet laddas eller under körningen. Programbiblioteket finns som ett självständigt objekt i filträdet och kan i allmänhet uppdateras utan att de enskilda program som använder det behöver röras. För att det sistnämnda skall fungera måste programmet ansvarigt för länkningen kunna avgöra huruvida en viss version av programbiblioteket är kompatibelt med ett visst annat datorprogram.
Delade programbibliotek är programbibliotek som laddas in i datorns arbetsminne bara på ett ställe, oberoende av hur många program som använder dem, och mappas in på lämpligt ställe i varje programs virtuella minnesrymd. Eftersom olika program använder olika kombinationer av programbibliotek måste antingen varje bibliotek tilldelas egna unika minnesadresser eller också måste koden i programbiblioteket vara skriven så, att den fungerar oberoende av på vilka adresser den laddas in. Det förra är det vanliga i Microsoft Windows, där koden inte kan delas i arbetsminnet då två bibliotek konfigurerats för samma minnesposition. Det senare är det vanliga i Unix/Linux, där det förra (prelinking, prebinding) används endast för att försnabba själva laddandet av programbibliotek (som är långsam för vissa nya typers program).
Positionsoberoende kod åstadkoms så att adresser anges relativt nuvarande minnesposition eller en given startadress. Startadresserna anges i en skild tabell. Tabellen konstrueras i samband med att biblioteket länkas in och kan inte delas mellan program som laddat in biblioteket på olika ställen, medan resten av koden kan delas. Den indirekta adresseringen gör körningen aningen långsammare, men tillåter delad kod oberoende av var i minnesrymden koden länkas in.
Under Linux behandlas programbibliotek som ren kod eller data som länkas in och körs i programmets kontext. Samarbete mellan programmen, då sådan önskas, sköts antingen direkt mellan programmen, eventuellt med hjälp av i programbiblioteket definierade konventioner, eller av en särskild serverprocess. Under Windows kan programbiblioteken ha en mer självständig ställning och koordinera samarbete mellan program som laddat samma bibliotek, exempelvis med hjälp av biblioteket administrerat gemensamt data.
Se även
[redigera | redigera wikitext]- Executable and Linkable Format (ELF, .so), Unix varianten av dynamiskt laddade bibliotek
- DLL, Microsofts proprietära windows-variant av dynamiskt laddade bibliotek