Jump to content

Ստատիկ և դինամիկ գրադարաններ

Վիքիպեդիայից՝ ազատ հանրագիտարանից

==Ներածություն==

Կոմպիլյացվող ծրագրավորման լեզուներում ծրագրի թարգմանության (կոմպիլյացիայի) արդյունքում ստեղծվում են օբյեկտային մոդուլներ (․o կամ ․obj ընդլայնումով ֆայլեր՝ կախված ՕՀ-ից), որոնք պարունակում են աարատային պլատֆորմի բինար կոդ։ Կապակցման (link) փուլում այդ ֆայլերը փոխանցվում են կապերի խմբագրիչին, որը լրացնում է մինչ այդ բաց թողնված կապերը և ստեղծում կատարվող մոդուլ։

Որևէ ֆունկցիոնալություն (ֆունկցիաների հավաքածու) ունենալու դեպքում, որը կարելի է օգտագործել տարբեր ծրագրերի կողմից, հաճախ անմիաստ է դառնում նույն կոդը ամեն անգամ ներառել վերջնական ծրագրային կոդի մեջ, և ամեն անգամ հանձնել թանգմանչին, որպեսզի այն ստեղծի օբյեկտային ֆայլ կամ կատարվող մոդուլ։ Ծրագրային գրադարանների մեխանիզմը հնարավորություն է տալիս ավելի արդյունավետ լուծել այս խնդիրը։

Ստատիկ գրադարաններ[խմբագրել | խմբագրել կոդը]

Ստատիկ գրադարանները հնարավորություն են տալիս մեկ անգամ ստեղծված որևէ օբյեկտային ֆայլ կամ ֆայլեր պահպանել գրադարանում (արխիվում)՝ այն դարձնելով վերօգտագործելի։

//calc_mean.h
double mean(double, double);
//calc_mean.c
double mean(double a, double b) {
    return (a+b)/2;
}

Վերը նշված կոդը ստատիկ գրադարան դարձնելու համար անհրաժեշտ է՝

gcc -c calc_mean.c -o calc_mean.o
ar rcs libmean.a calc_mean.o

UNIX և դրա նման համակարգրում ստեղծվող գրադարանի անունը պետք է սկսի lib-ով և ունենա .a (արխիվ) ընդլայնումը։

–c թարգմանել ծրագիրը, սակայն չհանձնել այն կապերի խմբագրիչին
–o անուն տալ ելքայի ֆայլին
rcs ավելացնել արխիվում, եթե գոյություն ունի ապա փոխարինել այն

Կապերի խմբագրիչը ստատիկ գրադարանից գտնում և մնացած ․o ֆայլերի հետ կապում է միայն այն ֆայլերը, որոնք պահանջվել են օգտագործողի կողմից։ Ստատիկ գրադարաններ կցելու գործընթացը կատարվում է աջից ձախ հերթականությամբ։

Դինամիկ գրադարաններ[խմբագրել | խմբագրել կոդը]

Դինամիկ գրադարանը իրենից ներկայացնում է .so կամ .dll ընդլայնումով ֆայլ, որը պարունակում է բինար կոդ։ Ի տարբերություն ստատիկ գրադարանի, դինամիկ գրադարանը բացի կոմպիլյացիայից անցնում է նաև կապերի խմբագրիչի միջով և չի ներառվում գեներացված վերջնական .exe ֆայլի մեջ։ Դինամիկ գրադարանը կարող է ցանկության դեպքում բեռնվել ծրագրի աշխատանքի ընթացքում (ինչպես Java-ում) կամ կցվել կոմպիլյացիայի ժամանակ առանց ներառվելու .exe ֆայլի մեջ։

Դինամիկ գրադարան ստեղծելու համար անհրաժեշտ է՝

gcc -fPIC -c calc_mean.c -o calc_mean.o

gcc -shared calc_mean.o -o libdyn.so

Գրադարանի անունը պետք է սկսվի lib-ով։

PIC-ը բացվում է որպես position independent code:

Նախկինում դինամիկ գրադարանից կարող էր օգտվել միայն այն պրոցեսը, որը առաջիններ բեռնել այն։ Մյուս բոլոր պրոցեսները կարող էին միայն բեռնել նրա կրկնօրինակը։ PIC գաղափարը շատ մեծ քայլ էր այս ոլորտում, որի միջոցով այժմ կարելի է խուսափել նմանատիպ խնդիրներից։

Ստատիկ գրադարանի փոխակերպումը դինամիկ գրադարանի[խմբագրել | խմբագրել կոդը]

Ստատիկ գրադարանը դինամիկ գրադարանի փոխակերպելու համար անհրաժեշտ է նախ հանել բոլոր .o/.obj ֆայլերը արխիվից, ապա փոխանցել անհրաժեշտ գրադարանը կապերի խմբագրիչին։

ar -x libname.a

gcc -shared <lib_name>.o -o libdyn.so

Առավելություններ և թերություններ[խմբագրել | խմբագրել կոդը]

Ստատիկ գրադարանները ներառվում են կոմպիլյացիայի արդյունքում ստացվող .exe ֆայլի մեջ ինչի պատճառով այդ ֆայլի ծավալը մեծանում է, սակայն դրա շնորհիվ գրադարանի ցանկացած ֆունկցիայի կանչը դառնում է ավելի արագ քան դինամիկ գրադարանի դեպքում։

Ստատիկ գրադարանի ամենամեծ թերությունը այն է, որ այն փոփոխելու դեպքում անհրաժեշտություն է առաջանում նորից կոմպիլացնել ամբողջ ծրագիրը։ Իսկ դինամիկ դրադարանները չունեն այս խնդիրը։ Բավական է պարզապես թարմացնել .dll/.so ֆայլը, ինչի շնորհիվ այսօր դրանք ունեն մեծ կիրառություն և այսօրվա համակարգչային ծրագրերի մեծ մասը օգտագործում է դինամիկ գրադարաններ՝ օգտագործողին ժամանակ առ ժամանակ թարմացումներ տրամադրելու նպատակով։