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

From Vigyanwiki
(minor changes)
(Work done)
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|इमैक्स लिस्प]], और शैल भाषाएँ [[बैश (यूनिक्स शेल)|बैश]], डैश, और मिरबीएसडी कॉर्न शेल ([[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 32: Line 32:
f();
f();
g();
g();
</syntaxhighlight>यह आउटपुट करेगा:
</syntaxhighlight>यह आउटपुट प्रदान करेगा:
  1
  1
  2
  2
Line 38: Line 38:
ऐसा इसलिए होता है क्योंकि ग्लोबल वेरिएबल $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>
 


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

Revision as of 23:49, 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() द्वारा नहीं देखा जाएगा।

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