Библиотека (рачунарство)

Из Википедије, слободне енциклопедије
Илустрација апликације коју користи дадотека Ворбисове библиотеке за покретање Огг Ворбис датотеке

У рачунарству, библиотека представља колекцију непроменљивих ресурса коју користе програмски језици, нпр. за развој софтвера. Библиотеке могу да садрже податке за подешавање, документацију, помоћне податке, поруке у шаблонима, неке старе кодове и потпрограме, класе, вредности или типске спецификације. У IBM-овом 360/оперативном систему и његовим млађим верзијама, библиотеке су одређене као одвојене групе података.

У рачунарству, библиотека представља колекцију извршавања различитих понашања, написаних у оквиру програмских језика. Када кажемо "понашање" мислимо на добро дефинисан приступ уз помоћ којег се уводи понашање. Ово значи да док год развијенији програми користе библиотеку за прављење системских позива, није потребно поново писати исте системске позиве више пута. Поред тога, понашање омогућава поновну употребу од стране више независних програма. Програм уводи библиотеком осигурано понашање преко механизма датог програма. На пример, у једноставном императивном програмском језику као што је C, понашање у библиотеци се позива коришћењем C-ове функције позивања. Оно што разликује позив у библиотеци од других функција истог програма, јесте начин на који је код организован у систему.

Код библиотеке је организован на такав начин да се може користити од стране више различитих програма који немају никакве везе један са другим, док је код део програма организован тако да се може користити само од стране једног програма. Ова разлика може довести до хијерархијске нотације када програм брзо расте, као што је случај са програмом који јесачињен од више милиона линија кода. У овом случају, постоје библиотеке које се поново користе од стране мањих независних делова великог програма. Издвајајућа карактеристика је та да је библиотека оргранизована за потребе које се могу поново користити од стране независних програма или потпрограма. Корисник једино мора да зна приступ, али не и унутрашње детаље библиотеке.

Циљ библиотеке је да омогући поновно коришћење понашања. Када програм позове библиотеку, он придобија понашање те библиотеке, тако да нема потребе да програм сам уводи понашање. Библиотеке омогућавају поделу кода у модуларној форми и лаку дистрибуцију кода.

Понашање које је имплементирано од стране библиотеке, може бити повезано са позивајућим програмом на различитим фазама програма. Ако се коду библиотеке приступа током прављења позивајућег програма, онда се библиотека назива - статична библиотека. Алтернатива је да се направи извршавање позивајућег програма и да се оно дистрибуира одвојено од библиотеке. Понашање библиотеке је повезано након извршавања као део почетног процеса извршавања, или на половини извршавања. У овом случају библиотека се назива - динамична библиотека. Динамична библиотека се може учитати и линковати као део припремања програма за извршавање уз помоћ линкера. У другом случају, на половини извршавања, апликација може затражити учитавање траженог модула.

Већина преведених програмских језика има стандардну библиотеку, иако програмери такође могу да креирају њихове сопствене библиотеке. Већина модерних софтверских система прави библиотеке које дозвољавају већину системских услуга. Такве библиотеке имају модификоване услуге које траже модерне апликације.  Већина кодова коришћених од стране модерне апликације је направљено у таквим системима библиотека.

Историја[уреди]

Најранији концепти програмирања који имају некакве везе са библиотекама, настојали су да одвоје дефиницију података од спровођења програма. ЈОВИАЛ је учинио концепт комуникационог "базена" популарним 1959. године, иако је усвојио идеју из већих системских СЕЈЏ (САГЕ) софтвера. Пратећи принципе одвојених проблема и сакривање информација у рачунарству, "Сврха комуникационог базена је била да омогући дељење података међу програмима, уз помоћ централизовања описа података".[1]

КОБОЛ је такође садржао "једноставне могућности за систем библиотеке" у 1959. године,[2] али их је Џим Самет означио "неадекватним карактеристикама библиотеке" у ретроспективи.[3]

