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

From Vigyanwiki
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.}} जब एक पहचानकर्ता के साथ जुड़ा होता है, तो एक स्थिरांक को "नामित" कहा जाता है, हालांकि "स्थिर" और "नामांकित स्थिरांक" शब्द प्रायः परस्पर विनिमय के लिए उपयोग किए जाते हैं। यह एक वेरिएबल के साथ विपरीत है, जो एक मान के साथ पहचानकर्ता है जिसे सामान्य निष्पादन के दौरान बदला जा सकता है, अर्थात, मान एक [[ चर (कंप्यूटर विज्ञान) |वेरिएबल]] (''वेरिएबल'') है।


प्रोग्रामर और कंपाइलर दोनों के लिए स्थिरांक उपयोगी होते हैं: प्रोग्रामर के लिए, वे स्व-दस्तावेजीकरण कोड का एक रूप होते हैं और [[शुद्धता (कंप्यूटर विज्ञान)|शुद्धता]] के बारे में तर्क देते हैं, जबकि कंपाइलर्स के लिए वे कंपाइल-टाइम और रन-टाइम चेक की अनुमति देते हैं जो यह सत्यापित करते हैं कि कॉन्स्टेंसी मान्यताओं का उल्लंघन नहीं किया गया है, और कुछ कंपाइलर ऑप्टिमाइज़ेशन को अनुमति या सरलीकृत करते हैं।
प्रोग्रामर और कंपाइलर दोनों के लिए स्थिरांक उपयोगी होते हैं: प्रोग्रामर के लिए, वे स्व-दस्तावेजीकरण कोड का एक रूप होते हैं और [[शुद्धता (कंप्यूटर विज्ञान)|शुद्धता]] के बारे में तर्क देते हैं, जबकि कंपाइलर्स के लिए वे कंपाइल-टाइम और रन-टाइम चेक की अनुमति देते हैं जो यह सत्यापित करते हैं कि कॉन्स्टेंसी मान्यताओं का उल्लंघन नहीं किया गया है, और कुछ कंपाइलर ऑप्टिमाइज़ेशन को अनुमति या सरलीकृत करते हैं।
Line 28: Line 28:
असेंबली भाषा में, अधिकांश माइक्रोप्रोसेसरों पर उपलब्ध तत्काल मोड निर्देशों का उपयोग करके शाब्दिक संख्याएं और वर्ण किए जाते हैं। तत्काल नाम [[निर्देश (कंप्यूटर विज्ञान)]] से तत्काल उपलब्ध होने वाले मूल्यों से आता है, क्योंकि मेमोरी पते को देखकर उन्हें अप्रत्यक्ष रूप से लोड करने का विरोध किया जाता है।<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}}जैसे कीवर्ड क्वालीफायर, जिसका अर्थ है कि इसका मान संकलन समय पर सेट किया जाएगा और रनटाइम पर परिवर्तनशील नहीं होना चाहिए। कंपाइलर्स सामान्यतः कोड के साथ ऑब्जेक्ट फ़ाइल के टेक्स्ट सेक्शन में स्थिर स्थिरांक डालते हैं, डेटा सेक्शन के विपरीत जहां गैर-कॉन्स्ट प्रारंभिक डेटा रखा जाता है। कुछ कंपाइलर विशेष रूप से स्थिरांक को समर्पित एक खंड का उत्पादन कर सकते हैं। त्रुटिपूर्ण संकेतकों द्वारा ऐसे स्थिरांकों के ओवरराइटिंग को रोकने के लिए इस क्षेत्र में मेमोरी सुरक्षा लागू की जा सकती है।
Line 71: Line 71:
इस विशेषता के अलावा, C++ में किसी कार्य या विधि को इस रूप में घोषित करना भी संभव है {{Cpp|const}}. यह ऐसे कार्यों या विधियों को स्थानीय वेरिएबल के अलावा कुछ भी संशोधित करने से रोकता है।
इस विशेषता के अलावा, C++ में किसी कार्य या विधि को इस रूप में घोषित करना भी संभव है {{Cpp|const}}. यह ऐसे कार्यों या विधियों को स्थानीय वेरिएबल के अलावा कुछ भी संशोधित करने से रोकता है।


C # में, कीवर्ड {{C sharp|const}} '''मौजूद''' है, लेकिन फ़ंक्शन पैरामीटर के लिए समान प्रभाव नहीं है, जैसा कि C/C++ में होता है। हालाँकि, जाँच करने के लिए कंपाइलर को हिलाने का एक तरीका है, हालाँकि यह थोड़ा मुश्किल है।<ref>
C # में, कीवर्ड {{C sharp|const}} उपलब्ध है, लेकिन फ़ंक्शन पैरामीटर के लिए समान प्रभाव नहीं है, जैसा कि C/C++ में होता है। हालाँकि, जाँच करने के लिए कंपाइलर को हिलाने का एक तरीका है, हालाँकि यह थोड़ा कठिन है।<ref>
{{cite web
{{cite web
| accessdate = 2012-05-06
| accessdate = 2012-05-06

Revision as of 17:03, 5 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++ में, किसी फ़ंक्शन या विधि के पैरामीटर को स्थिर घोषित करना संभव है। यह एक गारंटी है कि इस पैरामीटर को पहले असाइनमेंट (अनजाने में) के बाद संशोधित नहीं किया जा सकता है। यदि पैरामीटर एक पूर्व-परिभाषित (अंतर्निहित) प्रकार है, तो इसे मान द्वारा कहा जाता है और इसे संशोधित नहीं किया जा सकता है। यदि यह उपयोगकर्ता परिभाषित प्रकार है, तो वेरिएबल सूचक पता है, जिसे संशोधित नहीं किया जा सकता है। हालाँकि, वस्तु की सामग्री को बिना सीमा के संशोधित किया जा सकता है। मापदंडों को स्थिरांक के रूप में घोषित करना यह संकेत देने का एक तरीका हो सकता है कि यह मान नहीं बदला जाना चाहिए, लेकिन प्रोग्रामर को यह ध्यान रखना चाहिए कि किसी वस्तु के संशोधन के बारे में जाँच संकलक द्वारा नहीं की जा सकती है।

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

C # में, कीवर्ड 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.

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

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

जावा

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

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

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

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

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

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

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() और इसी तरह के तरीके।

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

सी#

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

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

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

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

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

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

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

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

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

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

यह भी देखें

  • आईबीएम/360 और जेड/आर्किटेक्वेरिएबल प्लेटफॉर्म के लिए एड्रेस कॉन्सटेंट

टिप्पणियाँ

  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. 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