स्थानीय चर: Difference between revisions

From Vigyanwiki
(minor changes)
(minor changes)
Line 1: Line 1:
{{Short description|Computer programming, a variable only usable in a portion of a program (the scope)}}
{{Short description|Computer programming, a variable only usable in a portion of a program (the scope)}}
[[कंप्यूटर विज्ञान]] में, एक स्थानीय [[चर (प्रोग्रामिंग)|चर]] एक चर है जिसे स्थानीय [[गुंजाइश (प्रोग्रामिंग)|कार्यक्षेत्र]] दिया जाता है। [[सबरूटीन|फ़ंक्शन]] या [[ब्लॉक (प्रोग्रामिंग)|ब्लॉक]] में एक स्थानीय चर संदर्भ जिसमें इसे घोषित किया गया है, बड़े दायरे में समान चर नाम को ओवरराइड करता है। [[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाओं]] में केवल दो स्तरों की दृश्यता के साथ, स्थानीय चर [[वैश्विक चर]] के साथ विपरीत होते हैं। दूसरी ओर, कई [[ALGOL]]-व्युत्पन्न भाषाएँ निजी चर, फ़ंक्शंस, स्थिरांक और उनके भीतर छिपे हुए प्रकारों के साथ, या तो नेस्टेड ब्लॉक या [[नेस्टेड समारोह|नेस्टेड फ़ंक्शंस]] द्वारा, किसी भी संख्या में नेस्टेड स्तर की दृश्यता की अनुमति देती हैं। स्थानीय चर [[प्रक्रियात्मक प्रोग्रामिंग]] के लिए मौलिक हैं, और अधिक आम तौर पर [[मॉड्यूलर प्रोग्रामिंग]]: स्थानीय चर के चर का उपयोग साइड-इफेक्ट्स के साथ मुद्दों से बचने के लिए किया जाता है जो वैश्विक चर के साथ हो सकते हैं।
[[कंप्यूटर विज्ञान|संगणक विज्ञान]] में, लोकल वेरिएबल एक प्रकार का [[चर (प्रोग्रामिंग)|वेरिएबल]] होता है जिसे लोकल [[गुंजाइश (प्रोग्रामिंग)|स्कोप]] प्रदान किया जाता है। [[सबरूटीन|फ़ंक्शन]] या [[ब्लॉक (प्रोग्रामिंग)|ब्लॉक]] में एक लोकल वेरिएबल सम्बन्ध जिसमें इसे प्रकटित किया जाता है कि बड़े स्कोप में समान वेरिएबल नाम को ओवरराइड करता है। [[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाओं]] में केवल दो स्तरों की दृश्यता के साथ, लोकल वेरिएबल [[वैश्विक चर|ग्लोबल वेरिएबल]] के कृत व्यतिरेक होते हैं। दूसरी ओर, कई [[ALGOL|एएलजीओएल]]-व्युत्पन्न भाषाएँ वैयक्तिक (प्राइवेट) वेरिएबल, फ़ंक्शंस, स्थिरांक और उनके कुछ प्रकारों के साथ, या तो नेस्टेड ब्लॉक या [[नेस्टेड समारोह|नेस्टेड फ़ंक्शंस]] द्वारा, किसी भी संख्या में नेस्टेड स्तर की दृश्यता की अनुमति प्रदान करती हैं। लोकल वेरिएबल [[प्रक्रियात्मक प्रोग्रामिंग|प्रक्रियात्मक (प्रोसेडुरल) प्रोग्रामिंग]] के लिए अत्यन्त महत्वपूर्ण हैं, और अधिक व्यापक रुप से [[मॉड्यूलर प्रोग्रामिंग]]: लोकल स्कोप के वेरिएबल का उपयोग अनुषंगी प्रभाव (साइड-इफेक्ट्स) के साथ समस्याओं से परिवर्जन के लिए किया जाता है जो ग्लोबल वेरिएबल के साथ हो सकते हैं।


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


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


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


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


