स्थिरांक (कंप्यूटर प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|Value that is not intended to be changed during program execution}} [[कंप्यूटर प्रोग्रामिंग]] में, ए...")
 
No edit summary
Line 1: Line 1:
{{Short description|Value that is not intended to be changed during program execution}}
{{Short description|Value that is not intended to be changed during program execution}}


[[[[कंप्यूटर प्रोग्राम]]िंग]] में, एक स्थिरांक एक मान (कंप्यूटर विज्ञान) है जिसे सामान्य [[निष्पादन (कंप्यूटिंग)]] के दौरान कंप्यूटर प्रोग्राम द्वारा परिवर्तित नहीं किया जाना चाहिए, अर्थात, मान 'स्थिर' है।{{efn|In some cases the expectation of constancy can be circumvented, e.g. using [[self-modifying code]] or by overwriting the [[memory location]] where the value is stored.}} जब एक पहचानकर्ता (कंप्यूटर भाषाओं) से जुड़ा होता है, तो एक स्थिरांक को नाम दिया जाना कहा जाता है, हालांकि स्थिरांक और नामित स्थिरांक अक्सर एक दूसरे के स्थान पर उपयोग किए जाते हैं। यह एक [[ चर (कंप्यूटर विज्ञान) ]] के साथ विपरीत है, जो एक मान के साथ एक पहचानकर्ता है जिसे सामान्य निष्पादन के दौरान बदला जा सकता है, अर्थात, मान परिवर्तनशील है।
[[कंप्यूटर प्रोग्राम|कंप्यूटर प्रोग्रामिंग]] में, '''स्थिरांक''' एक मान है जिसे सामान्य [[निष्पादन (कंप्यूटिंग)|निष्पादन]] के दौरान कार्यक्रम द्वारा परिवर्तित नहीं किया जाना चाहिए, अर्थात, मान स्थिर है।{{efn|In some cases the expectation of constancy can be circumvented, e.g. using [[self-modifying code]] or by overwriting the [[memory location]] where the value is stored.}} जब एक पहचानकर्ता के साथ जुड़ा होता है, तो एक स्थिरांक को "नामित" कहा जाता है, हालांकि "स्थिर" और "नामांकित स्थिरांक" शब्द अक्सर परस्पर विनिमय के लिए उपयोग किए जाते हैं। यह एक चर के साथ विपरीत है, जो एक मान के साथ पहचानकर्ता है जिसे सामान्य निष्पादन के दौरान बदला जा सकता है, अर्थात, मान एक [[ चर (कंप्यूटर विज्ञान) |चर]] (''वेरिएबल'') है।


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


एक स्थिरांक की सामान्य धारणा के विभिन्न विशिष्ट अहसास हैं, जिनमें सूक्ष्म भेद होते हैं जिन्हें अक्सर अनदेखा कर दिया जाता है। सबसे महत्वपूर्ण हैं: संकलन-समय (स्थैतिक रूप से मूल्यवान) स्थिरांक, रन-टाइम (गतिशील रूप से मूल्यवान) स्थिरांक, [[अपरिवर्तनीय वस्तु]]एँ और स्थिर प्रकार (स्थिरांक)
स्थिरांक की सामान्य धारणा के विभिन्न विशिष्ट अहसास हैं, सूक्ष्म भेदों के साथ जिन्हें अक्सर अनदेखा कर दिया जाता है। सबसे महत्वपूर्ण संकलन-समय (सांख्यिकीय मूल्यवान) स्थिरांक, रन-टाइम (गतिशील रूप से मूल्यवान) स्थिरांक, अपरिवर्तनीय वस्तुएं और स्थिरांक प्रकार (स्थिरांक) हैं।


संकलन-समय स्थिरांक के विशिष्ट उदाहरणों में गणितीय स्थिरांक, मानकों से मान (यहां [[अधिकतम संचरण इकाई]]), या आंतरिक कॉन्फ़िगरेशन मान (यहां प्रति पंक्ति वर्ण) शामिल हैं, जैसे कि ये [[सी (प्रोग्रामिंग भाषा)]] उदाहरण:
संकलन-समय स्थिरांक के विशिष्ट उदाहरणों में गणितीय स्थिरांक, मानकों से मान (यहाँ अधिकतम संचरण इकाई), या आंतरिक विन्यास मान (यहाँ प्रति पंक्ति वर्ण) शामिल हैं, जैसे कि ये C उदाहरण:<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
const float PI = 3.1415927;  // maximal single float precision
const float PI = 3.1415927;  // maximal single float precision
const unsigned int MTU = 1500;  // Ethernet v2, RFC 894
const unsigned int MTU = 1500;  // Ethernet v2, RFC 894
const unsigned int COLUMNS = 80;
const unsigned int COLUMNS = 80;
</syntaxhighlight>
</syntaxhighlight>
रन-टाइम स्थिरांक के विशिष्ट उदाहरण किसी फ़ंक्शन के इनपुट के आधार पर गणना किए गए मान हैं, जैसे कि यह [[C++]] उदाहरण:<!-- passing by value for simplicity -->
रन-टाइम स्थिरांक के विशिष्ट उदाहरण किसी फ़ंक्शन के इनपुट के आधार पर गणना किए गए मान हैं, जैसे कि यह [[C++]] उदाहरण:<syntaxhighlight lang=cpp>
 
<syntaxhighlight lang=cpp>
void f(std::string s) {
void f(std::string s) {
   const size_t l = s.length();
   const size_t l = s.length();
Line 22: Line 18:
}
}
</syntaxhighlight>
</syntaxhighlight>
== प्रयोग ==
कुछ [[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाएं]] स्थिरांक और चर प्रतीकों के बीच एक स्पष्ट वाक्य-विन्यास भेद करती हैं, उदाहरण के लिए एक स्थिरांक को [[ असाइनमेंट (कंप्यूटर विज्ञान) |असाइनमेंट]] को सिंटैक्स त्रुटि माना जाता है, जबकि अन्य भाषाओं में उन्हें वाक्यगत रूप से समान माना जाता है (दोनों केवल एक पहचानकर्ता), और उपचार में अंतर सिमेंटिक है (पहचानकर्ता को असाइनमेंट वाक्य रचनात्मक रूप से मान्य है, लेकिन यदि पहचानकर्ता स्थिरांक है तो यह शब्दार्थ से अमान्य है)।


 
एक स्थिर मान को एक बार परिभाषित किया जाता है और पूरे कार्यक्रम में इसे कई बार संदर्भित किया जा सकता है। एक ही मान को कई बार निर्दिष्ट करने के बजाय एक स्थिरांक का उपयोग करना कोड रखरखाव को आसान बना सकता है (जैसा कि स्वयं को दोहराना नहीं है) और एक मूल्य के लिए एक सार्थक नाम की आपूर्ति करके स्व-दस्तावेजीकरण किया जा सकता है, उदाहरण के लिए, {{code|PI}}3.1415926
== प्रयोग करें ==
कुछ [[प्रोग्रामिंग भाषा]]एं निरंतर और चर प्रतीकों के बीच एक स्पष्ट वाक्य-विन्यास भेद करती हैं, उदाहरण के लिए [[ असाइनमेंट (कंप्यूटर विज्ञान) ]] को एक सिंटैक्स त्रुटि होने के लिए एक स्थिरांक पर विचार करना, जबकि अन्य भाषाओं में उन्हें वाक्य-विन्यास के समान माना जाता है (दोनों केवल एक पहचानकर्ता), और उपचार में अंतर सिमेंटिक है (पहचानकर्ता को असाइनमेंट वाक्य रचनात्मक रूप से मान्य है, लेकिन यदि पहचानकर्ता स्थिर है तो यह शब्दार्थिक रूप से अमान्य है)।
 
