स्थिरांक (कंप्यूटर प्रोग्रामिंग): Difference between revisions
(Created page with "{{Short description|Value that is not intended to be changed during program execution}} [[कंप्यूटर प्रोग्रामिंग]] में, ए...") |
No edit summary |
||
(8 intermediate revisions by 4 users not shown) | |||
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.}} जब एक पहचानकर्ता के साथ जुड़ा होता है, तो एक स्थिरांक को "नामित" कहा जाता है, हालांकि "स्थिर" और "नामांकित स्थिरांक" शब्द प्रायः परस्पर विनिमय के लिए उपयोग किए जाते हैं। यह एक वेरिएबल के साथ विपरीत है, जो एक मान के साथ पहचानकर्ता है जिसे सामान्य निष्पादन के दौरान बदला जा सकता है, अर्थात, मान एक [[ चर (कंप्यूटर विज्ञान) |वेरिएबल]] (''वेरिएबल'') है। | |||
प्रोग्रामर और कंपाइलर दोनों के लिए स्थिरांक उपयोगी होते हैं: प्रोग्रामर के लिए वे स्व- | प्रोग्रामर और कंपाइलर दोनों के लिए स्थिरांक उपयोगी होते हैं: प्रोग्रामर के लिए, वे स्व-दस्तावेजीकरण कोड का एक रूप होते हैं और [[शुद्धता (कंप्यूटर विज्ञान)|शुद्धता]] के बारे में तर्क देते हैं, जबकि कंपाइलर्स के लिए वे कंपाइल-टाइम और रन-टाइम चेक की अनुमति देते हैं जो यह सत्यापित करते हैं कि कॉन्स्टेंसी मान्यताओं का उल्लंघन नहीं किया गया है, और कुछ कंपाइलर ऑप्टिमाइज़ेशन को अनुमति या सरलीकृत करते हैं। | ||
स्थिरांक की सामान्य धारणा के विभिन्न विशिष्ट अहसास हैं, सूक्ष्म भेदों के साथ जिन्हें प्रायः अनदेखा कर दिया जाता है। सबसे महत्वपूर्ण संकलन-समय (सांख्यिकीय मूल्यवान) स्थिरांक, रन-टाइम (गतिशील रूप से मूल्यवान) स्थिरांक, अपरिवर्तनीय वस्तुएं और स्थिरांक प्रकार (स्थिरांक) हैं। | |||
संकलन-समय स्थिरांक के विशिष्ट उदाहरणों में गणितीय स्थिरांक, मानकों से मान ( | संकलन-समय स्थिरांक के विशिष्ट उदाहरणों में गणितीय स्थिरांक, मानकों से मान (यहाँ अधिकतम संचरण इकाई), या आंतरिक विन्यास मान (यहाँ प्रति पंक्ति वर्ण) सम्मिलित हैं, जैसे कि ये 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++]] उदाहरण: | रन-टाइम स्थिरांक के विशिष्ट उदाहरण किसी फ़ंक्शन के इनपुट के आधार पर गणना किए गए मान हैं, जैसे कि यह [[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 । | |||
== शाब्दिक और मैक्रोज़ के साथ तुलना == | == शाब्दिक और मैक्रोज़ के साथ तुलना == | ||
डेटा मान को व्यक्त करने के कई मुख्य तरीके हैं जो प्रोग्राम निष्पादन के दौरान नहीं बदलते हैं जो विभिन्न प्रकार की प्रोग्रामिंग भाषाओं | डेटा मान को व्यक्त करने के कई मुख्य तरीके हैं जो प्रोग्राम के निष्पादन के दौरान नहीं बदलते हैं और जो विभिन्न प्रकार की प्रोग्रामिंग भाषाओं में सुसंगत है। एक बहुत ही बुनियादी तरीका प्रोग्राम कोड में केवल [[शाब्दिक (कंप्यूटर विज्ञान)|शाब्दिक]] संख्या, वर्ण या स्ट्रिंग लिखना है, जो 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> दूसरी ओर, माइक्रोप्रोसेसर की शब्द लंबाई से अधिक मूल्य, जैसे कि तार और सरणियाँ, अप्रत्यक्ष रूप से संभाले जाते हैं और असेंबलर सामान्यतः एक प्रोग्राम में ऐसी डेटा तालिकाओं को एम्बेड करने के लिए एक डेटा छद्म-ऑप प्रदान करते हैं। | ||
एक अन्य तरीका एक प्रतीकात्मक [[मैक्रो (कंप्यूटर विज्ञान)|मैक्रो]] को परिभाषित करना है। कई उच्च-स्तरीय प्रोग्रामिंग भाषाएं, और कई असेंबलर, एक मैक्रो सुविधा प्रदान करते हैं जहां प्रोग्रामर परिभाषित कर सकता है, सामान्यतः एक स्रोत फ़ाइल की प्रारम्भ में या एक अलग परिभाषा फ़ाइल में, विभिन्न मूल्यों के नाम। एक प्रीप्रोसेसर तब इन नामों को संकलित करने से पहले उपयुक्त मानों के साथ बदल देता है, जिसके परिणामस्वरूप तत्काल मोड के गति लाभ के साथ शाब्दिक रूप से उपयोग करने के समान कुछ होता है। चूंकि कोड को बनाए रखना कठिन हो सकता है जहां सभी मान शाब्दिक रूप से लिखे जाते हैं, यदि किसी मान का उपयोग किसी भी दोहराव या गैर-स्पष्ट तरीके से किया जाता है, तो इसे प्रायः मैक्रो के रूप में किया जाता है। | |||
एक तीसरा तरीका एक | एक तीसरा तरीका एक वेरिएबल को "स्थिरांक" घोषित और परिभाषित करना है। एक [[वैश्विक चर|वैश्विक वेरिएबल]] या स्थैतिक वेरिएबल घोषित किया जा सकता है (या असेंबली में परिभाषित प्रतीक) जैसे कि {{Cpp|const}}{{code|lang=ada|constant}}स्थिर, या {{Java|final}}जैसे कीवर्ड क्वालीफायर, जिसका अर्थ है कि इसका मान संकलन समय पर सेट किया जाएगा और रनटाइम पर परिवर्तनशील नहीं होना चाहिए। कंपाइलर्स सामान्यतः कोड के साथ ऑब्जेक्ट फ़ाइल के टेक्स्ट सेक्शन में स्थिर स्थिरांक डालते हैं, डेटा सेक्शन के विपरीत जहां गैर-कॉन्स्ट प्रारंभिक डेटा रखा जाता है। कुछ कंपाइलर विशेष रूप से स्थिरांक को समर्पित एक खंड का उत्पादन कर सकते हैं। त्रुटिपूर्ण संकेतकों द्वारा ऐसे स्थिरांकों के ओवरराइटिंग को रोकने के लिए इस क्षेत्र में मेमोरी सुरक्षा लागू की जा सकती है। | ||
ये स्थिरांक | ये स्थिरांक कई मायनों में शाब्दिक से भिन्न होते हैं। कंपाइलर्स सामान्यतः मैक्रो के साथ निष्पादन योग्य भर में फैलाने के बजाय प्रतीक द्वारा पहचाने गए एकल मेमोरी स्थान में निरंतर स्थान रखते हैं। हालांकि यह तत्काल मोड के गति लाभ को रोकता है, मेमोरी दक्षता में लाभ हैं, और डीबगर इन स्थिरांकों के साथ रनटाइम पर काम कर सकते हैं। इसके अलावा मैक्रोज़ को सी और C ++ में विरोधाभासी शीर्षलेख फ़ाइलों द्वारा आकस्मिक रूप से फिर से परिभाषित किया जा सकता है, लेकिन विरोधाभासी स्थिरांक संकलन समय पर पाए जाते हैं। | ||
भाषा के आधार पर, स्थिरांक | भाषा के आधार पर, स्थिरांक अलिखित या टाइप किए जा सकते हैं। 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> | |||
== गतिशील रूप से मूल्यवान स्थिरांक == | == गतिशील रूप से मूल्यवान स्थिरांक == | ||
ऊपर वर्णित स्थैतिक स्थिरांक के अलावा, कई प्रक्रियात्मक | ऊपर वर्णित स्थैतिक स्थिरांक के अलावा, कई प्रक्रियात्मक भाषाएँ जैसे कि एडा और 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> | ||
अभिव्यक्ति है कि स्थिरांक को आरंभीकृत किया जाता है, वे स्वयं स्थिर नहीं होते हैं। कार्यक्रम की वैधता या शब्दार्थ शुद्धता के लिए यहाँ | अभिव्यक्ति है कि स्थिरांक को आरंभीकृत किया जाता है, वे स्वयं स्थिर नहीं होते हैं। कार्यक्रम की वैधता या शब्दार्थ शुद्धता के लिए यहाँ स्थिरांकता का उपयोग आवश्यक नहीं है, लेकिन इसके तीन फायदे हैं: | ||
# | # रीडर को यह स्पष्ट है कि एक बार सेट हो जाने के बाद वस्तु को और संशोधित नहीं किया जाएगा | ||
# ऑब्जेक्ट के मूल्य को बदलने का प्रयास (बाद के प्रोग्रामर जो प्रोग्राम लॉजिक को पूरी तरह से नहीं समझते हैं) को कंपाइलर द्वारा अस्वीकार कर दिया जाएगा | # ऑब्जेक्ट के मूल्य को बदलने का प्रयास (बाद के प्रोग्रामर जो प्रोग्राम लॉजिक को पूरी तरह से नहीं समझते हैं) को कंपाइलर द्वारा अस्वीकार कर दिया जाएगा | ||
# कंपाइलर यह जानकर कोड ऑप्टिमाइज़ेशन करने में सक्षम हो सकता है कि एक बार बनने के बाद ऑब्जेक्ट का मान नहीं बदलेगा।<ref name=dvc>{{cite journal | title=Dynamically-Valued Constants: An Underused Language Feature | last=Schilling | first=Jonathan L. | journal=[[SIGPLAN Notices]] | volume=30 | issue=4 | date=April 1995 | pages=13–20 | doi=10.1145/202176.202177| s2cid=17489672 }}</ref> | # कंपाइलर यह जानकर कोड ऑप्टिमाइज़ेशन करने में सक्षम हो सकता है कि एक बार बनने के बाद ऑब्जेक्ट का मान नहीं बदलेगा।<ref name=dvc>{{cite journal | title=Dynamically-Valued Constants: An Underused Language Feature | last=Schilling | first=Jonathan L. | journal=[[SIGPLAN Notices]] | volume=30 | issue=4 | date=April 1995 | pages=13–20 | doi=10.1145/202176.202177| s2cid=17489672 }}</ref> | ||
गतिशील रूप से मूल्यवान स्थिरांक [[ALGOL 68]] के साथ एक भाषा सुविधा के रूप में उत्पन्न हुए।<ref name=dvc/>एडीए और सी ++ कोड के अध्ययन से पता चला है कि गतिशील रूप से मूल्यवान स्थिरांक | गतिशील रूप से मूल्यवान स्थिरांक [[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> दूसरी ओर, इस तरह के अपरिवर्तनीय वेरिएबल [[कार्यात्मक प्रोग्रामिंग]] में डिफ़ॉल्ट होते हैं क्योंकि वे बिना किसी दुष्प्रभाव (जैसे, पुनरावर्तन) के साथ प्रोग्रामिंग शैलियों का पक्ष लेते हैं या अधिकांश घोषणाओं को डिफ़ॉल्ट रूप से अपरिवर्तनीय बनाते हैं, जैसे [[एमएल (प्रोग्रामिंग भाषा)]]। [[विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग]] भाषाएं साइड-इफेक्ट्स को पूरी तरह से मना करती हैं। | ||
स्थिरांकता का उपयोग प्रायः फ़ंक्शन घोषणाओं में किया जाता है, एक वादे के रूप में कि जब कोई वस्तु संदर्भ द्वारा पारित की जाती है, तो बुलाया गया फ़ंक्शन इसे नहीं बदलेगा। सिंटैक्स के आधार पर, या तो पॉइंटर या इंगित की जाने वाली वस्तु स्थिर हो सकती है, हालांकि सामान्यतः बाद वाला वांछित होता है। विशेष रूप से C++ और सी में, यह सुनिश्चित करने का अनुशासन कि पूरे कार्यक्रम में उचित डेटा संरचनाएं स्थिर हैं, को कॉन्स्ट-शुद्धता कहा जाता है। | |||
== लगातार फ़ंक्शन पैरामीटर == | == लगातार फ़ंक्शन पैरामीटर == | ||
C/C++ में, किसी फ़ंक्शन या विधि के पैरामीटर को स्थिर घोषित करना संभव है। यह एक गारंटी है कि इस पैरामीटर को पहले असाइनमेंट (अनजाने में) के बाद संशोधित नहीं किया जा सकता है। यदि पैरामीटर एक पूर्व-परिभाषित (अंतर्निहित) प्रकार है, तो इसे मान द्वारा कहा जाता है और इसे संशोधित नहीं किया जा सकता है। यदि यह उपयोगकर्ता परिभाषित प्रकार है, तो | C/C++ में, किसी फ़ंक्शन या विधि के पैरामीटर को स्थिर घोषित करना संभव है। यह एक गारंटी है कि इस पैरामीटर को पहले असाइनमेंट (अनजाने में) के बाद संशोधित नहीं किया जा सकता है। यदि पैरामीटर एक पूर्व-परिभाषित (अंतर्निहित) प्रकार है, तो इसे मान द्वारा कहा जाता है और इसे संशोधित नहीं किया जा सकता है। यदि यह उपयोगकर्ता परिभाषित प्रकार है, तो वेरिएबल सूचक पता है, जिसे संशोधित नहीं किया जा सकता है। हालाँकि, वस्तु की सामग्री को बिना सीमा के संशोधित किया जा सकता है। मापदंडों को स्थिरांक के रूप में घोषित करना यह संकेत देने का एक तरीका हो सकता है कि यह मान नहीं बदला जाना चाहिए, लेकिन प्रोग्रामर को यह ध्यान रखना चाहिए कि किसी वस्तु के संशोधन के बारे में जाँच संकलक द्वारा नहीं की जा सकती है। | ||
इस विशेषता के अलावा, C++ में किसी कार्य या विधि को इस रूप में घोषित करना भी संभव है {{Cpp|const}}. यह ऐसे कार्यों या विधियों को स्थानीय | इस विशेषता के अलावा, C++ में किसी कार्य या विधि को इस रूप में घोषित करना भी संभव है {{Cpp|const}}. यह ऐसे कार्यों या विधियों को स्थानीय वेरिएबल के अलावा कुछ भी संशोधित करने से रोकता है। | ||
C # में, कीवर्ड {{C sharp|const}} उपलब्ध है, लेकिन फ़ंक्शन पैरामीटर के लिए समान प्रभाव नहीं है, जैसा कि C/C++ में होता है। हालाँकि, जाँच करने के लिए कंपाइलर को हिलाने का एक तरीका है, हालाँकि यह थोड़ा कठिन है।<ref> | |||
{{cite web | {{cite web | ||
| accessdate = 2012-05-06 | | accessdate = 2012-05-06 | ||
Line 90: | Line 80: | ||
| quote = [...] 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. | | quote = [...] 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. | ||
| url = https://stackoverflow.com/a/3826657/}} | | url = https://stackoverflow.com/a/3826657/}} | ||
</ref> | </ref> समान प्रभाव प्राप्त करने के लिए, पहले दो [[इंटरफ़ेस (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] परिभाषित किए गए हैं | ||
समान प्रभाव प्राप्त करने के लिए, पहले दो [[इंटरफ़ेस (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] परिभाषित किए गए हैं | |||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
Line 128: | Line 117: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== वस्तु-उन्मुख स्थिरांक == | == वस्तु-उन्मुख स्थिरांक == | ||
एक | एक स्थिरांक डेटा संरचना या वस्तु को वस्तु-उन्मुख भाषा में अपरिवर्तनीय वस्तु के रूप में संदर्भित किया जाता है। एक वस्तु का अपरिवर्तनीय होना प्रोग्राम डिजाइन में कुछ लाभ प्रदान करता है। उदाहरण के लिए, इसके पॉइंटर या संदर्भ को कॉपी करके, समय लेने वाली कॉपी ऑपरेशन से बचने और मेमोरी को संरक्षित करके इसे कॉपी किया जा सकता है। | ||
वस्तु-उन्मुख भाषाएँ जैसे C++ | वस्तु-उन्मुख भाषाएँ जैसे C++ स्थिरांकता को और भी आगे बढ़ाती हैं। किसी संरचना या वर्ग के अलग-अलग सदस्यों को वर्ग नहीं होने पर भी स्थिर बनाया जा सकता है। इसके विपरीत, {{Cpp|mutable}} कीवर्ड एक वर्ग के सदस्य को बदलने की अनुमति देता है, भले ही किसी वस्तु को तत्काल किया गया हो {{Cpp|const}}. | ||
C ++ में भी कार्य स्थिर हो सकते हैं। यहाँ अर्थ यह है कि कॉन्स्ट के रूप में तात्कालिक वस्तु के लिए केवल एक कॉन्स्ट फ़ंक्शन को कॉल किया जा सकता है; एक कॉन्स्ट फ़ंक्शन किसी गैर-परिवर्तनीय डेटा को नहीं बदलता है। | |||
C# में दोनों हैं {{C sharp|const}} और ए {{C sharp|readonly}} क्वालीफायर; इसका कॉन्स केवल संकलन-समय स्थिरांक के लिए है, जबकि कंस्ट्रक्टर और अन्य रनटाइम अनुप्रयोगों में केवल पढ़ने के लिए उपयोग किया जा सकता है। | |||
=== जावा === | === जावा === | ||
जावा में क्वालीफायर कहा जाता है {{Java|final}} जो एक संदर्भ को बदलने से रोकता है और यह सुनिश्चित करता है कि यह कभी भी किसी भिन्न वस्तु की ओर इशारा नहीं करेगा। यह संदर्भित वस्तु में परिवर्तन को ही नहीं रोकता है। जावा का {{Java|final}} मूल रूप से एक के बराबर है {{Cpp|const}} | जावा में क्वालीफायर कहा जाता है {{Java|final}} जो एक संदर्भ को बदलने से रोकता है और यह सुनिश्चित करता है कि यह कभी भी किसी भिन्न वस्तु की ओर इशारा नहीं करेगा। यह संदर्भित वस्तु में परिवर्तन को ही नहीं रोकता है। जावा का {{Java|final}} मूल रूप से एक के बराबर है {{Cpp|const}} C++ में सूचक। यह की अन्य सुविधाएँ प्रदान नहीं करता है {{Cpp|const}}. | ||
[[जावा (प्रोग्रामिंग भाषा)]] में, क्वालीफायर {{Java|final}} बताता है कि प्रभावित डेटा सदस्य या | [[जावा (प्रोग्रामिंग भाषा)]] में, क्वालीफायर {{Java|final}} बताता है कि प्रभावित डेटा सदस्य या वेरिएबल असाइन करने योग्य नहीं है, जैसा कि नीचे दिया गया है: | ||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
Line 148: | Line 135: | ||
i = 4; // Error! Cannot modify a "final" object | i = 4; // Error! Cannot modify a "final" object | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यह संकलक द्वारा निर्णायक होना चाहिए जहां | यह संकलक द्वारा निर्णायक होना चाहिए जहां वेरिएबल के साथ {{Java|final}} मार्कर प्रारंभ किया गया है, और इसे केवल एक बार किया जाना चाहिए, या कक्षा संकलित नहीं होगी। जावा का {{Java|final}} और C++ {{Cpp|const}} आदिम वेरिएबल के साथ लागू होने पर कीवर्ड का एक ही अर्थ होता है। | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
Line 154: | Line 141: | ||
i = 4; // Error! | i = 4; // Error! | ||
</syntaxhighlight> | </syntaxhighlight> | ||
संकेतकों को ध्यान में रखते हुए, ए {{Java|final}जावा में } संदर्भ का अर्थ कुछ समान है {{Cpp|const}} | <nowiki>संकेतकों को ध्यान में रखते हुए, ए {{Java|final}जावा में } संदर्भ का अर्थ कुछ समान है </nowiki>{{Cpp|const}} C ++ में सूचक C++ में, कोई स्थिरांक सूचक प्रकार घोषित कर सकता है। | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
Foo *const bar = mem_location; // const pointer type | Foo *const bar = mem_location; // const pointer type | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यहाँ, {{Cpp|bar}} को घोषणा के समय प्रारंभ किया जाना चाहिए और इसे फिर से नहीं बदला जा सकता है, लेकिन यह जो इंगित करता है वह संशोधित है। | यहाँ, {{Cpp|bar}} को घोषणा के समय प्रारंभ किया जाना चाहिए और इसे फिर से नहीं बदला जा सकता है, लेकिन यह जो इंगित करता है वह संशोधित है। अर्थात {{Cpp|*bar {{=}} value}} यह सही है। यह किसी अन्य स्थान की ओर इशारा नहीं कर सकता है। जावा में अंतिम संदर्भ उसी तरह काम करते हैं, सिवाय इसके कि उन्हें गैर-प्रारंभिक घोषित किया जा सकता है। | ||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
final Foo i; // a Java declaration | final Foo i; // a Java declaration | ||
</syntaxhighlight> | </syntaxhighlight> | ||
नोट: जावा पॉइंटर्स का समर्थन नहीं करता है।<ref>{{cite web|url=http://java.sun.com/docs/white/langenv/Simple.doc2.html#4107 |title=Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle |publisher=Java.sun.com |date=2013-08-14 |accessdate=2013-08-18}}</ref> | नोट: जावा पॉइंटर्स का समर्थन नहीं करता है।<ref>{{cite web|url=http://java.sun.com/docs/white/langenv/Simple.doc2.html#4107 |title=Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle |publisher=Java.sun.com |date=2013-08-14 |accessdate=2013-08-18}}</ref> ऐसा इसलिए है क्योंकि पॉइंटर (कंप्यूटर प्रोग्रामिंग) जावा (प्रतिबंधों के साथ) जावा में ऑब्जेक्ट तक पहुंचने का डिफ़ॉल्ट तरीका है, और जावा उन्हें इंगित करने के लिए सितारों का उपयोग नहीं करता है। उदाहरण के लिए, {{mono|i}} पिछले उदाहरण में एक सूचक है और उदाहरण का उपयोग करने के लिए उपयोग किया जा सकता है। | ||
ऐसा इसलिए है क्योंकि पॉइंटर (कंप्यूटर प्रोग्रामिंग) | |||
C++ में केवल-पढ़ने के लिए डेटा के लिए पॉइंटर भी घोषित किया जा सकता है। | C++ में केवल-पढ़ने के लिए डेटा के लिए पॉइंटर भी घोषित किया जा सकता है। | ||
Line 174: | Line 160: | ||
यहाँ {{code|bar}} कभी भी, कुछ भी इंगित करने के लिए संशोधित किया जा सकता है; बस उस नुकीले मूल्य को संशोधित नहीं किया जा सकता है {{code|bar}} सूचक। | यहाँ {{code|bar}} कभी भी, कुछ भी इंगित करने के लिए संशोधित किया जा सकता है; बस उस नुकीले मूल्य को संशोधित नहीं किया जा सकता है {{code|bar}} सूचक। | ||
जावा में कोई समकक्ष तंत्र नहीं है। इस प्रकार भी नहीं हैं {{Cpp|const}} तरीके। | जावा में कोई समकक्ष तंत्र नहीं है। इस प्रकार भी नहीं हैं {{Cpp|const}} तरीके। | ||
जावा में कॉन्स्ट-शुद्धता को लागू नहीं किया जा सकता है, हालांकि इंटरफेस के उपयोग और कक्षा में केवल पढ़ने के लिए इंटरफ़ेस को परिभाषित करने और इसे पास करने से, कोई यह सुनिश्चित कर सकता है कि ऑब्जेक्ट्स को सिस्टम के चारों ओर इस तरह पारित किया जा सकता है कि उन्हें संशोधित नहीं किया जा सकता है। | जावा में कॉन्स्ट-शुद्धता को लागू नहीं किया जा सकता है, हालांकि इंटरफेस के उपयोग और कक्षा में केवल पढ़ने के लिए इंटरफ़ेस को परिभाषित करने और इसे पास करने से, कोई यह सुनिश्चित कर सकता है कि ऑब्जेक्ट्स को सिस्टम के चारों ओर इस तरह पारित किया जा सकता है कि उन्हें संशोधित नहीं किया जा सकता है। | ||
Line 182: | Line 169: | ||
===सी#=== | ===सी#=== | ||
C# में, क्वालीफायर {{C sharp|readonly}} का डेटा सदस्यों पर वही प्रभाव पड़ता है जो जावा में {{Java|final}}करता है और C++ में {{Cpp|const}} करता है; संशोधक {{C sharp|const}} का प्रभाव C++ में {{Cpp|#define}} के समान (अभी तक टाइप किया गया और वर्ग-दायरा) है। विधियों और कक्षाओं पर लागू होने पर जावा के {{Java|final}}का अन्य, इनहेरिटेंस-इनहिबिटिंग प्रभाव C # में कीवर्ड {{C sharp|sealed}} की सहायता से प्रेरित होता है। | |||
सी ++ के विपरीत, सी # | सी ++ के विपरीत, सी # विधि और पैरामीटर को {{C sharp|const}} के रूप में चिह्नित करने की अनुमति नहीं देता है। हालाँकि, कोई भी रीड-ओनली उप-वर्गों को पार कर सकता है, और .NET फ्रेमवर्क अपरिवर्तनीय संग्रहों को अपरिवर्तनीय संग्रहों में परिवर्तित करने के लिए कुछ समर्थन प्रदान करता है जिन्हें केवल-पढ़ने के लिए रैपर के रूप में पारित किया जा सकता है। | ||
== प्रतिमान द्वारा == | == प्रतिमान द्वारा == | ||
[[प्रोग्रामिंग प्रतिमान]] | [[प्रोग्रामिंग प्रतिमान]] के अनुसार स्थिरांक का उपचार काफी भिन्न होता है। कॉन्स्ट-शुद्धता C++ जैसी अनिवार्य भाषाओं में एक मुद्दा है क्योंकि डिफ़ॉल्ट नाम बाइंडिंग सामान्यतः वेरिएबल बनाते हैं, जो भिन्न हो सकते हैं, जैसा कि नाम से पता चलता है, और इस प्रकार यदि कोई बाध्यकारी को निरंतर चिह्नित करना चाहता है तो इसके लिए कुछ अतिरिक्त संकेत की आवश्यकता होती है।{{efn|This is not universal: in Ada input parameters and loop parameters are implicitly constant, for instance.}} अन्य प्रोग्रामिंग लैंग्वेज प्रतिमानों में संबंधित मुद्दे उत्पन्न होते हैं, जिनमें कॉन्स्ट-करेक्टनेस के कुछ एनालॉग्स पाए जाते हैं। | ||
कार्यात्मक प्रोग्रामिंग में, डेटा | कार्यात्मक प्रोग्रामिंग में, डेटा सामान्यतः डिफ़ॉल्ट रूप से स्थिर होता है, बजाय डिफ़ॉल्ट रूप से वेरिएबल के। एक वेरिएबल (एक नाम और संभावित वेरिएबल मान के साथ एक भंडारण स्थान) के लिए एक मान निर्दिष्ट करने के बजाय, एक मूल्य के लिए एक नाम का बंधन बनाता है, जैसे कि {{code|lang=scheme|let}} लिस्प की कई बोलियों में निर्माण। कुछ कार्यात्मक भाषाओं में, विशेष रूप से बहु-प्रतिमान जैसे कि कॉमन लिस्प में, डेटा को संशोधित करना सामान्य है, जबकि अन्य में इसे टाला जाता है या असाधारण माना जाता है; यह स्कीम (एक अन्य लिस्प बोली) का मामला है, जो {{code|lang=scheme|set!}}का उपयोग करता है! डेटा को संशोधित करने के लिए निर्माण, के साथ! विस्मयादिबोधक बिंदु इस ओर ध्यान आकर्षित करता है। ऐसी भाषाएं डिफ़ॉल्ट रूप से स्थिरांक-शुद्धता के लक्ष्यों को प्राप्त करती हैं, निरंतरता के बजाय संशोधन पर ध्यान आकर्षित करती हैं। | ||
कई वस्तु-उन्मुख भाषाओं में, एक अपरिवर्तनीय वस्तु की अवधारणा है, जो विशेष रूप से | कई वस्तु-उन्मुख भाषाओं में, एक अपरिवर्तनीय वस्तु की अवधारणा होती है, जो विशेष रूप से बुनियादी प्रकार जैसे स्ट्रिंग्स के लिए उपयोग की जाती है; उल्लेखनीय उदाहरणों में सम्मिलित हैं जावा, जावास्क्रिप्ट, पायथन और C#। ये भाषाएँ अलग-अलग हैं कि क्या उपयोगकर्ता-परिभाषित प्रकारों को अपरिवर्तनीय के रूप में चिह्नित किया जा सकता है, और किसी वस्तु या प्रकार के विशेष क्षेत्रों (गुणों) को अपरिवर्तनीय के रूप में चिह्नित करने की अनुमति दे सकता है। | ||
कुछ | कुछ बहु-प्रतिमान भाषाओं में जो ऑब्जेक्ट-ओरिएंटेड और कार्यात्मक शैलियों दोनों की अनुमति देती हैं, इन दोनों सुविधाओं को जोड़ा जा सकता है। उदाहरण के लिए, [[OCaml]] में ऑब्जेक्ट फ़ील्ड डिफ़ॉल्ट रूप से अपरिवर्तनीय हैं और स्पष्ट रूप से म्यूटेबल होने के लिए कीवर्ड {{OCaml|mutable}} के साथ चिह्नित होना चाहिए, जबकि स्काला में, बाइंडिंग स्पष्ट रूप से अपरिवर्तनीय हैं जब "वैल्यू" के लिए {{code|lang=scala|val}} के साथ परिभाषित किया गया है और स्पष्ट रूप से म्यूटेबल है जब "वैरिएबल" के लिए {{code|lang=scala|var}} के साथ परिभाषित किया गया है "। | ||
== नामकरण परंपराएं == | == नामकरण परंपराएं == | ||
स्थिरांकों के लिए नामकरण परिपाटी | स्थिरांकों के लिए नामकरण परिपाटी भिन्न होती है। कुछ बस उन्हें उसी तरह नाम देते हैं जैसे वे किसी अन्य वेरिएबल को देते हैं। अन्य लोग स्थिरांक के लिए राजधानियों और अंडरस्कोर का उपयोग प्रतीकात्मक मैक्रोज़ के लिए अपने पारंपरिक उपयोग के समान करते हैं, जैसे {{code|SOME_CONSTANT}}<ref>[http://msdn.microsoft.com/en-us/library/aa188468(office.10).aspx Microsoft Office XP Developer: Constant Names]</ref> [[ हंगेरियन संकेतन |हंगेरियन संकेतन]] में, एक "k" उपसर्ग स्थिरांक के साथ-साथ मैक्रोज़ और [[प्रगणित प्रकार|प्रगणित]] प्रकारों को दर्शाता है। | ||
एक लागू | एक लागू अभिसमय यह है कि [[रूबी (प्रोग्रामिंग भाषा)|रूबी]] में, कोई भी वेरिएबल जो बड़े अक्षर से प्रारम्भ होता है, एक स्थिरांक माना जाता है, जिसमें वर्ग नाम भी सम्मिलित हैं। | ||
== यह भी देखें == | == यह भी देखें == | ||
* | * आईबीएम/360 और जेड/आर्किटेक्वेरिएबल प्लेटफॉर्म के लिए एड्रेस कॉन्सटेंट | ||
==टिप्पणियाँ== | ==टिप्पणियाँ== | ||
{{notelist|30em}} | {{notelist|30em}} | ||
==संदर्भ== | ==संदर्भ== | ||
{{Reflist|30em}} | {{Reflist|30em}} | ||
{{DEFAULTSORT:Constant (Programming)}} | {{DEFAULTSORT:Constant (Programming)}} | ||
[[Category: | [[Category:Articles with example C Sharp code|Constant (Programming)]] | ||
[[Category:Created On 26/05/2023]] | [[Category:Articles with example Java code|Constant (Programming)]] | ||
[[Category:Created On 26/05/2023|Constant (Programming)]] | |||
[[Category:Lua-based templates|Constant (Programming)]] | |||
[[Category:Machine Translated Page|Constant (Programming)]] | |||
[[Category:Pages with script errors|Constant (Programming)]] | |||
[[Category:Templates Vigyan Ready|Constant (Programming)]] | |||
[[Category:Templates that add a tracking category|Constant (Programming)]] | |||
[[Category:Templates that generate short descriptions|Constant (Programming)]] | |||
[[Category:Templates using TemplateData|Constant (Programming)]] | |||
[[Category:प्रोग्रामिंग का निर्माण|Constant (Programming)]] |
Latest revision as of 14:57, 13 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();
// ...
}
प्रयोग
कुछ प्रोग्रामिंग भाषाएं स्थिरांक और वेरिएबल प्रतीकों के बीच एक स्पष्ट वाक्य-विन्यास भेद करती हैं, उदाहरण के लिए एक स्थिरांक को असाइनमेंट को सिंटैक्स त्रुटि माना जाता है, जबकि अन्य भाषाओं में उन्हें वाक्यगत रूप से समान माना जाता है (दोनों केवल एक पहचानकर्ता), और उपचार में अंतर सिमेंटिक है (पहचानकर्ता को असाइनमेंट वाक्य रचनात्मक रूप से मान्य है, लेकिन यदि पहचानकर्ता स्थिरांक है तो यह शब्दार्थ से अमान्य है)।
एक स्थिर मान को एक बार परिभाषित किया जाता है और पूरे कार्यक्रम में इसे कई बार संदर्भित किया जा सकता है। एक ही मान को कई बार निर्दिष्ट करने के बजाय एक स्थिरांक का उपयोग करना कोड रखरखाव को आसान बना सकता है (जैसा कि स्वयं को दोहराना नहीं है) और एक मूल्य के लिए एक सार्थक नाम की आपूर्ति करके स्व-दस्तावेजीकरण किया जा सकता है, उदाहरण के लिए, PI
3.1415926 ।
शाब्दिक और मैक्रोज़ के साथ तुलना
डेटा मान को व्यक्त करने के कई मुख्य तरीके हैं जो प्रोग्राम के निष्पादन के दौरान नहीं बदलते हैं और जो विभिन्न प्रकार की प्रोग्रामिंग भाषाओं में सुसंगत है। एक बहुत ही बुनियादी तरीका प्रोग्राम कोड में केवल शाब्दिक संख्या, वर्ण या स्ट्रिंग लिखना है, जो C, C ++ और समान भाषाओं में सीधा है।
असेंबली भाषा में, अधिकांश माइक्रोप्रोसेसरों पर उपलब्ध तत्काल मोड निर्देशों का उपयोग करके शाब्दिक संख्याएं और वर्ण किए जाते हैं। तत्काल नाम निर्देश (कंप्यूटर विज्ञान) से तत्काल उपलब्ध होने वाले मूल्यों से आता है, क्योंकि मेमोरी पते को देखकर उन्हें अप्रत्यक्ष रूप से लोड करने का विरोध किया जाता है।[1] दूसरी ओर, माइक्रोप्रोसेसर की शब्द लंबाई से अधिक मूल्य, जैसे कि तार और सरणियाँ, अप्रत्यक्ष रूप से संभाले जाते हैं और असेंबलर सामान्यतः एक प्रोग्राम में ऐसी डेटा तालिकाओं को एम्बेड करने के लिए एक डेटा छद्म-ऑप प्रदान करते हैं।
एक अन्य तरीका एक प्रतीकात्मक मैक्रो को परिभाषित करना है। कई उच्च-स्तरीय प्रोग्रामिंग भाषाएं, और कई असेंबलर, एक मैक्रो सुविधा प्रदान करते हैं जहां प्रोग्रामर परिभाषित कर सकता है, सामान्यतः एक स्रोत फ़ाइल की प्रारम्भ में या एक अलग परिभाषा फ़ाइल में, विभिन्न मूल्यों के नाम। एक प्रीप्रोसेसर तब इन नामों को संकलित करने से पहले उपयुक्त मानों के साथ बदल देता है, जिसके परिणामस्वरूप तत्काल मोड के गति लाभ के साथ शाब्दिक रूप से उपयोग करने के समान कुछ होता है। चूंकि कोड को बनाए रखना कठिन हो सकता है जहां सभी मान शाब्दिक रूप से लिखे जाते हैं, यदि किसी मान का उपयोग किसी भी दोहराव या गैर-स्पष्ट तरीके से किया जाता है, तो इसे प्रायः मैक्रो के रूप में किया जाता है।
एक तीसरा तरीका एक वेरिएबल को "स्थिरांक" घोषित और परिभाषित करना है। एक वैश्विक वेरिएबल या स्थैतिक वेरिएबल घोषित किया जा सकता है (या असेंबली में परिभाषित प्रतीक) जैसे कि const
constant
स्थिर, या 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);
...
}
अभिव्यक्ति है कि स्थिरांक को आरंभीकृत किया जाता है, वे स्वयं स्थिर नहीं होते हैं। कार्यक्रम की वैधता या शब्दार्थ शुद्धता के लिए यहाँ स्थिरांकता का उपयोग आवश्यक नहीं है, लेकिन इसके तीन फायदे हैं:
- रीडर को यह स्पष्ट है कि एक बार सेट हो जाने के बाद वस्तु को और संशोधित नहीं किया जाएगा
- ऑब्जेक्ट के मूल्य को बदलने का प्रयास (बाद के प्रोग्रामर जो प्रोग्राम लॉजिक को पूरी तरह से नहीं समझते हैं) को कंपाइलर द्वारा अस्वीकार कर दिया जाएगा
- कंपाइलर यह जानकर कोड ऑप्टिमाइज़ेशन करने में सक्षम हो सकता है कि एक बार बनने के बाद ऑब्जेक्ट का मान नहीं बदलेगा।[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 और जेड/आर्किटेक्वेरिएबल प्लेटफॉर्म के लिए एड्रेस कॉन्सटेंट
टिप्पणियाँ
- ↑ 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.
- ↑ This is not universal: in Ada input parameters and loop parameters are implicitly constant, for instance.
संदर्भ
- ↑ Ex. IBM Systems Information. Instruction Set - Assembler Language Reference for PowerPC.
- ↑ Booch, Grady (1983). एडा के साथ सॉफ्टवेयर इंजीनियरिंग. Benjamin Cummings. pp. 116–117. ISBN 0-8053-0600-5.
- ↑ 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.
- ↑ 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.
- ↑
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.
- ↑ "Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle". Java.sun.com. 2013-08-14. Retrieved 2013-08-18.
- ↑ Microsoft Office XP Developer: Constant Names