Други велики допринос концепту савремене библиотеке се огледа у форми иновације потпрограма Фортрана. Фортранови потпрограми могу бити саставаљени тако да не зависе један од другог, али компајлер нема линкер. Саимим тим, пре увођења модула у Фортран, провера типова између Фотранових[NB 1] потпрограма је била немогућа.[4]

Коначно, историја треба да памти утицајни Симула 67. Симула је био први објектно оријентисани програмски језик, а његове класе су биле приближно сличне модерном концепту који се користио у Јави, C++, и C#. Класни концепт Симуле представља новију верзију пакета програмског језика Ада и модула Модуле-2[5] Чак и када је направљен (1965. године), Симула класе су се могле укључивати у фајлове библиотека и додавати у време компајлирања.[6]

Повезивање[уреди]

Библиотеке су веома важне код програмског повезивања или процесног везивања, зато што оне решавају референце познате под називом линкови или симболи. Процес повезивања се обично извршава аутоматски уз помоћ линкера или везивног програма који тражи неколико библиотека и различитих модула. Обично се не сматра грешком ако се тражени линк не може наћи у датом низу библиотека. Повезивање се може сматрати готовим када се креира датотека извршавања, или када се програм користи у периоду извршавања.

Решене референце се могу користити за адресирање неких рутинских позива. Оне могу бити у главном програму, или у једном делу  програма који зависи од другог. Оне су решене у измењеним или премештеним адресама (из заједничке базе), уз помоћ доделе временског извршавања меморије за меморијске сегменте сваког референцираног модула.

Неки програмски језици могу користити карактеристику звану паметно повезивање где је линкер повезан са комапјлером, тако да линкер зна како су спољашње референце коришћене, и да се код у библиотекама никад не користи, чак иако је унутрашње референциран, он може бити искључен из  апликације. На пример, програм који користи само целе бројеве, може искључити рутине библиотеке претварања целобројне вредности у децималну вредност. Ова паметна карактеристика може довести до смањивања величине датотеке и повећати простор у меморији.

Премештање[уреди]

Неке референце у програму или библиотеци су сачуване у релативној или симболичкој форми, и оне се не могу решити док сви кодови и библиотеке имају статичку адресу. Премештање је процес прилагођавања оваквих референци, и извршава се уз помоћ линкера или лоадера. Генерално гледано, премештање се не може урадити појединачно у библиотекама зато што адресе у меморији варирају у зависности од програма и осталих библиотека. Кодови који зависе од позиције избегавају апсолутне адресе и због тога им не треба премештање.

Статичне библиотеке[уреди]

Када је повезивање извршено током креирања неког објектног фајла, то повезивање се назива - статично повезивање или рано везивање. У таквом случају, повезивање се обично извршава уз помоћ линкера, али се може извршити и уз помоћ компилатора. Статичка библиотека, такође позната и као архив, има циљ да буде статички повезана. Првобитно су постојале само статичке библиотеке. Статичко повезивање мора бити извршено када се било који од модула поново компајлира.

Сви модули које програм захтева су понекад статично повезани и копирани у извршну датотеку. Овај процес, и добијени самостални фајл, је познат као статична израда програма. Статична израда не тражи даље премештање ако је коришћена виртуална меморија или ако напросто не постоји потреба за модификацијом адресе.

Заједничке библиотеке[уреди]

Заједничке библиотеке или заједнички објекти представљају фајл који треба да се дели уз помоћ извршног модула и следећих заједничких објектних фајлова. Модули коришћени од стране програма се чешће учитавају из индивидуалног заједничког објекта у периоду извршавања или периоду учитавања, него да се копирају уз помоћ линкера када он креира један монолитан извршни фајл за програм.

Заједничке библиотеке могу бити статично линковане, што значи да су референце решене и да се модули налазе у меморији када је извршни фајл креиран. Али, често је спајање заједничких библиотека одложено док се учитавају.

Већина модерних оперативних система[NB 2] може имате заједничке фајлове библиотеке истих формата као извршни програми. Ово омогућава две главне предности: прво, захтева прављење само једног лоадера, уместо два (имати један лоадер се сматра бољим избором због своје комплексности). Друго, дозвољава да се извршавања употребљавају као заједничке библиотеке, ако имају табелу симбола. Типично комбиновано извршавање и формати заједничке библиотеке су ЕЛФ (ELF) и Мач-О (Маch-O) (оба у Јуниксу) и ПЕ (у Виндоусу).

