क्यों मानक पुस्तकालयों प्रोग्रामिंग भाषा आदिम नहीं हैं? [बन्द है]


30

मैं सोच रहा था कि सभी प्रोग्रामिंग भाषाओं में मैं क्यों सीखा हूं, जैसे कि सी ++, जावा, पायथन) स्टैडलिब जैसी मानक लाइब्रेरी, समान "फ़ंक्शंस" होने के बजाय भाषा का एक आदिम होना।


4
आपका क्या मतलब है "संकलक निर्देश के सेट में फ़ंक्शन कॉल का अनुवाद क्यों नहीं कर सका"? लगभग यही है कि कंपाइलर क्या करता है, मानक पुस्तकालय या नहीं (ठीक है, पायथन केवल पार्टवे और जावा से जेवी बाईटकोड; समान अवधारणा)। मानक पुस्तकालयों में वास्तव में कोड -> निर्देशों के संकलन से कोई लेना-देना नहीं है।
Delioth

25
@Delioth मुझे लगता है कि सिमोन पूछ रहा है कि भाषा के मानक पुस्तकालय में सब कुछ क्यों नहीं है, इसके बजाय उस भाषा का एक आदिम निर्माण / कार्य $ लैंग है। मैं कहूंगा कि यह किसी के लिए भी एक उचित प्रश्न है जो प्रोग्रामिंग भाषाओं के लिए बहुत नया है :)
एंड्रेस एफ।

33
मानक पुस्तकालय आमतौर पर एक कामकाजी प्रोग्रामिंग भाषा और एक उपयोगी के बीच की खाई को भरता है जिसका लोग उपयोग करेंगे।
तेलस्टिन

6
पायथन के मानक पुस्तकालय का एक महत्वपूर्ण हिस्सा वास्तव में सी में लिखा गया है और पहले से ही संकलित है।
एल्मोवनक्लिमो

1
इसके विपरीत, बेसिक के अधिकांश कार्यान्वयनों में, सब कुछ भाषा का हिस्सा है और उनके लिए कोई लाइब्रेरी नहीं है और न ही उनके लिए समर्थन है (मशीन कार्यान्वयन में कॉल करने की क्षमता के लिए, कई कार्यान्वयनों में बचत करें)।
यूरो मिसेल

जवाबों:


32

मुझे विंसेंट (+1) के अच्छे उत्तर पर कुछ विस्तार करने की अनुमति दें :

संकलक निर्देश के सेट में फ़ंक्शन कॉल का अनुवाद क्यों नहीं कर सका?

यह कर सकता है, और कम से कम दो तंत्रों के माध्यम से ऐसा करता है:

  • फंक्शन कॉल को इनलाइन करना - अनुवाद के दौरान, कंपाइलर अपने कार्यान्वयन के साथ एक सोर्स कोड कॉल को फंक्शन में वास्तविक कॉल करने के बजाय सीधे इनलाइन से बदल सकता है। फिर भी फ़ंक्शन को कहीं न कहीं एक कार्यान्वयन को परिभाषित करने की आवश्यकता है और यह मानक पुस्तकालय में हो सकता है।

  • आंतरिक कार्य - आंतरिक कार्य ऐसे कार्य हैं जो संकलक को बिना किसी पुस्तकालय में कार्य किए बिना सूचित किए गए हैं। ये आमतौर पर हार्डवेयर विशेषताओं के लिए आरक्षित होते हैं जो किसी अन्य तरीके से व्यावहारिक रूप से सुलभ नहीं होते हैं, इतना सरल होना कि यहां तक ​​कि असेंबली भाषा लाइब्रेरी फ़ंक्शन के लिए कॉल का ओवरहेड भी उच्च माना जाता है। (संकलक आम तौर पर अपनी भाषा में केवल स्वचालित रूप से इनलाइन स्रोत कोड कर सकता है, लेकिन असेंबली फ़ंक्शंस, जो कि आंतरिक तंत्र में नहीं है)।

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

अधिकांश मानक लाइब्रेरी फ़ंक्शंस को इंट्रिक्टिक्स बनाने का कोई वास्तविक लाभ नहीं है (जो कि वास्तविक लाभ के लिए संकलक में बहुत अधिक ज्ञान कोड करेगा), इसलिए मशीन कोड कॉल फिर से सबसे उपयुक्त है।

