मैं सोच रहा था कि सभी प्रोग्रामिंग भाषाओं में मैं क्यों सीखा हूं, जैसे कि सी ++, जावा, पायथन) स्टैडलिब जैसी मानक लाइब्रेरी, समान "फ़ंक्शंस" होने के बजाय भाषा का एक आदिम होना।
मैं सोच रहा था कि सभी प्रोग्रामिंग भाषाओं में मैं क्यों सीखा हूं, जैसे कि सी ++, जावा, पायथन) स्टैडलिब जैसी मानक लाइब्रेरी, समान "फ़ंक्शंस" होने के बजाय भाषा का एक आदिम होना।
जवाबों:
मुझे विंसेंट (+1) के अच्छे उत्तर पर कुछ विस्तार करने की अनुमति दें :
संकलक निर्देश के सेट में फ़ंक्शन कॉल का अनुवाद क्यों नहीं कर सका?
यह कर सकता है, और कम से कम दो तंत्रों के माध्यम से ऐसा करता है:
फंक्शन कॉल को इनलाइन करना - अनुवाद के दौरान, कंपाइलर अपने कार्यान्वयन के साथ एक सोर्स कोड कॉल को फंक्शन में वास्तविक कॉल करने के बजाय सीधे इनलाइन से बदल सकता है। फिर भी फ़ंक्शन को कहीं न कहीं एक कार्यान्वयन को परिभाषित करने की आवश्यकता है और यह मानक पुस्तकालय में हो सकता है।
आंतरिक कार्य - आंतरिक कार्य ऐसे कार्य हैं जो संकलक को बिना किसी पुस्तकालय में कार्य किए बिना सूचित किए गए हैं। ये आमतौर पर हार्डवेयर विशेषताओं के लिए आरक्षित होते हैं जो किसी अन्य तरीके से व्यावहारिक रूप से सुलभ नहीं होते हैं, इतना सरल होना कि यहां तक कि असेंबली भाषा लाइब्रेरी फ़ंक्शन के लिए कॉल का ओवरहेड भी उच्च माना जाता है। (संकलक आम तौर पर अपनी भाषा में केवल स्वचालित रूप से इनलाइन स्रोत कोड कर सकता है, लेकिन असेंबली फ़ंक्शंस, जो कि आंतरिक तंत्र में नहीं है)।
अभी भी ये कहा जा रहा है, सबसे अच्छा विकल्प कभी-कभी कंपाइलर के लिए स्रोत भाषा में एक फ़ंक्शन कॉल को मशीन कोड में फ़ंक्शन कॉल में अनुवाद करने के लिए होता है। पुनरावृत्ति, आभासी तरीके, और सरासर आकार कुछ कारण हैं कि इनलाइनिंग हमेशा संभव / व्यावहारिक नहीं है। (एक अन्य कारण बिल्ड का इरादा है, जैसे अलग संकलन (ऑब्जेक्ट मॉड्यूल), अलग लोड इकाइयां (जैसे डीएलएल))।
अधिकांश मानक लाइब्रेरी फ़ंक्शंस को इंट्रिक्टिक्स बनाने का कोई वास्तविक लाभ नहीं है (जो कि वास्तविक लाभ के लिए संकलक में बहुत अधिक ज्ञान कोड करेगा), इसलिए मशीन कोड कॉल फिर से सबसे उपयुक्त है।
C एक उल्लेखनीय भाषा है जो यकीनन अन्य स्पष्ट भाषा कथनों को मानक पुस्तकालय कार्यों के पक्ष में छोड़ देती है। हालांकि पुस्तकालय पहले से मौजूद थे, इस भाषा ने मानक पुस्तकालय कार्यों से अधिक काम करने के लिए एक बदलाव किया और भाषा के व्याकरण में स्पष्ट बयानों के रूप में कम। उदाहरण के लिए, अन्य भाषाओं में IO को अक्सर विभिन्न कथनों के रूप में अपना सिंटैक्स दिया जाता था, जबकि C व्याकरण किसी भी IO कथनों को परिभाषित नहीं करता है, बस इसके मानक लाइब्रेरी को संदर्भित करने के लिए, जो कि फ़ंक्शन कॉल के माध्यम से सभी सुलभ है, जो संकलक पहले से ही जानता है कि कैसे करना है।
यह केवल भाषा को यथासंभव सरल रखने के लिए है। आपको भाषा की एक विशेषता के बीच अंतर करने की आवश्यकता होती है, जैसे कि एक प्रकार का लूप या कार्य करने के लिए मापदंडों को पारित करने के तरीके और इतने पर, और सामान्य कार्यक्षमता जो कि अधिकांश अनुप्रयोगों की आवश्यकता होती है।
पुस्तकालय ऐसे कार्य हैं जो कई प्रोग्रामर के लिए उपयोगी हो सकते हैं इसलिए उन्हें पुन: प्रयोज्य कोड के रूप में बनाया जाता है जिन्हें साझा किया जा सकता है। मानक पुस्तकालयों को बहुत सामान्य कार्यों के लिए डिज़ाइन किया गया है जो प्रोग्रामर को आमतौर पर चाहिए होते हैं। इस तरह प्रोग्रामिंग भाषा प्रोग्रामरों की एक विस्तृत श्रृंखला के लिए तुरंत उपयोगी है। भाषा की मुख्य विशेषताओं को बदले बिना पुस्तकालयों को अद्यतन और विस्तारित किया जा सकता है।
PHP
एक उदाहरण के रूप में शायद ही इसकी विशाल भाषा के कार्यों और भाषा के बीच कोई अंतर हो।
include
, require
और require_once
, अगर / के लिए / जबकि (संरचित प्रोग्रामिंग), अपवाद, 'त्रुटि मूल्यों' का एक अलग से व्यवस्था, कमजोर टाइपिंग नियम जटिल, जटिल ऑपरेटर पूर्वता नियम, और पर और पर । की, कहते हैं, स्मालटाक, योजना, Prolog, आगे, आदि सादगी को यह तुलना करें;)
अन्य उत्तरों में जो पहले ही कहा जा चुका है, उसके अतिरिक्त एक पुस्तकालय में मानक कार्य करना चिंता का विषय है :
भाषा को पार्स करना और इसके लिए कोड तैयार करना कंपाइलर का काम है। यह संकलक का काम नहीं है कि इसमें कुछ भी हो जो पहले से ही उस भाषा में लिखा जा सके और पुस्तकालय के रूप में प्रदान किया जा सके।
यह मुख्य रूप से सभी कार्यक्रमों द्वारा आवश्यक कोर कार्यक्षमता प्रदान करने के लिए मानक पुस्तकालय (एक जो हमेशा निहित है) नौकरी है । यह मानक पुस्तकालय का काम नहीं है जिसमें सभी कार्य शामिल हैं जो उपयोगी हो सकते हैं।
सहायक कार्यक्षमता प्रदान करने के लिए वैकल्पिक मानक पुस्तकालयों का काम है जो कई कार्यक्रम बिना कर सकते हैं, लेकिन जो अभी भी काफी बुनियादी हैं और मानक वातावरण के साथ शिपिंग के लिए कई अनुप्रयोगों के लिए आवश्यक हैं। यह उन वैकल्पिक पुस्तकालयों का काम नहीं है जिनमें सभी पुन: प्रयोज्य कोड हैं जो कभी भी लिखे गए हैं।
उपयोगी पुन: प्रयोज्य कार्यों का संग्रह प्रदान करना उपयोगकर्ता पुस्तकालयों का काम है। यह कभी भी लिखा गया है कि सभी कोड शामिल करने के लिए उपयोगकर्ता पुस्तकालयों का काम नहीं है।
यह एक अनुप्रयोग के स्रोत कोड का काम है जो कोड के शेष बिट्स प्रदान करता है जो वास्तव में केवल उस एक अनुप्रयोग के लिए प्रासंगिक हैं।
यदि आप एक आकार-फिट-सभी सॉफ़्टवेयर चाहते हैं, तो आपको कुछ जटिल लगता है। आपको प्रबंधनीय स्तर तक जटिलता को प्राप्त करने के लिए संशोधित करने की आवश्यकता है। और आपको आंशिक कार्यान्वयन की अनुमति देने के लिए संशोधित करने की आवश्यकता है :
थ्रेडिंग लाइब्रेरी एकल-कोर एम्बेडेड नियंत्रक पर बेकार है। pthread
लाइब्रेरी को शामिल नहीं करने के लिए इस एम्बेडेड कंट्रोलर के लिए भाषा कार्यान्वयन की अनुमति देना सही काम है।
गणित पुस्तकालय माइक्रो-नियंत्रक पर बेकार है जिसमें एफपीयू भी नहीं है। फिर से, ऐसे कार्यों को प्रदान करने के लिए मजबूर नहीं किया जा रहा है sin()
जो उस सूक्ष्म नियंत्रक के लिए आपकी भाषा के कार्यान्वयनकर्ताओं के लिए जीवन को बहुत आसान बनाता है।
यहां तक कि कोर मानक पुस्तकालय बेकार है जब आप एक कर्नेल प्रोग्रामिंग कर रहे हैं। आप write()
कर्नेल में syscall के printf()
बिना लागू नहीं कर सकते, और आप बिना कार्यान्वित नहीं कर सकते write()
। कर्नेल प्रोग्रामर के रूप में, यह आपका काम है कि write()
आप सिसकॉल प्रदान करें , आप बस इसके होने की उम्मीद नहीं कर सकते।
ऐसी भाषा जो मानक पुस्तकालयों से इस तरह की चूक के लिए अनुमति नहीं देती है, बस कई कार्यों के लिए उपयुक्त नहीं है । यदि आप चाहते हैं कि आपकी भाषा असामान्य वातावरण में लचीली रूप से प्रयोग करने योग्य हो, तो यह अनिवार्य होना चाहिए कि मानक लाइब्रेरी क्या शामिल हैं। आपकी भाषा जितना अधिक मानक पुस्तकालयों पर निर्भर करती है, उतनी ही अधिक धारणाएँ इसके निष्पादन के माहौल पर बनती हैं, और इस प्रकार यह उन पर्यावरणों के लिए इसके उपयोग को प्रतिबंधित करता है जो इन पूर्वापेक्षाओं को प्रदान करते हैं।
बेशक, उच्च स्तर की भाषाएं जैसे अजगर और जावा अपने पर्यावरण पर बहुत सारी धारणाएं बना सकते हैं। और वे अपने मानक पुस्तकालयों में कई, कई चीजों को शामिल करते हैं। C जैसी निम्न स्तरीय भाषाएँ अपने मानक पुस्तकालयों में बहुत कम उपलब्ध कराती हैं, और मुख्य मानक पुस्तकालय को बहुत छोटा रखती हैं। यही कारण है कि आप वस्तुतः किसी भी वास्तुकला के लिए एक काम कर रहे सी कंपाइलर को ढूंढते हैं, लेकिन हो सकता है कि उस पर कोई भी पाइथन स्क्रिप्ट न चला सके।
एक बड़ा कारण संकलक और मानक पुस्तकालय अलग-अलग हैं क्योंकि वे दो अलग-अलग उद्देश्यों की सेवा करते हैं (भले ही वे दोनों एक ही भाषा युक्ति द्वारा परिभाषित हों): संकलक उच्च-स्तरीय कोड को मशीन निर्देशों में अनुवाद करता है, और मानक पुस्तकालय पूर्व-परीक्षण प्रदान करता है आमतौर पर आवश्यक कार्यक्षमता के कार्यान्वयन। कंपाइलर लेखक अन्य सॉफ्टवेयर डेवलपर्स की तरह मॉड्यूलरिटी को महत्व देते हैं। वास्तव में, सी के कुछ शुरुआती कंपाइलर आगे की प्रक्रिया, संकलन, और लिंकिंग के लिए कंपाइलर को अलग-अलग कार्यक्रमों में विभाजित करते हैं।
यह प्रतिरूपकता आपको लाभ का एक गुच्छा देती है:
ऐतिहासिक रूप से बोलना (कम से कम सी के दृष्टिकोण से), भाषा के मूल, पूर्व-मानकीकरण संस्करणों में एक मानक पुस्तकालय नहीं था। ओएस विक्रेता और तीसरे पक्ष अक्सर आमतौर पर उपयोग की जाने वाली कार्यक्षमता से भरे पुस्तकालय प्रदान करते हैं, लेकिन अलग-अलग कार्यान्वयन में अलग-अलग चीजें शामिल थीं और वे एक-दूसरे के साथ काफी हद तक असंगत थे। जब सी को मानकीकृत किया गया था, तो उन्होंने इन असमान कार्यान्वयनों को सामंजस्य बनाने और पोर्टेबिलिटी में सुधार करने के प्रयास में "मानक पुस्तकालय" को परिभाषित किया। सी मानक पुस्तकालय भाषा से अलग विकसित हुआ, जैसे बूस्ट पुस्तकालयों में सी ++ के लिए है, लेकिन बाद में भाषा की युक्ति में एकीकृत किया गया।
अतिरिक्त कोने-केस का जवाब: बौद्धिक संपदा प्रबंधन
उल्लेखनीय उदाहरण .NET फ्रेमवर्क में Math.Pow (डबल, डबल) का कार्यान्वयन है जो Microsoft द्वारा Intel से खरीदा गया था और भले ही फ्रेमवर्क खुला-स्रोत चला गया हो, फिर भी अज्ञात रहता है। (सटीक होने के लिए, उपरोक्त मामले में यह एक पुस्तकालय के बजाय एक आंतरिक कॉल है, लेकिन विचार रखता है।) एक पुस्तकालय भाषा से ही अलग हो जाता है (सैद्धांतिक रूप से मानक पुस्तकालयों का सबसेट भी) भाषा के बैकरों को ड्राइंग में अधिक लचीलापन दे सकता है। क्या पारदर्शी रखना है और क्या नहीं, इसके बीच की रेखा को अज्ञात (तीसरे पक्ष या अन्य आईपी-संबंधित कारणों के साथ उनके अनुबंध के कारण) रहना चाहिए।
Math.Pow
किसी भी खरीदारी या इंटेल के बारे में कुछ भी उल्लेख नहीं करता है, और फ़ंक्शन के कार्यान्वयन के स्रोत कोड को पढ़ने वाले लोगों के बारे में बात करता है।
कीड़े और डिबगिंग।
कीड़े: सभी सॉफ्टवेयर में बग होते हैं, आपके मानक पुस्तकालय में बग होते हैं और आपके कंपाइलर में कीड़े होते हैं। भाषा के एक उपयोगकर्ता के रूप में इस तरह के बग को ढूंढना और उन्हें हल करना बहुत आसान है जब वे मानक पुस्तकालय में होते हैं जैसा कि कंपाइलर में विरोध किया जाता है।
डिबगिंग: मेरे लिए एक मानक लाइब्रेरी के स्टैक ट्रेस को देखना और मुझे कुछ समझाना आसान है जो गलत हो सकता है। क्योंकि उस स्टैक ट्रेस में कोड है जो मैं समझता हूं। निश्चित रूप से आप गहरी खुदाई कर सकते हैं और आप अपने आंतरिक कार्यों को भी ट्रेस कर सकते हैं, लेकिन यह बहुत आसान है अगर यह एक ऐसी भाषा है जो आप दिन-प्रतिदिन उपयोग करते हैं।
यह एक अच्छा सवाल है!
C ++ मानक, उदाहरण के लिए, यह कभी नहीं निर्दिष्ट करता है कि संकलक या मानक पुस्तकालय में क्या लागू किया जाना चाहिए: यह सिर्फ कार्यान्वयन को संदर्भित करता है । उदाहरण के लिए, आरक्षित प्रतीकों को संकलक (आंतरिक) के रूप में और मानक पुस्तकालय द्वारा, परस्पर विनिमय द्वारा दोनों परिभाषित किया जाता है।
फिर भी, सभी C ++ कार्यान्वयन जिन्हें मैं जानता हूं कि संकलक द्वारा प्रदान की जाने वाली आंतरिक संख्या की न्यूनतम संभव संख्या होगी, और मानक पुस्तकालय द्वारा जितना संभव हो उतना प्रदान किया जाएगा।
इस प्रकार, जबकि यह मानक पुस्तकालय को संकलक में आंतरिक कार्यक्षमता के रूप में परिभाषित करने के लिए तकनीकी रूप से संभव है, ऐसा लगता है कि शायद ही कभी अभ्यास में उपयोग किया जाता है।
आइए मानक पुस्तकालय से संकलक तक कार्यक्षमता के कुछ टुकड़े को स्थानांतरित करने के विचार पर विचार करें।
लाभ:
नुकसान:
std
) बनाना कठिन हो जाता है ।इसका मतलब है कि संकलक के लिए कुछ स्थानांतरित करना महंगा है , अभी और भविष्य में, और इसलिए इसे एक ठोस मामले की आवश्यकता है। कार्यक्षमता के कुछ टुकड़ों के लिए, यह आवश्यक है (उन्हें नियमित कोड के रूप में नहीं लिखा जा सकता है), हालांकि तब भी यह संकलक के पास जाने और मानक पुस्तकालय में उन्हें बनाने के लिए न्यूनतम और सामान्य टुकड़े निकालने का भुगतान करता है ।
खुद एक भाषा डिजाइनर के रूप में, मैं यहां कुछ अन्य उत्तरों की प्रतिध्वनि करना चाहता हूं, लेकिन यह किसी ऐसे व्यक्ति की आंखों के माध्यम से प्रदान करता है जो भाषा का निर्माण कर रहा है।
जब आप इसमें शामिल हो सकते हैं तो एक एपीआई समाप्त नहीं होता है। जब आप इसे से बाहर ले जा सकते हैं तो एक एपीआई समाप्त हो जाता है।
एक प्रोग्रामिंग भाषा को कुछ भाषा का उपयोग करके निर्दिष्ट किया जाना है। आपको अपनी भाषा में लिखे गए किसी भी कार्यक्रम के पीछे का अर्थ बताने में सक्षम होना चाहिए। इस भाषा को लिखना बहुत कठिन है, और अच्छी तरह से लिखना भी कठिन है। सामान्य तौर पर, यह अंग्रेजी का एक बहुत ही सटीक और अच्छी तरह से संरचित रूप होता है, जिसका उपयोग कंप्यूटर को नहीं, बल्कि अन्य डेवलपर्स को किया जाता है, खासकर उन डेवलपर्स को जो आपकी भाषा के लिए कंपाइलर या दुभाषिए लिखते हैं। यहाँ C ++ 11 कल्पना से एक उदाहरण है, [intro.multithread / 14]:
एक परमाणु वस्तु एम पर साइड इफेक्ट्स का दृश्य अनुक्रम, एम के मान गणना बी के संबंध में, एम के संशोधन क्रम में साइड इफेक्ट्स का एक अधिकतम उप-क्रमिक उप-अनुक्रम है, जहां पहला साइड इफेक्ट बी के संबंध में दिखाई देता है। , और हर साइड इफेक्ट के लिए, ऐसा नहीं है कि बी इससे पहले होता है। मूल्यांकन बी द्वारा निर्धारित परमाणु वस्तु एम का मूल्य, बी के संबंध में एम के दृश्य अनुक्रम में कुछ ऑपरेशन द्वारा संग्रहीत मूल्य होगा। नोट: यह दिखाया जा सकता है कि मूल्य के साइड इफेक्ट के दृश्य अनुक्रम अभिकलन अद्वितीय है नीचे दिए गए सुसंगतता आवश्यकताओं को देखते हुए। ध्यान दें]
Blek! जिस किसी ने भी यह समझने में डुबकी लगाई है कि C ++ 11 को मल्टीथ्रेडिंग कैसे हैंडल करता है, यह सराहना कर सकता है कि शब्दांकन को इतना खतरा अपारदर्शी क्यों होना चाहिए, लेकिन यह इस तथ्य को क्षमा नहीं करता है कि यह अच्छी तरह से है ... इतना अपारदर्शी!
इसके विपरीत std::shared_ptr<T>::reset
, मानक के पुस्तकालय अनुभाग में, की परिभाषा के साथ :
template <class Y> void reset(Y* p);
प्रभाव: के बराबर
shared_ptr(p).swap(*this)
तो क्या अंतर है? भाषा की परिभाषा के भाग में, लेखक यह नहीं मान सकते कि पाठक भाषा की प्रधानता को समझता है। अंग्रेजी गद्य में सब कुछ ध्यान से निर्दिष्ट किया जाना चाहिए। एक बार जब हम लाइब्रेरी की परिभाषा वाले हिस्से में पहुंच जाते हैं, तो हम व्यवहार को निर्दिष्ट करने के लिए भाषा का उपयोग कर सकते हैं। यह अक्सर बहुत आसान है!
सिद्धांत रूप में, किसी को भी प्रलेखों से एक सहज निर्माण हो सकता है कल्पना दस्तावेज़ की शुरुआत में, सभी तरह से परिभाषित करने के माध्यम से कि हम "मानक पुस्तकालय सुविधाओं" के रूप में क्या सोचेंगे, "भाषा आदिम" के बीच एक रेखा खींचने के बिना और "मानक पुस्तकालय" सुविधाएँ। व्यवहार में, यह रेखा खींचने के लिए बहुत मूल्यवान साबित होती है क्योंकि यह आपको भाषा के कुछ सबसे जटिल हिस्सों (जैसे कि जो एल्गोरिदम को लागू करना चाहिए) को उन्हें व्यक्त करने के लिए डिज़ाइन की गई भाषा का उपयोग करके लिखने देती है।
और हम वास्तव में कुछ धुंधली रेखाएँ देखते हैं:
java.lang.ref.Reference<T>
हो सकता है केवल मानक पुस्तकालय वर्गों द्वारा subclassed जा java.lang.ref.WeakReference<T>
java.lang.ref.SoftReference<T>
और java.lang.ref.PhantomReference<T>
वजह से व्यवहार Reference
इतनी गहराई से जावा भाषा विशिष्टता है कि वे उस प्रक्रिया को "मानक पुस्तकालय" वर्गों के रूप में लागू की भाग में कुछ प्रतिबंध लगाने के लिए की जरूरत के साथ जुड़ रहे हैं।यह मौजूदा उत्तरों के अतिरिक्त है (और एक टिप्पणी के लिए बहुत लंबा है)।
एक मानक पुस्तकालय के लिए कम से कम दो अन्य कारण हैं:
यदि कोई विशेष भाषा सुविधा किसी लाइब्रेरी फ़ंक्शन में है और मैं जानना चाहता हूं कि यह कैसे काम करता है, तो मैं सिर्फ उस फ़ंक्शन के लिए स्रोत पढ़ सकता हूं। अगर मैं बग रिपोर्ट / पैच / पुल अनुरोध सबमिट करना चाहता हूं, तो आमतौर पर फिक्स और टेस्ट केस (कोड) को कोड करना बहुत मुश्किल नहीं है। यदि यह संकलक में है, तो मुझे इंटर्नल्स में खुदाई करने में सक्षम होना चाहिए। भले ही यह एक ही भाषा में हो (और यह होना चाहिए, किसी भी स्वाभिमानी कंपाइलर को स्व-होस्ट किया जाना चाहिए) कंपाइलर कोड एप्लीकेशन कोड जैसा कुछ नहीं है। सही फाइलें ढूंढने में भी हमेशा के लिए लग सकता है।
यदि आप उस मार्ग पर जाते हैं तो आप बहुत सारे संभावित योगदानकर्ताओं से खुद को काट रहे हैं।
कई भाषाएँ इस सुविधा को एक डिग्री या किसी अन्य को प्रदान करती हैं, लेकिन यह कोड को फिर से लोड करने के लिए बहुत अधिक जटिल होगा जो कि हॉट रीलोडिंग कर रहा है। यदि SL रनटाइम से अलग है तो इसे फिर से लोड किया जा सकता है।
यह एक दिलचस्प सवाल है, लेकिन पहले से ही कई अच्छे जवाब दिए गए हैं, इसलिए मैं पूरी कोशिश नहीं करूंगा।
हालांकि, दो चीजें जो मुझे नहीं लगता कि उन्होंने पर्याप्त ध्यान दिया है:
पहला यह कि पूरी बात सुपर क्लियर नहीं है। यह बिल्कुल एक स्पेक्ट्रम है क्योंकि चीजों को अलग तरीके से करने के कारण हैं। एक उदाहरण के रूप में, संकलक अक्सर मानक पुस्तकालयों और उनके कार्यों के बारे में जानते हैं। उदाहरण का उदाहरण: सी का "हैलो वर्ल्ड" फ़ंक्शन - प्रिंटफ - वह सबसे अच्छा है जिसके बारे में मैं सोच सकता हूं। यह एक लाइब्रेरी फंक्शन है, इसे छांटना है, क्योंकि यह बहुत ही प्लेटफॉर्म पर निर्भर है। लेकिन यह व्यवहार (कार्यान्वयन परिभाषित) है, जिसे प्रोग्रामर द्वारा खराब इनवोकेशन के बारे में चेतावनी देने के लिए कंपाइलर द्वारा जाना जाना चाहिए। यह विशेष रूप से साफ नहीं है, लेकिन एक अच्छे समझौते के रूप में देखा गया। संयोग से, यह "क्यों इस डिजाइन" के अधिकांश सवालों का असली जवाब है: बहुत समझौता और "उस समय एक अच्छा विचार जैसा लग रहा था"। हमेशा "यह करने का स्पष्ट तरीका था" या "
दूसरा यह है कि यह मानक पुस्तकालय को वह सब मानक नहीं होने देता है। ऐसी बहुत सी परिस्थितियाँ जो एक भाषा के लिए वांछनीय होती हैं, लेकिन आमतौर पर उनके साथ जो मानक पुस्तकालय होते हैं, वे व्यावहारिक और वांछनीय दोनों नहीं होते हैं। यह आमतौर पर गैर-मानक प्लेटफार्मों पर सी जैसी सिस्टम प्रोग्रामिंग भाषाओं के साथ मामला है। उदाहरण के लिए, यदि आपके पास ओएस या एक अनुसूचक के बिना एक सिस्टम है: तो आप थ्रेडिंग नहीं करेंगे।
एक मानक लाइब्रेरी मॉडल के साथ (और इसमें थ्रेडिंग का समर्थन किया जा रहा है) इसे साफ तरीके से संभाला जा सकता है: कंपाइलर बहुत अधिक है, आप उन पुस्तकालयों के बिट्स का पुन: उपयोग कर सकते हैं जो लागू होते हैं, और कुछ भी जो आप नहीं हटा सकते। यदि यह संकलक में पकाया जाता है तो चीजें गड़बड़ होने लगती हैं।
उदाहरण के लिए:
आप एक आज्ञाकारी संकलक नहीं हो सकते।
आप मानक से अपने विचलन को कैसे इंगित करेंगे। ध्यान दें कि आम तौर पर आयात के कुछ रूप होते हैं / इसमें सिंटैक्स शामिल होता है जो आप विफल हो सकते हैं अर्थात अजगर का आयात या सी शामिल है जो आसानी से समस्या को इंगित करता है यदि मानक पुस्तकालय मॉडल में कुछ भी गायब है।
यदि आप 'लाइब्रेरी' की कार्यक्षमता को बढ़ाना या बढ़ाना चाहते हैं, तो भी ऐसी ही समस्याएं लागू होती हैं। यह आपके विचार से कहीं अधिक सामान्य है। बस थ्रेडिंग से चिपके रहने के लिए: विंडोज़, लिनेक्स और कुछ-एक्सक्लूसिव-नेटवर्क-प्रोसेसिंग-यूनिट्स, सभी थ्रेडिंग का अलग-अलग तरीके से उपयोग करते हैं। जबकि लिनक्स / विंडोज़ बिट्स काफी स्थिर हो सकते हैं और एक समान एपीआई का उपयोग करने में सक्षम हो सकते हैं, एनपीयू सामान सप्ताह के दिन और एपीआई इसके साथ बदल जाएगा। कंपाइलर जल्दी से खराब हो जाएगा क्योंकि लोगों ने फैसला किया कि उन्हें किन बिट्स का समर्थन करने की ज़रूरत है / कर सकते हैं-अगर वे इस तरह की चीज़ों को विभाजित करने का कोई तरीका नहीं था, तो बहुत तेज़ी से।