स्थानीय चर: Difference between revisions
(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]]-व्युत्पन्न भाषाएँ निजी चर, फ़ंक्शंस, स्थिरांक और उनके भीतर छिपे हुए प्रकारों के साथ, या तो नेस्टेड ब्लॉक या [[नेस्टेड समारोह|नेस्टेड फ़ंक्शंस]] द्वारा, किसी भी संख्या में नेस्टेड स्तर की दृश्यता की अनुमति देती हैं। स्थानीय चर [[प्रक्रियात्मक प्रोग्रामिंग]] के लिए मौलिक हैं, और अधिक आम तौर पर [[मॉड्यूलर प्रोग्रामिंग]]: स्थानीय चर के चर का उपयोग साइड-इफेक्ट्स के साथ मुद्दों से बचने के लिए किया जाता है जो वैश्विक चर के साथ हो सकते हैं। | ||
== स्कोप == | == स्कोप == | ||
स्थानीय | स्थानीय चर में एक शाब्दिक या गतिशील दायरा हो सकता है, हालांकि शाब्दिक (स्थैतिक) दायरा कहीं अधिक सामान्य है। लेक्सिकल स्कोपिंग (या लेक्सिकल स्कोप; जिसे स्टैटिक स्कोपिंग या स्टैटिक स्कोप भी कहा जाता है) में, यदि एक वैरिएबल नाम का स्कोप एक निश्चित ब्लॉक है, तो इसका स्कोप ब्लॉक डेफिनिशन का प्रोग्राम टेक्स्ट है: उस ब्लॉक के टेक्स्ट के भीतर, वेरिएबल नाम मौजूद है, और वेरिएबल के मान के लिए बाध्य है, लेकिन उस ब्लॉक के टेक्स्ट के बाहर, वैरिएबल नाम मौजूद नहीं है। इसके विपरीत, डायनेमिक स्कोपिंग (या डायनेमिक स्कोप) में, यदि एक चर नाम का दायरा एक निश्चित ब्लॉक है, तो इसका दायरा वह ब्लॉक है और सभी कार्यों को उस ब्लॉक द्वारा सकर्मक रूप से बुलाया जाता है (सिवाय इसके कि जब किसी अन्य घोषणा द्वारा फिर से ओवरराइड किया गया हो); ब्लॉक समाप्त होने के बाद, वेरिएबल नाम मौजूद नहीं है। कुछ भाषाएँ, जैसे [[पर्ल]] और [[सामान्य लिस्प|कॉमन लिस्प]], प्रोग्रामर को किसी चर को परिभाषित या पुनर्परिभाषित करते समय स्थैतिक या गतिशील स्कोपिंग चुनने की अनुमति देती हैं। डायनेमिक स्कूपिंग का उपयोग करने वाली भाषाओं के उदाहरणों में शामिल हैं [[लोगो (प्रोग्रामिंग भाषा)|लोगो]], [[Emacs lisp]], और शेल भाषाएँ [[बैश (यूनिक्स शेल)|बैश]], डैश, और MirBSD कॉर्न शेल ([[mksh]]) की "स्थानीय" घोषणा। अधिकांश अन्य भाषाएं लेक्सिकली स्कोप्ड लोकल वेरिएबल्स प्रदान करती हैं। | ||
अधिकांश भाषाओं में, स्थानीय चर सीधे [[कॉल स्टैक]] पर संग्रहीत | अधिकांश भाषाओं में, स्थानीय चर [[स्वचालित चर]] होते हैं जो सीधे [[कॉल स्टैक]] पर संग्रहीत होते हैं। इसका मतलब यह है कि जब एक पुनरावर्ती फ़ंक्शन खुद को कॉल करता है, तो फ़ंक्शन के प्रत्येक उदाहरण में स्थानीय चर को अलग-अलग पते दिए जाते हैं। इसलिए इस दायरे के चर घोषित किए जा सकते हैं, लिखे जा सकते हैं और पढ़े जा सकते हैं, बिना किसी साइड-इफेक्ट्स के उस ब्लॉक के बाहर के कार्यों के जोखिम के बिना जिसमें वे घोषित किए गए हैं। | ||
प्रोग्रामिंग लैंग्वेज जो वैल्यू सिमेंटिक्स द्वारा कॉल को नियोजित करती हैं, एक तथाकथित सबरूटीन प्रदान करती हैं, | प्रोग्रामिंग लैंग्वेज जो वैल्यू सिमेंटिक्स द्वारा कॉल को नियोजित करती हैं, एक तथाकथित सबरूटीन प्रदान करती हैं, जो इसे पास किए गए तर्कों की अपनी स्थानीय प्रति के साथ प्रदान करती है। अधिकांश भाषाओं में, इन स्थानीय मापदंडों को सबरूटीन के भीतर अन्य स्थानीय चर के समान ही माना जाता है। इसके विपरीत, [[संदर्भ द्वारा कॉल करें|कॉल बाय रेफरेंस]] और [[नाम से बुलाओ|कॉल बाय नेम]] सिमेंटिक्स पैरामीटर को तर्कों के रूप में पास किए गए मानों के उपनाम के रूप में कार्य करने की अनुमति देता है, जिससे सबरूटीन को अपने दायरे से बाहर चर को संशोधित करने की अनुमति मिलती है। | ||
== स्थिर स्थानीय चर == | == स्थिर स्थानीय चर == | ||
एक विशेष प्रकार का स्थानीय चर, जिसे | एक विशेष प्रकार का स्थानीय चर, जिसे स्थिर स्थानीय कहा जाता है, कई मुख्यधारा की भाषाओं में उपलब्ध है ([[सी (प्रोग्रामिंग भाषा)|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 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 MB)}} ({{As of|2009|lc=on}}). In particular, see section 6.2.4 “Storage durations of objects”, page 32.</ref> लेकिन स्वचालित स्थानीय चर के साथ कार्य क्षेत्र (वैश्विक दायरा नहीं) होता है। | ||
यह | यह स्थिर कीवर्ड के अन्य उपयोगों से अलग है, जिसके विभिन्न भाषाओं में कई अलग-अलग अर्थ हैं।<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> | |||
यह समझने के लिए कि यह कैसे काम करता है, निम्नलिखित कोड पर विचार करें:<syntaxhighlight lang="perl"> | |||
यह समझने के लिए कि यह कैसे काम करता है, निम्नलिखित कोड पर विचार करें: | $a = 1; | ||
< | sub f() { | ||
$ | local $a; | ||
$a = 2; | |||
g(); | |||
$ | |||
} | } | ||
sub g() { | |||
print "$a\n"; | |||
} | } | ||
g(); | |||
f(); | |||
g(); | |||
</ | </syntaxhighlight>यह आउटपुट करेगा: | ||
यह आउटपुट करेगा: | |||
1 | 1 | ||
2 | 2 | ||
1 | 1 | ||
ऐसा इसलिए होता है क्योंकि वैश्विक चर $a को {{code|f()}} के अंदर एक नए अस्थायी (स्थानीय) अर्थ में संशोधित किया गया है, लेकिन {{code|f()}} के दायरे को छोड़ने पर वैश्विक मान को पुनर्स्थापित किया जाता है। | |||
<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>$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]
यह भी देखें
- वैश्विक चर
- गैर-स्थानीय चर
संदर्भ
- ↑ "वर्तमान सी मानक" (PDF). Template:छोटा (as of 2009[update]). In particular, see section 6.2.4 “Storage durations of objects”, page 32.
- ↑ perldoc.perl.org: local
- ↑ perldoc.perl.org: perlsub: Temporary Values via
local()
- ↑ perldoc.perl.org: perlsub: Private Variables via
my()
- ↑ Randal L. Schwartz and Tom Phoenix (2001-07-01). लर्निंग पर्ल तीसरा संस्करण. O'REILLY. paragraph 4.7. ISBN 0-596-00132-0.
- ↑ Conrad Irwin. "LSpace: Dynamic scope for Ruby". December 2012 http://cirw.in/blog/lspace Retrieved 2013-10-16.