C एक उल्लेखनीय भाषा है जो यकीनन अन्य स्पष्ट भाषा कथनों को मानक पुस्तकालय कार्यों के पक्ष में छोड़ देती है। हालांकि पुस्तकालय पहले से मौजूद थे, इस भाषा ने मानक पुस्तकालय कार्यों से अधिक काम करने के लिए एक बदलाव किया और भाषा के व्याकरण में स्पष्ट बयानों के रूप में कम। उदाहरण के लिए, अन्य भाषाओं में IO को अक्सर विभिन्न कथनों के रूप में अपना सिंटैक्स दिया जाता था, जबकि C व्याकरण किसी भी IO कथनों को परिभाषित नहीं करता है, बस इसके मानक लाइब्रेरी को संदर्भित करने के लिए, जो कि फ़ंक्शन कॉल के माध्यम से सभी सुलभ है, जो संकलक पहले से ही जानता है कि कैसे करना है।


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

10
@DocBrown 1975 तक, प्रोग्रामिंग भाषा के विकास के क्षेत्र में पर्याप्त उदाहरण थे (ALGOL-68, कोई भी?) जिसने दिखाया कि भाषा में हर चीज को सीधे सेंकने का प्रयास सीधे भाषा विनिर्देशों और दोनों में काफी धीमी गति से होता है? उत्पादन में भाषा कार्यान्वयन।
जोकर_vD

5
इसी तरह का एक उदाहरण पायथन ने क्या किया है print: 2.x में, यह एक बयान था , जिसका अपना विशेष व्याकरण है, लेकिन 3.x में, यह सिर्फ एक अन्य फ़ंक्शन कॉल बन गया। आधिकारिक स्पष्टीकरण के लिए PEP 3105 देखें ।
dan04

1
@DocBrown, पोर्टेबिलिटी लगभग निश्चित रूप से एक कारण नहीं था। जब यूनिक्स और सी बनाए गए थे, तो वे डिज़ाइन किए गए थे और बिल्कुल एक मशीन के लिए बनाया गया था, एक अतिरिक्त पीडीपी -7, जैसा कि केन थॉम्पसन ने सोचा था कि असफल मल्टीिक्स परियोजना से क्या अवधारणाएं उबार सकती हैं। सी भी एक कारण के लिए बनाया गया था: एक उच्च स्तरीय भाषा जिसमें (यू) यूनिक्स को लागू करने के लिए। वे मूल रूप से सॉफ़्टवेयर डिज़ाइन में एक प्रयोग हैं, न कि किसी व्यावसायिक मल्टी-प्लेटफ़ॉर्म OS और भाषा पर एक गंभीर प्रयास। उदाहरण के लिए bell-labs.com/usr/dmr/www/chist.html देखें ।
यूरो मिसेल

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

70

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

पुस्तकालय ऐसे कार्य हैं जो कई प्रोग्रामर के लिए उपयोगी हो सकते हैं इसलिए उन्हें पुन: प्रयोज्य कोड के रूप में बनाया जाता है जिन्हें साझा किया जा सकता है। मानक पुस्तकालयों को बहुत सामान्य कार्यों के लिए डिज़ाइन किया गया है जो प्रोग्रामर को आमतौर पर चाहिए होते हैं। इस तरह प्रोग्रामिंग भाषा प्रोग्रामरों की एक विस्तृत श्रृंखला के लिए तुरंत उपयोगी है। भाषा की मुख्य विशेषताओं को बदले बिना पुस्तकालयों को अद्यतन और विस्तारित किया जा सकता है।


3
हर बार नहीं। PHPएक उदाहरण के रूप में शायद ही इसकी विशाल भाषा के कार्यों और भाषा के बीच कोई अंतर हो।
वाहिद अमीरी

15
मैं PHP को एक सरल भाषा के उदाहरण के रूप में नहीं ले
जाऊंगा

3
@DrBreakalot PHP एक बहुत ही सरल भाषा है। यह कहना नहीं है कि यह एक सुसंगत डिजाइन है, लेकिन यह एक और मुद्दा है।
मोनिका

19
@LightnessRacesinOrbit मैं PHP को "सरल" बिल्कुल नहीं कहूंगा: इसमें एक क्लास-आधारित ऑब्जेक्ट सिस्टम, 'आदिम मूल्यों' का एक अलग सेट, स्टैंडअलोन फ़ंक्शंस, ऑब्जेक्ट सिस्टम पर निर्मित प्रथम श्रेणी के क्लोजर, एक नेमस्पेस तंत्र, विभिन्न विचार "स्थिर" कहा जाता है, के बयानों के साथ ही भाव, include, requireऔर require_once, अगर / के लिए / जबकि (संरचित प्रोग्रामिंग), अपवाद, 'त्रुटि मूल्यों' का एक अलग से व्यवस्था, कमजोर टाइपिंग नियम जटिल, जटिल ऑपरेटर पूर्वता नियम, और पर और पर । की, कहते हैं, स्मालटाक, योजना, Prolog, आगे, आदि सादगी को यह तुलना करें;)
Warbo

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

