चर और संकेत के बीच अंतर क्या है?


10

ओओ और फंक्शनल प्रोग्रामिंग में अंतर को रेखांकित करने वाले एक लेख को पढ़ते हुए मैं फंक्शन पॉइंटर्स में आया। जब मैंने अपनी कंप्यूटर साइंस की डिग्री (2003) पूरी की तब से कुछ समय हो चुका है और इसलिए मैंने अपनी याददाश्त को ताज़ा करने के लिए पॉइंटर्स को देखा।

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

यह एक चर से अलग क्यों है? चर स्मृति पते के लिए सांकेतिक नाम हैं और संकलक वास्तविक पते के साथ नाम को बदल देंगे। इसका मतलब यह है कि चर में मेमोरी स्थानों के संदर्भ होते हैं और अगर उस तरह के डेटा मौजूद हैं तो उस पते पर डेटा को इंगित करने के लिए विचार किया जा सकता है।

यदि अंतर व्यवहार में है (शायद एक संकेतक को रनटाइम पर पुन: असाइन नहीं किया जा सकता है, या केवल एक प्रतीकात्मक चर नाम सौंपा जा सकता है, किसी अन्य मूल्य नहीं) इसका मतलब यह नहीं है कि यह केवल एक विशेष प्रकार का एक चर है, सूचक प्रकार? उसी तरह से जिस प्रकार के पूर्णांक के रूप में घोषित किया गया चर उस संकलन में प्रतिबंधित होता है, जिसका वह उपयोग कर सकता है।

मुझे यहां क्या समझ नहीं आ रहा है?


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

जवाबों:


8

आपका प्रश्न कई मायनों में दिलचस्प है, क्योंकि इसमें कई मुद्दों के लिए सावधानीपूर्वक भेदों की आवश्यकता होती है। लेकिन आपकी दृष्टि मुझे अनिवार्य रूप से सही लगती है। इस उत्तर को लिखने से पहले मैंने अपना उत्तर पढ़ने से बचने के लिए आपका संदर्भ नहीं पढ़ा।

सबसे पहले, आपका कथन Variables are symbolic names for memory addresses, यह लगभग सही है, लेकिन अवधारणा और इसके सामान्य कार्यान्वयन को भ्रमित करता है। एक चर वास्तव में सिर्फ एक कंटेनर है जिसमें एक मूल्य हो सकता है जिसे बदला जा सकता है। आमतौर पर, इस कंटेनर को कंप्यूटर पर मेमोरी स्पेस की एक विशेषता के रूप में कार्यान्वित किया जाता है, जिसके द्वारा पता और पता चलता है और चूंकि चर में ऑब्जेक्ट हो सकता है जिसमें अधिक या कम जानकारी के साथ प्रतिनिधित्व की आवश्यकता होती है।

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

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

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

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

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

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

एक पहचानकर्ता के साथ अपरिवर्तनीय मूल्य का जुड़ाव आमतौर पर एक स्थिरांक कहलाता है। लिटरल्स उस अर्थ में निरंतर हैं।

"मूल्य कंटेनरों" को मूल्यों के रूप में भी माना जा सकता है, और एक पहचानकर्ता के साथ उनका जुड़ाव सामान्य "भोले" अर्थ में एक चर है जिसे आप उपयोग कर रहे हैं। तो आप कह सकते हैं कि एक चर "कंटेनर स्थिर" है।

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

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

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

कोड के बारे में, आप बताते हैं [pointers] might indicate the entry point to a section of code and can be used to call that code। वास्तव में यह बिल्कुल सच नहीं है। कोड का एक खंड अक्सर अर्थहीन होता है (उच्च स्तर या कार्यान्वयन के दृष्टिकोण से)। एक उच्च-स्तरीय दृष्टिकोण से, कोड में आमतौर पर पहचानकर्ता होते हैं, और आपको इन पहचानकर्ताओं की स्थैतिक संदर्भ में व्याख्या करनी होगी, जहां वे घोषित किए गए थे। लेकिन वास्तव में उसी स्थिर संदर्भ का एक संभावित दोहराव है, अनिवार्य रूप से पुनरावृत्ति के कारण जो एक गतिशील (रन-टाइम) घटना है, और कोड को केवल स्थिर संदर्भ के एक उपयुक्त गतिशील उदाहरण में निष्पादित किया जा सकता है। यह थोड़ा जटिल है, लेकिन इसका नतीजा यह है कि उचित अवधारणा एक बंद करने वाली है जो कोड के एक टुकड़े और एक ऐसे वातावरण को जोड़ती है जहां पहचानकर्ताओं की व्याख्या की जानी है। क्लोजर एक उचित सिमेंटिक कॉन्सेप्ट है, यानी एक उचित निश्चित सिमेंटिक वैल्यू है। तब आपके पास क्लोजर स्थिरांक, क्लोजर वैरिएबल हो सकते हैं,

एक फ़ंक्शन एक क्लोजर है, आमतौर पर कुछ मापदंडों के साथ इसकी कुछ संस्थाओं (स्थिरांक और चर) को परिभाषित करने या शुरू करने के लिए।

मैं इन तंत्रों के उपयोग पर कई भिन्नताओं को छोड़ रहा हूं।

क्लोजर का उपयोग अत्यावश्यक या कार्यात्मक भाषाओं में OO संरचनाओं को परिभाषित करने के लिए किया जा सकता है। दरअसल, ओओ शैली पर प्रारंभिक कार्य (शायद नाम से पहले) उस तरह से किया गया था।

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

लेकिन याद रखें: कई चीजें देखने वाले की आंखों में होती हैं, जब तक वह एक सुसंगत दृश्य को संरक्षित करता है। देखने के बिंदु अलग हो सकते हैं।

क्या इससे आपके सवाल का जवाब मिलता है?

पुनश्च: यह एक लंबा जवाब है। यदि आप इसके कुछ हिस्से को अपर्याप्त मानते हैं, तो कृपया इसके बारे में स्पष्ट रहें। धन्यवाद।


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

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

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

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

@NectarSoft वास्तव में। जब आप एक क्लोजर का निर्माण करते हैं, तो आप उस कोड को उस कोड को उचित अर्थ देने के लिए (माइक्रो-प्रबंधन जानकारी से बचने के लिए कुछ व्यावहारिक बाधाओं तक) आवश्यक है, उस संदर्भ को प्रतिबंधित करने का प्रयास करते हैं। यह वैधानिक रूप से तय किया जा सकता है।
बबौ

2

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

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