स्थिर और साझा पुस्तकालयों के बीच अंतर?


560

स्थिर और साझा पुस्तकालयों के बीच अंतर क्या है?

मैं ग्रहण का उपयोग करता हूं और स्टैटिक लाइब्रेरी और शेयर्ड लाइब्रेरी सहित कई प्रोजेक्ट प्रकार हैं? क्या एक का दूसरे पर फायदा है?


4
विकिपीडिया में स्थिर, गतिशील और साझा पुस्तकालयों के बीच अंतर का अच्छा विवरण है।
एडम होल्म्बर्ग

जवाबों:


745

साझा लाइब्रेरी हैं .so (या विंडोज .dll, या OS X .dylib में) फाइलें। लाइब्रेरी से संबंधित सभी कोड इस फ़ाइल में है, और इसे रन-टाइम पर इसका उपयोग करके प्रोग्राम द्वारा संदर्भित किया जाता है। एक साझा पुस्तकालय का उपयोग करने वाला एक कार्यक्रम केवल उस कोड का संदर्भ देता है जिसे वह साझा पुस्तकालय में उपयोग करता है।

स्टेटिक लाइब्रेरी एक .a (या विंडोज .lib) फाइलों में होती हैं। पुस्तकालय से संबंधित सभी कोड इस फ़ाइल में हैं, और यह सीधे संकलन समय पर कार्यक्रम में जुड़ा हुआ है। स्टैटिक लाइब्रेरी का उपयोग करने वाला प्रोग्राम उस कोड की कॉपी लेता है जिसे वह स्टैटिक लाइब्रेरी से उपयोग करता है और इसे प्रोग्राम का हिस्सा बनाता है। [विंडोज में .lib फाइलें भी हैं जो .dll फ़ाइलों को संदर्भित करने के लिए उपयोग की जाती हैं, लेकिन वे पहले की तरह ही कार्य करती हैं]।

प्रत्येक विधि में फायदे और नुकसान हैं:

  • साझा पुस्तकालय, प्रत्येक प्रोग्राम में डुप्लिकेट किए गए कोड की मात्रा को कम कर देते हैं जो कि बायनेरिज़ को छोटा रखते हुए लाइब्रेरी का उपयोग करता है। यह आपको साझा किए गए ऑब्जेक्ट को एक के साथ बदलने की अनुमति देता है जो कार्यात्मक रूप से समतुल्य है, लेकिन हो सकता है कि उस प्रोग्राम को फिर से शुरू करने की आवश्यकता के बिना प्रदर्शन लाभ जोड़ा जाए जो इसका उपयोग करता है। साझा पुस्तकालय, हालांकि कार्यों के निष्पादन के लिए एक छोटी सी अतिरिक्त लागत के साथ-साथ एक रन-टाइम लोडिंग लागत भी होगी क्योंकि पुस्तकालय में सभी प्रतीकों का उपयोग उन चीजों से जुड़ा होना चाहिए। इसके अतिरिक्त, साझा पुस्तकालयों को रन-टाइम पर एक एप्लिकेशन में लोड किया जा सकता है, जो बाइनरी प्लग-इन सिस्टम को लागू करने के लिए सामान्य तंत्र है।

  • स्टेटिक लाइब्रेरी बाइनरी के समग्र आकार को बढ़ाती है, लेकिन इसका मतलब है कि आपको उस लाइब्रेरी की एक कॉपी साथ ले जाने की आवश्यकता नहीं है जिसका उपयोग किया जा रहा है। जैसा कि कोड संकलन समय पर जुड़ा हुआ है, कोई अतिरिक्त रन-टाइम लोडिंग लागत नहीं है। कोड बस वहाँ है।

व्यक्तिगत रूप से, मैं साझा पुस्तकालयों को पसंद करता हूं, लेकिन यह सुनिश्चित करने के लिए स्थैतिक पुस्तकालयों का उपयोग करता हूं कि बाइनरी में कई बाहरी निर्भरताएं नहीं होती हैं, जिन्हें पूरा करना मुश्किल हो सकता है, जैसे कि C ++ मानक पुस्तकालय के विशिष्ट संस्करण या Boost C ++ पुस्तकालय के विशिष्ट संस्करण।


2
"साझा किए गए ऑब्जेक्ट को ... कार्यात्मक रूप से समकक्ष के साथ बदलें, लेकिन [प्रदर्शन में सुधार] कर सकते हैं: विशेष रूप से, एपीआई (एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस: फ़ंक्शन हस्ताक्षरों और प्रकारों सहित चर) के सिमेंटिक उपयोग में समकक्ष कॉलर-सामना कार्यक्षमता, लेकिन कार्यान्वयन-पक्ष कार्यक्षमता अधिक से अधिक भिन्न हो सकती है। उदाहरण के लिए, फ़ंक्शन हमेशा फ़ाइल में लॉग करता है -> टीसीपी सर्वर पर भी लॉग इन करें: $ MY_APP_LOG_SERVER में अपेक्षित पोर्ट।
टोनी डेलरो

