संदर्भ (कंप्यूटर विज्ञान): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(8 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Short description|Data type which allows a program to indirectly access a particular value in memory}}
{{Short description|Data type which allows a program to indirectly access a particular value in memory}}
{{About|कंप्यूटिंग में सामान्य अवधारणा|C++ में अधिक विशिष्ट अवधारणा|संदर्भ (C++)}}
{{About|कंप्यूटिंग में सामान्य अवधारणा|C++ में अधिक विशिष्ट अवधारणा|संदर्भ (C++)}}
{{More citations needed|date=November 2009}}
'''[[संगणक|कंप्यूटर]] प्रोग्रामिंग में''', संदर्भ(रिफरेन्स) एक मान है, जो प्रोग्राम को अप्रत्यक्ष रूप से एक विशेष डेटा, जैसे [[चर (कंप्यूटर विज्ञान)]] के मान या [[रिकॉर्ड (कंप्यूटर विज्ञान)|दस्तावेज़]], कंप्यूटर की [[मेमोरी (कंप्यूटिंग)|मेमोरी]] या किसी अन्य [[डेटा स्टोरेज डिवाइस|डेटा भंडारण उपकरण]] में नियंत्रण करने में सक्षम बनाता है। तथा संदर्भ विवरण को संदर्भित करने के लिए कहा जाता है, और विवरण तक पहुंचने के संदर्भ को [[डेरेफरेंस ऑपरेटर|भिन्नता(डीरिफरेन्स]]) करना कहा जाता है। एक संदर्भ स्वयं के विवरण से भिन्न होता है।
'''''[[[[संगणक|कंप्यूटर]] प्रोग्रामिंग]] में''''', संदर्भ एक मान है, जो एक प्रोग्राम को अप्रत्यक्ष रूप से एक विशेष डेटा, जैसे [[चर (कंप्यूटर विज्ञान)]] के मान या [[रिकॉर्ड (कंप्यूटर विज्ञान)|दस्तावेज़]], कंप्यूटर की [[मेमोरी (कंप्यूटिंग)|मेमोरी]] या किसी अन्य [[डेटा स्टोरेज डिवाइस|डेटा भंडारण उपकरण]] में नियंत्रण करने में सक्षम बनाता है। तथा संदर्भ विवरण को संदर्भित करने के लिए कहा जाता है, और विवरण तक पहुंचने के संदर्भ को [[डेरेफरेंस ऑपरेटर|अपसंदर्भन]] करना कहा जाता है। एक संदर्भ स्वयं विवरण से भिन्न होता है।


एक संदर्भ एक [[सार डेटा प्रकार]] है और इसे कई तरीकों से कार्यान्वित किया जा सकता है। आमतौर पर, एक संदर्भ किसी दिए गए सिस्टम पर स्मृति में संग्रहीत डेटा को संदर्भित करता है, और इसका आंतरिक मान डेटा का स्मृति पता होता है, यानी एक सूचक के रूप में एक संदर्भ लागू किया जाता है। इस कारण से एक संदर्भ को अक्सर डेटा को "इंगित" करने के लिए कहा जाता है। अन्य कार्यान्वयन में डेटम के पते और कुछ निश्चित "आधार" पते के बीच एक ऑफसेट (अंतर) सम्मिलित है, एक अनुक्रमणिका, [[अद्वितीय कुंजी]], या [[पहचानकर्ता]] का उपयोग [[सरणी डेटा संरचना]] या [[तालिका (डेटाबेस)]] में [[खोजें|(lookup]]) ऑपरेशन में किया जाता है, एक ऑपरेटिंग सिस्टम [[हैंडल (कंप्यूटिंग)]] , भंडारण उपकरण पर [[भौतिक पता]], या [[URL]] जैसे नेटवर्क पता आदि।
संदर्भ एक [[सार डेटा प्रकार|संक्षेप डेटा प्रकार]] है इसे कई तरीकों से कार्यान्वित किया जा सकता है। सामान्य रूप से एक संदर्भ किसी दिए गए सिस्टम (कंप्यूटर) पर मेमोरी में संग्रहीत डेटा को संदर्भित करता है, और इसका आंतरिक मान डेटा का मेमोरी पता(एड्रेस) होता है, अर्थात एक सूचक के रूप में संदर्भ लागू किया जाता है। इस कारण से संदर्भ को अधिकांश डेटा को इंगित करने के लिए कहा जाता है। अन्य कार्यान्वयन में डेटम(datum) के एड्रेस और कुछ निश्चित आधार एड्रेस के बीच एक अंतर सम्मिलित होता है, एक अनुक्रमणिका, [[अद्वितीय कुंजी]], या [[पहचानकर्ता]] का उपयोग [[सरणी डेटा संरचना]] या [[तालिका (डेटाबेस)|तालिका]] में [[खोजें|lookup]] ऑपरेशन में किया जाता है, एक ऑपरेटिंग सिस्टम [[हैंडल (कंप्यूटिंग)]], भंडारण उपकरण पर [[भौतिक पता]], या [[URL]] जैसे नेटवर्क एड्रेस आदि होते हैं।


