क्या सी स्टैटिक लाइब्रेरियों पर आधारित हैं? [बन्द है]


11

साझा पुस्तकालय होने के लिए 2 तर्क हैं:

  1. यह डिस्क स्थान को कम करने में मदद करता है।
  2. जब एक साझा लाइब्रेरी अपडेट की जाती है, तो उसके आधार पर सभी बायनेरिज़ को अपडेट मिलता है।

साझा पुस्तकालयों के लिए मुख्य रूप से एक दोष है:

  • वे () निर्भरता नरक का परिचय दे सकते हैं।

डेस्कटॉप कंप्यूटर पर, 1 लाभ वास्तव में अब और नहीं है। डिस्क स्थान को बर्बाद करना इन दिनों एक समस्या नहीं है।

स्थिर बायनेरिज़ होने से हमें बेहतर पैकेज मैनेजर प्राप्त करने में मदद मिलेगी - मेरा मतलब है, निर्भरता नरक अतीत की बात होगी। एक प्रोग्राम जोड़ना सिर्फ एक बाइनरी जोड़ना होगा; अंततः एक फ़ोल्डर को अपनी फ़ाइलों को संभालने देने के लिए। किसी प्रोग्राम को हटाना बस इस फ़ाइल को हटाना होगा। निर्भरता? गया हुआ।

दूसरा लाभ अभी भी खड़ा है, लेकिन मुझे लगता है कि डेस्कटॉप कंप्यूटरों पर स्थिर बायनेरिज़ का लाभ इसे बढ़ा देता है। मेरा मतलब है, यहां तक ​​कि नई भाषाएं भी जैसे कि सुविधा के कारण साझा पुस्तकालयों के फायदे के बावजूद अपने सभी बायनेरिज़ को संकलित करती हैं।


चूंकि साझा पुस्तकालयों के मुख्य लाभों में से एक अब कोई बड़ी बात नहीं है, क्या सी स्टैटिक लाइब्रेरी अभी भी डूबे हुए हैं? यदि हां, तो क्यों?


4
C का उपयोग प्राथमिक कारण विशेष रूप से किया जाता है क्योंकि आप आधुनिक डेस्कटॉप कंप्यूटर पर काम नहीं कर रहे हैं ।
तेलेस्टिन

18
@Telastyn मुझे क्षमा करें? सॉफ्टवेयर मेरे डेस्कटॉप कंप्यूटर पर स्थापित के अधिकांश सी में लिखा है
फ्लोरियन Margaine

6
साइड बिट - इस विषय पर पढ़ी गई एक ऑफ साइट - डायनामिक लिंकिंग को ध्यान में रखते हुए हानिकारक

6
गतिशील पुस्तकालयों का एक लाभ यह है कि लोग अभी भी आपके 15 साल पुराने बंद स्रोत गेम में बग्स, सुरक्षा छिद्रों या हार्डवेयर मुद्दों के आसपास काम करने के लिए पुस्तकालयों को अपडेट कर सकते हैं जो अद्यतन प्राप्त करना बंद कर चुके हैं। एक आला मामले की तरह, लेकिन चूंकि अच्छे खेल कमोडिटीज नहीं हैं, "बस एक और प्रोग्राम का उपयोग करें" वास्तव में मदद नहीं करता है। यह आपके स्वयं के कोड को खोलने के बिना एलजीपीएल के अनुपालन के लिए भी मायने रखता है।
डोभाल

4
आप साझा पुस्तकालयों के दो अन्य लाभों को भूल गए: 1) वे स्मृति में भी साझा किए जाते हैं, 2) सभी लिंकर्स बुरी तरह से चूसते हैं, और एक विशाल बाइनरी को जोड़ना अत्यधिक अप्रिय है। बाइनरी को कई छोटी संस्थाओं में विभाजित करने से पूरी प्रक्रिया बहुत अधिक सहनीय हो जाती है।
तर्क

जवाबों:


9

