Кіріспе

Компьютерлік бағдарламаны жасауға қолданылатын ресурстар жинағы – бағдарламалық жасақтаманы әзірлеу концепциясы. Компьютерлік ғылымда кітапхана – бағдарламалық жасақтаманы іске асыру үшін бағдарламалық жасақтаманы әзірлеу барысында пайдаланылатын, тек оқуға арналған ресурстардың жиынтығы. Дәстүр бойынша кітапханалар кіші бағдарламалардан (қазіргі кезде функциялар деп аталады) тұратын. Бүгінгі күні бұл концепцияға орындалатын кодтың басқа да түрлері, соның ішінде классстар, сондай-ақ орындалмайтын деректер, мысалы, кескіндер мен мәтін де кіреді. Кітапхана бастапқы код жинағын да білдіре алады. Мысалы, бағдарлама жүйелік шақыруларды бағдарламаның өзінде тікелей жасаудың орнына, кітапхана арқылы жанама түрде жасауға болады.

Жалпы

Кітапхананы бірнеше тәуелсіз қолданушылар (бағдарламалар және басқа кітапханалар) пайдалана алады. Бұл бағдарламада анықталған ресурстардан өзгеше, оларды әдетте тек сол бағдарлама ғана қолдана алады. Қолданушы кітапхана ресурсын пайдаланғанда, кітапхананың мүмкіндіктерін өзі іске асырмастан иеленеді. Кітапханалар кодты модулдік түрде қайта пайдалануға мүмкіндік береді. Кітапхананы пайдаланатын код жазғанда, бағдарламашыға кітапханада қандай элементтер бар екенін және оларды қалай қолдануға болатынын сияқты жоғары деңгейдегі ақпарат ғана қажет, кітапхананың барлық ішкі егжей-тегжейлерін білудің қажеті жоқ. Кітапханалар басқа кітапханаларды пайдалана алады, нәтижесінде бағдарламада кітапханалардың иерархиясы құрылады.

Орындалатын

Орындалатын кодтың кітапханасы функционалды шақыруға арналған анықталған интерфейске ие. Мысалы, C тілінде кітапхана функциясы C тілінің стандартты функция шақыру мүмкіндігі арқылы шақырылады. Егер функция бағдарламаның өзінде емес, кітапханада қолжетімді болса, сілтемелегіш кітапхана механизмі арқылы функцияны шақыру үшін код жасайды. Кітапхананың функциялары шақырушы бағдарламаның өмірлік циклінің әртүрлі кезеңдерінде қосылуы мүмкін. Егер кітапхананың коды шақырушы бағдарлама құрастырылып жатқанда қолжетімді болса, онда кітапхана статикалық кітапхана деп аталады. Баламасы – бағдарламаның орындалатын файлы мен кітапхана файлы бөлек жасалады. Кітапхана функциялары орындалатын файл іске қосылғаннан кейін, жүктелу кезінде немесе орындалу кезінде қосылады. Бұл жағдайда кітапхана динамикалық кітапхана деп аталады. Көптеген компиляцияланған тілдерде стандартты кітапхана бар, бірақ бағдарламашылар өздерінің жеке кітапханаларын да құра алады. Көптеген қазіргі заманғы бағдарламалық жүйелер жүйелік қызметтердің басым бөлігін іске асыратын кітапханаларды ұсынады. Мұндай кітапханалар қазіргі заманғы қолданбаларға қажетті қызметтерді ұйымдастырады. Сондықтан қазіргі заманғы қолданбалар қолданатын кодтың көп бөлігі осы жүйелік кітапханаларда ұсынылған.

Тарих