वैश्विक कार्यों में स्थिर स्थानीय लोगों का जीवनकाल स्थिर वैश्विक चर के समान होता है, क्योंकि उनका मूल्य कार्यक्रम के जीवन के लिए स्मृति में रहता है,<ref>{{cite web|url= http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf |title=वर्तमान सी मानक}} ​​{{छोटा|(3.61&nbsp;MB)}} ({{As of|2009|lc=on}}). In particular, see section 6.2.4 “Storage durations of objects”, page 32.</ref> लेकिन स्वचालित स्थानीय चर के साथ कार्य क्षेत्र (वैश्विक दायरा नहीं) होता है।
ग्लोबल फ़ंक्शंस में स्थिर लोकल लोगों का जीवनकाल स्थिर ग्लोबल वेरिएबल के समान होता है, क्योंकि उनका मूल्य फंक्शनक्रम के जीवन के लिए स्मृति में रहता है,<ref>{{cite web|url= http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf |title=वर्तमान सी मानक}} ​​{{छोटा|(3.61&nbsp;MB)}} ({{As of|2009|lc=on}}). In particular, see section 6.2.4 “Storage durations of objects”, page 32.</ref> परन्तु स्वचालित लोकल वेरिएबल के साथ फंक्शन क्षेत्र (ग्लोबल स्कोप नहीं) होता है।


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