34

अन्य उत्तरों में जो पहले ही कहा जा चुका है, उसके अतिरिक्त एक पुस्तकालय में मानक कार्य करना चिंता का विषय है :

  • भाषा को पार्स करना और इसके लिए कोड तैयार करना कंपाइलर का काम है। यह संकलक का काम नहीं है कि इसमें कुछ भी हो जो पहले से ही उस भाषा में लिखा जा सके और पुस्तकालय के रूप में प्रदान किया जा सके।

  • यह मुख्य रूप से सभी कार्यक्रमों द्वारा आवश्यक कोर कार्यक्षमता प्रदान करने के लिए मानक पुस्तकालय (एक जो हमेशा निहित है) नौकरी है । यह मानक पुस्तकालय का काम नहीं है जिसमें सभी कार्य शामिल हैं जो उपयोगी हो सकते हैं।

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

  • उपयोगी पुन: प्रयोज्य कार्यों का संग्रह प्रदान करना उपयोगकर्ता पुस्तकालयों का काम है। यह कभी भी लिखा गया है कि सभी कोड शामिल करने के लिए उपयोगकर्ता पुस्तकालयों का काम नहीं है।

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

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

  • थ्रेडिंग लाइब्रेरी एकल-कोर एम्बेडेड नियंत्रक पर बेकार है। pthreadलाइब्रेरी को शामिल नहीं करने के लिए इस एम्बेडेड कंट्रोलर के लिए भाषा कार्यान्वयन की अनुमति देना सही काम है।

  • गणित पुस्तकालय माइक्रो-नियंत्रक पर बेकार है जिसमें एफपीयू भी नहीं है। फिर से, ऐसे कार्यों को प्रदान करने के लिए मजबूर नहीं किया जा रहा है sin()जो उस सूक्ष्म नियंत्रक के लिए आपकी भाषा के कार्यान्वयनकर्ताओं के लिए जीवन को बहुत आसान बनाता है।

  • यहां तक ​​कि कोर मानक पुस्तकालय बेकार है जब आप एक कर्नेल प्रोग्रामिंग कर रहे हैं। आप write()कर्नेल में syscall के printf()बिना लागू नहीं कर सकते, और आप बिना कार्यान्वित नहीं कर सकते write()। कर्नेल प्रोग्रामर के रूप में, यह आपका काम है कि write()आप सिसकॉल प्रदान करें , आप बस इसके होने की उम्मीद नहीं कर सकते।

ऐसी भाषा जो मानक पुस्तकालयों से इस तरह की चूक के लिए अनुमति नहीं देती है, बस कई कार्यों के लिए उपयुक्त नहीं है । यदि आप चाहते हैं कि आपकी भाषा असामान्य वातावरण में लचीली रूप से प्रयोग करने योग्य हो, तो यह अनिवार्य होना चाहिए कि मानक लाइब्रेरी क्या शामिल हैं। आपकी भाषा जितना अधिक मानक पुस्तकालयों पर निर्भर करती है, उतनी ही अधिक धारणाएँ इसके निष्पादन के माहौल पर बनती हैं, और इस प्रकार यह उन पर्यावरणों के लिए इसके उपयोग को प्रतिबंधित करता है जो इन पूर्वापेक्षाओं को प्रदान करते हैं।

बेशक, उच्च स्तर की भाषाएं जैसे अजगर और जावा अपने पर्यावरण पर बहुत सारी धारणाएं बना सकते हैं। और वे अपने मानक पुस्तकालयों में कई, कई चीजों को शामिल करते हैं। C जैसी निम्न स्तरीय भाषाएँ अपने मानक पुस्तकालयों में बहुत कम उपलब्ध कराती हैं, और मुख्य मानक पुस्तकालय को बहुत छोटा रखती हैं। यही कारण है कि आप वस्तुतः किसी भी वास्तुकला के लिए एक काम कर रहे सी कंपाइलर को ढूंढते हैं, लेकिन हो सकता है कि उस पर कोई भी पाइथन स्क्रिप्ट न चला सके।


16

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

यह प्रतिरूपकता आपको लाभ का एक गुच्छा देती है:

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

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


6

अतिरिक्त कोने-केस का जवाब: बौद्धिक संपदा प्रबंधन

