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

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

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

औपचारिक प्रतिनिधित्व
एक संदर्भ R मान है, जो एक ऑपरेशन को स्वीकार करता है, भिन्नता (R), जो एक मान देता है। सामान्य रूप से reference टाइप किया जाता है ताकि यह एक विशिष्ट प्रकार के मान लौटाए, जैसे: interface Reference { T value; } प्रायः संदर्भ एक नियुक्ति ऑपरेशन store (R, x) को भी स्वीकार करता है, जिसका अर्थ है कि यह एक काल्पनिक चर होता है।

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

आंशिक रूप से निलंबित(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, और कई अन्य कार्यात्मक भाषाओं में, अधिकांश मान स्थायी होते हैं। उन्हें असाइनमेंट द्वारा संशोधित नहीं किया जा सकता है। निर्देश्य करने योग्य संदर्भ कक्ष उत्परिवर्तनीय डेटा चर प्रदान करते हैं, जिसे संशोधित किया जा सकता है। ऐसे संदर्भ कक्ष किसी भी मान को ग्रहण कर सकते हैं, और इसलिए उन्हें बहुरूपी प्रकार (कंप्यूटर विज्ञान)  दिया जाता है, जहां  को इंगित किए गए मान के प्रकार से प्रतिस्थापित किया जाना है। इन परस्पर संदर्भों को उनके जीवनकाल में विभिन्न वस्तुओं की ओर संकेत किया जा सकता है। उदाहरण के लिए, यह परिपत्र डेटा संरचनाओं के निर्माण की अनुमति देता है। संदर्भ सेल कार्यात्मक रूप से लंबाई 1 के एक परिवर्तनशील सरणी के समतुल्य होता है।

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

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

यह भी देखें

 * संदर्भ प्रकार
 * अमूर्तता (कंप्यूटर विज्ञान)
 * ऑटोविविफिकेशन
 * परिबद्ध सूचक
 * लिंक्ड डेटा
 * मैजिक कुकी
 * चर (प्रोग्रामिंग)
 * कमजोर संदर्भ

बाहरी संबंध

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