आपके प्रश्न का आधार त्रुटिपूर्ण है। जो कुछ किया गया है, उसके पीछे आधार की समझ नहीं है (कार्गो कल्ट प्रोग्रामिंग)?

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

असली सवाल यह है कि स्टेटिक और डायनेमिक लिंकिंग के पेशेवरों और विपक्षों में क्या है और कब एक दूसरे पर पसंद किया जाएगा।


2
बेसिल का जवाब होता है आपको बता ठीक क्यों वह साझा लाइब्रेरी का उपयोग कर की सिफारिश की: ? "क्यों आप लिंक के स्थिर आपके आवेदन करना चाहते हैं । यह आम तौर पर एक गलती है (क्योंकि आप प्रणाली गतिशील पुस्तकालयों के लिए अद्यतन से लाभ नहीं है) विशेष रूप से नाम सेवा स्विच में libc से सुविधाएं गतिशील लाइब्रेरी चाहती हैं। " यह सिर्फ एक" शेख़ी "नहीं है क्योंकि आप इससे सहमत नहीं हैं।
कोडी ग्रे

@ कोडी से जुड़ा हुआ उत्तर संपादित किया गया है क्योंकि मैंने इसे शेख़ी कहा है। एक ही राय है कि मैं स्टैटिक बनाम डायनेमिक लिंकिंग पर पकड़ रखता हूं, वह है जो आपकी आवश्यकताओं के लिए उपयुक्त हो, और पसंद की ताकत और कमजोरियों को समझने के बजाय कार्गो पंथ प्रोग्रामिंग सिद्धांत में पड़ें क्योंकि "किसी ने ऐसा कहा"।
मटनज़

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

1
स्थिर लिंकिंग जहां उपयुक्त है, उसका अच्छा उदाहरण है, जहां मैं काम करता हूं - बड़े, जटिल जीवन महत्वपूर्ण प्रणालियां। एक बार जब एक महत्वपूर्ण मॉड्यूल का परीक्षण किया जाता है और ऑपरेशन के लिए अनुमोदित किया जाता है, तो यह व्यवहार 'प्रक्रिया' के माध्यम से जाने के बिना नहीं बदलना चाहिए। हालांकि, सिस्टम के किसी भी संचालन और गैर-जीवन महत्वपूर्ण भागों (बिलिंग और रिपोर्टिंग) को कम मजबूत नियंत्रण की आवश्यकता नहीं है और गतिशील लिंकेज का उपयोग करें।
1

7

डेवलपर के दृष्टिकोण से, डायनेमिक लिंकिंग अक्सर आपके संकलन / लिंक / टेस्ट लूप को काफी तेज़ कर सकता है।

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

Qt जैसी लोकप्रिय लाइब्रेरी में सुरक्षा के मुद्दे पर विचार करें। डायनेमिक लिंकिंग के साथ, मैं सिर्फ एक पैकेज को अपडेट कर सकता हूं, बजाय इसके कि क्यूटी में लिंक करने वाले हर एक पैकेज को पहचानें, पुन: व्यवस्थित करें और तैनात करें।

स्टेटिक लिंकिंग से स्वतंत्र रूप से बंद स्रोत अनुप्रयोगों में लाभ हो सकता है, लेकिन ओपन सोर्स पैकेज प्रबंधन में इससे अधिक मदद मिलती है।


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

5

साझा पुस्तकालयों को मूल रूप से आपके कारण # 2 के लिए लिनक्स वितरण अनुरक्षकों द्वारा दृढ़ता से पसंद किया जाता है । यह वास्तव में उनके लिए महत्वपूर्ण है, उदाहरण के लिए, जब कोई zlib में सुरक्षा बग पाता है , तो उन्हें zlib का उपयोग करने वाले हर एक प्रोग्राम को फिर से नहीं करना पड़ता है - न केवल यह करने के लिए उन्हें और अधिक CPU चक्र खर्च करने होंगे। recompiling, हर कोई जो डिस्ट्रो का उपयोग करता है, फिर उन सभी कार्यक्रमों को फिर से डाउनलोड करना होगा । इस बीच, एक वितरण द्वारा प्रदान किए गए पैकेज के सेट के भीतर, निर्भरता नरक एक मुद्दा नहीं है, क्योंकि पुस्तकालयों के उस सेट के साथ काम करने के लिए सब कुछ परीक्षण किया जाता है।

