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

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

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

औपचारिक प्रतिनिधित्व
एक संदर्भ R एक मान है, जो एक ऑपरेशन को स्वीकार करता है, भिन्नता (R), जो एक मान देता है। सामान्य रूप से संदर्भ टाइप किया जाता है ताकि यह एक विशिष्ट प्रकार के मान लौटाए, जैसे: 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