У неким старијим окружењима као што је 16-битни Виндоус или МПЕ за ХП 3000, дозвољени су поређани подаци у коду зајендичких бибилиотека, али могу и друге значајне рестрикције да се налазе у коду заједничких библиотека.

Заједничка меморија[уреди]

Код библиотеке може бити подељен у меморији уз помоћ вишеструких процеса. Ако је коришћена виртуелна меморија, процеси извршавају исту страну РАМ меморије, мапиране у различите адресорске просторе сваког процеса. Ово је предност. На пример, у систему отвореног корака (ОpenStep), апликације су обично величине неколико стотина килобајта и учитавају се брзо; већина њихових кодова је лоцирана у библиотекама које су већ учитане због друих захтева оперативног система .

Програми могу постићи РАМ дељење уз помоћ коришћења позиционирања независних кодова (као нпр. у Јуниксу), што доводи до комплексне али флексибилне архитектуре, или уз помоћ коришћења честих виртуелних адреса (као нпр. у Виндоусу и ОС/2). Ови системи нас уверавају да код има велику могућност да буде подељен, уз помоћ различитих трикова као што је мапирање простора адресе или резервисање слотова за сваку заједничку библиотеку. Трећа могућност је слабо складиштење, коришћено од стране IBM Система/38 и његових наследника. Она дозвољава кодове који зависе од позиције али има значајне рестрикције тј. ограничава место пласирања кода или начин његовог дељења.


У неким различитим случајевима верзије подељених библиотека могу изазвати проблеме, посебно када библиотеке различитих верзија имају исти назив датотеке, а различите инсталиране апликације које траже специфичне верзије. Такав сценарио је познат као ДЛЛ пакао, именованог након Виндоусове и ОС/2 ДЛЛ датотеке. Мноштво модерних оперативних система је обрисало методе након 2001 године, да би елеминисале горе наведен проблем или коришћење специфичне "приватне" библиотеке.[7]

Динамично повезивање[уреди]

Динамично повезивање или касно везивање представља повезивање док се програм учитава (време учитавања) или извршава (време извршавања), али постоје и ситуације када се повезивање врши након прављења извршног фајла. Динамично повезана библиотека (код Виндоус оперативног система и ОС/2 система; динамично подељени објекти или ДСО код система сличним Јуниксу) је библиотека намењена за динамично повезивање. Само делић целокупног посла одради линкер након креирања извршног фајла; он само снима шта треба програму као и инекдсима или бројевима у библиотекама. Главни део посла у процесу повезивања је завршен  када се апликација учита (време учитавања) или током извршавања (време извршавања). Обично, неопходно повезивање програма, које се назива "динамички линкер" или "учитавајући линкер", представља део основног оперативног система. (Међутим, могуће је, а и није тешко, написати програм који користи динамично повезивање и који садржи свој властити динамични линкер, чак и за оперативне системе који не подржавају динамично повезивање.)

Програмери су првобитно развијали динамично повезивање у Мултикс оперативном систему, започетим 1964. године, и у МТС (Мичиген терминалски ситем), који је направљен у касним 1960-им годинама.[8]

Оптимизација[уреди]

Иако се заједничке библиотеке на већини система не мењају често, системи могу да одреде сваку адресу за сваку заједничку библиотеку у систему, и могу да чувају информације у библитекама и извршавајућим фајловима. Ако је свака заједничка библотека која је позвана прошла овакав процес, онда ће се свака учитати на својој одређеној адреси, што убрзава процес динамичног повезивања. Оптимизација је још позната и као процес који долази пре повезивања у Х оперативном систему или као процес који долази пре повезивања у Линукс оперативном систему. Мане ове технике се огледају у томе што обухвата време потребно за одређивање адреса сваки пут када се библиотека промени, немогућност коришћења стандардног адресирања, и недостатак потребног простора за коришћење виртуелне адресе (проблем који ће се ублажити усвајањем 64-битне архитектуре, барем за сада)