Компьютерлік кітапхана идеясы Чарльз Бэббидж жасаған алғашқы компьютерлерге қатысты. 1888 жылы жарияланған оның Аналитикалық машинасы туралы еңбегінде компьютерлік операцияларды сандық деректерден бөлек карталарға тебуге болатыны айтылды. Егер осы операциялық карталар қайта пайдалану үшін сақталса, онда "қозғалтқыш өзінің кітапханасын бірте-бірте құрар еді". 1947 жылы Голдстайн мен фон Нейман IAS машинасы – сол кезде әлі жұмыс істемейтін алғашқы компьютердегі жұмыстары үшін субпрограммалардың "кітапханасын" жасаудың пайдалы екенін болжады. Олар қайта пайдалануға болатын компьютерлік кодты сақтайтын магниттік сымдардан жасалған физикалық кітапхананы көздеді. Фон Нейманның ықпалымен Уилкс және оның командасы EDSAC құрастырды. Бұл компьютердің субпрограммалық кітапханасы перфолентадан жасалған картотекада сақталды. EDSAC бағдарламалары негізгі бағдарламадан және субпрограммалық кітапханадан алынған субпрограммалар тізбегінен тұрды. 1951 жылы команда бағдарламалау бойынша алғашқы оқулықты – "Электрондық цифрлық компьютер үшін бағдарламаларды дайындау" жариялады, онда кітапхананың құрылуы мен мақсаты егжей-тегжейлі сипатталды. COBOL 1959 жылы "кітапхана жүйесі үшін қарапайым мүмкіндіктерді" қамтыды, бірақ Жан Саммет оларды кейіннен "жеткіліксіз кітапханалық мүмкіндіктер" деп сипаттады. JOVIAL-да Communication Pool (COMPOOL) бар, ол шартты түрде бас файлдардың кітапханасы. Қазіргі заманғы кітапхана тұжырымдамасына үлкен үлес қосқан – FORTRAN-ның субпрограммалық инновациясы. FORTRAN субпрограммаларын бір-бірінен тәуелсіз жинастыруға болады, бірақ компиляторда байланыстырушы (linker) болмады. Сондықтан, Fortran 90-да модульдер енгізілгенге дейін FORTRAN субпрограммаларының арасында типтік тексеру мүмкін емес еді. 1960 жылдардың ортасына қарай, жинастырушылар үшін көшіру және макро кітапханалар кеңінен таралды. IBM System/360 танымал болғаннан бастап, жүйе параметрлері сияқты мәтіндік элементтердің басқа түрлерін қамтитын кітапханалар да кеңінен қолданыла бастады. IBM-нің OS/360 және оның ізілділерінде мұндай кітапхана бөлінген деректер жиынтығы деп аталады. 1965 жылы жасалған Simula – алғашқы объектіге бағытталған бағдарламалау тілі, компиляторы арқылы кітапханаларға сыныптарды қосу мүмкіндігін ұсынады.

Байланыстыру

Кітапханалар бағдарламаны байланыстыру немесе байлау процесінде маңызды рөл атқарады, ол сілтемелер немесе кітапхана модульдерінің символдары ретінде белгілі сілтемелерді шешеді. Байланыстыру процесін әдетте линкер немесе байлаушы бағдарлама автоматты түрде жасайды, ол белгілі бір тәртіппен кітапханалар мен басқа модульдер жиынтығын іздейді. Әдетте, егер сілтеме нысанасы берілген кітапханалар жиынтығында бірнеше рет табылса, ол қате болып саналмайды. Байланыстыру орындалатын файл құрылған кезде (статикалық байланыстыру) немесе бағдарлама қолданылған кезде орындау уақытында (динамикалық байланыстыру) жүзеге асырылуы мүмкін. Шешілетін сілтемелер секірулер және басқа да процедуралық шақырулар үшін мекенжайлар болуы мүмкін. Олар негізгі бағдарламада немесе бір модульде, екіншісіне тәуелділік ретінде болуы мүмкін. Олар әр модульдің жад сегменттеріне орындау уақытында жад бөлу арқылы белгіленген немесе қайта орналастырылатын мекенжайларға (жалпы базадан) айналдырылады. Кейбір бағдарламалау тілдері "ақылды байланыстыру" деп аталатын мүмкіндікті қолданады, онда линкер компилятормен үйлесімді немесе біріктірілген, сондықтан линкер сыртқы сілтемелердің қалай қолданылатынын біледі және кітапханадағы код, тіпті ішкі сілтемелер болса да, егер ол ешқашан қолданылмаса, құрастырылған қосымшадан шығарылуы мүмкін. Мысалы, егер бағдарлама арифметика үшін тек бүтін сандарды қолданса немесе мүлдем арифметикалық операциялар жасалмаса, онда қалқыма нүктелік кітапхананың процедураларын алып тастауға болады. Бұл "ақылды байланыстыру" мүмкіндігі қосымша файлдың мөлшерін азайтуға және жадты тиімді пайдалануға мүмкіндік береді.

