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

From Vigyanwiki
(Created page with "{{Short description|Computer programming, a variable only usable in a portion of a program (the scope)}} कंप्यूटर विज्ञान में, एक...")
 
(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]], और शेल भाषाएँ [[बैश (यूनिक्स शेल)|बैश]], डैश, और MirBSD कॉर्न शेल ([[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>
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>. रुबी के लिए कम से कम एक पुस्तकालय है जो गतिशील रूप से दायरे वाले चर प्रदान करता है।
[[रूबी (प्रोग्रामिंग भाषा)|रूबी]] एक भाषा के रूप में पर्ल से भी प्रेरित थी, लेकिन इस मामले में, संकेतन को सरल बनाया गया था: एक वैश्विक चर नाम $ चिह्न से पहले होना चाहिए, जैसे $ चर_नाम, जबकि एक <code>$variable_name</code> के पास इसके नाम के सामने कोई $ चिह्न नहीं है, जैसे कि <code>variable_name</code> (जबकि पर्ल में सभी स्केलर मानों के सामने $ होता है)। ध्यान दें कि रूबी केवल पर्ल के <code>my</code>जैसे स्टेटिकली-स्कोप्ड लोकल वेरिएबल्स के लिए बिल्ट-इन सपोर्ट प्रदान करती है, पर्ल के <code>local</code>जैसे डायनामिक-स्कोप्ड लोकल वेरिएबल्स के लिए नहीं। रुबी के लिए कम से कम एक लाइब्रेरी है जो गतिशील रूप से दायरे वाले चर प्रदान करती है।<ref>
<ref>
Conrad Irwin.
Conrad Irwin.
"LSpace: Dynamic scope for Ruby".
"LSpace: Dynamic scope for Ruby".
Line 54: Line 51:
Retrieved 2013-10-16.
Retrieved 2013-10-16.
</ref>
</ref>


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

Revision as of 18:38, 20 December 2022

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

स्कोप

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