Лоцирање библиотека у периоду извршавања[уреди]

Лоадери код заједничких библиотека, варирају у зависности од функционалности. Неки зависе од извршавања сачуваних делова библиотека. Свака промена као нпр. именовање или промена фајла ће довести до пада система. Чешће, само је име библиотеке (не и путања) сачувано у периоду извршавања, уз помоћ оперативног система који подржава методу за налажење тражене библиотеке или неког алгоритма. 

Ако извршавање заједничке библиотеке зависи од тога да ли је обрисана, померена, преименована или да ли је различита верзвија библиотеке копирана на месту на ком је била током претраге, извршавање ће показати грешку. Ово се назива зависност пакла и постоји на многим платформама. Виндоус варијанта је обично позната као ДЛЛ пакао. Овај проблем се се не може појавити ако се свака верзија сваке библиотеке подједнако идентификује и ако сваки програм референцира библиотеке по њиховим посебним идентификаторима. Проблем "ДЛЛ пакла" је настао са ранијим верзијама Виндоуса, као резултат коришћења имена библиотека, која нису била уникатна, за решавање динамичног повезивања у програмима. (Да би се избегао овај проблем, касније верзије Виндоуса су се ослањале на могућност инсталирања приватног ДЛЛ-a - што представља делимично повлачење из употребе заједничких библиотека - заједно са механизмом, да би се спречила замена заједничких система ДЛЛ-а са њиховим ранијим верзијама.)

Мајкрософт Виндоус[уреди]

Мајкрософт виндоус проверава регистар да би утврдио право место за учитавање ДЛЛ-а који имплементира ЦОМ објекте, док ће остали ДЛЛ објекти проверити директоријуме. Прво, Виндоус проверава директоријум из ког је програм учитан (приватни ДЛЛ[7]); било какве директоријуме позивањем SetDllDirectory() функције; Систем 32, Систем, и Виндоус директоријуми; затим тренутне директоријуме; а на крају директоријуме специфиране од стране ПАТХ окружења променљивих.[9] Апликације написане за .NET Framework (од 2002. године), такође проверавају глобално складиште као примарно складиште подељених длл фајлова за брисање проблема ДЛЛ пакла.

Отворени корак[уреди]

Отворени корак користи флексибилнији систем, и након покретања система, сакупља листу библиотека из познатих локација (слично ПАТХ концепту). Померање библиотека не представља неки посебан проблем, мада корисници сносе временски трошак при првом покретању система.

Системи слични Јункис систему[уреди]

Већина система који су слични Јуниксу имају опцију "претраге" којом се утврђују директоријуми у којима се налазе динамичне библиотеке. Неки системи одређују стандардну путању у конфигурацијској датотеци; док је остали кодирају у динамични лоадер. Неки формати извршних фајлова могу додати директоријуме уз помоћ којих ће тражити библиотеке за партикуларни програм. Да би се ово занемарило, постоји пречица преко окружења променљиве, иако је она онемогућена за неке програме, тако да корисник не може покренути тај програм. Развојници (девелопери) библиотека су се охрабрили да пласирају своје динамичне библиотеке на местима у стандардној претрази. Са друге стране, ово може чинити инсталацију нових библиотека проблематичном, па ће "познате" локације брзо постати складиште за растући број фајлова, чинећи управљање још више комплекснијим.

Динамично учитавање[уреди]

Динамично учитавање тј. подниз динамичког повезивања, омогућава учитавање динамично повезане библиотеке и очитавање (ако је затражено) у периоду извршавања. Такав захтев се може затражити у периоду састављања или експлицитно у периоду извршавања. Имплицитни захтеви се извршавају у периоду састављања када линкер додаје референце библиотеке које укључују путању фајлова или једноставна имена фајлова. Експлицитни захтеви се извршавају када апликација упути директан позив АПИ оперативном систему у периоду извршавања.