उल्लेखनीय उदाहरण .NET फ्रेमवर्क में Math.Pow (डबल, डबल) का कार्यान्वयन है जो Microsoft द्वारा Intel से खरीदा गया था और भले ही फ्रेमवर्क खुला-स्रोत चला गया हो, फिर भी अज्ञात रहता है। (सटीक होने के लिए, उपरोक्त मामले में यह एक पुस्तकालय के बजाय एक आंतरिक कॉल है, लेकिन विचार रखता है।) एक पुस्तकालय भाषा से ही अलग हो जाता है (सैद्धांतिक रूप से मानक पुस्तकालयों का सबसेट भी) भाषा के बैकरों को ड्राइंग में अधिक लचीलापन दे सकता है। क्या पारदर्शी रखना है और क्या नहीं, इसके बीच की रेखा को अज्ञात (तीसरे पक्ष या अन्य आईपी-संबंधित कारणों के साथ उनके अनुबंध के कारण) रहना चाहिए।


यह भ्रामक है। आपके द्वारा लिंक किया गया पृष्ठ Math.Powकिसी भी खरीदारी या इंटेल के बारे में कुछ भी उल्लेख नहीं करता है, और फ़ंक्शन के कार्यान्वयन के स्रोत कोड को पढ़ने वाले लोगों के बारे में बात करता है।
मोनिका

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

5

कीड़े और डिबगिंग।

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

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


5

यह एक अच्छा सवाल है!

अत्याधुनिक

C ++ मानक, उदाहरण के लिए, यह कभी नहीं निर्दिष्ट करता है कि संकलक या मानक पुस्तकालय में क्या लागू किया जाना चाहिए: यह सिर्फ कार्यान्वयन को संदर्भित करता है । उदाहरण के लिए, आरक्षित प्रतीकों को संकलक (आंतरिक) के रूप में और मानक पुस्तकालय द्वारा, परस्पर विनिमय द्वारा दोनों परिभाषित किया जाता है।

फिर भी, सभी C ++ कार्यान्वयन जिन्हें मैं जानता हूं कि संकलक द्वारा प्रदान की जाने वाली आंतरिक संख्या की न्यूनतम संभव संख्या होगी, और मानक पुस्तकालय द्वारा जितना संभव हो उतना प्रदान किया जाएगा।

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

क्यूं कर?

आइए मानक पुस्तकालय से संकलक तक कार्यक्षमता के कुछ टुकड़े को स्थानांतरित करने के विचार पर विचार करें।

लाभ:

  • बेहतर डायग्नोस्टिक्स: इंट्रिनिक्स विशेष-आवरण हो सकते हैं।
  • बेहतर प्रदर्शन: आंतरिक विशेष आवरण हो सकता है।

नुकसान:

  • बढ़े हुए संकलक द्रव्यमान: प्रत्येक विशेष-मामला संकलक में जटिलता जोड़ता है; जटिलता रखरखाव की लागत, और कीड़े की संभावना बढ़ जाती है।
  • धीमी गति से चलना: कार्यक्षमता के कार्यान्वयन को बदलने के लिए संकलक को बदलने की आवश्यकता होती है, जिससे प्रयोग करने के लिए सिर्फ एक छोटा पुस्तकालय (बाहर std) बनाना कठिन हो जाता है ।
  • प्रवेश करने के लिए उच्च बार: अधिक महंगा / अधिक कठिन यह कुछ बदलना है, कम लोगों के कूदने की संभावना है।

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


5

खुद एक भाषा डिजाइनर के रूप में, मैं यहां कुछ अन्य उत्तरों की प्रतिध्वनि करना चाहता हूं, लेकिन यह किसी ऐसे व्यक्ति की आंखों के माध्यम से प्रदान करता है जो भाषा का निर्माण कर रहा है।

जब आप इसमें शामिल हो सकते हैं तो एक एपीआई समाप्त नहीं होता है। जब आप इसे से बाहर ले जा सकते हैं तो एक एपीआई समाप्त हो जाता है।

