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

From Vigyanwiki
(Created page with "{{Short description|Computer programming, a variable only usable in a portion of a program (the scope)}} कंप्यूटर विज्ञान में, एक...")
 
No edit summary
 
(6 intermediate revisions by 3 users not shown)
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]]) की "लोकल" विज्ञप्ति। अधिकांश अन्य भाषाएं लेक्सिकली स्कोप्ड लोकल वेरिएबल्स प्रदान करती हैं।


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


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


== स्थिर स्थानीय चर ==
== स्टैटिक लोकल वेरिएबल्स ==
एक विशेष प्रकार का स्थानीय चर, जिसे स्थैतिक स्थानीय कहा जाता है, कई मुख्यधारा भाषाओं ([[सी (प्रोग्रामिंग भाषा)]]/[[सी ++]], [[मूल दृश्य]], और विज़ुअल बेसिक .NET|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">
यह समझने के लिए कि यह कैसे काम करता है, निम्नलिखित कोड पर विचार करें:
$a = 1;
<वाक्यविन्यास प्रकाश लैंग = पर्ल>
sub f() {
$ = 1;
     local $a;
उप एफ () {
     $a = 2;
     स्थानीय $ ;
     g();
     $ = 2;
     जी();
}
}
उप जी () {
sub g() {
     प्रिंट $a\n ;
     print "$a\n";
}
}
जी();
g();
एफ();
f();
जी();
g();
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>यह आउटपुट प्रदान करेगा:
 
यह आउटपुट करेगा:
  1
  1
  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>my</code> इस मामले में बजाय <code>local</code> उस मामले में तीन बार 1 प्रिंट किया होगा <code>$a</code> चर फ़ंक्शन के स्थिर दायरे तक सीमित होगा {{code|f()}} और द्वारा नहीं देखा गया {{code|g()}}.<br /> रैंडल एल. श्वार्ट्ज और टॉम फीनिक्स का तर्क है कि ऑपरेटर <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".
Line 54: Line 49:
Retrieved 2013-10-16.
Retrieved 2013-10-16.
</ref>
</ref>


== यह भी देखें ==
== यह भी देखें ==
* वैश्विक चर
* ग्लोबल वेरिएबल
* [[गैर-स्थानीय चर]]
* [[गैर-स्थानीय चर|गैर-लोकल वेरिएबल]]
 
 
==इस पेज में लापता आंतरिक लिंक की सूची==
 
*दुष्प्रभाव (कंप्यूटर विज्ञान)
*सार्वत्रिक चर
*मूल्य से कॉल करें
*समारोह तर्क
*स्मृति पता
*पानी का छींटा (खोल)
*रिकर्सन (कंप्यूटर विज्ञान)
*स्थैतिक चर
*स्थैतिक स्मृति आवंटन
*स्थैतिक वैश्विक चर
*समारोह का दायरा
==संदर्भ==
==संदर्भ==
<references />
<references />


{{DEFAULTSORT:Local Variable}}[[Category: चर (कंप्यूटर विज्ञान)]]
{{DEFAULTSORT:Local Variable}}
 


[[Category: Machine Translated Page]]
[[Category:All articles containing potentially dated statements]]
[[Category:Created On 14/12/2022]]
[[Category:Articles containing potentially dated statements from 2009]]
[[Category:Articles with invalid date parameter in template]]
[[Category:Articles with short description|Local Variable]]
[[Category:CS1 français-language sources (fr)]]
[[Category:CS1 maint]]
[[Category:CS1 Ελληνικά-language sources (el)]]
[[Category:Citation Style 1 templates|W]]
[[Category:Collapse templates]]
[[Category:Created On 14/12/2022|Local Variable]]
[[Category:Machine Translated Page|Local Variable]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description|Local Variable]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates based on the Citation/CS1 Lua module]]
[[Category:Templates generating COinS|Cite web]]
[[Category:Templates generating microformats]]
[[Category:Templates that are not mobile friendly]]
[[Category:Templates used by AutoWikiBrowser|Cite web]]
[[Category:Templates using TemplateData]]
[[Category:Wikipedia fully protected templates|Cite web]]
[[Category:Wikipedia metatemplates]]
[[Category:चर (कंप्यूटर विज्ञान)|Local Variable]]

Latest revision as of 08:30, 9 January 2023

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

स्कोप

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