Көшіру

Бағдарлама немесе кітапхана модульіндегі кейбір сілтемелер салыстырмалы немесе символдық түрде сақталады, оларды барлық код пен кітапханаларға соңғы статикалық мекенжайлар берілгенге дейін анықтау мүмкін емес. Қайта орналастыру – бұл сілтемелерді түзету процесі, ол сілтеуіш немесе жүктеуіш арқылы жүзеге асырылады. Әдетте, жеке кітапханаларды қайта орналастыруға болмайды, себебі жадтағы мекенжайлар оларды пайдаланатын бағдарламаға және олармен біріктірілген басқа кітапханаларға байланысты өзгеріп отыруы мүмкін. Позицияға тәуелсіз код абсолютті мекенжайларға сілтеме жасамайды, сондықтан оны қайта орналастыру қажет болмайды.

Статикалық кітапханалар

Тіркеу орындалатын файлды немесе басқа объектілік файлды құру кезінде жасалса, ол статикалық байланыстыру немесе ерте байланыс деп аталады. Мұндай жағдайда, байланыстыруды әдетте байланыстырушы (линкер) жасайды, бірақ компилятор да жасай алады. Статикалық кітапхана, сонымен қатар архив деп те аталады, статикалық байланыстыру үшін арналған. Алғашқыда тек статикалық кітапханалар ғана болды. Кез келген модульдер қайта компиляцияланғанда статикалық байланыстыру жасалуы керек. Бағдарламаға қажетті барлық модульдер кейде статикалық байланыстырылып, орындалатын файлға көшіріледі. Бұл процесс және одан шығатын дербес файл бағдарламаның статикалық құрастырылуы деп аталады. Статикалық құрастыруға виртуалды жад пайдаланылса және адрес кеңістігінің кездейсоқ орналасуы қажет болмаса, қосымша ауыстыру қажет болмауы мүмкін.

Ортақ кітапханалар

Ортақ кітапхана немесе ортақ нысан – орындалатын файлдар мен басқа ортақ нысан файлдарымен бөлісілетін файл. Бағдарлама пайдаланатын модульдер жүктелу уақытында немесе жұмыс істеу кезінде жеке ортақ нысандардан жадқа жүктеледі, бағдарлама үшін біртұтас орындалатын файл жасағанда сілтеуіш оларды көшірмейді. Ортақ кітапханалар компиляция кезінде статикалық байланыс арқылы қосылуы мүмкін, яғни кітапхана модульдеріне сілтемелер анықталып, модульдерге жад орындалатын файл жасалғанда бөлінеді. Алайда, ортақ кітапханаларды байланыстыру көбінесе олар жүктелгенге дейін кейінге шегеріледі.

Нысандар кітапханалары