एक प्रोग्रामिंग भाषा को कुछ भाषा का उपयोग करके निर्दिष्ट किया जाना है। आपको अपनी भाषा में लिखे गए किसी भी कार्यक्रम के पीछे का अर्थ बताने में सक्षम होना चाहिए। इस भाषा को लिखना बहुत कठिन है, और अच्छी तरह से लिखना भी कठिन है। सामान्य तौर पर, यह अंग्रेजी का एक बहुत ही सटीक और अच्छी तरह से संरचित रूप होता है, जिसका उपयोग कंप्यूटर को नहीं, बल्कि अन्य डेवलपर्स को किया जाता है, खासकर उन डेवलपर्स को जो आपकी भाषा के लिए कंपाइलर या दुभाषिए लिखते हैं। यहाँ 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इतनी गहराई से जावा भाषा विशिष्टता है कि वे उस प्रक्रिया को "मानक पुस्तकालय" वर्गों के रूप में लागू की भाग में कुछ प्रतिबंध लगाने के लिए की जरूरत के साथ जुड़ रहे हैं।
  • C # में, एक क्लास है, System.Delegate जो प्रतिनिधियों की अवधारणा को एनकोड करता है। अपने नाम के बावजूद, यह एक प्रतिनिधि नहीं है। यह एक अमूर्त वर्ग (त्वरित नहीं हो सकता) है जिससे आप व्युत्पन्न वर्ग नहीं बना सकते। भाषा विनिर्देश में लिखी गई विशेषताओं के माध्यम से केवल सिस्टम इसे कर सकता है।

2

यह मौजूदा उत्तरों के अतिरिक्त है (और एक टिप्पणी के लिए बहुत लंबा है)।

एक मानक पुस्तकालय के लिए कम से कम दो अन्य कारण हैं:

प्रवेश में रुकावट

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

यदि आप उस मार्ग पर जाते हैं तो आप बहुत सारे संभावित योगदानकर्ताओं से खुद को काट रहे हैं।

हॉट कोड लोड हो रहा है

कई भाषाएँ इस सुविधा को एक डिग्री या किसी अन्य को प्रदान करती हैं, लेकिन यह कोड को फिर से लोड करने के लिए बहुत अधिक जटिल होगा जो कि हॉट रीलोडिंग कर रहा है। यदि SL रनटाइम से अलग है तो इसे फिर से लोड किया जा सकता है।


3
"किसी भी स्वाभिमानी कंपाइलर को स्व-होस्ट किया जाना चाहिए" - बिल्कुल नहीं। इन सभी भाषाओं को संकलित करने के लिए C, C ++, Objective-C, Swift, Fortran इत्यादि में लिखे LLVM के संस्करणों को व्यर्थ करना होगा।
gnasher729

@ gnasher729 ऐसा नहीं है कि एक विशेष मामला (सीएलआर जैसे अन्य बहुभाषी लक्ष्यों के साथ) का एक सा?
जारेड स्मिथ

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

2

यह एक दिलचस्प सवाल है, लेकिन पहले से ही कई अच्छे जवाब दिए गए हैं, इसलिए मैं पूरी कोशिश नहीं करूंगा।

हालांकि, दो चीजें जो मुझे नहीं लगता कि उन्होंने पर्याप्त ध्यान दिया है:

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

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

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

उदाहरण के लिए:

  • आप एक आज्ञाकारी संकलक नहीं हो सकते।

  • आप मानक से अपने विचलन को कैसे इंगित करेंगे। ध्यान दें कि आम तौर पर आयात के कुछ रूप होते हैं / इसमें सिंटैक्स शामिल होता है जो आप विफल हो सकते हैं अर्थात अजगर का आयात या सी शामिल है जो आसानी से समस्या को इंगित करता है यदि मानक पुस्तकालय मॉडल में कुछ भी गायब है।

यदि आप 'लाइब्रेरी' की कार्यक्षमता को बढ़ाना या बढ़ाना चाहते हैं, तो भी ऐसी ही समस्याएं लागू होती हैं। यह आपके विचार से कहीं अधिक सामान्य है। बस थ्रेडिंग से चिपके रहने के लिए: विंडोज़, लिनेक्स और कुछ-एक्सक्लूसिव-नेटवर्क-प्रोसेसिंग-यूनिट्स, सभी थ्रेडिंग का अलग-अलग तरीके से उपयोग करते हैं। जबकि लिनक्स / विंडोज़ बिट्स काफी स्थिर हो सकते हैं और एक समान एपीआई का उपयोग करने में सक्षम हो सकते हैं, एनपीयू सामान सप्ताह के दिन और एपीआई इसके साथ बदल जाएगा। कंपाइलर जल्दी से खराब हो जाएगा क्योंकि लोगों ने फैसला किया कि उन्हें किन बिट्स का समर्थन करने की ज़रूरत है / कर सकते हैं-अगर वे इस तरह की चीज़ों को विभाजित करने का कोई तरीका नहीं था, तो बहुत तेज़ी से।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.