एक स्थिर मूल्य एक बार परिभाषित किया गया है और पूरे कार्यक्रम में कई बार संदर्भित किया जा सकता है। एक ही मूल्य को कई बार निर्दिष्ट करने के बजाय एक स्थिरांक का उपयोग करना कोड रखरखाव को आसान बना सकता है (जैसा कि स्वयं को दोहराना नहीं है) और एक मूल्य के लिए एक सार्थक नाम की आपूर्ति करके स्व-दस्तावेज़ीकरण हो सकता है, उदाहरण के लिए, {{code|PI}} 3.1415926 के बजाय।


== शाब्दिक और मैक्रोज़ के साथ तुलना ==
== शाब्दिक और मैक्रोज़ के साथ तुलना ==
डेटा मान को व्यक्त करने के कई मुख्य तरीके हैं जो प्रोग्राम निष्पादन के दौरान नहीं बदलते हैं जो विभिन्न प्रकार की प्रोग्रामिंग भाषाओं के अनुरूप हैं। एक बहुत ही बुनियादी तरीका प्रोग्राम कोड में केवल एक [[शाब्दिक (कंप्यूटर विज्ञान)]] संख्या, वर्ण या स्ट्रिंग लिखना है, जो सी, सी ++ और इसी तरह की भाषाओं में सीधा है।
डेटा मान को व्यक्त करने के कई मुख्य तरीके हैं जो प्रोग्राम के निष्पादन के दौरान नहीं बदलते हैं और जो विभिन्न प्रकार की प्रोग्रामिंग भाषाओं में सुसंगत है। एक बहुत ही बुनियादी तरीका प्रोग्राम कोड में केवल [[शाब्दिक (कंप्यूटर विज्ञान)|शाब्दिक]] संख्या, वर्ण या स्ट्रिंग लिखना है, जो C, C ++ और समान भाषाओं में सीधा है।


असेंबली भाषा में, अधिकांश माइक्रोप्रोसेसरों पर उपलब्ध तत्काल मोड निर्देशों का उपयोग करके शाब्दिक संख्याएं और वर्ण किए जाते हैं। तत्काल नाम [[निर्देश (कंप्यूटर विज्ञान)]] से तत्काल उपलब्ध होने वाले मूल्यों से आता है, क्योंकि स्मृति पते को देखकर उन्हें अप्रत्यक्ष रूप से लोड करने का विरोध किया जाता है।<ref name='ibmpowerpc'>Ex. [http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.aixassem/doc/alangref/addic.htm IBM Systems Information]. Instruction Set - Assembler Language Reference for PowerPC.</ref> दूसरी ओर, माइक्रोप्रोसेसर की शब्द लंबाई से अधिक मूल्य, जैसे कि तार और सरणियाँ, अप्रत्यक्ष रूप से संभाले जाते हैं और असेंबलर आमतौर पर एक प्रोग्राम में ऐसी डेटा तालिकाओं को एम्बेड करने के लिए एक डेटा छद्म-ऑप प्रदान करते हैं।
असेंबली भाषा में, अधिकांश माइक्रोप्रोसेसरों पर उपलब्ध तत्काल मोड निर्देशों का उपयोग करके शाब्दिक संख्याएं और वर्ण किए जाते हैं। तत्काल नाम [[निर्देश (कंप्यूटर विज्ञान)]] से तत्काल उपलब्ध होने वाले मूल्यों से आता है, क्योंकि स्मृति पते को देखकर उन्हें अप्रत्यक्ष रूप से लोड करने का विरोध किया जाता है।<ref name='ibmpowerpc'>Ex. [http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.aixassem/doc/alangref/addic.htm IBM Systems Information]. Instruction Set - Assembler Language Reference for PowerPC.</ref> दूसरी ओर, माइक्रोप्रोसेसर की शब्द लंबाई से अधिक मूल्य, जैसे कि तार और सरणियाँ, अप्रत्यक्ष रूप से संभाले जाते हैं और असेंबलर आमतौर पर एक प्रोग्राम में ऐसी डेटा तालिकाओं को एम्बेड करने के लिए एक डेटा छद्म-ऑप प्रदान करते हैं।


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


एक तीसरा तरीका एक चर को स्थिर होने के रूप में घोषित और परिभाषित करना है। एक कीवर्ड क्वालीफायर के साथ एक [[वैश्विक चर]] या स्थिर चर घोषित किया जा सकता है (या असेंबली में परिभाषित प्रतीक){{Cpp|const}}, {{code|lang=ada|constant}}, या {{Java|final}}, जिसका अर्थ है कि इसका मान संकलन समय पर सेट किया जाएगा और रनटाइम पर परिवर्तनशील नहीं होना चाहिए। कंपाइलर्स आम तौर पर कोड के साथ ऑब्जेक्ट फ़ाइल के टेक्स्ट सेक्शन में स्थिर स्थिरांक डालते हैं, डेटा सेक्शन के विपरीत जहां गैर-कॉन्स्ट आरंभिक डेटा रखा जाता है। कुछ संकलक विशेष रूप से स्थिरांक के लिए समर्पित एक खंड का उत्पादन कर सकते हैं। त्रुटिपूर्ण पॉइंटर्स द्वारा ऐसे स्थिरांकों के ओवरराइटिंग को रोकने के लिए इस क्षेत्र में मेमोरी सुरक्षा लागू की जा सकती है।
एक तीसरा तरीका एक चर को "स्थिरांक" घोषित और परिभाषित करना है। एक [[वैश्विक चर]] या स्थैतिक चर घोषित किया जा सकता है (या असेंबली में परिभाषित प्रतीक) जैसे कि {{Cpp|const}}{{code|lang=ada|constant}}स्थिर, या {{Java|final}}जैसे कीवर्ड क्वालीफायर, जिसका अर्थ है कि इसका मान संकलन समय पर सेट किया जाएगा और रनटाइम पर परिवर्तनशील नहीं होना चाहिए। कंपाइलर्स आम तौर पर कोड के साथ ऑब्जेक्ट फ़ाइल के टेक्स्ट सेक्शन में स्थिर स्थिरांक डालते हैं, डेटा सेक्शन के विपरीत जहां गैर-कॉन्स्ट प्रारंभिक डेटा रखा जाता है। कुछ कंपाइलर विशेष रूप से स्थिरांक को समर्पित एक खंड का उत्पादन कर सकते हैं। त्रुटिपूर्ण संकेतकों द्वारा ऐसे स्थिरांकों के ओवरराइटिंग को रोकने के लिए इस क्षेत्र में स्मृति सुरक्षा लागू की जा सकती है।