1
".sos के कार्यों के निष्पादन के लिए एक छोटी अतिरिक्त लागत" - यह संभव है (यदि फ़ंक्शन समूहों / आदेश को स्थैतिक लिंक में कैश इलाके के लिए अनुकूलित किया गया है, या ओएस / लोडर / कंपाइलर / आर्किटेक्चर में विषमताओं के कारण क्रॉस की तरह है) -सेगमेंट / बड़े-पॉइंटर परफैक्ट पेनल्टी), लेकिन कई आर्किटेक्चर / कंपाइलर-सेटिंग्स पर डायनेमिक लिंकर सटीक कॉलिंग मशीन ऑपकोड बनाने के लिए कॉल को पैच करता है।
टोनी डेलरो

2
"जैसा कि कोड संकलन समय पर जुड़ा हुआ है, कोई अतिरिक्त रन-टाइम लोडिंग लागत नहीं है। कोड बस वहां है।" - हाँ और नहीं ... यदि निष्पादन की आवश्यकता है, तो यह सभी निष्पादन योग्य छवि में तैयार है, लेकिन - ऐसी स्थिति से शुरू करना जहां आपका कार्यक्रम हाल ही में कैश में चलने के लिए पर्याप्त नहीं है - साझा पुस्तकालयों के साथ यह संभव है (कभी-कभी संभव है) या निश्चित) कि OS, ड्राइवर या कोई अन्य प्रोग्राम पहले से ही साझा की गई लाइब्रेरी को लोड कर देगा जिसे आपका ऐप उपयोग करना चाहता है, इस स्थिति में यह कैश में हो सकता है और आपका प्रोग्राम शुरू हो सकता है और तेज़ी से चल सकता है।
टोनी डेलरो

15
कुछ लोग जो उल्लेख करने में विफल रहे हैं, वह यह है कि स्टैटिक लाइब्रेरीज़ के साथ कंपाइलर को पता होता है कि आपके एप्लिकेशन को किन कार्यों की आवश्यकता है और फिर केवल उन फ़ंक्शन को शामिल करके इसे ऑप्टिमाइज़ कर सकते हैं। यह बड़े पैमाने पर पुस्तकालय के आकार में कटौती कर सकता है, खासकर यदि आप केवल एक बहुत बड़े पुस्तकालय के वास्तव में छोटे उपसमूह का उपयोग करते हैं!
जदयूनेटर

1
इस जवाब को बेहतर तरीके से व्यवस्थित किया जा सकता था। प्रत्येक आयाम में अंतर दिखाने के लिए, जहां भिन्नता है, वहां पेशेवरों / विपक्षों के लिए बुलेट सूची बनाना उपयोगी होगा।
एलिफेंट

377

एक स्थैतिक पुस्तकालय एक किताबों की दुकान की तरह है, और एक साझा पुस्तकालय की तरह है ... एक पुस्तकालय। पूर्व के साथ, आप घर लेने के लिए पुस्तक / फ़ंक्शन की अपनी प्रति प्राप्त करते हैं; उत्तरार्द्ध के साथ आप और बाकी सभी लोग उसी पुस्तक / फ़ंक्शन का उपयोग करने के लिए लाइब्रेरी जाते हैं। तो जो कोई भी (साझा) पुस्तकालय का उपयोग करना चाहता है, उसे यह जानना होगा कि वह कहां है, क्योंकि आपको पुस्तक / फ़ंक्शन को "प्राप्त करना" है। एक स्थैतिक पुस्तकालय के साथ, पुस्तक / कार्य आपका स्वयं का है, और आप इसे अपने घर / कार्यक्रम के भीतर रखते हैं, और एक बार आपके पास यह है कि आपको इसकी परवाह नहीं है कि आपको यह कहाँ या कब मिला है।


70

सरलीकृत:

  • स्टेटिक लिंकिंग: एक बड़ा निष्पादन योग्य
  • डायनेमिक लिंकिंग: एक छोटी निष्पादन योग्य प्लस एक या एक से अधिक लाइब्रेरी फाइल्स (.dll फाइलें विंडोज पर, .so लिनक्स पर, या .OSlib macOS पर)।

1
यह उत्तर मेरे लिए सबसे अच्छा है क्योंकि यह व्यावहारिक है। यह एक रूपक की तुलना में बहुत अधिक समझ में आता है जो इस बारे में बात नहीं करता है कि वास्तव में कंप्यूटर में क्या हो रहा है। यह जानने के बाद कि यह क्या होता है, मैं सहज रूप से अन्य सभी निहितार्थों को जानता हूं।
ऑफ99555