Алғашқыда 1960-шы жылдары пайда болғанмен, динамикалық байланыс 1980-ші жылдардың соңына дейін ең көп қолданылатын операциялық жүйелерде кеңінен қолданылмады. 1990-шы жылдардың басында ол көптеген операциялық жүйелерде қандай да бір түрінде қолжетімді болды. Осы кезеңде объектіге бағытталған бағдарламалау (ООП) бағдарламалау саласының маңызды бөлігіне айналды. Runtime байланысын қолданатын ООП, дәстүрлі кітапханалар ұсынбайтын қосымша ақпаратты қажет етеді. Кодтың атаулары мен кіру нүктелерінен өзге, олар тәуелділіктері бар объектілердің тізімін де талап етеді. Бұл ООП-тің негізгі ұғымдарының бірі – мұрагерлік салдарынан туындайды, яғни әдістің толық анықтамасының бөліктері әртүрлі жерлерде орналасуы мүмкін. Бұл тек бір кітапхананың екіншісінің қызметтерін пайдалануын тізімдеуден асып түседі: нағыз ООП жүйесінде кітапханалардың өзі компиляция уақытында белгілі болмауы мүмкін және жүйеге қарай өзгеруі мүмкін. Сонымен қатар, көптеген бағдарламашылар көп деңгейлі бағдарламалар идеясымен айналысты, онда жұмыс үстеліндегі компьютерде іске қосылған "дисплей" деректерді сақтау немесе өңдеу үшін мейнфрейм немесе миникомпьютердің қызметтерін пайдаланады. Мысалы, графикалық интерфейсі бар компьютердегі бағдарлама үлкен деректер жиынтығының шағын үлгілерін көрсету үшін миникомпьютерге хабарлама жібереді. Бұл міндеттерді қашықтықтан процедура шақырулары (RPC) орындады, бірақ стандартты RPC жүйесі болған жоқ. Біраз уақыттан кейін көптеген миникомпьютер және мейнфрейм өндірушілері екі технологияны біріктіретін жобаларды бастады, нәтижесінде кез келген жерде қолданылатын ООП кітапхана форматы пайда болды. Мұндай жүйелер объект кітапханалары немесе таратылған объектілер деп аталды, егер олар қашықтан қол жеткізуді қолдаса (барлығы да емес). Microsoft-тың COM-і жергілікті пайдалану үшін осындай жүйенің мысалы болып табылады. DCOM, COM-ның өңделген нұсқасы, қашықтан қол жеткізуді қолдайды. Бір кезде объект кітапханалары бағдарламалау әлемінде "келесі үлкен жетістік" мәртебесіне ие болды. Көптеген платформаларда жұмыс істейтін жүйелерді құруға көптеген әрекеттер жасалды, ал компаниялар бағдарламашыларды өз жүйелеріне байлап қоюға бәсекелесті. Мысалдарға IBM-нің System Object Model (SOM/DSOM), Sun Microsystems-тің Distributed Objects Everywhere (DOE), NeXT-тің Portable Distributed Objects (PDO), Digital-дің ObjectBroker, Microsoft-тың Component Object Model (COM/DCOM) және CORBA негізіндегі кез келген жүйелер жатады.

Сынып кітапханалары

Сынып кітапханалары – ескі код кітапханаларының объектіге бағытталған бағдарламалаудағы (ООП) шамамен эквиваленті. Олар сыныптарды қамтиды, бұл сыныптар қасиеттерді сипаттайды және объектілермен байланысты әрекеттерді (әдістерді) анықтайды. Сынып кітапханалары инстанцияларды, яғни белгілі бір мәндерге орнатылған қасиеттері бар объектілерді құру үшін пайдаланылады. Кейбір ООП тілдерінде, мысалы Java-да, бұл айырмашылық анық: сыныптар көбінесе кітапхана файлдарында (Java-ның JAR форматы сияқты) сақталады, ал құрастырылған объектілер тек жадта орналасады (бірақ жеке файлдарда сақталуы да мүмкін). Ал Smalltalk сияқты тілдерде сынып кітапханалары – ортаның, сыныптардың және құрастырылған барлық объектілердің толық күйін қамтитын жүйелік бейненің бастапқы нүктесі болып табылады. Бүгінде көптеген сынып кітапханалары пакеттік репозиторийде (мысалы, Java үшін Maven Central) сақталады. Клиенттік код сыртқы кітапханаларға тәуелділіктерді құрастыру конфигурация файлдарында (мысалы, Java-дағы Maven Pom) нақты көрсетеді.

Қашықтағы кітапханалар