ये स्थिरांक शाब्दिक से कई मायनों में भिन्न होते हैं। कंपाइलर आम तौर पर मैक्रो के साथ पूरे निष्पादन योग्य में फैलाने के बजाय प्रतीक द्वारा पहचाने गए एकल स्मृति स्थान में स्थिरांक रखते हैं। हालांकि यह तत्काल मोड के गति लाभ को रोकता है, स्मृति दक्षता में लाभ हैं, और डीबगर्स रनटाइम पर इन स्थिरांकों के साथ काम कर सकते हैं। इसके अलावा मैक्रोज़ को सी और सी ++ में विरोधाभासी शीर्षलेख फ़ाइलों द्वारा गलती से फिर से परिभाषित किया जा सकता है, जबकि विरोधाभासी स्थिरांक संकलन समय पर पाए जाते हैं।
ये स्थिरांक कई मायनों में शाब्दिक से भिन्न होते हैं। कंपाइलर्स आम तौर पर मैक्रो के साथ निष्पादन योग्य भर में फैलाने के बजाय प्रतीक द्वारा पहचाने गए एकल स्मृति स्थान में निरंतर स्थान रखते हैं। हालांकि यह तत्काल मोड के गति लाभ को रोकता है, स्मृति दक्षता में लाभ हैं, और डीबगर इन स्थिरांकों के साथ रनटाइम पर काम कर सकते हैं। इसके अलावा मैक्रोज़ को सी और C ++ में विरोधाभासी शीर्षलेख फ़ाइलों द्वारा आकस्मिक रूप से फिर से परिभाषित किया जा सकता है, लेकिन विरोधाभासी स्थिरांक संकलन समय पर पाए जाते हैं।


भाषा के आधार पर, स्थिरांक अनटाइप्ड या टाइप किए जा सकते हैं। सी और सी ++ में, मैक्रोज़ पूर्व प्रदान करते हैं, जबकि {{Cpp|const}} उत्तरार्द्ध प्रदान करता है:
भाषा के आधार पर, स्थिरांक अलिखित या टाइप किए जा सकते हैं। C और C ++ में, मैक्रोज़ पूर्व प्रदान करते हैं, जबकि {{Cpp|const}} बाद वाले को प्रदान करता है:


<syntaxhighlight lang=C>
<syntaxhighlight lang=C>
Line 47: Line 41:
const float pi2 = 3.1415926535;
const float pi2 = 3.1415926535;
</syntaxhighlight>
</syntaxhighlight>
एडा में, सार्वभौमिक संख्यात्मक प्रकार हैं जिनका उपयोग वांछित होने पर किया जा सकता है:
जबकि एडा में, सार्वभौमिक संख्यात्मक प्रकार होते हैं जिनका उपयोग वांछित होने पर किया जा सकता है:


