संकल्पना (सामान्य प्रोग्रामिंग): Difference between revisions
(Created page with "सामान्य प्रोग्रामिंग में, एक अवधारणा एक प्रकार पर समर्थित संचाल...") |
No edit summary |
||
Line 1: | Line 1: | ||
[[सामान्य प्रोग्रामिंग]] में, | [[सामान्य प्रोग्रामिंग]] में, अवधारणा प्रकार पर समर्थित संचालन का विवरण है, जिसमें वाक्यविन्यास और शब्दार्थ शामिल हैं। इस प्रकार, अवधारणाएँ [[अमूर्त प्रकार]]ों से संबंधित होती हैं लेकिन अवधारणाओं को उपप्रकार संबंध की आवश्यकता नहीं होती है। | ||
==भाषा प्रयोग== | ==भाषा प्रयोग== | ||
यह शब्द [[मानक टेम्पलेट लाइब्रेरी]] के लिए 1998 से ही प्रयोग में था,<ref>Austern, M.H. ''Generic programming and the STL: using and extending the C++ Standard Template Library''. 1998. pp 17–18</ref> क्योंकि यह उन पहले पुस्तकालयों में से | यह शब्द [[मानक टेम्पलेट लाइब्रेरी]] के लिए 1998 से ही प्रयोग में था,<ref>Austern, M.H. ''Generic programming and the STL: using and extending the C++ Standard Template Library''. 1998. pp 17–18</ref> क्योंकि यह उन पहले पुस्तकालयों में से था जो बड़े पैमाने पर टेम्पलेट्स का उपयोग करता था। अवधारणा शब्द (और इसकी लोकप्रियता) का श्रेय [[अलेक्जेंडर स्टेपानोव]] को दिया जाता है,<ref>[https://isocpp.org/blog/2016/02/a-bit-of-background-for-concepts-and-cpp17-bjarne-stroustrup a bit of background for concepts and C++17—Bjarne Stroustrup], by Bjarne Stroustrup | Feb 26, 2016</ref><ref>[https://isocpp.org/blog/2016/01/alex-stepanov Alex Stepanov], by Bjarne Stroustrup | Jan 21, 2016</ref> एसटीएल के प्राथमिक डिजाइनर। | ||
C++ 1998 मानक में, कॉन्सेप्ट शब्द को विशेष प्रकार की आवश्यकताओं का | C++ 1998 मानक में, कॉन्सेप्ट शब्द को विशेष प्रकार की आवश्यकताओं का सरल विवरण देने के लिए पेश किया गया था, जो आमतौर पर टेम्पलेट पैरामीटर होता है। इसे भाषा में स्पष्ट रूप से एन्कोड नहीं किया गया था - अवधारणा केवल इस बात से व्यक्त की गई थी कि उस प्रकार की वस्तुओं पर किस प्रकार के संचालन का प्रयास किया जाता है और क्या काम करने की उम्मीद की जाती है (अर्थात, सही ढंग से संकलित करना)। [[C++11]] में स्पष्ट भाषा सुविधा के रूप में कॉन्सेप्ट्स (C++) को जोड़ने का प्रस्ताव था, हालांकि इसे तैयार नहीं होने के कारण अस्वीकार कर दिया गया था। [[C++20]] ने अंततः अवधारणा के परिष्कृत डिज़ाइन को स्वीकार कर लिया। | ||
चूंकि [[जावा (प्रोग्रामिंग भाषा)]] और सी शार्प (प्रोग्रामिंग भाषा)|सी# में जेनेरिक में [[सी++]] के [[टेम्पलेट (सी++)]]सी++) से कुछ समानताएं हैं, इसलिए वहां अवधारणाओं की भूमिका [[ प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग) ]] द्वारा निभाई जाती है। हालाँकि, अवधारणाओं और इंटरफेस के बीच | चूंकि [[जावा (प्रोग्रामिंग भाषा)]] और सी शार्प (प्रोग्रामिंग भाषा)|सी# में जेनेरिक में [[सी++]] के [[टेम्पलेट (सी++)]]सी++) से कुछ समानताएं हैं, इसलिए वहां अवधारणाओं की भूमिका [[ प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग) ]] द्वारा निभाई जाती है। हालाँकि, अवधारणाओं और इंटरफेस के बीच महत्वपूर्ण अंतर है: जब किसी विशेष इंटरफ़ेस को लागू करने के लिए टेम्पलेट पैरामीटर की आवश्यकता होती है, तो मिलान प्रकार केवल वर्ग हो सकता है जो उस इंटरफ़ेस को (स्पष्ट रूप से) लागू करता है। अवधारणाएँ अधिक लचीलापन लाती हैं क्योंकि उन्हें दो तरीकों से संतुष्ट किया जा सकता है: | ||
* अवधारणा मानचित्र का उपयोग करके स्पष्ट रूप से संतुष्ट के रूप में परिभाषित किया गया है (इंटरफ़ेस के विपरीत, प्रकार को अलग से परिभाषित किया गया है) | * अवधारणा मानचित्र का उपयोग करके स्पष्ट रूप से संतुष्ट के रूप में परिभाषित किया गया है (इंटरफ़ेस के विपरीत, प्रकार को अलग से परिभाषित किया गया है) | ||
* ऑटो अवधारणाओं के लिए स्पष्ट रूप से परिभाषित, जिसका उपयोग अंतर्निहित प्रकारों और अन्य प्रकारों के लिए भी किया जा सकता है जो इस उपयोग के लिए पूर्वनिर्धारित नहीं थे | * ऑटो अवधारणाओं के लिए स्पष्ट रूप से परिभाषित, जिसका उपयोग अंतर्निहित प्रकारों और अन्य प्रकारों के लिए भी किया जा सकता है जो इस उपयोग के लिए पूर्वनिर्धारित नहीं थे | ||
लेकिन C# भाषा में कई संरचनाएं हैं जहां उपयोग किए गए प्रकार को परिभाषित इंटरफ़ेस को स्पष्ट रूप से लागू करने की आवश्यकता नहीं है, इसे केवल संबंधित पैटर्न से मेल खाना आवश्यक है (हालांकि, इन पैटर्न को अवधारणाएं नहीं कहा जाता है)। जैसे फ़ोरैच लूप|<code>foreach</code>पुनरावृत्ति कथन पुनरावृत्त वस्तु को किसी भी प्रकार का होने की अनुमति देता है, जब तक कि यह | लेकिन C# भाषा में कई संरचनाएं हैं जहां उपयोग किए गए प्रकार को परिभाषित इंटरफ़ेस को स्पष्ट रूप से लागू करने की आवश्यकता नहीं है, इसे केवल संबंधित पैटर्न से मेल खाना आवश्यक है (हालांकि, इन पैटर्न को अवधारणाएं नहीं कहा जाता है)। जैसे फ़ोरैच लूप|<code>foreach</code>पुनरावृत्ति कथन पुनरावृत्त वस्तु को किसी भी प्रकार का होने की अनुमति देता है, जब तक कि यह उपयुक्त कार्यान्वयन करता है <code>GetEnumerator</code> तरीका।<ref>[https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/statements#the-foreach-statement ''C# 6.0 draft specification'', ''The foreach statement'']</ref> (तुलना करें <code>using</code> वह कथन जिसे कार्यान्वित करने के लिए संसाधन की आवश्यकता होती है <code>System.IDisposable</code> इंटरफेस।<ref>[https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/statements#the-using-statement ''C# 6.0 draft specification'', ''The using statement'']</ref>) | ||
[[निम (प्रोग्रामिंग भाषा)]] मनमाने ढंग से संकलन-समय बूलियन विधेय की | [[निम (प्रोग्रामिंग भाषा)]] मनमाने ढंग से संकलन-समय बूलियन विधेय की श्रृंखला के रूप में अवधारणाओं को लागू करता है।<ref>{{Cite web |title=निम प्रायोगिक विशेषताएं|url=https://nim-lang.org/docs/manual_experimental.html#concepts |access-date=2023-06-19 |website=nim-lang.org}}</ref> | ||
अवधारणाओं के समान कुछ लागू करने वाली | अवधारणाओं के समान कुछ लागू करने वाली अन्य भाषा [[हास्केल (प्रोग्रामिंग भाषा)]] है, जहां फीचर को [[ प्रकार वर्ग ]] कहा जाता है। | ||
==उदाहरण== | ==उदाहरण== | ||
Line 20: | Line 20: | ||
कुल ऑर्डरिंग अवधारणा के शब्दार्थ का वर्णन करती है <code><</code> ऑपरेटर। | कुल ऑर्डरिंग अवधारणा के शब्दार्थ का वर्णन करती है <code><</code> ऑपरेटर। | ||
प्रकार पूरी तरह से आदेश दिया जाता है जब <code><</code> द्विआधारी विधेय है और निम्नलिखित गुणों को संतुष्ट करता है:<ref>{{cite book |last=Stepanov |first=Alexander |date=2009 |title=प्रोग्रामिंग के तत्व|publisher=Addison-Wesley Professional |page=49 |isbn=9780321635372}}</ref><ref>[https://www.jmeiners.com/efficient-programming-with-components/06_min_max.html#Reviewing-Total-Orderings Total Orderings - Efficient Programming with Components]</ref> | |||
*प्रति-प्रतिक्रियाशील: <code>!(a < a)</code> किसी भी मूल्य के लिए <code>a</code>. | *प्रति-प्रतिक्रियाशील: <code>!(a < a)</code> किसी भी मूल्य के लिए <code>a</code>. | ||
* सकर्मक: यदि <code>a < b</code> और <code>b < c</code> तब <code>a < c</code>. | * सकर्मक: यदि <code>a < b</code> और <code>b < c</code> तब <code>a < c</code>. | ||
Line 42: | Line 42: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
'''इटरेटर''' | |||
यदि प्रकार <code>I</code> C++ में ट्रिवियल इटरेटर अवधारणा को संतुष्ट करता है, और <code>i</code> प्रकार का है <code>I</code>, निम्नलिखित संगत शब्दार्थ के साथ मान्य अभिव्यक्तियाँ हैं:<ref>[http://www.martinbroadhurst.com/stl/trivial.html Trivial Iterator<!-- Bot generated title -->]</ref> | |||
यदि | |||
* <code>I i</code> डिफ़ॉल्ट निर्माण. | * <code>I i</code> डिफ़ॉल्ट निर्माण. | ||
* <code>*i</code> किसी प्रकार में परिवर्तनीय होना चाहिए <code>T</code>. | * <code>*i</code> किसी प्रकार में परिवर्तनीय होना चाहिए <code>T</code>. |
Revision as of 18:16, 2 August 2023
सामान्य प्रोग्रामिंग में, अवधारणा प्रकार पर समर्थित संचालन का विवरण है, जिसमें वाक्यविन्यास और शब्दार्थ शामिल हैं। इस प्रकार, अवधारणाएँ अमूर्त प्रकारों से संबंधित होती हैं लेकिन अवधारणाओं को उपप्रकार संबंध की आवश्यकता नहीं होती है।
भाषा प्रयोग
यह शब्द मानक टेम्पलेट लाइब्रेरी के लिए 1998 से ही प्रयोग में था,[1] क्योंकि यह उन पहले पुस्तकालयों में से था जो बड़े पैमाने पर टेम्पलेट्स का उपयोग करता था। अवधारणा शब्द (और इसकी लोकप्रियता) का श्रेय अलेक्जेंडर स्टेपानोव को दिया जाता है,[2][3] एसटीएल के प्राथमिक डिजाइनर।
C++ 1998 मानक में, कॉन्सेप्ट शब्द को विशेष प्रकार की आवश्यकताओं का सरल विवरण देने के लिए पेश किया गया था, जो आमतौर पर टेम्पलेट पैरामीटर होता है। इसे भाषा में स्पष्ट रूप से एन्कोड नहीं किया गया था - अवधारणा केवल इस बात से व्यक्त की गई थी कि उस प्रकार की वस्तुओं पर किस प्रकार के संचालन का प्रयास किया जाता है और क्या काम करने की उम्मीद की जाती है (अर्थात, सही ढंग से संकलित करना)। C++11 में स्पष्ट भाषा सुविधा के रूप में कॉन्सेप्ट्स (C++) को जोड़ने का प्रस्ताव था, हालांकि इसे तैयार नहीं होने के कारण अस्वीकार कर दिया गया था। C++20 ने अंततः अवधारणा के परिष्कृत डिज़ाइन को स्वीकार कर लिया।
चूंकि जावा (प्रोग्रामिंग भाषा) और सी शार्प (प्रोग्रामिंग भाषा)|सी# में जेनेरिक में सी++ के टेम्पलेट (सी++)सी++) से कुछ समानताएं हैं, इसलिए वहां अवधारणाओं की भूमिका प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग) द्वारा निभाई जाती है। हालाँकि, अवधारणाओं और इंटरफेस के बीच महत्वपूर्ण अंतर है: जब किसी विशेष इंटरफ़ेस को लागू करने के लिए टेम्पलेट पैरामीटर की आवश्यकता होती है, तो मिलान प्रकार केवल वर्ग हो सकता है जो उस इंटरफ़ेस को (स्पष्ट रूप से) लागू करता है। अवधारणाएँ अधिक लचीलापन लाती हैं क्योंकि उन्हें दो तरीकों से संतुष्ट किया जा सकता है:
- अवधारणा मानचित्र का उपयोग करके स्पष्ट रूप से संतुष्ट के रूप में परिभाषित किया गया है (इंटरफ़ेस के विपरीत, प्रकार को अलग से परिभाषित किया गया है)
- ऑटो अवधारणाओं के लिए स्पष्ट रूप से परिभाषित, जिसका उपयोग अंतर्निहित प्रकारों और अन्य प्रकारों के लिए भी किया जा सकता है जो इस उपयोग के लिए पूर्वनिर्धारित नहीं थे
लेकिन C# भाषा में कई संरचनाएं हैं जहां उपयोग किए गए प्रकार को परिभाषित इंटरफ़ेस को स्पष्ट रूप से लागू करने की आवश्यकता नहीं है, इसे केवल संबंधित पैटर्न से मेल खाना आवश्यक है (हालांकि, इन पैटर्न को अवधारणाएं नहीं कहा जाता है)। जैसे फ़ोरैच लूप|foreach
पुनरावृत्ति कथन पुनरावृत्त वस्तु को किसी भी प्रकार का होने की अनुमति देता है, जब तक कि यह उपयुक्त कार्यान्वयन करता है GetEnumerator
तरीका।[4] (तुलना करें using
वह कथन जिसे कार्यान्वित करने के लिए संसाधन की आवश्यकता होती है System.IDisposable
इंटरफेस।[5])
निम (प्रोग्रामिंग भाषा) मनमाने ढंग से संकलन-समय बूलियन विधेय की श्रृंखला के रूप में अवधारणाओं को लागू करता है।[6] अवधारणाओं के समान कुछ लागू करने वाली अन्य भाषा हास्केल (प्रोग्रामिंग भाषा) है, जहां फीचर को प्रकार वर्ग कहा जाता है।
उदाहरण
कुल ऑर्डर
कुल ऑर्डरिंग अवधारणा के शब्दार्थ का वर्णन करती है <
ऑपरेटर।
प्रकार पूरी तरह से आदेश दिया जाता है जब <
द्विआधारी विधेय है और निम्नलिखित गुणों को संतुष्ट करता है:[7][8]
- प्रति-प्रतिक्रियाशील:
!(a < a)
किसी भी मूल्य के लिएa
. - सकर्मक: यदि
a < b
औरb < c
तबa < c
. - विरोधी सममिति: यदि
a < b
तब!(b < a)
. - कुल: यदि
a != b
तबa < b
याb < a
.
कई एल्गोरिदम ठीक से काम करने के लिए इन गुणों पर भरोसा करते हैं।
उदाहरण के लिए min
फ़ंक्शन को पूरी तरह से ऑर्डर किए गए प्रकारों पर सुरक्षित रूप से परिभाषित किया जा सकता है:
// requires: T satisfies Totally Ordered
template <typename T>
T min(T a, T b) {
// < is defined.
if (b < a) {
return b;
} else {
// !(b < a) implies a == b or a < b
return a;
}
}
इटरेटर
यदि प्रकार I
C++ में ट्रिवियल इटरेटर अवधारणा को संतुष्ट करता है, और i
प्रकार का है I
, निम्नलिखित संगत शब्दार्थ के साथ मान्य अभिव्यक्तियाँ हैं:[9]
I i
डिफ़ॉल्ट निर्माण.*i
किसी प्रकार में परिवर्तनीय होना चाहिएT
.i->m
यदि मान्य है(*i).m
है।
यह भी देखें
- प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)
- अवधारणाएँ (C++)
- इंटरफ़ेस (जावा)
- क्लास टाइप करें
संदर्भ
- ↑ Austern, M.H. Generic programming and the STL: using and extending the C++ Standard Template Library. 1998. pp 17–18
- ↑ a bit of background for concepts and C++17—Bjarne Stroustrup, by Bjarne Stroustrup | Feb 26, 2016
- ↑ Alex Stepanov, by Bjarne Stroustrup | Jan 21, 2016
- ↑ C# 6.0 draft specification, The foreach statement
- ↑ C# 6.0 draft specification, The using statement
- ↑ "निम प्रायोगिक विशेषताएं". nim-lang.org. Retrieved 2023-06-19.
- ↑ Stepanov, Alexander (2009). प्रोग्रामिंग के तत्व. Addison-Wesley Professional. p. 49. ISBN 9780321635372.
- ↑ Total Orderings - Efficient Programming with Components
- ↑ Trivial Iterator