Тағы бір кітапханалық техника толығымен бөлек атқарылатын файлдарды (көбінесе жеңіл форматта) пайдаланады және оларды желі арқылы басқа компьютерге қашықтықтан процедура шақыру (RPC) арқылы шақырады. Бұл операциялық жүйені қайта пайдалануды максималдайды: кітапхананы қолдау үшін қажетті код, басқа бағдарламаларға қолданбалық қолдау және қауіпсіздік қамтамасыз ету үшін қолданылатын кодтың өзі болып табылады. Сонымен қатар, мұндай жүйелер кітапхананың бір машинада болуын қажет етпейді, сұраныстарды желі арқылы жіберуге мүмкіндік береді. Дегенмен, мұндай тәсіл әрбір кітапхана шақыруына айтарлықтай қосымша шығын тудырады. RPC шақырулары, бір машинаға жүктелген ортақ кітапхананы шақырудан әлдеқайда қымбат. Бұл тәсіл көбінесе таратылған архитектурада қолданылады, ол мұндай қашықтықтан шақыруларды, атап айтқанда клиент-серверлік жүйелерді және Enterprise JavaBeans сияқты қолданба серверлерін кеңінен пайдаланады.

Кодты құру кітапханалары

Кодты құру кітапханалары – Java үшін байт-кодты жасауға немесе өзгертуге арналған жоғары деңгейдегі API. Олар аспектіге бағытталған бағдарламалауда, кейбір деректерге қол жеткізу аясында және динамикалық прокси объектілерін жасау үшін тесттеуде қолданылады. Сондай-ақ, олар өріс кіруді (field access) бақылауға пайдаланылады.

Қазіргі заманғы Unix-қа ұқсас жүйелер

Жүйе libfoo.a және libfoo.so файлдарын /lib, /usr/lib немесе /usr/local/lib сияқты каталогтарда сақтайды. Файл атаулары әрқашан lib сөзімен басталады және a (архив, статикалық кітапхана) немесе so (бөліскен объекті, динамикалық байланысты кітапхана) қосымшасымен аяқталады. Кейбір жүйелерде динамикалық байланыстырылған кітапхананың бірнеше атауы болуы мүмкін. Бұл атаулар әдетте бірдей префиксті бөліседі және нұсқа нөмірін көрсететін әртүрлі қосымшалары болады. Көптеген атаулар соңғы нұсқаға символдық сілтемелердің атаулары болып табылады. Мысалы, кейбір жүйелерде libfoo.so.2 динамикалық байланыстырылған кітапхана libfoo-ның екінші негізгі интерфейс нұсқасының файл атауы болады. Кітапхана каталогтарында кездесетін la файлдары libtool архивтері, жүйе оларды тікелей пайдалана алмайды.

macOS

Жүйе BSD-ден статикалық кітапхана конвенцияларын мұра етеді, кітапхана файлда сақталады және сондай-ақ динамикалық байланысты кітапханаларды (дилбиб қосымшасымен) пайдалана алады. Дегенмен, macOS-тағы көптеген кітапханалар "фреймворктерден" тұрады, олар кітапхананың қажетті файлдары мен метадеректерін қамтитын, "бундельдер" деп аталатын арнайы каталогтардың ішінде орналасқан. Мысалы, MyFramework деп аталатын фреймворк MyFramework.framework бунделинде іске асырылады, ал MyFramework.framework/MyFramework динамикалық байланысты кітапхана файлы болып табылады немесе MyFramework.framework/Versions/Current/MyFramework-тегі динамикалық байланысты кітапхана файлына сілтеме болып табылады.

Microsoft Windows-тың жүйелік жүйесі

Динамикалық сілтеме кітапханалары әдетте *.DLL жұрнағымен аяқталады, бірақ басқа файл атауының кеңейтімдері арнайы мақсаттағы динамикалық байланысты кітапханаларды, мысалы, *.OCX OLE кітапханалары үшін анықтауы мүмкін. Интерфейс нұсқалары файл атауларында кодталған немесе COM объектілерінің интерфейстерін пайдаланып абстракцияланады. Олардың қалай компиляцияланғанына байланысты, *.LIB файлдары статикалық кітапханалар немесе тек компиляция кезінде қажет болатын динамикалық байланыс кітапханаларының өкілдіктері болуы мүмкін, олар "импорт кітапханалары" деп аталады. UNIX әлемінен өзгеше, түрлі файл кеңейтімдерін қолданатын Windows-та LIB файлына сілтеме жасағанда, оның қарапайым статикалық кітапхана ма, әлде импорт кітапханасы ма екенін білу қажет. Егер соңғысы болса, DLL файлы орындалу кезінде міндетті түрде болуы керек.