<syntaxhighlight lang=Ada>
<syntaxhighlight lang=Ada>
Line 54: Line 48:
pi2 : constant float := 3.1415926535;
pi2 : constant float := 3.1415926535;
</syntaxhighlight>
</syntaxhighlight>
अनटाइप्ड वेरिएंट को प्रत्येक उपयोग पर उपयुक्त प्रकार में परिवर्तित किया जा रहा है।<ref>{{cite book | title=एडा के साथ सॉफ्टवेयर इंजीनियरिंग| last=Booch | first=Grady | authorlink=Grady Booch | publisher=[[Benjamin Cummings]] | year=1983 | isbn=0-8053-0600-5 | pages=[https://archive.org/details/softwareengineer00booc/page/116 116–117] | url-access=registration | url=https://archive.org/details/softwareengineer00booc/page/116 }}</ref>
अप्रकाशित संस्करण को प्रत्येक उपयोग पर उपयुक्त प्रकार में स्पष्ट रूप से परिवर्तित किया जा रहा है।<ref>{{cite book | title=एडा के साथ सॉफ्टवेयर इंजीनियरिंग| last=Booch | first=Grady | authorlink=Grady Booch | publisher=[[Benjamin Cummings]] | year=1983 | isbn=0-8053-0600-5 | pages=[https://archive.org/details/softwareengineer00booc/page/116 116–117] | url-access=registration | url=https://archive.org/details/softwareengineer00booc/page/116 }}</ref>
 
 
== गतिशील रूप से मूल्यवान स्थिरांक ==
== गतिशील रूप से मूल्यवान स्थिरांक ==
ऊपर वर्णित स्थैतिक स्थिरांक के अलावा, कई प्रक्रियात्मक भाषाएं जैसे कि एडा और सी ++ वैश्विक वैरिएबल की ओर निरंतरता की अवधारणा को विस्तारित करती हैं जो प्रारंभिक समय पर बनाई जाती हैं, स्थानीय चर जो स्वचालित रूप से स्टैक पर या रजिस्टरों में रनटाइम पर बनाए जाते हैं, गतिशील रूप से आवंटित मेमोरी के लिए सूचक द्वारा और फ़ंक्शन हेडर में पैरामीटर सूचियों तक पहुँचा जाता है।
ऊपर वर्णित स्थैतिक स्थिरांक के अलावा, कई प्रक्रियात्मक भाषाएँ जैसे कि एडा और C++ वैश्विक चरों की ओर निरंतरता की अवधारणा का विस्तार करती हैं जो आरंभिक समय पर बनाए जाते हैं, स्थानीय चर जो स्टैक पर या रजिस्टरों में स्वचालित रूप से रनटाइम पर बनाए जाते हैं, डायनेमिक रूप से आबंटित मेमोरी जिसे पॉइंटर द्वारा एक्सेस किया जाता है, और फ़ंक्शन हेडर में पैरामीटर सूची में।
 
गतिशील रूप से मूल्यवान स्थिरांक एक चर को स्मृति के एक विशिष्ट क्षेत्र में रहने के रूप में निर्दिष्ट नहीं करते हैं, न ही संकलन समय पर मान निर्धारित किए जाते हैं। सी ++ कोड में जैसे


<syntaxhighlight lang=Cpp>
गतिशील रूप से मूल्यवान स्थिरांक एक चर को स्मृति के एक विशिष्ट क्षेत्र में रहने के रूप में नामित नहीं करते हैं, न ही संकलन समय पर मान निर्धारित किए जाते हैं। C++ कोड जैसे<syntaxhighlight lang=Cpp>
float func(const float ANYTHING) {
float func(const float ANYTHING) {
     const float XYZ = someGlobalVariable*someOtherFunction(ANYTHING);
     const float XYZ = someGlobalVariable*someOtherFunction(ANYTHING);
Line 68: Line 58:
}
}
</syntaxhighlight>
</syntaxhighlight>
अभिव्यक्ति है कि स्थिरांक को आरंभीकृत किया जाता है, वे स्वयं स्थिर नहीं होते हैं। कार्यक्रम की वैधता या शब्दार्थ शुद्धता के लिए यहाँ निरंतरता का उपयोग आवश्यक नहीं है, लेकिन इसके तीन फायदे हैं:
अभिव्यक्ति है कि स्थिरांक को आरंभीकृत किया जाता है, वे स्वयं स्थिर नहीं होते हैं। कार्यक्रम की वैधता या शब्दार्थ शुद्धता के लिए यहाँ स्थिरांकता का उपयोग आवश्यक नहीं है, लेकिन इसके तीन फायदे हैं:
# पाठक को यह स्पष्ट है कि एक बार सेट हो जाने के बाद वस्तु को और संशोधित नहीं किया जाएगा
# पाठक को यह स्पष्ट है कि एक बार सेट हो जाने के बाद वस्तु को और संशोधित नहीं किया जाएगा
# ऑब्जेक्ट के मूल्य को बदलने का प्रयास (बाद के प्रोग्रामर जो प्रोग्राम लॉजिक को पूरी तरह से नहीं समझते हैं) को कंपाइलर द्वारा अस्वीकार कर दिया जाएगा
# ऑब्जेक्ट के मूल्य को बदलने का प्रयास (बाद के प्रोग्रामर जो प्रोग्राम लॉजिक को पूरी तरह से नहीं समझते हैं) को कंपाइलर द्वारा अस्वीकार कर दिया जाएगा
Line 74: Line 64:
गतिशील रूप से मूल्यवान स्थिरांक [[ALGOL 68]] के साथ एक भाषा सुविधा के रूप में उत्पन्न हुए।<ref name=dvc/>एडीए और सी ++ कोड के अध्ययन से पता चला है कि गतिशील रूप से मूल्यवान स्थिरांक आमतौर पर 1% या उससे कम वस्तुओं के लिए उपयोग किए जाते हैं, जब उनका अधिक उपयोग किया जा सकता है, क्योंकि कुछ 40-50% स्थानीय, गैर-वर्ग वस्तुएं वास्तव में एक बार अपरिवर्तनीय होती हैं। बनाया था।<ref name=dvc/><ref name=ada>{{cite conference | title=Programming Practices: Analysis of Ada Source Developed for the Air Force, Army, and Navy | last=Perkins | first=J. A. | conference=Proceedings TRI-Ada '89 | pages=342–354 | doi=10.1145/74261.74287}}</ref> दूसरी ओर, इस तरह के अपरिवर्तनीय चर [[कार्यात्मक प्रोग्रामिंग]] में डिफ़ॉल्ट होते हैं क्योंकि वे बिना किसी दुष्प्रभाव (जैसे, पुनरावर्तन) के साथ प्रोग्रामिंग शैलियों का पक्ष लेते हैं या अधिकांश घोषणाओं को डिफ़ॉल्ट रूप से अपरिवर्तनीय बनाते हैं, जैसे [[एमएल (प्रोग्रामिंग भाषा)]]। [[विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग]] भाषाएं साइड-इफेक्ट्स को पूरी तरह से मना करती हैं।
गतिशील रूप से मूल्यवान स्थिरांक [[ALGOL 68]] के साथ एक भाषा सुविधा के रूप में उत्पन्न हुए।<ref name=dvc/>एडीए और सी ++ कोड के अध्ययन से पता चला है कि गतिशील रूप से मूल्यवान स्थिरांक आमतौर पर 1% या उससे कम वस्तुओं के लिए उपयोग किए जाते हैं, जब उनका अधिक उपयोग किया जा सकता है, क्योंकि कुछ 40-50% स्थानीय, गैर-वर्ग वस्तुएं वास्तव में एक बार अपरिवर्तनीय होती हैं। बनाया था।<ref name=dvc/><ref name=ada>{{cite conference | title=Programming Practices: Analysis of Ada Source Developed for the Air Force, Army, and Navy | last=Perkins | first=J. A. | conference=Proceedings TRI-Ada '89 | pages=342–354 | doi=10.1145/74261.74287}}</ref> दूसरी ओर, इस तरह के अपरिवर्तनीय चर [[कार्यात्मक प्रोग्रामिंग]] में डिफ़ॉल्ट होते हैं क्योंकि वे बिना किसी दुष्प्रभाव (जैसे, पुनरावर्तन) के साथ प्रोग्रामिंग शैलियों का पक्ष लेते हैं या अधिकांश घोषणाओं को डिफ़ॉल्ट रूप से अपरिवर्तनीय बनाते हैं, जैसे [[एमएल (प्रोग्रामिंग भाषा)]]। [[विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग]] भाषाएं साइड-इफेक्ट्स को पूरी तरह से मना करती हैं।


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


== लगातार फ़ंक्शन पैरामीटर ==
== लगातार फ़ंक्शन पैरामीटर ==
Line 131: Line 121:


== वस्तु-उन्मुख स्थिरांक ==
== वस्तु-उन्मुख स्थिरांक ==
एक निरंतर डेटा संरचना या वस्तु को वस्तु-उन्मुख भाषा में अपरिवर्तनीय वस्तु के रूप में संदर्भित किया जाता है। एक वस्तु का अपरिवर्तनीय होना प्रोग्राम डिजाइन में कुछ लाभ प्रदान करता है। उदाहरण के लिए, इसके पॉइंटर या संदर्भ को कॉपी करके, समय लेने वाली कॉपी ऑपरेशन से बचने और मेमोरी को संरक्षित करके इसे कॉपी किया जा सकता है।
एक स्थिरांक डेटा संरचना या वस्तु को वस्तु-उन्मुख भाषा में अपरिवर्तनीय वस्तु के रूप में संदर्भित किया जाता है। एक वस्तु का अपरिवर्तनीय होना प्रोग्राम डिजाइन में कुछ लाभ प्रदान करता है। उदाहरण के लिए, इसके पॉइंटर या संदर्भ को कॉपी करके, समय लेने वाली कॉपी ऑपरेशन से बचने और मेमोरी को संरक्षित करके इसे कॉपी किया जा सकता है।


वस्तु-उन्मुख भाषाएँ जैसे C++ निरंतरता को और भी आगे बढ़ाती हैं। किसी संरचना या वर्ग के अलग-अलग सदस्यों को वर्ग नहीं होने पर भी स्थिर बनाया जा सकता है। इसके विपरीत, {{Cpp|mutable}} कीवर्ड एक वर्ग के सदस्य को बदलने की अनुमति देता है, भले ही किसी वस्तु को तत्काल किया गया हो {{Cpp|const}}.
वस्तु-उन्मुख भाषाएँ जैसे C++ स्थिरांकता को और भी आगे बढ़ाती हैं। किसी संरचना या वर्ग के अलग-अलग सदस्यों को वर्ग नहीं होने पर भी स्थिर बनाया जा सकता है। इसके विपरीत, {{Cpp|mutable}} कीवर्ड एक वर्ग के सदस्य को बदलने की अनुमति देता है, भले ही किसी वस्तु को तत्काल किया गया हो {{Cpp|const}}.


सी ++ में भी कार्य स्थिर हो सकते हैं। यहाँ अर्थ यह है कि कॉन्स्ट के रूप में तात्कालिक वस्तु के लिए केवल एक कॉन्स्ट फ़ंक्शन को कॉल किया जा सकता है; एक कॉन्स्ट फ़ंक्शन किसी गैर-परिवर्तनीय डेटा को नहीं बदलता है।
सी ++ में भी कार्य स्थिर हो सकते हैं। यहाँ अर्थ यह है कि कॉन्स्ट के रूप में तात्कालिक वस्तु के लिए केवल एक कॉन्स्ट फ़ंक्शन को कॉल किया जा सकता है; एक कॉन्स्ट फ़ंक्शन किसी गैर-परिवर्तनीय डेटा को नहीं बदलता है।
Line 154: Line 144:
i = 4; // Error!
i = 4; // Error!
</syntaxhighlight>
</syntaxhighlight>
संकेतकों को ध्यान में रखते हुए, ए {{Java|final}जावा में } संदर्भ का अर्थ कुछ समान है {{Cpp|const}} सी ++ में सूचक। सी ++ में, कोई निरंतर सूचक प्रकार घोषित कर सकता है।
<nowiki>संकेतकों को ध्यान में रखते हुए, ए {{Java|final}जावा में } संदर्भ का अर्थ कुछ समान है </nowiki>{{Cpp|const}} सी ++ में सूचक। सी ++ में, कोई स्थिरांक सूचक प्रकार घोषित कर सकता है।


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">

Revision as of 14:55, 2 June 2023

कंप्यूटर प्रोग्रामिंग में, स्थिरांक एक मान है जिसे सामान्य निष्पादन के दौरान कार्यक्रम द्वारा परिवर्तित नहीं किया जाना चाहिए, अर्थात, मान स्थिर है।[lower-alpha 1] जब एक पहचानकर्ता के साथ जुड़ा होता है, तो एक स्थिरांक को "नामित" कहा जाता है, हालांकि "स्थिर" और "नामांकित स्थिरांक" शब्द अक्सर परस्पर विनिमय के लिए उपयोग किए जाते हैं। यह एक चर के साथ विपरीत है, जो एक मान के साथ पहचानकर्ता है जिसे सामान्य निष्पादन के दौरान बदला जा सकता है, अर्थात, मान एक चर (वेरिएबल) है।

प्रोग्रामर और कंपाइलर दोनों के लिए स्थिरांक उपयोगी होते हैं: प्रोग्रामर के लिए, वे स्व-दस्तावेजीकरण कोड का एक रूप होते हैं और शुद्धता के बारे में तर्क देते हैं, जबकि कंपाइलर्स के लिए वे कंपाइल-टाइम और रन-टाइम चेक की अनुमति देते हैं जो यह सत्यापित करते हैं कि कॉन्स्टेंसी मान्यताओं का उल्लंघन नहीं किया गया है, और कुछ कंपाइलर ऑप्टिमाइज़ेशन को अनुमति या सरलीकृत करते हैं।

स्थिरांक की सामान्य धारणा के विभिन्न विशिष्ट अहसास हैं, सूक्ष्म भेदों के साथ जिन्हें अक्सर अनदेखा कर दिया जाता है। सबसे महत्वपूर्ण संकलन-समय (सांख्यिकीय मूल्यवान) स्थिरांक, रन-टाइम (गतिशील रूप से मूल्यवान) स्थिरांक, अपरिवर्तनीय वस्तुएं और स्थिरांक प्रकार (स्थिरांक) हैं।

संकलन-समय स्थिरांक के विशिष्ट उदाहरणों में गणितीय स्थिरांक, मानकों से मान (यहाँ अधिकतम संचरण इकाई), या आंतरिक विन्यास मान (यहाँ प्रति पंक्ति वर्ण) शामिल हैं, जैसे कि ये C उदाहरण:

const float PI = 3.1415927;  // maximal single float precision
const unsigned int MTU = 1500;  // Ethernet v2, RFC 894
const unsigned int COLUMNS = 80;

रन-टाइम स्थिरांक के विशिष्ट उदाहरण किसी फ़ंक्शन के इनपुट के आधार पर गणना किए गए मान हैं, जैसे कि यह C++ उदाहरण:

void f(std::string s) {
  const size_t l = s.length();
  // ...
}

प्रयोग

कुछ प्रोग्रामिंग भाषाएं स्थिरांक और चर प्रतीकों के बीच एक स्पष्ट वाक्य-विन्यास भेद करती हैं, उदाहरण के लिए एक स्थिरांक को असाइनमेंट को सिंटैक्स त्रुटि माना जाता है, जबकि अन्य भाषाओं में उन्हें वाक्यगत रूप से समान माना जाता है (दोनों केवल एक पहचानकर्ता), और उपचार में अंतर सिमेंटिक है (पहचानकर्ता को असाइनमेंट वाक्य रचनात्मक रूप से मान्य है, लेकिन यदि पहचानकर्ता स्थिरांक है तो यह शब्दार्थ से अमान्य है)।

एक स्थिर मान को एक बार परिभाषित किया जाता है और पूरे कार्यक्रम में इसे कई बार संदर्भित किया जा सकता है। एक ही मान को कई बार निर्दिष्ट करने के बजाय एक स्थिरांक का उपयोग करना कोड रखरखाव को आसान बना सकता है (जैसा कि स्वयं को दोहराना नहीं है) और एक मूल्य के लिए एक सार्थक नाम की आपूर्ति करके स्व-दस्तावेजीकरण किया जा सकता है, उदाहरण के लिए, PI3.1415926 ।

शाब्दिक और मैक्रोज़ के साथ तुलना

डेटा मान को व्यक्त करने के कई मुख्य तरीके हैं जो प्रोग्राम के निष्पादन के दौरान नहीं बदलते हैं और जो विभिन्न प्रकार की प्रोग्रामिंग भाषाओं में सुसंगत है। एक बहुत ही बुनियादी तरीका प्रोग्राम कोड में केवल शाब्दिक संख्या, वर्ण या स्ट्रिंग लिखना है, जो C, C ++ और समान भाषाओं में सीधा है।

असेंबली भाषा में, अधिकांश माइक्रोप्रोसेसरों पर उपलब्ध तत्काल मोड निर्देशों का उपयोग करके शाब्दिक संख्याएं और वर्ण किए जाते हैं। तत्काल नाम निर्देश (कंप्यूटर विज्ञान) से तत्काल उपलब्ध होने वाले मूल्यों से आता है, क्योंकि स्मृति पते को देखकर उन्हें अप्रत्यक्ष रूप से लोड करने का विरोध किया जाता है।[1] दूसरी ओर, माइक्रोप्रोसेसर की शब्द लंबाई से अधिक मूल्य, जैसे कि तार और सरणियाँ, अप्रत्यक्ष रूप से संभाले जाते हैं और असेंबलर आमतौर पर एक प्रोग्राम में ऐसी डेटा तालिकाओं को एम्बेड करने के लिए एक डेटा छद्म-ऑप प्रदान करते हैं।

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

एक तीसरा तरीका एक चर को "स्थिरांक" घोषित और परिभाषित करना है। एक वैश्विक चर या स्थैतिक चर घोषित किया जा सकता है (या असेंबली में परिभाषित प्रतीक) जैसे कि constconstantस्थिर, या finalजैसे कीवर्ड क्वालीफायर, जिसका अर्थ है कि इसका मान संकलन समय पर सेट किया जाएगा और रनटाइम पर परिवर्तनशील नहीं होना चाहिए। कंपाइलर्स आम तौर पर कोड के साथ ऑब्जेक्ट फ़ाइल के टेक्स्ट सेक्शन में स्थिर स्थिरांक डालते हैं, डेटा सेक्शन के विपरीत जहां गैर-कॉन्स्ट प्रारंभिक डेटा रखा जाता है। कुछ कंपाइलर विशेष रूप से स्थिरांक को समर्पित एक खंड का उत्पादन कर सकते हैं। त्रुटिपूर्ण संकेतकों द्वारा ऐसे स्थिरांकों के ओवरराइटिंग को रोकने के लिए इस क्षेत्र में स्मृति सुरक्षा लागू की जा सकती है।

ये स्थिरांक कई मायनों में शाब्दिक से भिन्न होते हैं। कंपाइलर्स आम तौर पर मैक्रो के साथ निष्पादन योग्य भर में फैलाने के बजाय प्रतीक द्वारा पहचाने गए एकल स्मृति स्थान में निरंतर स्थान रखते हैं। हालांकि यह तत्काल मोड के गति लाभ को रोकता है, स्मृति दक्षता में लाभ हैं, और डीबगर इन स्थिरांकों के साथ रनटाइम पर काम कर सकते हैं। इसके अलावा मैक्रोज़ को सी और C ++ में विरोधाभासी शीर्षलेख फ़ाइलों द्वारा आकस्मिक रूप से फिर से परिभाषित किया जा सकता है, लेकिन विरोधाभासी स्थिरांक संकलन समय पर पाए जाते हैं।

भाषा के आधार पर, स्थिरांक अलिखित या टाइप किए जा सकते हैं। C और C ++ में, मैक्रोज़ पूर्व प्रदान करते हैं, जबकि const बाद वाले को प्रदान करता है:

#define PI 3.1415926535

const float pi2 = 3.1415926535;

जबकि एडा में, सार्वभौमिक संख्यात्मक प्रकार होते हैं जिनका उपयोग वांछित होने पर किया जा सकता है:

pi : constant := 3.1415926535;

pi2 : constant float := 3.1415926535;

अप्रकाशित संस्करण को प्रत्येक उपयोग पर उपयुक्त प्रकार में स्पष्ट रूप से परिवर्तित किया जा रहा है।[2]

गतिशील रूप से मूल्यवान स्थिरांक

ऊपर वर्णित स्थैतिक स्थिरांक के अलावा, कई प्रक्रियात्मक भाषाएँ जैसे कि एडा और C++ वैश्विक चरों की ओर निरंतरता की अवधारणा का विस्तार करती हैं जो आरंभिक समय पर बनाए जाते हैं, स्थानीय चर जो स्टैक पर या रजिस्टरों में स्वचालित रूप से रनटाइम पर बनाए जाते हैं, डायनेमिक रूप से आबंटित मेमोरी जिसे पॉइंटर द्वारा एक्सेस किया जाता है, और फ़ंक्शन हेडर में पैरामीटर सूची में।

गतिशील रूप से मूल्यवान स्थिरांक एक चर को स्मृति के एक विशिष्ट क्षेत्र में रहने के रूप में नामित नहीं करते हैं, न ही संकलन समय पर मान निर्धारित किए जाते हैं। C++ कोड जैसे

float func(const float ANYTHING) {
    const float XYZ = someGlobalVariable*someOtherFunction(ANYTHING);
    ...
}

अभिव्यक्ति है कि स्थिरांक को आरंभीकृत किया जाता है, वे स्वयं स्थिर नहीं होते हैं। कार्यक्रम की वैधता या शब्दार्थ शुद्धता के लिए यहाँ स्थिरांकता का उपयोग आवश्यक नहीं है, लेकिन इसके तीन फायदे हैं:

  1. पाठक को यह स्पष्ट है कि एक बार सेट हो जाने के बाद वस्तु को और संशोधित नहीं किया जाएगा
  2. ऑब्जेक्ट के मूल्य को बदलने का प्रयास (बाद के प्रोग्रामर जो प्रोग्राम लॉजिक को पूरी तरह से नहीं समझते हैं) को कंपाइलर द्वारा अस्वीकार कर दिया जाएगा
  3. कंपाइलर यह जानकर कोड ऑप्टिमाइज़ेशन करने में सक्षम हो सकता है कि एक बार बनने के बाद ऑब्जेक्ट का मान नहीं बदलेगा।[3]

गतिशील रूप से मूल्यवान स्थिरांक ALGOL 68 के साथ एक भाषा सुविधा के रूप में उत्पन्न हुए।[3]एडीए और सी ++ कोड के अध्ययन से पता चला है कि गतिशील रूप से मूल्यवान स्थिरांक आमतौर पर 1% या उससे कम वस्तुओं के लिए उपयोग किए जाते हैं, जब उनका अधिक उपयोग किया जा सकता है, क्योंकि कुछ 40-50% स्थानीय, गैर-वर्ग वस्तुएं वास्तव में एक बार अपरिवर्तनीय होती हैं। बनाया था।[3][4] दूसरी ओर, इस तरह के अपरिवर्तनीय चर कार्यात्मक प्रोग्रामिंग में डिफ़ॉल्ट होते हैं क्योंकि वे बिना किसी दुष्प्रभाव (जैसे, पुनरावर्तन) के साथ प्रोग्रामिंग शैलियों का पक्ष लेते हैं या अधिकांश घोषणाओं को डिफ़ॉल्ट रूप से अपरिवर्तनीय बनाते हैं, जैसे एमएल (प्रोग्रामिंग भाषा)विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषाएं साइड-इफेक्ट्स को पूरी तरह से मना करती हैं।

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

लगातार फ़ंक्शन पैरामीटर

C/C++ में, किसी फ़ंक्शन या विधि के पैरामीटर को स्थिर घोषित करना संभव है। यह एक गारंटी है कि इस पैरामीटर को पहले असाइनमेंट (अनजाने में) के बाद संशोधित नहीं किया जा सकता है। यदि पैरामीटर एक पूर्व-परिभाषित (अंतर्निहित) प्रकार है, तो इसे मान द्वारा कहा जाता है और इसे संशोधित नहीं किया जा सकता है। यदि यह उपयोगकर्ता परिभाषित प्रकार है, तो चर सूचक पता है, जिसे संशोधित नहीं किया जा सकता है। हालाँकि, वस्तु की सामग्री को बिना सीमा के संशोधित किया जा सकता है। मापदंडों को स्थिरांक के रूप में घोषित करना यह संकेत देने का एक तरीका हो सकता है कि यह मान नहीं बदला जाना चाहिए, लेकिन प्रोग्रामर को यह ध्यान रखना चाहिए कि किसी वस्तु के संशोधन के बारे में जाँच संकलक द्वारा नहीं की जा सकती है।

इस विशेषता के अलावा, C++ में किसी कार्य या विधि को इस रूप में घोषित करना भी संभव है const. यह ऐसे कार्यों या विधियों को स्थानीय चर के अलावा कुछ भी संशोधित करने से रोकता है।

सी # में, कीवर्ड const मौजूद है, लेकिन फ़ंक्शन पैरामीटर के लिए समान प्रभाव नहीं है, जैसा कि C/C++ में होता है। हालाँकि, जाँच करने के लिए कंपाइलर को हिलाने का एक तरीका है, हालाँकि यह थोड़ा मुश्किल है।[5] समान प्रभाव प्राप्त करने के लिए, पहले दो इंटरफ़ेस (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) परिभाषित किए गए हैं

public interface IReadable
{
    IValueInterface aValue { get; }
}

public interface IWritable : IReadable
{
    IValueInterface aValue { set; }
}

public class AnObject : IWritable
{
    private ConcreteValue _aValue;

    public IValueInterface aValue
    {
        get { return _aValue; }
        set { _aValue = value as ConcreteValue; }
    }
}

फिर, परिभाषित विधियाँ केवल-पढ़ने या पढ़ने/लिखने की क्षमताओं के साथ सही इंटरफ़ेस का चयन करती हैं:

public void DoSomething(IReadable aVariable)
{
    // Cannot modify aVariable!
}

public void DoSomethingElse(IWritable aVariable)
{
    // Can modify aVariable, so be careful!
}


वस्तु-उन्मुख स्थिरांक

एक स्थिरांक डेटा संरचना या वस्तु को वस्तु-उन्मुख भाषा में अपरिवर्तनीय वस्तु के रूप में संदर्भित किया जाता है। एक वस्तु का अपरिवर्तनीय होना प्रोग्राम डिजाइन में कुछ लाभ प्रदान करता है। उदाहरण के लिए, इसके पॉइंटर या संदर्भ को कॉपी करके, समय लेने वाली कॉपी ऑपरेशन से बचने और मेमोरी को संरक्षित करके इसे कॉपी किया जा सकता है।

वस्तु-उन्मुख भाषाएँ जैसे C++ स्थिरांकता को और भी आगे बढ़ाती हैं। किसी संरचना या वर्ग के अलग-अलग सदस्यों को वर्ग नहीं होने पर भी स्थिर बनाया जा सकता है। इसके विपरीत, mutable कीवर्ड एक वर्ग के सदस्य को बदलने की अनुमति देता है, भले ही किसी वस्तु को तत्काल किया गया हो const.

सी ++ में भी कार्य स्थिर हो सकते हैं। यहाँ अर्थ यह है कि कॉन्स्ट के रूप में तात्कालिक वस्तु के लिए केवल एक कॉन्स्ट फ़ंक्शन को कॉल किया जा सकता है; एक कॉन्स्ट फ़ंक्शन किसी गैर-परिवर्तनीय डेटा को नहीं बदलता है।

सी # में दोनों हैं const और ए readonly क्वालीफायर; इसका कॉन्स केवल संकलन-समय स्थिरांक के लिए है, जबकि कंस्ट्रक्टर और अन्य रनटाइम अनुप्रयोगों में केवल पढ़ने के लिए उपयोग किया जा सकता है।

जावा

जावा में क्वालीफायर कहा जाता है final जो एक संदर्भ को बदलने से रोकता है और यह सुनिश्चित करता है कि यह कभी भी किसी भिन्न वस्तु की ओर इशारा नहीं करेगा। यह संदर्भित वस्तु में परिवर्तन को ही नहीं रोकता है। जावा का final मूल रूप से एक के बराबर है const सी ++ में सूचक। यह की अन्य सुविधाएँ प्रदान नहीं करता है const.

जावा (प्रोग्रामिंग भाषा) में, क्वालीफायर final बताता है कि प्रभावित डेटा सदस्य या चर असाइन करने योग्य नहीं है, जैसा कि नीचे दिया गया है:

final int i = 3;
i = 4; // Error! Cannot modify a "final" object

यह संकलक द्वारा निर्णायक होना चाहिए जहां चर के साथ final मार्कर प्रारंभ किया गया है, और इसे केवल एक बार किया जाना चाहिए, या कक्षा संकलित नहीं होगी। जावा का final और सी++ const आदिम चर के साथ लागू होने पर कीवर्ड का एक ही अर्थ होता है।

const int i = 3; // C++ declaration
i = 4; // Error!

संकेतकों को ध्यान में रखते हुए, ए {{Java|final}जावा में } संदर्भ का अर्थ कुछ समान है const सी ++ में सूचक। सी ++ में, कोई स्थिरांक सूचक प्रकार घोषित कर सकता है।

Foo *const bar = mem_location; // const pointer type

यहाँ, bar को घोषणा के समय प्रारंभ किया जाना चाहिए और इसे फिर से नहीं बदला जा सकता है, लेकिन यह जो इंगित करता है वह संशोधित है। अर्थात। *bar = value यह सही है। यह किसी अन्य स्थान की ओर इशारा नहीं कर सकता है। जावा में अंतिम संदर्भ उसी तरह काम करते हैं, सिवाय इसके कि उन्हें गैर-प्रारंभिक घोषित किया जा सकता है।

final Foo i; // a Java declaration

नोट: जावा पॉइंटर्स का समर्थन नहीं करता है।[6] ऐसा इसलिए है क्योंकि पॉइंटर (कंप्यूटर प्रोग्रामिंग) # जावा (प्रतिबंधों के साथ) जावा में ऑब्जेक्ट तक पहुंचने का डिफ़ॉल्ट तरीका है, और जावा उन्हें इंगित करने के लिए सितारों का उपयोग नहीं करता है। उदाहरण के लिए, i पिछले उदाहरण में एक सूचक है और उदाहरण का उपयोग करने के लिए इस्तेमाल किया जा सकता है।

C++ में केवल-पढ़ने के लिए डेटा के लिए पॉइंटर भी घोषित किया जा सकता है।

const Foo *bar;

यहाँ bar कभी भी, कुछ भी इंगित करने के लिए संशोधित किया जा सकता है; बस उस नुकीले मूल्य को संशोधित नहीं किया जा सकता है bar सूचक।

जावा में कोई समकक्ष तंत्र नहीं है। इस प्रकार भी नहीं हैं const तरीके। जावा में कॉन्स्ट-शुद्धता को लागू नहीं किया जा सकता है, हालांकि इंटरफेस के उपयोग और कक्षा में केवल पढ़ने के लिए इंटरफ़ेस को परिभाषित करने और इसे पास करने से, कोई यह सुनिश्चित कर सकता है कि ऑब्जेक्ट्स को सिस्टम के चारों ओर इस तरह पारित किया जा सकता है कि उन्हें संशोधित नहीं किया जा सकता है।

जावा संग्रह ढांचा एक अपरिवर्तनीय रैपर बनाने का एक तरीका प्रदान करता है Collection के जरिए Collections.unmodifiableCollection() और इसी तरह के तरीके।

जावा में एक विधि को अंतिम घोषित किया जा सकता है, जिसका अर्थ है कि इसे उपवर्गों में ओवरराइड नहीं किया जा सकता है।

सी#

सी शार्प (प्रोग्रामिंग लैंग्वेज) में | सी #, क्वालीफायर readonly का डेटा सदस्यों पर समान प्रभाव पड़ता है final जावा में करता है और const C++ में करता है; संशोधक const के समान प्रभाव (अभी तक टाइप किया गया और वर्ग-दायरा) है #define सी ++ में। जावा का अन्य, वंशानुक्रम-अवरोधक प्रभाव final जब विधियों और कक्षाओं पर लागू किया जाता है तो कीवर्ड की सहायता से सी # में प्रेरित होता है sealed.

सी ++ के विपरीत, सी # विधियों और पैरामीटर को चिह्नित करने की अनुमति नहीं देता है const. हालाँकि, कोई भी रीड-ओनली उप-वर्गों को पार कर सकता है, और .NET फ्रेमवर्क अपरिवर्तनीय संग्रहों को अपरिवर्तनीय संग्रहों में परिवर्तित करने के लिए कुछ सहायता प्रदान करता है, जिन्हें केवल-पढ़ने के लिए रैपर के रूप में पारित किया जा सकता है।

प्रतिमान द्वारा

प्रोग्रामिंग प्रतिमान द्वारा स्थिरांक का उपचार महत्वपूर्ण रूप से भिन्न होता है। कॉन्स्ट-शुद्धता सी ++ जैसी अनिवार्य भाषाओं में एक मुद्दा है क्योंकि डिफ़ॉल्ट नाम बंधन आमतौर पर वेरिएबल (कंप्यूटर विज्ञान) बनाते हैं, जो अलग-अलग हो सकते हैं, जैसा कि नाम से पता चलता है, और इस प्रकार यदि कोई बाध्यकारी को स्थिर के रूप में चिह्नित करना चाहता है तो इसके लिए कुछ अतिरिक्त संकेत की आवश्यकता होती है .[lower-alpha 2] अन्य प्रोग्रामिंग भाषा में प्रतिमानों से संबंधित समस्याएँ उत्पन्न होती हैं, जिनमें स्थिरांक-शुद्धता के कुछ अनुरूप पाए जाते हैं।

कार्यात्मक प्रोग्रामिंग में, डेटा आमतौर पर डिफ़ॉल्ट रूप से चर के बजाय डिफ़ॉल्ट रूप से स्थिर होता है। एक चर (एक नाम और संभावित चर मान के साथ एक भंडारण स्थान) के लिए एक मान निर्दिष्ट करने के बजाय, एक नाम के लिए एक मूल्य के लिए एक बंधन बनाता है, जैसे कि let लिस्प (प्रोग्रामिंग भाषा) की कई बोलियों में निर्माण। कुछ कार्यात्मक भाषाओं में, विशेष रूप से बहु-प्रतिमान वाले जैसे कि सामान्य लिस्प , डेटा को संशोधित करना सामान्य है, जबकि अन्य में इसे टाला जाता है या असाधारण माना जाता है; यह स्कीम (प्रोग्रामिंग लैंग्वेज) (एक अन्य लिस्प बोली) का मामला है, जो set! डेटा को संशोधित करने के लिए निर्माण, के साथ ! विस्मयादिबोधक चिह्न इस ओर ध्यान आकर्षित करता है। ऐसी भाषाएँ डिफ़ॉल्ट रूप से स्थिरांक-शुद्धता के लक्ष्यों को प्राप्त करती हैं, स्थिरता के बजाय संशोधन पर ध्यान आकर्षित करती हैं।

कई वस्तु-उन्मुख भाषाओं में, एक अपरिवर्तनीय वस्तु की अवधारणा है, जो विशेष रूप से मूल प्रकार जैसे तार के लिए उपयोग की जाती है; उल्लेखनीय उदाहरणों में जावा, जावास्क्रिप्ट, पायथन और सी # शामिल हैं। ये भाषाएँ अलग-अलग हैं कि क्या उपयोगकर्ता-परिभाषित प्रकारों को अपरिवर्तनीय के रूप में चिह्नित किया जा सकता है, और किसी वस्तु या प्रकार के विशेष क्षेत्रों (विशेषताओं) को अपरिवर्तनीय के रूप में चिह्नित करने की अनुमति दे सकता है।

कुछ बहुप्रतिमान भाषाओं में जो वस्तु-उन्मुख और कार्यात्मक शैलियों दोनों की अनुमति देती हैं, इन दोनों विशेषताओं को जोड़ा जा सकता है। उदाहरण के लिए, OCaml में ऑब्जेक्ट फ़ील्ड डिफ़ॉल्ट रूप से अपरिवर्तनीय हैं और उन्हें स्पष्ट रूप से कीवर्ड के साथ चिह्नित किया जाना चाहिए mutable उत्परिवर्तनीय होने के लिए, जबकि स्काला में, बाइंडिंग स्पष्ट रूप से अपरिवर्तनीय होती है जब इसे परिभाषित किया जाता है val मूल्य के लिए और परिभाषित होने पर स्पष्ट रूप से परिवर्तनशील var चर के लिए।

नामकरण परंपराएं

स्थिरांकों के लिए नामकरण परिपाटी (प्रोग्रामिंग) अलग-अलग होती है। कुछ बस उन्हें उसी तरह नाम देते हैं जैसे वे किसी अन्य चर को देते हैं। अन्य लोग स्थिरांक के लिए राजधानियों और अंडरस्कोर का उपयोग प्रतीकात्मक मैक्रोज़ के लिए अपने पारंपरिक उपयोग के समान करते हैं, जैसे कि SOME_CONSTANT.[7] हंगेरियन संकेतन में, k उपसर्ग स्थिरांक के साथ-साथ मैक्रो (कंप्यूटर विज्ञान) और प्रगणित प्रकारों को दर्शाता है।

एक लागू परिपाटी यह है कि रूबी (प्रोग्रामिंग भाषा) में, कोई भी वेरिएबल जो एक बड़े अक्षर से शुरू होता है, एक स्थिरांक माना जाता है, जिसमें वर्ग के नाम भी शामिल हैं।

यह भी देखें

टिप्पणियाँ

  1. In some cases the expectation of constancy can be circumvented, e.g. using self-modifying code or by overwriting the memory location where the value is stored.
  2. This is not universal: in Ada input parameters and loop parameters are implicitly constant, for instance.


संदर्भ

  1. Ex. IBM Systems Information. Instruction Set - Assembler Language Reference for PowerPC.
  2. Booch, Grady (1983). एडा के साथ सॉफ्टवेयर इंजीनियरिंग. Benjamin Cummings. pp. 116–117. ISBN 0-8053-0600-5.
  3. Jump up to: 3.0 3.1 3.2 Schilling, Jonathan L. (April 1995). "Dynamically-Valued Constants: An Underused Language Feature". SIGPLAN Notices. 30 (4): 13–20. doi:10.1145/202176.202177. S2CID 17489672.
  4. Perkins, J. A. Programming Practices: Analysis of Ada Source Developed for the Air Force, Army, and Navy. Proceedings TRI-Ada '89. pp. 342–354. doi:10.1145/74261.74287.
  5. Timwi (2010-09-09). "Read-only ("const"-like) function parameters of C#". Stack Overflow. Retrieved 2012-05-06. [...] Then you can declare methods whose parameter type "tells" whether it plans on changing the variable or not:. [...] This mimics compile-time checks similar to constness in C++. As Eric Lippert correctly pointed out, this is not the same as immutability. But as a C++ programmer I think you know that.
  6. "Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle". Java.sun.com. 2013-08-14. Retrieved 2013-08-18.
  7. Microsoft Office XP Developer: Constant Names