36

स्थैतिक पुस्तकालय के लिए, कोड को पुस्तकालय से लिंकर द्वारा निकाला जाता है और इसका उपयोग उस बिंदु पर अंतिम निष्पादन योग्य बनाने के लिए किया जाता है जिसे आप अपना आवेदन संकलित / निर्माण करते हैं। अंतिम निष्पादन योग्य समय पर पुस्तकालय पर कोई निर्भरता नहीं है

साझा लाइब्रेरी के लिए, कंपाइलर / लिंकर यह जाँचता है कि आपके द्वारा लिंक किए गए नाम लाइब्रेरी में मौजूद हैं जब एप्लिकेशन बनाया गया है, लेकिन उनके कोड को एप्लिकेशन में स्थानांतरित नहीं करता है। रन टाइम पर, साझा लाइब्रेरी उपलब्ध होनी चाहिए।

सी प्रोग्रामिंग भाषा में स्वयं स्थिर या साझा पुस्तकालयों की कोई अवधारणा नहीं है - वे पूरी तरह से एक कार्यान्वयन सुविधा हैं।

व्यक्तिगत रूप से, मैं स्थैतिक पुस्तकालयों का उपयोग करना पसंद करता हूं, क्योंकि यह सॉफ्टवेयर वितरण को सरल बनाता है। हालांकि, यह एक राय है कि अतीत में कितना (लाक्षणिक) रक्त बहाया गया है।


5
+1 के लिए "सी प्रोग्रामिंग भाषा में स्वयं स्थिर या साझा पुस्तकालयों की कोई अवधारणा नहीं है - वे पूरी तरह से एक कार्यान्वयन सुविधा है।"
टाइगर

1
हाय अनन / @ टाइगर, आपने क्यों कहा "सी प्रोग्रामिंग भाषा में ही स्थिर या साझा पुस्तकालयों की कोई अवधारणा नहीं है - वे पूरी तरह से एक कार्यान्वयन सुविधा है।" क्या आप कृपया थोड़ा विस्तार से बता सकते हैं या मुझे उचित संदर्भ दे सकते हैं?
सुनील शाहू

@SunilShahu प्रोग्राम को कैसे संकलित और लिंक किया जाता है यह आपके द्वारा उपयोग किए जा रहे कंपाइलर और लिंकर के लिए विशिष्ट है, अर्थात भाषा का विशिष्ट कार्यान्वयन। आमतौर पर भाषा के विवरणों का वर्णन नहीं किया जाता है कि भाषाओं को कैसे लागू किया जाना चाहिए या बनाया जाना चाहिए, केवल कार्यक्षमता, वाक्यविन्यास, व्याकरण, आदि
JC Rocemonte

@SunilShahu अधिक स्पष्ट उदाहरण जावास्क्रिप्ट हो सकता है, उदाहरण के लिए, जहां विनिर्देश (EcmaScript) भाषा की विशेषताओं का वर्णन करता है, लेकिन यह अलग-अलग विक्रेता हैं जो जेएस दुभाषियों (ब्राउज़र इंजन या Node.js, उदाहरण के लिए) को जहाज करते हैं। दूसरी ओर, पायथन प्रोग्रामिंग भाषा के कई कार्यान्वयन हैं। आधिकारिक एक सीपीथॉन है, लेकिन अन्य भाषाओं में लिखे गए अन्य हैं।
बजे जेसी रोकोमांटे

31

स्टेटिक लाइब्रेरी एक एप्लीकेशन के हिस्से के रूप में संकलित हैं, जबकि साझा लाइब्रेरी नहीं हैं। जब आप एक एप्लिकेशन वितरित करते हैं जो साझा किए गए काम पर निर्भर करता है, पुस्तकालयों, जैसे। MS Windows पर dll स्थापित करने की आवश्यकता है।

स्टैटिक लाइब्रेरियों का लाभ यह है कि एप्लिकेशन चलाने वाले उपयोगकर्ता के लिए कोई निर्भरता आवश्यक नहीं है - उदाहरण के लिए उन्हें अपने DLL को अपग्रेड करने की आवश्यकता नहीं है। नुकसान यह है कि आपका एप्लिकेशन आकार में बड़ा है क्योंकि आप इसे उन सभी पुस्तकालयों के साथ शिपिंग कर रहे हैं जिनकी इसे आवश्यकता है।

साथ ही छोटे अनुप्रयोगों के लिए अग्रणी, साझा पुस्तकालय उपयोगकर्ता को अपने स्वयं के उपयोग करने की क्षमता प्रदान करते हैं, शायद पुस्तकालयों के बेहतर संस्करण एक के बजाय उस अनुप्रयोग पर निर्भर होते हैं