== पर्ल में स्थानीय चर ==
== पर्ल में लोकल वेरिएबल ==
पर्ल डायनेमिक और लेक्सिकली-स्कोप्ड लोकल वेरिएबल्स दोनों का समर्थन करता है। कीवर्ड <code>local</code> का उपयोग स्थानीय डायनामिक-स्कोप्ड वेरिएबल्स को परिभाषित करने के लिए किया जाता है, जबकि <code>my</code> का उपयोग स्थानीय लेक्सिकली-स्कोप्ड वेरिएबल्स के लिए किया जाता है। चूंकि डायनेमिक स्कूपिंग आज कम आम है, पर्ल प्रलेखन चेतावनी देता है कि "<code>local</code>वह नहीं है जिसे ज्यादातर लोग" स्थानीय "के रूप में सोचते हैं।"<ref>[http://perldoc.perl.org/functions/local.html perldoc.perl.org: local]</ref> इसके बजाय, <code>local</code> कीवर्ड एक वैश्विक (पैकेज) चर के लिए एक अस्थायी, गतिशील रूप से दायरे वाला मान देता है, जो संलग्न ब्लॉक के अंत तक रहता है। हालांकि, वेरिएबल ब्लॉक के भीतर से बुलाए गए किसी भी फ़ंक्शन के लिए दृश्यमान है।<ref>[http://perldoc.perl.org/perlsub.html#Temporary-Values-via-local() perldoc.perl.org: perlsub: Temporary Values via <code>local()</code>]</ref> शब्दावली-दायरे वाले स्थानीय चर बनाने के लिए, इसके बजाय <code>my</code> ऑपरेटर का उपयोग करें।<ref>[http://perldoc.perl.org/perlsub.html#Private-Variables-via-my() perldoc.perl.org: perlsub: Private Variables via <code>my()</code>]</ref>
पर्ल डायनेमिक और लेक्सिकली-स्कोप्ड लोकल वेरिएबल्स दोनों का समर्थन करता है। कीवर्ड <code>local</code> का उपयोग लोकल डायनामिक-स्कोप्ड वेरिएबल्स को परिभाषित करने के लिए किया जाता है, जबकि <code>my</code> का उपयोग लोकल लेक्सिकली-स्कोप्ड वेरिएबल्स के लिए किया जाता है। चूंकि डायनेमिक स्कोपिंग आज कम आम है, पर्ल प्रलेखन चेतावनी देता है कि "<code>local</code>वह नहीं है जिसे ज्यादातर लोग" लोकल "के रूप में सोचते हैं।"<ref>[http://perldoc.perl.org/functions/local.html perldoc.perl.org: local]</ref> इसके बजाय, <code>local</code> कीवर्ड एक ग्लोबल (पैकेज) वेरिएबल के लिए एक अस्थायी, डायनेमिक रूप से स्कोप वाला मान देता है, जो संलग्न ब्लॉक के अंत तक रहता है। हालांकि, वेरिएबल ब्लॉक के भीतर से बुलाए गए किसी भी फ़ंक्शन के लिए दृश्यमान है।<ref>[http://perldoc.perl.org/perlsub.html#Temporary-Values-via-local() perldoc.perl.org: perlsub: Temporary Values via <code>local()</code>]</ref> शब्दावली-स्कोप वाले लोकल वेरिएबल बनाने के लिए, इसके बजाय <code>my</code> ऑपरेटर का उपयोग करें।<ref>[http://perldoc.perl.org/perlsub.html#Private-Variables-via-my() perldoc.perl.org: perlsub: Private Variables via <code>my()</code>]</ref>


यह समझने के लिए कि यह कैसे काम करता है, निम्नलिखित कोड पर विचार करें:<syntaxhighlight lang="perl">
यह समझने के लिए कि यह कैसे काम करता है, निम्नलिखित कोड पर विचार करें:<syntaxhighlight lang="perl">
Line 36: Line 36:
  2
  2
  1
  1
ऐसा इसलिए होता है क्योंकि वैश्विक चर $a को {{code|f()}} के अंदर एक नए अस्थायी (स्थानीय) अर्थ में संशोधित किया गया है, लेकिन {{code|f()}} के दायरे को छोड़ने पर वैश्विक मान को पुनर्स्थापित किया जाता है।
ऐसा इसलिए होता है क्योंकि ग्लोबल वेरिएबल $a को {{code|f()}} के अंदर एक नए अस्थायी (लोकल) अर्थ में संशोधित किया गया है, परन्तु {{code|f()}} के स्कोप को छोड़ने पर ग्लोबल मान को पुनर्स्थापित किया जाता है।


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


Randal L. Schwartz और टॉम फीनिक्स का तर्क है कि ऑपरेटर <code>local</code> का एक अलग नाम होना चाहिए था जैसे <code>save</code>।<ref>{{cite book|author=Randal L. Schwartz and Tom Phoenix|title=लर्निंग पर्ल तीसरा संस्करण|at=paragraph 4.7|publisher=O'REILLY|date=2001-07-01|ISBN=0-596-00132-0|url=https://archive.org/details/learningperl00schw}}</ref>
Randal L. Schwartz और टॉम फीनिक्स का तर्क है कि ऑपरेटर <code>local</code> का एक अलग नाम होना चाहिए था जैसे <code>save</code>।<ref>{{cite book|author=Randal L. Schwartz and Tom Phoenix|title=लर्निंग पर्ल तीसरा संस्करण|at=paragraph 4.7|publisher=O'REILLY|date=2001-07-01|ISBN=0-596-00132-0|url=https://archive.org/details/learningperl00schw}}</ref>




== रूबी में स्थानीय चर ==
== रूबी में लोकल वेरिएबल ==
[[रूबी (प्रोग्रामिंग भाषा)|रूबी]] एक भाषा के रूप में पर्ल से भी प्रेरित थी, लेकिन इस मामले में, संकेतन को सरल बनाया गया था: एक वैश्विक चर नाम $ चिह्न से पहले होना चाहिए, जैसे $ चर_नाम, जबकि एक <code>$variable_name</code> के पास इसके नाम के सामने कोई $ चिह्न नहीं है, जैसे कि <code>variable_name</code> (जबकि पर्ल में सभी स्केलर मानों के सामने $ होता है)। ध्यान दें कि रूबी केवल पर्ल के <code>my</code>जैसे स्टेटिकली-स्कोप्ड लोकल वेरिएबल्स के लिए बिल्ट-इन सपोर्ट प्रदान करती है, पर्ल के <code>local</code>जैसे डायनामिक-स्कोप्ड लोकल वेरिएबल्स के लिए नहीं। रुबी के लिए कम से कम एक लाइब्रेरी है जो गतिशील रूप से दायरे वाले चर प्रदान करती है।<ref>
[[रूबी (प्रोग्रामिंग भाषा)|रूबी]] एक भाषा के रूप में पर्ल से भी प्रेरित थी, परन्तु इस मामले में, संकेतन को सरल बनाया गया था: एक ग्लोबल वेरिएबल नाम $ चिह्न से पहले होना चाहिए, जैसे $ वेरिएबल_नाम, जबकि एक <code>$variable_name</code> के पास इसके नाम के सामने कोई $ चिह्न नहीं है, जैसे कि <code>variable_name</code> (जबकि पर्ल में सभी स्केलर मानों के सामने $ होता है)। ध्यान दें कि रूबी केवल पर्ल के <code>my</code>जैसे स्टेटिकली-स्कोप्ड लोकल वेरिएबल्स के लिए बिल्ट-इन सपोर्ट प्रदान करती है, पर्ल के <code>local</code>जैसे डायनामिक-स्कोप्ड लोकल वेरिएबल्स के लिए नहीं। रुबी के लिए कम से कम एक लाइब्रेरी है जो डायनेमिक रूप से स्कोप वाले वेरिएबल प्रदान करती है।<ref>
Conrad Irwin.
Conrad Irwin.
"LSpace: Dynamic scope for Ruby".
"LSpace: Dynamic scope for Ruby".
Line 53: Line 53:


== यह भी देखें ==
== यह भी देखें ==
* वैश्विक चर
* ग्लोबल वेरिएबल
* [[गैर-स्थानीय चर]]
* [[गैर-स्थानीय चर|गैर-लोकल वेरिएबल]]
==संदर्भ==
==संदर्भ==
<references />
<references />

Revision as of 19:32, 21 December 2022

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

स्कोप

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