Већина оперативних система који подржавају динамично повезане библиотеке такође подржавају динамично учитавање библиотека преко рантајм АПИ линкера. На пример, Мајкрософт Виндоус користи АПИ функције LoadLibrary, LoadLibraryEx, FreeLibrary и GetProcAdress преко Мајкрософтових динамично повезаних библиотека; POSIX базирани системи, укључујући Јуникс и њему сличне системе користе dlopen, dlclose и dlsym. Неки развојни системи извршавају аутоматски овај процес.

Објекти и класе библиотека[уреди]

Иако је првобитно осмишљено у 1960им годинама, динамично повезивање није дошло до састава оперативних система, коришћених од стране корисника рачунара све до касних 1980их година. У суштини, оно је било доступно у одређеној форми у већини оперативних система у раним 1990им годинама. Током истог периода, објектно оријентисано програмирање (ООП) је постало важан део света програмирања. ООП у периоду покретања програма захтева додатне информације које традиционалне библиотеке не подржавају. Поред имена и улазних тачака локализованог кода, потребна је и листа објеката од којих  зависи. Ово је споредни ефекат једне од главних карактеристика ООП, а то је наслеђивање, што значи да делови комплетне дефиниције било које методе могу бити различито пласирани. Ово је компликованије од једноставног листања и подразумева једну библиотеку која тражи услуге друге: У правим ООП системима, библиотеке се можда не препознају у период састављања, али та могућност варира од система до система.

У исто време, мноштво девелопера ради на идеји мулти-повезивања програма, у којима би "екран" покренут на десктоп рачунару користио услуге мејнфрејм или мини рачунара за складиштење или процесуирање података. На пример, програм на ГУИ-базираним рачунарима би послао поруку на мини рачунар да би добио мали пример великог приказа базе података. Позиви далеких процедура већ управљају овим задацима, али не постоји стандардни РПЦ систем.

Убрзо је већина произвођача мини рачунара и мејнфрејм рачунара подстицала пројекте да комбинују оба, дајући ООП формат библиотеке који се може користити свуда. Такви системи су били познати као објектне библиотеке, или дистрибуирани објекти, ако подржавају даљински (удаљен) приступ (немају сви ову могућност). Мајкросфотов КОМ је пример система за локалну употребу, ДКОМ преставља модификовану верзију која омогућава даљински приступ.


Одређено време објекти библиотека имају статус "следеће велике ствари" у програмском свету. Било је неколико напора да се направе системи који би се могли покретати преко платформи, чак је било покушаја великих компанија да се девелопери ограниче на свој сопствени систем. Примери укључују IBM-ов систем објектног модела, санов микросистем дистрибуираних објекта, следеће преносиве дистрибуиране објекте, дигиталне објекте, Мајкрософтову компоненту објектног модела, и било који број КОБРА-базираних система.

Након неизбежног хлађења тржишта, објектне библиотеке су настављене да буду коришћене и у објектно оријентисаним програмима и дистрибуираним информационим системима. Класе библиотеке ООП су еквивалентне старијим типовима кодова библиотека. Оне садрже класе, које описују карактеристике и дефинишу акције (медоте) које објетки садрже. Класе библиотека се користе за креирање инстанци, или објекта преко њихових карактеристичних низова. У неким ООП програмским језицима, као што је Јава, разлика је јасна, класе се често налазе у датотекама библиотеке (као нпр. Јавин ЈАР (JAR) фајл формат) док објекти инстанце бораве само у меморији (иако би потенцијално могле да се налазе у одвојеним датотекама). У другим програмима, као нпр. Smalltalk, класе библиотека се углавном користе као полазна тачка за системску слику која обухвата целокупно окружење, класе и инстанце објеката.

Удаљене библиотеке[уреди]

Друга солуција за библиотеке подразумева коришћење потпуно одвојених извршавања (обично у лаганијој форми) а они се позивају користећи удаљени процедурални позив (РПЦ) преко интернета на други рачунар. Овај приступ потпуно повећава поновну употребу оперативног ситема: код који мора да подржава библиотеку је исти код који се користи за прављење апликација и за осигуравање сваког другог програма. Поред тога, такви системи не захтевају да библиотека постоји, али могу послати неке друге захтеве преко интернета.