यदि आप तृतीय-पक्ष सॉफ़्टवेयर का निर्माण कर रहे हैं, जिसे आपके वितरण में पुस्तकालयों की आवश्यकता नहीं है, तो सांख्यिकीय रूप से उन पुस्तकालयों को जोड़ने से विकल्प की तुलना में कम परेशानी हो सकती है, और यह ठीक है।

दूसरी महत्वपूर्ण बात यह है कि जीएनयू libcऔर जीसीसी के libstdc++दोनों घटक हैं जो लाइब्रेरी से जुड़े होने पर मज़बूती से काम नहीं करते हैं। सबसे आम समस्या है dlopen, क्योंकि आप जो भी मॉड्यूल लोड करते हैं, dlopenवह स्वयं गतिशील रूप से जुड़ा होता है libc.so.6। तो इसका मतलब है कि अब आपके पास अपने पता स्थान में सी लाइब्रेरी की दो प्रतियां हैं, और जब वे आंतरिक mallocडेटा संरचना की किस प्रति (उदाहरण के लिए) आधिकारिक हैं , तो वे सहमत नहीं हैं । यह बदतर हो जाता है: कार्यों का एक पूरा गुच्छा जो कुछ भी करने dlopen, जैसे gethostbynameऔर iconvउपयोग करने के लिए प्रकट नहीं होता हैdlopenआंतरिक रूप से (ताकि उनका व्यवहार रनटाइम-कंफर्टेबल हो)। सौभाग्य से, lib और libstdc ++ के लिए ABI बहुत स्थिर है, इसलिए आपको गतिशील रूप से लिंक करने में समस्याओं का सामना करने की संभावना नहीं है।


2

मैं मैट्नज़ के अंतिम बिंदु से सहमत हूं: यह सवाल एक लोडेड सवाल है। यह मानता है कि स्टेटिक लिंकिंग खराब है। मैं दो कारणों से सोच सकता हूं कि ऐसा क्यों नहीं है:

  • स्टेटिक लिंकिंग सुरक्षित है: यदि एक साझा लाइब्रेरी को अपडेट किया जाता है जैसे कि कोई एप्लिकेशन नए का उपयोग करता है (शायद नया पुराने को हटा देता है, या पुराने को हटा दिया जाता है), यह जोखिम पेश कर सकता है कि नया संस्करण एप्लिकेशन को तोड़ता है। यह एप्लिकेशन के आधिकारिक अपडेट के दायरे से बाहर एक कोड परिवर्तन है। हो सकता है इसका परीक्षण न किया गया हो। स्थैतिक रूप से लिंकिंग बाहरी रूप से पुस्तकालयों को साझा न करके इसे बढ़ावा देता है। मैं मानता हूं कि इस जोखिम के कारण साझा पुस्तकालयों के लिए यह एक नुकसान है। क्या होगा यदि एक साझा पुस्तकालय का एक नया संस्करण एक नया बग पेश करता है जो कुछ पुराने अनुप्रयोगों को तोड़ता है?

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


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

1
इन दिनों बाहर बहुत ज्यादा हर OS पर डायनामिक लाइब्रेरी की मांग है। वास्तव में उपयोग किए जा रहे पृष्ठ केवल स्मृति में हैं। यदि कई अनुप्रयोग समान कार्यक्षमता का उपयोग कर रहे हैं, तो वे मेमोरी साझा करेंगे और स्थिर लाइब्रेरी केस से कम उपयोग करेंगे। यदि एक ही लाइब्रेरी में कई ऐप अलग-अलग कार्यक्षमता का उपयोग कर रहे हैं, तो कार्यक्षमता के दोनों सेटों को स्थिर किया जाएगा, जिसमें स्थिर दृष्टिकोण के समान प्रभाव होगा।
एलन शटको

