स्थानीय चर

From Vigyanwiki
Revision as of 19:32, 21 December 2022 by alpha>Abhishekk (minor changes)

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

स्कोप

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

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

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

स्थिर लोकल वेरिएबल

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

ग्लोबल फ़ंक्शंस में स्थिर लोकल लोगों का जीवनकाल स्थिर ग्लोबल वेरिएबल के समान होता है, क्योंकि उनका मूल्य फंक्शनक्रम के जीवन के लिए स्मृति में रहता है,[1] परन्तु स्वचालित लोकल वेरिएबल के साथ फंक्शन क्षेत्र (ग्लोबल स्कोप नहीं) होता है।

यह स्थिर कीवर्ड के अन्य उपयोगों से अलग है, जिसके विभिन्न भाषाओं में कई अलग-अलग अर्थ हैं।static

पर्ल में लोकल वेरिएबल

पर्ल डायनेमिक और लेक्सिकली-स्कोप्ड लोकल वेरिएबल्स दोनों का समर्थन करता है। कीवर्ड local का उपयोग लोकल डायनामिक-स्कोप्ड वेरिएबल्स को परिभाषित करने के लिए किया जाता है, जबकि my का उपयोग लोकल लेक्सिकली-स्कोप्ड वेरिएबल्स के लिए किया जाता है। चूंकि डायनेमिक स्कोपिंग आज कम आम है, पर्ल प्रलेखन चेतावनी देता है कि "localवह नहीं है जिसे ज्यादातर लोग" लोकल "के रूप में सोचते हैं।"[2] इसके बजाय, local कीवर्ड एक ग्लोबल (पैकेज) वेरिएबल के लिए एक अस्थायी, डायनेमिक रूप से स्कोप वाला मान देता है, जो संलग्न ब्लॉक के अंत तक रहता है। हालांकि, वेरिएबल ब्लॉक के भीतर से बुलाए गए किसी भी फ़ंक्शन के लिए दृश्यमान है।[3] शब्दावली-स्कोप वाले लोकल वेरिएबल बनाने के लिए, इसके बजाय my ऑपरेटर का उपयोग करें।[4]

यह समझने के लिए कि यह कैसे काम करता है, निम्नलिखित कोड पर विचार करें:

$a = 1;
sub f() {
    local $a;
    $a = 2;
    g();
}
sub g() {
    print "$a\n";
}
g();
f();
g();

यह आउटपुट करेगा:

1
2
1

ऐसा इसलिए होता है क्योंकि ग्लोबल वेरिएबल $a को f() के अंदर एक नए अस्थायी (लोकल) अर्थ में संशोधित किया गया है, परन्तु f() के स्कोप को छोड़ने पर ग्लोबल मान को पुनर्स्थापित किया जाता है।

local के बजाय इस मामले में my का उपयोग करने से 1 तीन बार प्रिंट होता है क्योंकि उस स्थिति में $a वेरिएबल फ़ंक्शन f() के स्थिर स्कोप तक सीमित होगा और g() द्वारा नहीं देखा जाएगा।

Randal L. Schwartz और टॉम फीनिक्स का तर्क है कि ऑपरेटर local का एक अलग नाम होना चाहिए था जैसे save[5]


रूबी में लोकल वेरिएबल

रूबी एक भाषा के रूप में पर्ल से भी प्रेरित थी, परन्तु इस मामले में, संकेतन को सरल बनाया गया था: एक ग्लोबल वेरिएबल नाम $ चिह्न से पहले होना चाहिए, जैसे $ वेरिएबल_नाम, जबकि एक $variable_name के पास इसके नाम के सामने कोई $ चिह्न नहीं है, जैसे कि variable_name (जबकि पर्ल में सभी स्केलर मानों के सामने $ होता है)। ध्यान दें कि रूबी केवल पर्ल के myजैसे स्टेटिकली-स्कोप्ड लोकल वेरिएबल्स के लिए बिल्ट-इन सपोर्ट प्रदान करती है, पर्ल के localजैसे डायनामिक-स्कोप्ड लोकल वेरिएबल्स के लिए नहीं। रुबी के लिए कम से कम एक लाइब्रेरी है जो डायनेमिक रूप से स्कोप वाले वेरिएबल प्रदान करती है।[6]

यह भी देखें

संदर्भ

  1. "वर्तमान सी मानक" (PDF). ​​Template:छोटा (as of 2009). In particular, see section 6.2.4 “Storage durations of objects”, page 32.
  2. perldoc.perl.org: local
  3. perldoc.perl.org: perlsub: Temporary Values via local()
  4. perldoc.perl.org: perlsub: Private Variables via my()
  5. Randal L. Schwartz and Tom Phoenix (2001-07-01). लर्निंग पर्ल तीसरा संस्करण. O'REILLY. paragraph 4.7. ISBN 0-596-00132-0.
  6. Conrad Irwin. "LSpace: Dynamic scope for Ruby". December 2012 http://cirw.in/blog/lspace Retrieved 2013-10-16.