स्थानीय चर

From Vigyanwiki

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

स्कोप

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

रैंडल एल. स्क्वार्ट्ज़ और टॉम फीनिक्स का तर्क है कि ऑपरेटर 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.