== औपचारिक प्रतिनिधित्व ==
== औपचारिक प्रतिनिधित्व ==
एक संदर्भ ''R'' एक मान है, जो एक ऑपरेशन को स्वीकार करता है, <kbd>भिन्नता</kbd>(R), जो एक मान देता है। सामान्य रूप से संदर्भ टाइप किया जाता है ताकि यह एक विशिष्ट प्रकार के मान लौटाए, जैसे:<ref name=Sherman>{{cite book |last1=Sherman |first1=Mark S. |title=पैरागॉन: विशिष्टता, कार्यान्वयन और सार डेटा प्रकारों के चयन के लिए प्रकार पदानुक्रम का उपयोग करने वाली भाषा|date=April 1985 |publisher=Springer Science & Business Media |isbn=978-3-540-15212-5 |page=175 |url=https://www.google.com/books/edition/Paragon/tXzuooE8EVsC?hl=en&gbpv=1pg=PA175 |language=en}}</ref><ref>{{cite web |title=संदर्भ (जावा प्लेटफार्म एसई 7)|url=https://docs.oracle.com/javase/7/docs/api/java/lang/ref/Reference.html |website=docs.oracle.com |access-date=10 May 2022}}</ref>
एक संदर्भ ''R'' मान है, जो एक ऑपरेशन को स्वीकार करता है, <kbd>भिन्नता</kbd>(R), जो एक मान देता है। सामान्य रूप से reference टाइप किया जाता है ताकि यह एक विशिष्ट प्रकार के मान लौटाए, जैसे:<ref name=Sherman>{{cite book |last1=Sherman |first1=Mark S. |title=पैरागॉन: विशिष्टता, कार्यान्वयन और सार डेटा प्रकारों के चयन के लिए प्रकार पदानुक्रम का उपयोग करने वाली भाषा|date=April 1985 |publisher=Springer Science & Business Media |isbn=978-3-540-15212-5 |page=175 |url=https://www.google.com/books/edition/Paragon/tXzuooE8EVsC?hl=en&gbpv=1pg=PA175 |language=en}}</ref><ref>{{cite web |title=संदर्भ (जावा प्लेटफार्म एसई 7)|url=https://docs.oracle.com/javase/7/docs/api/java/lang/ref/Reference.html |website=docs.oracle.com |access-date=10 May 2022}}</ref>
  interface Reference<T> {
  interface Reference<T> {
  T value();
  T value();
  }
  }
प्रायः संदर्भ एक नियुक्ति ऑपरेशन <kbd>store</kbd>(''R'', ''x'') को भी स्वीकार करता है, जिसका अर्थ है कि यह एक काल्पनिक चर होता है।<ref name="Sherman" />
प्रायः संदर्भ एक नियुक्ति ऑपरेशन <kbd>store</kbd>(''R'', ''x'') को भी स्वीकार करता है, जिसका अर्थ है कि यह एक काल्पनिक चर होता है।<ref name="Sherman" />
== उपयोग ==
== उपयोग ==
प्रोग्रामिंग में संदर्भों का व्यापक रूप से उपयोग किया जाता है, विशेष रूप से [[सबरूटीन|प्रक्रियाओं]] के लिए [[तर्क (कंप्यूटर विज्ञान)]] के रूप में बड़े या परिवर्तनशील डेटा को कुशलतापूर्वक पास करने के लिए, या विभिन्न उपयोगों के बीच ऐसे डेटा को साझा करने के लिए। विशेष रूप से, एक संदर्भ एक चर या रिकॉर्ड को इंगित कर सकता है जिसमें अन्य डेटा के संदर्भ शामिल हैं। यह विचार [[अप्रत्यक्ष संबोधन]] और लिंक की गई सूचियों जैसे कई [[लिंक्ड डेटा संरचना|लिंक्ड डेटा संरचनाओ]] का आधार है। संदर्भ लचीलेपन को बढ़ाते हैं जहां वस्तुओं को संग्रहीत किया जा सकता है, उन्हें कैसे आवंटित किया जाता है, और कोड के क्षेत्रों के बीच उन्हें कैसे पारित किया जाता है। जब तक कोई डेटा के संदर्भ तक पहुंच सकता है, तब तक कोई इसके माध्यम से डेटा तक पहुंच सकता है, और डेटा को स्वयं स्थानांतरित करने की आवश्यकता नहीं है। वे विभिन्न कोड क्षेत्रों के बीच डेटा साझा करना भी आसान बनाते हैं; प्रत्येक इसका संदर्भ रखता है।
प्रोग्रामिंग में संदर्भों का व्यापक रूप से उपयोग किया जाता है, विशेष रूप से [[सबरूटीन|प्रक्रियाओं]] के लिए [[तर्क (कंप्यूटर विज्ञान)]] के रूप में बड़े या परिवर्तनशील डेटा को कुशलतापूर्वक पास करने के लिए, या विभिन्न उपयोगों के बीच ऐसे डेटा को साझा करने के लिए। विशेष रूप से, एक संदर्भ एक चर या रिकॉर्ड को इंगित कर सकता है जिसमें अन्य डेटा के संदर्भ सम्मिलित होते हैं। यह विचार [[अप्रत्यक्ष संबोधन]] और लिंक की गई सूचियों जैसे कई [[लिंक्ड डेटा संरचना|लिंक्ड डेटा संरचनाओ]] का आधार है। जो संदर्भ उपयोग क्षमता को बढ़ाते हैं तथा जहां वस्तुओं को संग्रहीत किया जा सकता है, उन्हें कैसे आवंटित किया जाता है, और कोड के क्षेत्रों के बीच उन्हें कैसे प्रस्तुत किया जाता है। जब तक कोई डेटा के संदर्भ तक पहुंच सकता है, तब तक कोई इसके माध्यम से डेटा तक पहुंच सकता है, और डेटा को स्वयं स्थानांतरित करने की आवश्यकता नहीं है। वे विभिन्न कोड क्षेत्रों के बीच डेटा साझा करना भी आसान बनाते हैं। तथा प्रत्येक इसका संदर्भ रखता है


आंशिक रूप से झूलने और [[जंगली संदर्भ|जंगली संदर्भों]] की संभावना के कारण और आंशिक रूप से क्योंकि संदर्भों के साथ डेटा की [[टोपोलॉजी]] एक [[निर्देशित ग्राफ]] है, जिसका विश्लेषण काफी जटिल हो सकता है, संदर्भ एक कार्यक्रम में महत्वपूर्ण जटिलता पैदा कर सकते हैं। बहरहाल, पॉइंटर अंकगणित की अनुपस्थिति के कारण पॉइंटर्स की तुलना में विश्लेषण करना अभी भी सरल है।
आंशिक रूप से निलंबित(dangling) और [[जंगली संदर्भ|साधारण(wild) संदर्भों]] की संभावना के कारण और आंशिक रूप से संदर्भों के साथ डेटा की [[टोपोलॉजी]] एक [[निर्देशित ग्राफ]] है, जिसका विश्लेषण काफी जटिल हो सकता है, संदर्भ एक कार्यक्रम में महत्वपूर्ण जटिलता उत्पन्न कर सकते हैं। फिर भी, पॉइंटर अंकगणित की अनुपस्थिति के कारण संकेतक(पॉइंटर्स) की तुलना में विश्लेषण करना अभी भी सरल है।


कार्यान्वयन में भिन्न होने पर संदर्भों का तंत्र, लगभग सभी आधुनिक प्रोग्रामिंग भाषाओं के लिए एक मौलिक प्रोग्रामिंग भाषा विशेषता है। यहां तक ​​कि कुछ भाषाएं जो संदर्भों के प्रत्यक्ष उपयोग का समर्थन नहीं करती हैं, उनका भी कुछ आंतरिक या अंतर्निहित उपयोग होता है। उदाहरण के लिए, [[मूल्यांकन रणनीति]] कॉलिंग सम्मेलन द्वारा कॉल को संदर्भों के स्पष्ट या निहित उपयोग के साथ कार्यान्वित किया जा सकता है।
कार्यान्वयन में भिन्न होने पर संदर्भों की प्रक्रिया लगभग सभी आधुनिक प्रोग्रामिंग भाषाओं के लिए एक मौलिक प्रोग्रामिंग भाषा विशेषता है। यहां तक ​​कि कुछ भाषाएं जो संदर्भों के प्रत्यक्ष उपयोग का समर्थन नहीं करती हैं, उनका भी कुछ आंतरिक या अंतर्निहित उपयोग होता है। उदाहरण के लिए, [[मूल्यांकन रणनीति|मूल्यांकन योजना]] कॉलिंग सम्मेलन द्वारा कॉल को संदर्भों के स्पष्ट या निहित उपयोग के साथ कार्यान्वित किया जा सकता है।


== उदाहरण ==
== उदाहरण ==
पॉइंटर्स सबसे आदिम प्रकार के संदर्भ हैं। अंतर्निहित हार्डवेयर के साथ उनके घनिष्ठ संबंध के कारण, वे संदर्भों के सबसे शक्तिशाली और कुशल प्रकारों में से एक हैं। हालाँकि, इस संबंध के कारण भी, पॉइंटर्स को मेमोरी आर्किटेक्चर के विवरण के प्रोग्रामर द्वारा एक मजबूत समझ की आवश्यकता होती है। चूंकि पॉइंटर्स एक स्मृति स्थान के पते को सीधे मान के बजाय स्टोर करते हैं, पॉइंटर्स के अनुचित उपयोग से प्रोग्राम में [[अपरिभाषित व्यवहार]] हो सकता है, विशेष रूप से लटकने वाले [[जंगली सूचक]] या जंगली पॉइंटर्स के कारण। [[स्मार्ट सूचक]] अपारदर्शी डेटा संरचनाएं हैं जो पॉइंटर्स की तरह काम करती हैं लेकिन केवल विशेष तरीकों से ही एक्सेस की जा सकती हैं।
संकेतक(पॉइंटर्स) सबसे प्राचीन प्रकार के संदर्भ हैं। अंतर्निहित हार्डवेयर के साथ उनके घनिष्ठ संबंध के कारण, वे संदर्भों के सबसे शक्तिशाली और कुशल प्रकारों में से एक हैं। हालाँकि, इस संबंध के कारण भी, संकेतक को मेमोरी निर्माण कला के विवरण के प्रोग्रामर द्वारा एक जटिल समझ की आवश्यकता होती है। चूंकि संकेतक एक मेमोरी स्थान के एड्रेस को सीधे मान के अतिरिक्त संग्रहित करते हैं, संकेतक के अनुचित उपयोग से प्रोग्राम में [[अपरिभाषित व्यवहार]] हो सकता है, विशेष रूप से निलंबन वाले [[जंगली सूचक|साधारण सूचक]] या साधारण संकेतक के कारण [[स्मार्ट सूचक]] अस्पष्ट डेटा संरचनाएं होती हैं, जो संकेतक की तरह काम करती हैं लेकिन केवल विशेष तरीकों से ही नियंत्रित की जा सकती हैं।


एक हैंडल एक सार संदर्भ है, और इसे विभिन्न तरीकों से प्रदर्शित किया जा सकता है। एक सामान्य उदाहरण [[फ़ाइल संभाल]] (stdio|C I/O लाइब्रेरी में FILE डेटा संरचना) है, जिसका उपयोग अमूर्त फ़ाइल सामग्री के लिए किया जाता है। यह आम तौर पर दोनों फाइलों का प्रतिनिधित्व करता है, जैसे कि फाइल पर लॉक का अनुरोध करते समय, और फाइल की सामग्री के भीतर एक विशिष्ट स्थिति, जैसे फाइल को पढ़ते समय।
संचलन एक संक्षेप संदर्भ है, और इसे विभिन्न तरीकों से प्रदर्शित किया जा सकता है। सामान्य उदाहरण [[फ़ाइल संभाल|FILE संचलन]] (stdio|C I/O लाइब्रेरी में FILE डेटा संरचना) है, जिसका उपयोग संक्षेप FILE सामग्री के लिए किया जाता है। यह सामान्य रूप से दोनों फाइलों का प्रतिनिधित्व करता है, जैसे कि फाइल पर लॉक का अनुरोध करते समय और फाइल की सामग्री के भीतर एक विशिष्ट स्थिति, जैसे फाइल को पढ़ते समय आदि।


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


यदि हमारे पास कुंजियों का एक सेट K और डेटा ऑब्जेक्ट्स का एक सेट D है, तो K से D तक कोई भी अच्छी तरह से परिभाषित (एकल-मूल्यवान) फ़ंक्शन ∪ {[[Nullable type]]} एक प्रकार के संदर्भ को परिभाषित करता है, जहां शून्य कुंजी की छवि नहीं है किसी भी सार्थक चीज का जिक्र।
यदि हमारे पास कुंजियों का एक सेट K और डेटा संक्षेप का एक सेट D है, तो K से D ∪ {[[Nullable type|Null]]} तक कोई भी अच्छी तरह से परिभाषित (एकल-मान) कारक एक प्रकार के संदर्भ को परिभाषित करता है, जहां शून्य एक कुंजी की प्रतिरूप है, जो किसी सार्थक वस्तु का जिक्र नहीं करती है।


ऐसे फ़ंक्शन का एक वैकल्पिक प्रतिनिधित्व एक निर्देशित ग्राफ़ है जिसे [[पहुंच योग्यता ग्राफ]] कहा जाता है। यहां, प्रत्येक डेटाम को शीर्ष द्वारा दर्शाया गया है और यदि यू में डेटाम वी में डेटाम को संदर्भित करता है तो यू से वी तक एक किनारा है। अधिकतम [[बाहर डिग्री]] एक है। ये ग्राफ़ [[कचरा संग्रह (कंप्यूटर विज्ञान)]] में मूल्यवान हैं, जहाँ इनका उपयोग दुर्गम वस्तुओं से सुलभ को अलग करने के लिए किया जा सकता है।
ऐसे कारक का एक वैकल्पिक प्रतिनिधित्व एक निर्देशित ग्राफ़ है, जिसे [[पहुंच योग्यता ग्राफ|अभिगम्यता (reachability) ग्राफ]] कहा जाता है। यहां, प्रत्येक डेटम को शीर्ष द्वारा दर्शाया गया है और यदि u में डेटाम v में डेटम को संदर्भित करता है तो u से v तक एक किनारा है। अधिकतम [[बाहर डिग्री|बाहर अंश]] एक है। ये ग्राफ़ [[कचरा संग्रह (कंप्यूटर विज्ञान)|गार्बेज संग्रह (कंप्यूटर विज्ञान)]] में मान हैं, जहाँ इनका उपयोग अप्राप्य वस्तुओं से सुलभ को अलग करने के लिए किया जा सकता है।


== बाहरी और आंतरिक भंडारण ==
== बाहरी और आंतरिक भंडारण ==
कई डेटा संरचनाओं में, बड़ी, जटिल वस्तुएँ छोटी वस्तुओं से बनी होती हैं। इन वस्तुओं को आम तौर पर दो तरीकों में से एक में संग्रहीत किया जाता है:
कई डेटा संरचनाओं में, बड़ी, जटिल वस्तुएँ छोटी वस्तुओं से बनी होती हैं। इन वस्तुओं को सामान्य रूप से दो तरीकों में से एक में संग्रहीत किया जाता है।


# आंतरिक भंडारण के साथ, छोटी वस्तु की सामग्री बड़ी वस्तु के अंदर जमा हो जाती है।
# आंतरिक भंडारण के साथ, छोटी वस्तु की सामग्री बड़ी वस्तु के अंदर संग्रहीत हो जाती है।
# बाहरी भंडारण के साथ, छोटी वस्तुओं को उनके स्थान पर आवंटित किया जाता है, और बड़ी वस्तु केवल उनके संदर्भों को संग्रहीत करती है।
# बाहरी भंडारण के साथ, छोटी वस्तुओं को उनके स्थान पर आवंटित किया जाता है, और बड़ी वस्तु केवल उनके संदर्भों को संग्रहीत करती है।


आंतरिक भंडारण आमतौर पर अधिक कुशल होता है, क्योंकि संदर्भों और गतिशील आवंटन मेटाडेटा के लिए एक स्थान की लागत होती है, और एक संदर्भ को संदर्भित करने और छोटी वस्तुओं के लिए मेमोरी आवंटित करने से जुड़ी समय लागत होती है। आंतरिक भंडारण एक ही बड़ी वस्तु के विभिन्न भागों को स्मृति में एक साथ पास रखकर संदर्भ की स्थानीयता को भी बढ़ाता है। हालाँकि, ऐसी कई स्थितियाँ हैं जिनमें बाह्य संग्रहण को प्राथमिकता दी जाती है।
आंतरिक भंडारण सामान्य रूप से अधिक कुशल होता है, क्योंकि संदर्भों और गतिशील आवंटन मेटाडेटा के लिए एक स्थान की लागत होती है, और एक संदर्भ को संदर्भित करने और छोटी वस्तुओं के लिए मेमोरी आवंटित करने से जुड़ी समय लागत होती है। आंतरिक भंडारण एक ही बड़ी वस्तु के विभिन्न भागों को मेमोरी में एक साथ पास रखकर संदर्भ की स्थानीयता को भी बढ़ाता है। हालाँकि, ऐसी कई स्थितियाँ हैं जिनमें बाह्य संग्रहण को प्राथमिकता दी जाती है।


* यदि [[पुनरावर्ती डेटा प्रकार]] है, जिसका अर्थ है कि इसमें स्वयं शामिल हो सकता है। इसे आंतरिक तरीके से प्रस्तुत नहीं किया जा सकता है।
* यदि [[पुनरावर्ती डेटा प्रकार|डेटा संरचना पुनरावर्ती]] है, जिसका अर्थ है कि इसमें स्वयं सम्मिलित हो सकता है। इसे आंतरिक तरीके से प्रस्तुत नहीं किया जा सकता है।
* यदि बड़ी वस्तु को सीमित स्थान वाले क्षेत्र में संग्रहीत किया जा रहा है, जैसे कि ढेर, तो हम बड़े घटक वस्तुओं को किसी अन्य मेमोरी क्षेत्र में संग्रहीत करके और संदर्भों का उपयोग करके उन्हें संदर्भित करके भंडारण से बाहर निकलने से रोक सकते हैं।
* यदि बड़ी वस्तु को सीमित स्थान वाले क्षेत्र में संग्रहीत किया जा रहा है, जैसे कि ढेर, तो हम बड़े घटक वस्तुओं को किसी अन्य मेमोरी क्षेत्र में संग्रहीत करके और संदर्भों का उपयोग करके उन्हें संदर्भित करके भंडारण से बाहर निकलने से रोक सकते हैं।
* यदि छोटी वस्तुएं आकार में भिन्न हो सकती हैं, तो बड़ी वस्तु का आकार बदलना अक्सर असुविधाजनक या महंगा होता है ताकि उसमें अभी भी उन्हें शामिल किया जा सके।
* यदि छोटी वस्तुएं आकार में भिन्न हो सकती हैं, तो बड़ी वस्तु का आकार परिवर्तन प्रायः असुविधाजनक या महंगा होता है ताकि उसमें अभी भी उन्हें सम्मिलित किया जा सके।
* संदर्भों के साथ काम करना और नई आवश्यकताओं के लिए बेहतर अनुकूलन करना अक्सर आसान होता है।
* संदर्भों के साथ काम करना और नई आवश्यकताओं के लिए बेहतर अनुकूलन करना प्रायः सरल होता है।


कुछ भाषाएँ, जैसे कि [[जावा (प्रोग्रामिंग भाषा)]], स्मॉलटाक, [[पायथन (प्रोग्रामिंग भाषा)]], और [[योजना (प्रोग्रामिंग भाषा)]], आंतरिक भंडारण का समर्थन नहीं करती हैं। इन भाषाओं में, सभी वस्तुओं को समान रूप से संदर्भों के माध्यम से एक्सेस किया जाता है।
कुछ प्रोग्रामिंग भाषाएँ, जैसे कि [[जावा (प्रोग्रामिंग भाषा)|जावा(Java)]], स्मॉलटाक(Smalltalk), [[पायथन (प्रोग्रामिंग भाषा)|पायथन(Python]]), और [[योजना (प्रोग्रामिंग भाषा)|स्कीम]](Scheme), आंतरिक भंडारण का समर्थन नहीं करती हैं। इन भाषाओं में, सभी वस्तुओं को समान रूप से संदर्भों के माध्यम से नियंत्रित किया जाता है।


== भाषा समर्थन ==
== भाषा समर्थन ==


=== विधानसभा ===
=== असेंबली ===
[[सभा की भाषा|असेंबली भाषा]] में, रॉ मेमोरी एड्रेस या इंडेक्स को टेबल में इस्तेमाल करके संदर्भों को व्यक्त करना विशिष्ट है। ये काम करते हैं, लेकिन उपयोग करने में कुछ मुश्किल हैं, क्योंकि एक पता आपको उस मूल्य के बारे में कुछ नहीं बताता है जो यह इंगित करता है, यह भी नहीं कि यह कितना बड़ा है या इसकी व्याख्या कैसे करें; ऐसी जानकारी प्रोग्राम लॉजिक में एन्कोडेड है। इसका परिणाम यह होता है कि गलत कार्यक्रमों में गलत व्याख्या हो सकती है, जिससे आश्चर्यजनक त्रुटियां हो सकती हैं।
[[सभा की भाषा|असेंबली भाषा]] में, रॉ(Raw) मेमोरी एड्रेस या सूची को सारिणी में उपयोग करके संदर्भों के रूप मे व्यक्त करना विशिष्ट है। ये काम करते हैं, लेकिन उपयोग करने में कुछ जटिल होते हैं, क्योंकि एक एड्रेस आपको उस मान के बारे में कुछ नहीं बताता है, जो यह इंगित करता है, यह भी नहीं कि यह कितना बड़ा है या इसकी व्याख्या कैसे करें। ऐसी जानकारी प्रोग्राम तर्क में एन्कोडेड होती है। इसका परिणाम यह होता है कि गलत कार्यक्रमों में गलत व्याख्या हो सकती है, जिससे आश्चर्यजनक त्रुटियां हो सकती हैं।


=== लिस्प ===
=== लिस्प ===


सबसे प्रारंभिक अपारदर्शी संदर्भों में से एक [[लिस्प (प्रोग्रामिंग भाषा)]] भाषा विपक्ष का था, जो केवल स्तु संरचना है जिसमें अन्य लिस्प ऑब्जेक्ट्स के दो संदर्भ हैं, जिनमें संभवतः अन्य कॉन्स सेल भी शामिल हैं। इस सरल संरचना का उपयोग आमतौर पर एकल लिंक्ड सूचियों के निर्माण के लिए किया जाता है, लेकिन इसका उपयोग सरल [[बाइनरी ट्री]] और तथाकथित "डॉटेड लिस्ट" बनाने के लिए भी किया जा सकता है, जो एक शून्य संदर्भ के साथ नहीं बल्कि एक मान के साथ समाप्त होता है।
सबसे प्रारंभिक अस्पष्ट संदर्भों में से एक [[लिस्प (प्रोग्रामिंग भाषा)|लिस्प(Lisp)]] भाषा विपक्ष का था, जो केवल साधारण संरचना है जिसमें अन्य लिस्प उद्देश्य के दो संदर्भ हैं, जिनमें संभवतः अन्य कॉन्स सेल भी सम्मिलित हैं। इस सरल संरचना का उपयोग सामान्य रूप से एकल लिंक्ड सूचियों के निर्माण के लिए किया जाता है, लेकिन इसका उपयोग सरल [[बाइनरी ट्री]] और तथाकथित बिंदीदार सूचियाँ बनाने के लिए भी किया जा सकता है, जो एक शून्य संदर्भ के साथ नहीं बल्कि एक मान के साथ समाप्त होता है।


=== सी/सी ++ ===
=== सी/सी ++ ===
{{Further|संदर्भ (सी ++)}}
{{Further|संदर्भ (C ++)}}


सूचक आज भी सबसे लोकप्रिय प्रकार के संदर्भों में से एक है। यह कच्चे पते के असेंबली प्रतिनिधित्व के समान है, सिवाय इसके कि इसमें एक स्थिर डेटाटाइप होता है जिसका उपयोग संकलन-समय पर किया जा सकता है ताकि यह सुनिश्चित किया जा सके कि जिस डेटा को संदर्भित किया गया है उसकी गलत व्याख्या नहीं की गई है। हालाँकि, क्योंकि C में एक [[कमजोर टाइपिंग|कमजोर]] प्रकार की प्रणाली है जिसका उल्लंघन [[कास्ट (कंप्यूटर साइंस)]] (विभिन्न पॉइंटर प्रकारों के बीच और पॉइंटर प्रकारों और पूर्णांकों के बीच स्पष्ट रूपांतरण) का उपयोग करके किया जा सकता है, यदि अधिक कठिन हो तो गलत व्याख्या अभी भी संभव है। इसके उत्तराधिकारी [[सी ++]] ने अपने [[सी ++ मानक पुस्तकालय]] में नए कास्ट ऑपरेटरों, एक संदर्भ प्रकार और स्मार्ट पॉइंटर्स के साथ पॉइंटर्स की टाइप सुरक्षा बढ़ाने की कोशिश की <code>&</code>, , लेकिन फिर भी संगतता के लिए इन सुरक्षा तंत्रों को दरकिनार करने की क्षमता को बरकरार रखा।
सूचक आज भी एक सबसे लोकप्रिय प्रकार के संदर्भों में से एक है। यह रॉ एड्रेस के असेंबली प्रतिनिधित्व के समान होता है, सिवाय इसके कि इसमें एक स्थिर डेटाटाइप होता है जिसका उपयोग संकलन-समय पर किया जा सकता है ताकि यह सुनिश्चित किया जा सके कि जिस डेटा को संदर्भित किया गया है उसकी गलत व्याख्या नहीं की गई है। हालाँकि, क्योंकि C में एक [[कमजोर टाइपिंग|कमजोर]] प्रकार की प्रणाली है जिसका उल्लंघन [[कास्ट (कंप्यूटर साइंस)]] (विभिन्न पॉइंटर प्रकारों के बीच और पॉइंटर प्रकारों और पूर्णांकों के बीच स्पष्ट रूपांतरण) का उपयोग करके किया जा सकता है, यदि अधिक जटिल हो तो गलत व्याख्या अभी भी संभव है। इसके परवर्ती [[सी ++|C++]] ने अपने [[सी ++ मानक पुस्तकालय|C++ मानक पुस्तकालय]] में नए कास्ट ऑपरेटरों, एक संदर्भ प्रकार और स्मार्ट संकेतक के साथ संकेतक प्रकार की सुरक्षा बढ़ाने की कोशिश की <code>&</code>, लेकिन फिर भी संगतता के लिए इन सुरक्षा प्रक्रिया को दरकिनार करने की क्षमता को बनाए रखा।


=== [[फोरट्रान]] ===
=== [[फोरट्रान|फोरट्रान (कंप्यूटर भाषा)]] ===
'''फोरट्रान के पास संदर्भों''' का स्पष्ट प्रतिनिधित्व नहीं है, लेकिन इसका उपयोग [[कॉल-टू-संदर्भ द्वारा]] कॉलिंग सिमेंटिक्स में करता है। एक फोरट्रान संदर्भ को किसी अन्य वस्तु के उपनाम के रूप में सबसे अच्छा माना जाता है, जैसे कि स्केलर चर या किसी सरणी की पंक्ति या स्तंभ। संदर्भ को डीरेफेरेंस करने या सीधे संदर्भ की सामग्री में हेरफेर करने के लिए कोई सिंटैक्स नहीं है। फोरट्रान संदर्भ शून्य हो सकते हैं। अन्य भाषाओं की तरह, ये संदर्भ गतिशील संरचनाओं के प्रसंस्करण की सुविधा प्रदान करते हैं, जैसे कि लिंक्ड सूचियाँ, कतारें और पेड़।
फोरट्रान के पास संदर्भों का स्पष्ट प्रतिनिधित्व नहीं है, लेकिन इसका उपयोग [[कॉल-टू-संदर्भ द्वारा|कॉल-बाई-रेफरेंस]] कॉलिंग सिमेंटिक्स में करता है। एक फोरट्रान संदर्भ को किसी अन्य उद्देश्य के उपनाम के रूप में सबसे अच्छा माना जाता है, जैसे कि स्केलर चर या किसी सरणी की पंक्ति या स्तंभ। संदर्भ को डीरेफेरेंस करने या सीधे संदर्भ की सामग्री में क्रमभंग करने के लिए कोई सिंटैक्स नहीं होता है। फोरट्रान संदर्भ शून्य हो सकते हैं। अन्य भाषाओं की तरह, ये संदर्भ गतिशील संरचनाओं के प्रसंस्करण की सुविधा प्रदान करते हैं, जैसे कि लिंक्ड सूचियाँ, कतारें(queues) और ट्री।


=== वस्तु-उन्मुख भाषाएँ ===
=== ऑब्जेक्ट-ओरिएंटेड भाषाएँ ===
एफिल (प्रोग्रामिंग लैंग्वेज), जावा (प्रोग्रामिंग लैंग्वेज), सी शार्प (प्रोग्रामिंग लैंग्वेज) | सी # और [[मूल दृश्य]] जैसी कई ऑब्जेक्ट-ओरिएंटेड लैंग्वेज लैंग्वेज ने बहुत अधिक अपारदर्शी प्रकार के संदर्भ को अपनाया है, जिसे आमतौर पर केवल एक के रूप में संदर्भित किया जाता है। संदर्भ। इन संदर्भों में सी पॉइंटर्स जैसे प्रकार होते हैं जो इंगित करते हैं कि वे संदर्भित डेटा की व्याख्या कैसे करें, लेकिन वे इस प्रकार सुरक्षित हैं कि उन्हें कच्चे पते के रूप में नहीं समझा जा सकता है और असुरक्षित रूपांतरणों की अनुमति नहीं है। एक्सेस और असाइनमेंट (कंप्यूटर साइंस) के लिए संदर्भों का बड़े पैमाने पर उपयोग किया जाता है # ऑब्जेक्ट ओरिएंटेड लैंग्वेज ऑब्जेक्ट्स में असाइनमेंट। फ़ंक्शन/[[विधि (कंप्यूटर प्रोग्रामिंग)]] कॉल या संदेश पासिंग में भी संदर्भों का उपयोग किया जाता है, और संदर्भ गणना का उपयोग अक्सर अप्रयुक्त वस्तुओं के कचरा संग्रह (कंप्यूटर विज्ञान) करने के लिए किया जाता है।
एफिल(Eiffel), जावा(JAVA), C # और [[मूल दृश्य|Visual Basic]] जैसी कई ऑब्जेक्ट-ओरिएंटेड भाषाओं ने बहुत अधिक अस्पष्ट प्रकार के संदर्भ को अपनाया है, जिसे सामान्य रूप से केवल एक संदर्भ के रूप में संदर्भित किया जाता है। इन संदर्भों में C संकेतक जैसे प्रकार होते हैं, जो इंगित करते हैं कि वे संदर्भित डेटा की व्याख्या कैसे करें, लेकिन वे इस प्रकार सुरक्षित हैं कि उन्हें रॉ एड्रेस के रूप में नहीं समझा जा सकता है और असुरक्षित रूपांतरणों की अनुमति नहीं होती है। वस्तुओं तक पहुँचने और आवंटित करने के लिए संदर्भों का बड़े पैमाने पर उपयोग किया जाता है। संदर्भों का उपयोग कार्य/ [[विधि (कंप्यूटर प्रोग्रामिंग)]] या संदेश समाप्ति में भी किया जाता है, और अप्रयुक्त ऑब्जेक्ट का गार्बेज संग्रह करने के लिए संदर्भ संख्या का उपयोग प्रायः किया जाता है।


=== कार्यात्मक भाषाएं ===
=== कार्यात्मक भाषाएं ===
मानक ML, [[OCaml]], और कई अन्य कार्यात्मक भाषाओं में, अधिकांश मान स्थायी होते हैं: उन्हें असाइनमेंट द्वारा संशोधित नहीं किया जा सकता है। असाइन करने योग्य संदर्भ सेल [[परिवर्तनशील]], डेटा प्रदान करते हैं जिसे संशोधित किया जा सकता है। ऐसे संदर्भ कक्ष कोई भी मान धारण कर सकते हैं, और इसलिए उन्हें [[बहुरूपता (कंप्यूटर विज्ञान)]] प्रकार दिया जाता है <code>α ref</code>, कहाँ पे <code>α</code> इंगित किए गए मान के प्रकार से प्रतिस्थापित किया जाना है। इन परस्पर संदर्भों को उनके जीवनकाल में विभिन्न वस्तुओं की ओर इशारा किया जा सकता है। उदाहरण के लिए, यह परिपत्र डेटा संरचनाओं के निर्माण की अनुमति देता है। संदर्भ सेल कार्यात्मक रूप से लंबाई 1 के एक परिवर्तनशील सरणी के समतुल्य है।
मानक ML, [[OCaml]], और कई अन्य कार्यात्मक भाषाओं में, अधिकांश मान स्थायी होते हैं। उन्हें असाइनमेंट द्वारा संशोधित नहीं किया जा सकता है। निर्देश्य करने योग्य संदर्भ कक्ष उत्परिवर्तनीय डेटा चर प्रदान करते हैं, जिसे संशोधित किया जा सकता है। ऐसे संदर्भ कक्ष किसी भी मान को ग्रहण कर सकते हैं, और इसलिए उन्हें [[बहुरूपता (कंप्यूटर विज्ञान)|बहुरूपी प्रकार (कंप्यूटर विज्ञान)]] <code>α ref</code> दिया जाता है, जहां <code>α</code>को इंगित किए गए मान के प्रकार से प्रतिस्थापित किया जाना है। इन परस्पर संदर्भों को उनके जीवनकाल में विभिन्न वस्तुओं की ओर संकेत किया जा सकता है। उदाहरण के लिए, यह परिपत्र डेटा संरचनाओं के निर्माण की अनुमति देता है। संदर्भ सेल कार्यात्मक रूप से लंबाई 1 के एक परिवर्तनशील सरणी के समतुल्य होता है।


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


=== [[पर्ल]]/PHP ===
=== [[पर्ल]]/PHP ===
पर्ल कठिन संदर्भों का समर्थन करता है, जो अन्य भाषाओं में समान रूप से कार्य करता है, और प्रतीकात्मक संदर्भ, जो केवल स्ट्रिंग मान होते हैं जिनमें चर के नाम होते हैं। जब एक मूल्य जो एक कठिन संदर्भ नहीं है, को संदर्भित नहीं किया जाता है, तो पर्ल इसे एक प्रतीकात्मक संदर्भ मानता है और चर को मान द्वारा दिए गए नाम के साथ देता है।<ref>{{cite web|url=http://perldoc.perl.org/perlref.html#Symbolic-references |title=perlref|publisher=perldoc.perl.org |access-date=2013-08-19}}</ref> [[PHP]] के पास इसके रूप में एक समान विशेषता है <code>$$var</code> वाक्य - विन्यास।<ref>{{cite web|url=http://www.php.net/manual/en/language.variables.variable.php |title=चर चर - मैनुअल|publisher=PHP |access-date=2013-08-19}}</ref>
पर्ल जटिल संदर्भों का समर्थन करता है, जो अन्य भाषाओं में समान रूप से कार्य करता है, और प्रतीकात्मक संदर्भ, जो केवल स्ट्रिंग मान होते हैं, जिनमें चर के नाम होते हैं। जब एक मान जो एक जटिल संदर्भ नहीं है, उसको हटा दिया जाता है, तो पर्ल इसे एक प्रतीकात्मक संदर्भ मानता है और चर को मान द्वारा दिए गए नाम के साथ देता है।।<ref>{{cite web|url=http://perldoc.perl.org/perlref.html#Symbolic-references |title=perlref|publisher=perldoc.perl.org |access-date=2013-08-19}}</ref> [[PHP]] में इसके <code>$$var</code> सिंटैक्स के रूप में एक समान विशेषता होती है।<ref>{{cite web|url=http://www.php.net/manual/en/language.variables.variable.php |title=चर चर - मैनुअल|publisher=PHP |access-date=2013-08-19}}</ref>
 
 
== यह भी देखें ==
== यह भी देखें ==
* [[संदर्भ प्रकार]]
* [[संदर्भ प्रकार]]
* अमूर्तता (कंप्यूटर विज्ञान)
* अमूर्तता (कंप्यूटर विज्ञान)
* [[ऑटोविविफिकेशन]]
* [[ऑटोविविफिकेशन]]
* [[बंधा हुआ सूचक]]
* [[बंधा हुआ सूचक|परिबद्ध सूचक]]
* जुड़ा हुआ डेटा
* लिंक्ड डेटा
* [[जादू कुकी]]
* [[जादू कुकी|मैजिक कुकी]]
* [[चर (प्रोग्रामिंग)]]
* [[चर (प्रोग्रामिंग)]]
* [[कमजोर संदर्भ]]
* [[कमजोर संदर्भ]]
Line 97: Line 94:
{{Semantic Web}}
{{Semantic Web}}
{{Web syndication}}
{{Web syndication}}
[[Category:डेटा प्रकार]]
[[Category: प्रोग्रामिंग भाषा अवधारणाएं]]
[[Category: आदिम प्रकार]]


 
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category: Machine Translated Page]]
[[Category:Articles with short description]]
[[Category:CS1 English-language sources (en)]]
[[Category:CS1 français-language sources (fr)]]
[[Category:CS1 maint]]
[[Category:CS1 Ελληνικά-language sources (el)]]
[[Category:Citation Style 1 templates|W]]
[[Category:Collapse templates]]
[[Category:Created On 14/12/2022]]
[[Category:Created On 14/12/2022]]
[[Category:Machine Translated Page]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates based on the Citation/CS1 Lua module]]
[[Category:Templates generating COinS|Cite web]]
[[Category:Templates generating microformats]]
[[Category:Templates that are not mobile friendly]]
[[Category:Templates used by AutoWikiBrowser|Cite web]]
[[Category:Templates using TemplateData]]
[[Category:Wikipedia fully protected templates|Cite web]]
[[Category:Wikipedia metatemplates]]
[[Category:आदिम प्रकार]]
[[Category:डेटा प्रकार]]
[[Category:प्रोग्रामिंग भाषा अवधारणाएं]]

Latest revision as of 10:20, 30 December 2022

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

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

औपचारिक प्रतिनिधित्व

एक संदर्भ R मान है, जो एक ऑपरेशन को स्वीकार करता है, भिन्नता(R), जो एक मान देता है। सामान्य रूप से reference टाइप किया जाता है ताकि यह एक विशिष्ट प्रकार के मान लौटाए, जैसे:[1][2]

interface Reference<T> {
 T value();
}

प्रायः संदर्भ एक नियुक्ति ऑपरेशन store(R, x) को भी स्वीकार करता है, जिसका अर्थ है कि यह एक काल्पनिक चर होता है।[1]

उपयोग

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

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

कार्यान्वयन में भिन्न होने पर संदर्भों की प्रक्रिया लगभग सभी आधुनिक प्रोग्रामिंग भाषाओं के लिए एक मौलिक प्रोग्रामिंग भाषा विशेषता है। यहां तक ​​कि कुछ भाषाएं जो संदर्भों के प्रत्यक्ष उपयोग का समर्थन नहीं करती हैं, उनका भी कुछ आंतरिक या अंतर्निहित उपयोग होता है। उदाहरण के लिए, मूल्यांकन योजना कॉलिंग सम्मेलन द्वारा कॉल को संदर्भों के स्पष्ट या निहित उपयोग के साथ कार्यान्वित किया जा सकता है।

उदाहरण

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

संचलन एक संक्षेप संदर्भ है, और इसे विभिन्न तरीकों से प्रदर्शित किया जा सकता है। सामान्य उदाहरण FILE संचलन (stdio|C I/O लाइब्रेरी में FILE डेटा संरचना) है, जिसका उपयोग संक्षेप FILE सामग्री के लिए किया जाता है। यह सामान्य रूप से दोनों फाइलों का प्रतिनिधित्व करता है, जैसे कि फाइल पर लॉक का अनुरोध करते समय और फाइल की सामग्री के भीतर एक विशिष्ट स्थिति, जैसे फाइल को पढ़ते समय आदि।

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

यदि हमारे पास कुंजियों का एक सेट K और डेटा संक्षेप का एक सेट D है, तो K से D ∪ {Null} तक कोई भी अच्छी तरह से परिभाषित (एकल-मान) कारक एक प्रकार के संदर्भ को परिभाषित करता है, जहां शून्य एक कुंजी की प्रतिरूप है, जो किसी सार्थक वस्तु का जिक्र नहीं करती है।

ऐसे कारक का एक वैकल्पिक प्रतिनिधित्व एक निर्देशित ग्राफ़ है, जिसे अभिगम्यता (reachability) ग्राफ कहा जाता है। यहां, प्रत्येक डेटम को शीर्ष द्वारा दर्शाया गया है और यदि u में डेटाम v में डेटम को संदर्भित करता है तो u से v तक एक किनारा है। अधिकतम बाहर अंश एक है। ये ग्राफ़ गार्बेज संग्रह (कंप्यूटर विज्ञान) में मान हैं, जहाँ इनका उपयोग अप्राप्य वस्तुओं से सुलभ को अलग करने के लिए किया जा सकता है।

बाहरी और आंतरिक भंडारण

कई डेटा संरचनाओं में, बड़ी, जटिल वस्तुएँ छोटी वस्तुओं से बनी होती हैं। इन वस्तुओं को सामान्य रूप से दो तरीकों में से एक में संग्रहीत किया जाता है।

  1. आंतरिक भंडारण के साथ, छोटी वस्तु की सामग्री बड़ी वस्तु के अंदर संग्रहीत हो जाती है।
  2. बाहरी भंडारण के साथ, छोटी वस्तुओं को उनके स्थान पर आवंटित किया जाता है, और बड़ी वस्तु केवल उनके संदर्भों को संग्रहीत करती है।

आंतरिक भंडारण सामान्य रूप से अधिक कुशल होता है, क्योंकि संदर्भों और गतिशील आवंटन मेटाडेटा के लिए एक स्थान की लागत होती है, और एक संदर्भ को संदर्भित करने और छोटी वस्तुओं के लिए मेमोरी आवंटित करने से जुड़ी समय लागत होती है। आंतरिक भंडारण एक ही बड़ी वस्तु के विभिन्न भागों को मेमोरी में एक साथ पास रखकर संदर्भ की स्थानीयता को भी बढ़ाता है। हालाँकि, ऐसी कई स्थितियाँ हैं जिनमें बाह्य संग्रहण को प्राथमिकता दी जाती है।

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

कुछ प्रोग्रामिंग भाषाएँ, जैसे कि जावा(Java), स्मॉलटाक(Smalltalk), पायथन(Python), और स्कीम(Scheme), आंतरिक भंडारण का समर्थन नहीं करती हैं। इन भाषाओं में, सभी वस्तुओं को समान रूप से संदर्भों के माध्यम से नियंत्रित किया जाता है।

भाषा समर्थन

असेंबली

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

लिस्प

सबसे प्रारंभिक अस्पष्ट संदर्भों में से एक लिस्प(Lisp) भाषा विपक्ष का था, जो केवल साधारण संरचना है जिसमें अन्य लिस्प उद्देश्य के दो संदर्भ हैं, जिनमें संभवतः अन्य कॉन्स सेल भी सम्मिलित हैं। इस सरल संरचना का उपयोग सामान्य रूप से एकल लिंक्ड सूचियों के निर्माण के लिए किया जाता है, लेकिन इसका उपयोग सरल बाइनरी ट्री और तथाकथित बिंदीदार सूचियाँ बनाने के लिए भी किया जा सकता है, जो एक शून्य संदर्भ के साथ नहीं बल्कि एक मान के साथ समाप्त होता है।

सी/सी ++

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

फोरट्रान (कंप्यूटर भाषा)

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

ऑब्जेक्ट-ओरिएंटेड भाषाएँ

एफिल(Eiffel), जावा(JAVA), C # और Visual Basic जैसी कई ऑब्जेक्ट-ओरिएंटेड भाषाओं ने बहुत अधिक अस्पष्ट प्रकार के संदर्भ को अपनाया है, जिसे सामान्य रूप से केवल एक संदर्भ के रूप में संदर्भित किया जाता है। इन संदर्भों में C संकेतक जैसे प्रकार होते हैं, जो इंगित करते हैं कि वे संदर्भित डेटा की व्याख्या कैसे करें, लेकिन वे इस प्रकार सुरक्षित हैं कि उन्हें रॉ एड्रेस के रूप में नहीं समझा जा सकता है और असुरक्षित रूपांतरणों की अनुमति नहीं होती है। वस्तुओं तक पहुँचने और आवंटित करने के लिए संदर्भों का बड़े पैमाने पर उपयोग किया जाता है। संदर्भों का उपयोग कार्य/ विधि (कंप्यूटर प्रोग्रामिंग) या संदेश समाप्ति में भी किया जाता है, और अप्रयुक्त ऑब्जेक्ट का गार्बेज संग्रह करने के लिए संदर्भ संख्या का उपयोग प्रायः किया जाता है।

कार्यात्मक भाषाएं

मानक ML, OCaml, और कई अन्य कार्यात्मक भाषाओं में, अधिकांश मान स्थायी होते हैं। उन्हें असाइनमेंट द्वारा संशोधित नहीं किया जा सकता है। निर्देश्य करने योग्य संदर्भ कक्ष उत्परिवर्तनीय डेटा चर प्रदान करते हैं, जिसे संशोधित किया जा सकता है। ऐसे संदर्भ कक्ष किसी भी मान को ग्रहण कर सकते हैं, और इसलिए उन्हें बहुरूपी प्रकार (कंप्यूटर विज्ञान) α ref दिया जाता है, जहां αको इंगित किए गए मान के प्रकार से प्रतिस्थापित किया जाना है। इन परस्पर संदर्भों को उनके जीवनकाल में विभिन्न वस्तुओं की ओर संकेत किया जा सकता है। उदाहरण के लिए, यह परिपत्र डेटा संरचनाओं के निर्माण की अनुमति देता है। संदर्भ सेल कार्यात्मक रूप से लंबाई 1 के एक परिवर्तनशील सरणी के समतुल्य होता है।

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

पर्ल/PHP

पर्ल जटिल संदर्भों का समर्थन करता है, जो अन्य भाषाओं में समान रूप से कार्य करता है, और प्रतीकात्मक संदर्भ, जो केवल स्ट्रिंग मान होते हैं, जिनमें चर के नाम होते हैं। जब एक मान जो एक जटिल संदर्भ नहीं है, उसको हटा दिया जाता है, तो पर्ल इसे एक प्रतीकात्मक संदर्भ मानता है और चर को मान द्वारा दिए गए नाम के साथ देता है।।[3] PHP में इसके $$var सिंटैक्स के रूप में एक समान विशेषता होती है।[4]

यह भी देखें

संदर्भ

  1. 1.0 1.1 Sherman, Mark S. (April 1985). पैरागॉन: विशिष्टता, कार्यान्वयन और सार डेटा प्रकारों के चयन के लिए प्रकार पदानुक्रम का उपयोग करने वाली भाषा (in English). Springer Science & Business Media. p. 175. ISBN 978-3-540-15212-5.
  2. "संदर्भ (जावा प्लेटफार्म एसई 7)". docs.oracle.com. Retrieved 10 May 2022.
  3. "perlref". perldoc.perl.org. Retrieved 2013-08-19.
  4. "चर चर - मैनुअल". PHP. Retrieved 2013-08-19.


बाहरी संबंध

  • Pointer Fun With Binky Introduction to pointers in a 3-minute educational video – Stanford Computer Science Education Library