@AlanShutko मैंने संघर्ष किया और आपके द्वारा बताए गए तरीकों से उस हिस्से को कई तरीकों से हटा दिया। इस तरह से कोई वास्तविक गारंटी नहीं है, भले ही आधुनिक ऑपरेटिंग सिस्टम स्थैतिक के ओवरहेड के साथ साझा पुस्तकालयों की दक्षता प्रदान करते हैं। मैं फिर से संपादित करूंगा।

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

@ जूल्स मैं सहमत हूं, यह एक बिंदु था जो आधुनिक ऑपरेटिंग सिस्टमों में समस्याग्रस्त और संदिग्ध वैधता का था। मैंने उसे हटा दिया।

1

स्थिर और गतिशील पुस्तकालयों में से प्रत्येक का अपना उपयोग होता है। किसी एक अनुप्रयोग को कार्यक्षेत्र में देखते हुए हमें एक अलग विचार मिलता है कि क्या आवश्यक है और क्या नहीं है।

स्टेटिक लिंकिंग बहुत तेजी से एप्लिकेशन परिनियोजन को सरल करता है। विभिन्न संस्करणों के साथ पता लगाने और निपटने के लिए नहीं। बस सेंकना और तैनात करना।

गतिशील पुस्तकालयों के साथ स्पष्ट लाभ स्वतंत्र रूप से अपडेट लागू करने की क्षमता है।

यह एक कारण है कि मैं जावा के लिए मावेन और अन्य समान गतिशील लिंकिंग प्रोजेक्ट बिल्डरों में से एक है। वे उम्मीद करते हैं कि एकल लाइब्रेरी संस्करण किसी दिए गए url पर हमेशा और हमेशा के लिए उपलब्ध होगा। 10 वर्षों में होने वाली समस्या को नहीं समझने पर कोई भी आवेदन को संकलित नहीं कर सकता है क्योंकि सभी स्रोत और जार चले गए हैं।


क्या कोई विशेष कारण है कि यह उन कार्यक्रमों के लिए संभव नहीं होना चाहिए जो FooLib1.8मानक तरीके से अपने निष्पादन योग्य पैकेज में उस पुस्तकालय के लिए कोड को शामिल करने में सक्षम होने के लिए उपयोग करते हैं, ताकि FooLib1.9अपग्रेड या डाउनग्रेड करने के साथ अपग्रेड की गई उपयोगिता को अनुमति दे सकें? जिस तरह से क्लासिक मैकिंटोश में कोड संग्रहीत किया गया था, वह बहुत आसान हो जाएगा; क्या कोई कारण है कि आज की प्रणालियाँ इसे और बेहतर नहीं कर सकती हैं?
सुपरकैट

@ सुपरकैट का मतलब है कि किसी दिए गए पुस्तकालय का हर संस्करण सिस्टम पर उपलब्ध होगा? निश्चित नहीं कि मैं प्रश्न को समझूं। ओपी प्रश्न को सिस्टम वाइड शेयर्ड लाइब्रेरियों बनाम स्टैटिक लाइब्रेरीज़ की ओर अधिक निर्देशित किया गया था, जिन्हें एक साथ पैक किया जाएगा।
बहुत सारे क्रिस्प

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

यदि दी गई लाइब्रेरी का लाइसेंस आपको अपने पैकेज के साथ इसे वितरित करने की अनुमति देता है, तो यह हमेशा ऐसा करने का पसंदीदा तरीका है। यह बाहरी निर्भरता की संख्या को कम करता है। जब से आप सब कुछ वितरित कर रहे होंगे तब एक अपग्रेड या पैचिंग मैकेनिक उसी तरह से स्थिर या गतिशील होगा। आमतौर पर बाइनरी डेल्टास पर आधारित पैचिंग। कोई फर्क नहीं पड़ेगा।
बहुत सारे कुरकुरा 16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.