3
DLL नरक जैसा कि ज्ञात है
घीस

1
"स्टेटिक लाइब्रेरीज़ को एक एप्लीकेशन के हिस्से के रूप में संकलित किया जाता है" ... स्टैटिक लाइब्रेरीज़ को स्टैटिक लाइब्रेरीज़ के रूप में संकलित किया जाता है और एक एप्लीकेशन के हिस्से के रूप में लिंक किया जाता है
idclev 463035818

19

साझा पुस्तकालयों का सबसे महत्वपूर्ण लाभ यह है कि मेमोरी में लोड किए गए कोड की केवल एक प्रति है, चाहे लाइब्रेरी कितनी भी प्रक्रिया का उपयोग कर रही हो। स्थिर पुस्तकालयों के लिए प्रत्येक प्रक्रिया को कोड की अपनी प्रति मिलती है। इससे महत्वपूर्ण मेमोरी अपव्यय हो सकता है।

ओटीओएच, स्टैटिक लाइब्रेरीज़ का एक फायदा यह है कि आपके एप्लिकेशन में सब कुछ बंडल है। इसलिए आपको यह चिंता करने की जरूरत नहीं है कि क्लाइंट के पास उनके सिस्टम पर उपलब्ध सही लाइब्रेरी (और संस्करण) उपलब्ध होगी।


1
निष्पादन योग्य छवि डिस्क पर बड़ी होती है, साथ ही मेमोरी में, जब स्थिर लिबास का उपयोग किया जाता है।
जस्ट जेफ

यह सही है, कि जब मैंने कहा कि सब कुछ आपके आवेदन में बंडल है, तो मैं क्या कर रहा था।
जसमीत

इसके अतिरिक्त, .so* निक्स सिस्टम पर फाइलें थोड़े साझा (गतिशील) पुस्तकालय हैं।
एसएनआर

6

अन्य सभी उत्तरों के शीर्ष पर, एक बात का उल्लेख नहीं किया गया है जो अभी तक डिकॉप्लिंग है:

मुझे एक वास्तविक विश्व उत्पादन कोड के बारे में बोलने दें, जो मैं के साथ काम कर रहा हूं:

एक बहुत बड़ा सॉफ्टवेयर,> 300 प्रोजेक्ट्स (विजुअल स्टूडियो के साथ) से बना है, जो ज्यादातर स्टैटिक लीब के रूप में निर्मित होता है और अंत में सभी लिंक एक साथ एक विशाल निष्पादन योग्य होते हैं, आप निम्नलिखित समस्याओं का अंत करते हैं:

-लिंक का समय बेहद लंबा होता है। आप लिंक के 15 मिनट से अधिक तक समाप्त हो सकते हैं, मान लें कि 10 का संकलन समय है-कुछ उपकरण अपने घुटने पर इतने बड़े निष्पादन योग्य हैं, जैसे कि मेमोरी चेक टूल जो कोड को इंस्ट्रूमेंट करना चाहिए। आप मूर्खों के रूप में देखी गई सीमाओं तक पहुँच सकते हैं।

अधिक समस्याग्रस्त आपके सॉफ़्टवेयर का डिकॉउलिंग है: इस वास्तविक विश्व उदाहरण पर, हर प्रोजेक्ट की हेडर फाइलें किसी भी अन्य प्रोजेक्ट से पहुंच योग्य थीं। परिणामस्वरूप एक डेवलपर के लिए निर्भरता जोड़ना बहुत आसान था; यह हेडर को शामिल करने के बारे में था, क्योंकि अंत में लिंक प्रतीकों का पता लगाएगा। यह भयानक साइकिलिंग निर्भरता और पूर्ण गड़बड़ी से समाप्त होता है।

साझा पुस्तकालय के साथ, यह थोड़ा अतिरिक्त काम है क्योंकि डेवलपर को आश्रित पुस्तकालय को जोड़ने के लिए प्रोजेक्ट बिल्ड सिस्टम को संपादित करना होगा। मैंने देखा कि साझा लाइब्रेरी कोड एक क्लीनर कोड एपीआई पेश करता है।


2
-------------------------------------------------------------------------
|  +-  |    Shared(dynamic)       |   Static Library (Linkages)         |
-------------------------------------------------------------------------
|Pros: | less memory use          |   an executable, using own libraries|
|      |                          |     ,coming with the program,       |
|      |                          |   doesn't need to worry about its   |
|      |                          |   compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of       |   bigger memory uses                |
|      | libraries may be altered |                                     |
|      | subject to OS  and its   |                                     |
|      | version, which may affect|                                     |
|      | the compilebility and    |                                     |
|      | runnability of the code  |                                     |
-------------------------------------------------------------------------
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.