Међутим, такав приступ значи да сваки позив библиотеке захтева значајну количину такозваног "overhead-a" тј. прелажења преко. РПЦ позиви су много скупљи од позива заједничке библиотеке која је већ учитана на истој машини. Овај приступ се често користи у  расподељеном израчунавању које тешко користи удаљене позиве, а посебно тешко користи системе на релацији клијент-сервер и  апликационе сервере као што је Јава Ентерпрајс.

Библиотеке генерације кода[уреди]

Библиотеке генерације кода представљају АПИ високог нивоа који генеришу или трансформишу бајт код за Јаву. Користе се често од стране аспектно оријентисаних програма, за приступ подацима, и за тестирање динамичних објеката. Користе се такође за прекидање приступа одређеном делу.[10]

Именовање датотеке[уреди]

  • Мноштво модерних система сличним Јуниксу имају ову опцију.
Систем чува libfoo.a и libfoo.so датотеке у директоријумима на следећи начин /lib, /usr/lib или /usr/local/lib. Имена датотека увек почињу са lib, а завршавају се са суфиксом .a (архива, статична библиотека) или .so (заједнички објекат (shared object), динамично повезане библиотеке). Неки системи могу да имају више имена код  динамично повезаних библиотека, где већина имена означава симболинко повезивање; имена могу да садрже главну верзију библиотеке, или целу верзију; на пример, на неким системима libfoo.so.2 би било име фајла за секундарну ревизију приступа динамично повезане библиотеке libfoo. Фајлови .la који се понекад налазе у директоријама библиотеке представљају архивне алатке библиотеке. Систем их не користи.
Систем наслеђује скуп статичких библиотека из BSD, и снима их као .a фајл, а користи га као .so- стил динамично повезаних библиотека (са .dylib суфикосм). Већина библиотека у OS X, међутим, садржи "оквир", који се налази унутар специјалних директоријума који се називају "корпе" које мењају податке и мета податке који су потребни библиотекама. На пример, оквир познат као MyFramework треба да се имплементира у корпу  MyFramework.framework, заједно са MyFramework.framework/MyFramework  а може бити динамично повезан фајл библиотеке или опонашајући динамично повезан фајл библиотеке у MyFramework.framework/Versions/Current/MyFramework.
Динамично спојене библиотеке обично имају суфикс *.DLL,[11] иако се и друга имена екстензија фалова могу одредити као динамично линковане баријере, као нпр. *.OCX код објектно спојених и уграђених (ОСУ) библиотека. Ревизија приступа је такође шивфрована у именима фајлова, или абрстрактована користећи ЦОМ-објектни приступ . У зависности од тога како су компајлирани, *.LIB фајлови могу представљати статичне библиотеке или динамично повезане библиотеке које се користе само током компилације (тј. "убацивања библиотека"). Различито од UNIX света, који користи различиту екстензију фајла, када се повезује са .LIB фајл на Виндоусу прво се мора знати да ли је библиотека регуларно статична или убачена библитека. У даљем случају, .DLL фајл се мора извршити у периоду извршавања програма.

Види још[уреди]

Напомене[уреди]

  1. It was possible earlier between, e.g., Ada subprograms.
  2. Some older systems, e.g., Burroughs MCP, Multics, also have only a single format for executable files, regardless of whether they are shared.

Референце[уреди]

  1. Wexelblat (1981). стр. 369.
  2. Wexelblat (1981). стр. 274.
  3. Wexelblat (1981). стр. 258.
  4. Wilson & Clark (1988). стр. 126.
  5. Wilson & Clark (1988). стр. 52.
  6. Wexelblat (1981). стр. 716.
  7. 7,0 7,1 Anderson, Rick (2000-01-11).
  8. "A History of MTS".
  9. "Dynamic-Link Library Search Order".
  10. "Code Generation Library". http://sourceforge.net/: Source Forge.
  11. Bresnahan & Blum (2015)

Литература[уреди]

  • Wexelblat, Richard (1981). History of Programming Languages. ACM Monograph Series. New York, NY: Academic Press. ISBN 0-12-745040-8. 

Спољашње везе[уреди]