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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

यह भी देखें

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

बाहरी संबंध

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