मेटाप्रोग्रामिंग: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(13 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Short description|Programming paradigm}}
{{Short description|Programming paradigm}}
{{About|
'''मेटाप्रोग्रामिंग''' प्रोग्रामिंग प्रौद्योगिकी है जिसमें [[कंप्यूटर प्रोग्राम]] अन्य प्रोग्रामों को अपने डेटा के रूप में व्यवहार करने की क्षमता रखते हैं। इसका अर्थ है कि अन्य प्रोग्रामों को पढ़ने, उत्पन्न करने, विश्लेषण करने या परिवर्तित करने के लिए डिज़ाइन किया जा सकता है, एवं यहां तक ​​कि चलते समय स्वयं को संशोधित भी किया जा सकता है।<ref>{{cite web|url=https://handbook.unimelb.edu.au/view/2013/COMP90053 |title=Course on Program Analysis and Transformation|author=Harald Sondergaard |access-date=18 September 2014}}</ref><ref>{{cite book |last1=Czarnecki |first1=Krzysztof |author-link1=Krzysztof Czarnecki |last2=Eisenecker |first2=Ulrich W. |author-link2=Ulrich W. Eisenecker |date=2000 |title=Generative Programming|isbn=0-201-30977-7}}</ref> कुछ स्थितियों में, यह प्रोग्रामर को समाधान व्यक्त करने के लिए कोड की पंक्तियों की संख्या को अर्घ्य करने की अनुमति देता है, विकास के समय को अर्घ्य करता है।<ref>{{cite web|last1=Walker|first1=Max|title=The Art of Metaprogrmming in Java|url=https://newcircle.com/s/post/1267/the_art_of_metaprogramming_in_java_video_jaxconf|website=New Circle|access-date=28 January 2014}}</ref> यह कार्यक्रमों को पुनर्संकलन के बिना नई स्थितियों को कुशलतापूर्वक विधारण के लिए अधिक कोमलता की भी अनुमति देता है।
कंप्यूटर प्रोग्रामिंग तकनीक|प्रबंधन प्रौद्योगिकी|
चार्ल्स सिमोनी}}
{{Programming paradigms}}
मेटाप्रोग्रामिंग प्रोग्रामिंग प्रौद्योगिकी है जिसमें [[कंप्यूटर प्रोग्राम]] अन्य प्रोग्रामों को अपने डेटा के रूप में व्यवहार करने की क्षमता रखते हैं। इसका अर्थ है कि अन्य प्रोग्रामों को पढ़ने, उत्पन्न करने, विश्लेषण करने या परिवर्तित करने के लिए डिज़ाइन किया जा सकता है,एवं यहां तक ​​कि चलते समय स्वयं को संशोधित भी किया जा सकता है।<ref>{{cite web|url=https://handbook.unimelb.edu.au/view/2013/COMP90053 |title=Course on Program Analysis and Transformation|author=Harald Sondergaard |access-date=18 September 2014}}</ref><ref>{{cite book |last1=Czarnecki |first1=Krzysztof |author-link1=Krzysztof Czarnecki |last2=Eisenecker |first2=Ulrich W. |author-link2=Ulrich W. Eisenecker |date=2000 |title=Generative Programming|isbn=0-201-30977-7}}</ref> कुछ स्थितियों में, यह प्रोग्रामर को समाधान व्यक्त करने के लिए कोड की पंक्तियों की संख्या को कम करने की अनुमति देता है, विकास के समय को अर्घ्य करता है।<ref>{{cite web|last1=Walker|first1=Max|title=The Art of Metaprogrmming in Java|url=https://newcircle.com/s/post/1267/the_art_of_metaprogramming_in_java_video_jaxconf|website=New Circle|access-date=28 January 2014}}</ref> यह कार्यक्रमों को पुनर्संकलन के बिना नई स्थितियों को कुशलतापूर्वक विधारण के लिए अधिक कोमलता की भी अनुमति देता है।


मेटाप्रोग्रामिंग का उपयोग रन टाइम (प्रोग्राम जीवनचक्र चरण) से कम्प्यूटेशंस को स्थानांतरित करने के लिए किया जा सकता है। रन-टाइम से [[संकलन समय]] तक, कंपाइल-टाइम_फंक्शन_एक्सेक्यूशन का उपयोग करके कोड उत्पन्न करने के लिए, एवं [[स्व-संशोधित कोड]] को सक्षम करने के लिए प्रोग्रामिंग भाषा की अपनी मेटल भाषा होने की क्षमता को [[प्रतिबिंब (कंप्यूटर विज्ञान)]] कहा जाता है।<ref>{{cite web|last1=Krauss|first1=Aaron|title=Programming Concepts: Type Introspection and Reflection|url=https://thesocietea.org/2016/02/programming-concepts-type-introspection-and-reflection/|website=The Societa|access-date=14 September 2014}}</ref> परावर्तन मेटाप्रोग्रामिंग की सुविधा के लिए मूल्यवान भाषा विशेषता है।
मेटाप्रोग्रामिंग का उपयोग रन टाइम (प्रोग्राम जीवनचक्र चरण) से कम्प्यूटेशंस को स्थानांतरित करने के लिए किया जा सकता है। रन-टाइम से [[संकलन समय]] तक, कंपाइल-समय_प्रोग्राम_एक्सेक्यूशन का उपयोग करके कोड उत्पन्न करने के लिए, एवं [[स्व-संशोधित कोड]] को सक्षम करने के लिए प्रोग्रामिंग भाषा की अपनी मेटल भाषा होने की क्षमता को [[प्रतिबिंब (कंप्यूटर विज्ञान)]] कहा जाता है।<ref>{{cite web|last1=Krauss|first1=Aaron|title=Programming Concepts: Type Introspection and Reflection|url=https://thesocietea.org/2016/02/programming-concepts-type-introspection-and-reflection/|website=The Societa|access-date=14 September 2014}}</ref> परावर्तन मेटाप्रोग्रामिंग की सुविधा के लिए मूल्यवान भाषा विशेषता है।


मेटाप्रोग्रामिंग 1970 एवं 1980 के दशक में लिस्प (LISP) जैसी सूची प्रसंस्करण भाषाओं का उपयोग करके लोकप्रिय था। 1980 के दशक में [[[[लिस्प]] मशीनों]] लोकप्रिय थीं एवं उन अनुप्रयोगों को सक्षम करती थीं जो कोड को संसाधित कर सकते थे। वे प्रायः कृत्रिम बुद्धिमत्ता अनुप्रयोगों के लिए उपयोग किए जाते थे।
मेटाप्रोग्रामिंग 1970 एवं 1980 के दशक में लिस्प (LISP) जैसी सूची प्रसंस्करण भाषाओं का उपयोग करके लोकप्रिय था। 1980 के दशक में [[[[लिस्प]] मशीन]] लोकप्रिय थीं एवं उन अनुप्रयोगों को सक्षम करती थीं जो कोड को संसाधित कर सकते थे। वे प्रायः कृत्रिम बुद्धिमत्ता अनुप्रयोगों के लिए उपयोग किए जाते थे।


== दृष्टिकोण ==
== दृष्टिकोण ==
Line 14: Line 10:


मेटाप्रोग्रामिंग सामान्यतः तीन उपायों में कार्य करता है।<ref>{{cite web|last1=Joshi|first1=Prateek|title=What Is Metaprogramming? – Part 2/2|url=https://prateekvjoshi.com/2014/04/05/what-is-metaprogramming-part-22/|website=Perpetual Enigma|date=5 April 2014|access-date=14 August 2014}}</ref>
मेटाप्रोग्रामिंग सामान्यतः तीन उपायों में कार्य करता है।<ref>{{cite web|last1=Joshi|first1=Prateek|title=What Is Metaprogramming? – Part 2/2|url=https://prateekvjoshi.com/2014/04/05/what-is-metaprogramming-part-22/|website=Perpetual Enigma|date=5 April 2014|access-date=14 August 2014}}</ref>
# प्रथम उपाए रन-टाइम इंजन के इंटर्नल्स को प्रोग्रामिंग कोड के लिए [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]] (एपीआई) के माध्यम से प्रकाशित करना है, जैसे कि, नेट (NET) फ्रेमवर्क | नेट (NET) माइक्रोसॉफ्ट इंटरमीडिएट भाषा एमिटर के लिए किया जाता है।
# प्रथम उपाए रन-टाइम इंजन के इंटर्नल्स को प्रोग्रामिंग कोड के लिए [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]] (एपीआई) के माध्यम से प्रकाशित करना है, जैसे कि, नेट (NET) फ्रेमवर्क, नेट (NET) माइक्रोसॉफ्ट इंटरमीडिएट भाषा एमिटर के लिए किया जाता है।
# दूसरा दृष्टिकोण अभिव्यक्ति का गतिशील निष्पादन है जिसमें प्रोग्रामिंग कमांड होते हैं, जो प्रायः स्ट्रिंग्स से बने होते हैं, किन्तु तर्क या संदर्भ का उपयोग करने वाले अन्य उपायों से भी हो सकते हैं, जैसे कि जावास्क्रिप्ट।<ref>for example, instance_eval in [[Ruby (programming language)|Ruby]] takes a string or an anonymous function. {{cite web |url=http://www.ruby-doc.org/core-1.9.3/BasicObject.html#method-i-instance_eval |title=Rdoc for Class: BasicObject (Ruby 1.9.3) - instance_eval |access-date=30 December 2011}}</ref> इस प्रकार प्रोग्राम लिख सकते हैं। यद्यपि दोनों दृष्टिकोणों का उपयोग भाषा में किया जा सकता है, अधिकांश भाषाएँ एक या दूसरे की ओर अग्रेषित हैं।
# दूसरा दृष्टिकोण अभिव्यक्ति का गतिशील निष्पादन है जिसमें प्रोग्रामिंग कमांड होते हैं, जो प्रायः स्ट्रिंग्स से बने होते हैं, किन्तु तर्क या संदर्भ का उपयोग करने वाले अन्य उपायों से भी हो सकते हैं, जैसे कि जावास्क्रिप्ट है।<ref>for example, instance_eval in [[Ruby (programming language)|Ruby]] takes a string or an anonymous function. {{cite web |url=http://www.ruby-doc.org/core-1.9.3/BasicObject.html#method-i-instance_eval |title=Rdoc for Class: BasicObject (Ruby 1.9.3) - instance_eval |access-date=30 December 2011}}</ref> इस प्रकार प्रोग्राम लिख सकते हैं। यद्यपि दोनों दृष्टिकोणों का उपयोग भाषा में किया जा सकता है, अधिकांश भाषाएँ एक या दूसरे की ओर अग्रेषित हैं।
# तीसरा दृष्टिकोण पूर्ण रूप से भाषा के बाहर चरण रखना है। सामान्य प्रयोजन [[कार्यक्रम परिवर्तन]] प्रणाली जैसे संकलक, जो भाषा के विवरण को स्वीकार करते हैं एवं उन भाषाओं पर इच्छानुसार परिवर्तन करते हैं, सामान्य मेटाप्रोग्रामिंग के प्रत्यक्ष कार्यान्वयन हैं। यह मेटाप्रोग्रामिंग को वस्तुतः किसी भी लक्ष्य भाषा पर लागू करने की अनुमति देता है, उस लक्ष्य भाषा की स्वयं कोई मेटाप्रोग्रामिंग क्षमता हो। कोई इसे स्कीम (प्रोग्रामिंग भाषा) के साथ कार्य पर देख सकता है एवं यह कैसे [[सी (प्रोग्रामिंग भाषा)]] में आने वाली कुछ सीमाओं से व्यवहार की अनुमति देता है, जो सी का विस्तार करने के लिए स्कीम भाषा का भाग था।<ref>{{cite web|title=Art of Metaprogramming|website=[[IBM]] |url=http://www.ibm.com/developerworks/library/l-metaprog1/}}</ref>
# तीसरा दृष्टिकोण पूर्ण रूप से भाषा के बाहर चरण रखना है। सामान्य प्रयोजन [[कार्यक्रम परिवर्तन]] प्रणाली जैसे संकलक, जो भाषा के विवरण को स्वीकार करते हैं एवं उन भाषाओं पर इच्छानुसार परिवर्तन करते हैं, सामान्य मेटाप्रोग्रामिंग के प्रत्यक्ष कार्यान्वयन हैं। यह मेटाप्रोग्रामिंग को वस्तुतः किसी भी लक्ष्य भाषा पर प्रारम्भ करने की अनुमति देता है, उस लक्ष्य भाषा की स्वयं कोई मेटाप्रोग्रामिंग क्षमता हो। कोई इसे स्कीम (प्रोग्रामिंग भाषा) के साथ कार्य पर देख सकता है एवं यह कैसे [[सी (प्रोग्रामिंग भाषा)|सी (C) (प्रोग्रामिंग भाषा)]] में आने वाली कुछ सीमाओं से व्यवहार की अनुमति देता है, जो सी (C) का विस्तार करने के लिए स्कीम भाषा का भाग था।<ref>{{cite web|title=Art of Metaprogramming|website=[[IBM]] |url=http://www.ibm.com/developerworks/library/l-metaprog1/}}</ref>
लिस्प (प्रोग्रामिंग भाषा) संभवतः मेटाप्रोग्रामिंग सुविधाओं के साथ सर्वोत्कृष्ट भाषा है, दोनों इसकी ऐतिहासिक उदाहरण के कारण एवं इसकी मेटाप्रोग्रामिंग की सरलता एवं शक्ति के कारण लिस्प मेटाप्रोग्रामिंग में, अनकोट ऑपरेटर (सामान्यतः अल्पविराम) कोड का परिचय देता है जिसका मूल्यांकन रन टाइम के अतिरिक्त प्रोग्राम डेफिनिशन टाइम पर किया जाता है; लिस्प देखें (प्रोग्रामिंग भाषा) # स्व-मूल्यांकन प्रपत्र एवं उद्धरण | लिस्प में स्व-मूल्यांकन फ़ॉर्म एवं उद्धरण मेटाप्रोग्रामिंग भाषा इस प्रकार प्रोग्रामिंग भाषा के समान है, एवं उपस्थित लिस्प रूटीन को मेटाप्रोग्रामिंग के लिए पुन: उपयोग किया जा सकता है, यदि वांछित हो। प्रोग्राम में दो भाषाओ को सम्मिलित करके इस दृष्टिकोण को अन्य भाषाओं में लागू किया गया है, जो प्रोग्राम के डेटा के साथ उपयुक्त कार्य करता है। कुछ सामान्य उच्च-स्तरीय भाषाओं के लिए इसके जैसे कार्यान्वयन हैं, जैसे [[वस्तु पास्कल]] के लिए  [[RemObjects|रेमऑब्जेक्ट्स (RemObjects)]] की [[पास्कल स्क्रिप्ट]] होती हैI
लिस्प (प्रोग्रामिंग भाषा) संभवतः मेटाप्रोग्रामिंग सुविधाओं के साथ सर्वोत्कृष्ट भाषा है, दोनों इसकी ऐतिहासिक उदाहरण के कारण एवं इसकी मेटाप्रोग्रामिंग की सरलता एवं शक्ति के कारण लिस्प मेटाप्रोग्रामिंग में, अनकोट ऑपरेटर (सामान्यतः अल्प विराम) कोड का परिचय देता है जिसका मूल्यांकन रन टाइम के अतिरिक्त प्रोग्राम डेफिनिशन टाइम पर किया जाता है; लिस्प देखें (प्रोग्रामिंग भाषा) स्व-मूल्यांकन प्रपत्र एवं उद्धरण लिस्प में स्व-मूल्यांकन फ़ॉर्म एवं उद्धरण मेटाप्रोग्रामिंग भाषा इस प्रकार प्रोग्रामिंग भाषा के समान है, एवं उपस्थित लिस्प रूटीन को मेटाप्रोग्रामिंग के लिए पुन: उपयोग किया जा सकता है, यदि वांछित हो। प्रोग्राम में दो भाषाओ को सम्मिलित करके इस दृष्टिकोण को अन्य भाषाओं में प्रारम्भ किया गया है, जो प्रोग्राम के डेटा के साथ उपयुक्त कार्य करता है। कुछ सामान्य उच्च-स्तरीय भाषाओं के लिए इसके जैसे कार्यान्वयन हैं, जैसे [[वस्तु पास्कल]] के लिए  [[RemObjects|रेमऑब्जेक्ट्स (RemObjects)]] की [[पास्कल स्क्रिप्ट]] होती हैI


== उपयोग ==
== उपयोग ==


=== कोड जनरेशन ===
=== कोड जनरेशन ===
मेटाप्रोग्राम का एक सरल उदाहरण यह [[यूनिक्स खोल]] [[स्क्रिप्ट (कंप्यूटर प्रोग्रामिंग)]] है, जो [[जनरेटिव प्रोग्रामिंग]] का एक उदाहरण है:
मेटाप्रोग्राम का सरल उदाहरण यह [[यूनिक्स खोल|यूनिक्स शेल]] [[स्क्रिप्ट (कंप्यूटर प्रोग्रामिंग)]] है, जो [[जनरेटिव प्रोग्रामिंग]] का उदाहरण है:
#!/bin/sh  # metaprogram


<वाक्यविन्यास लैंग = बैश>
echo '#!/bin/sh' > program
#!/बिन/श
for i in $(seq 992)
# मेटाप्रोग्राम
do
इको '#!/बिन/'> प्रोग्राम
    echo "echo $i" >> program
मेरे लिए $(seq 992) में
done
करना
chmod +x program
    इको इको $i >> प्रोग्राम
यह स्क्रिप्ट (या प्रोग्राम) नयी 993-लाइन प्रोग्राम बनाता है जो 1-992 नंबर प्रिंट करता है। यह केवल उदाहरण है कि अधिक कोड लिखने के लिए कोड का उपयोग कैसे करें; यह संख्याओं की सूची को प्रिंट करने का अधिक लाभदायक उपाय नहीं है। प्रोग्रामर इस मेटाप्रोग्राम को मिनट से भी अर्घ्य समय में लिख एवं निष्पादित कर सकता है, एवं उस समय की मात्रा में कोड की 1000 से अधिक पंक्तियाँ उत्पन्न करेगा। क्विन (कंप्यूटिंग) विशेष प्रकार का मेटाप्रोग्राम है जो स्वयं के स्रोत कोड को स्वयं आउटपुट के रूप में उत्पन्न करता है। क्वीन्स (Quines) सामान्यतः केवल मनोरंजक या सैद्धांतिक रुचि के होते हैं।
पूर्ण
चामोद + एक्स कार्यक्रम
</वाक्यविन्यास हाइलाइट>


यह स्क्रिप्ट (या प्रोग्राम) एक नया 993-लाइन प्रोग्राम बनाता है जो 1-992 नंबर प्रिंट करता है। यह केवल एक उदाहरण है कि अधिक कोड लिखने के लिए कोड का उपयोग कैसे करें; यह संख्याओं की सूची को प्रिंट करने का सबसे कारगर तरीका नहीं है। बहरहाल, एक प्रोग्रामर इस मेटाप्रोग्राम को एक मिनट से भी कम समय में लिखएवं निष्पादित कर सकता है,एवं उस समय की मात्रा में कोड की 1000 से अधिक पंक्तियाँ उत्पन्न करेगा।
सभी मेटाप्रोग्रामिंग में जनरेटिव प्रोग्रामिंग सम्मिलित नहीं है। यदि प्रोग्राम रनटाइम पर संशोधित किए जा सकते हैं या वृद्धिशील संकलन उपलब्ध है (जैसे C Sharp (सी शार्प) (प्रोग्रामिंग भाषा) सी [[फोर्थ (प्रोग्रामिंग भाषा)]] (C Forth), फ्रिंक (प्रोग्रामिंग भाषा), [[ग्रूवी (प्रोग्रामिंग भाषा)]], [[जावास्क्रिप्ट]], लिस्प (प्रोग्रामिंग भाषा), [[अमृत ​​​​(प्रोग्रामिंग भाषा)]], [[लुआ (प्रोग्रामिंग भाषा)]], [[निम (प्रोग्रामिंग भाषा)]], [[पर्ल]], [[पीएचपी]], पायथन (प्रोग्रामिंग भाषा), आरईबीओएल, [[रूबी (प्रोग्रामिंग भाषा)]], [[जंग (प्रोग्रामिंग भाषा)|रस्ट (प्रोग्रामिंग भाषा)]], [[एसएएस (सॉफ्टवेयर)]], स्मॉलटॉक, एवं [[टीसीएल]]), जो प्रौद्योगिकीयो का उपयोग वास्तव में स्रोत कोड उत्पन्न किए बिना मेटाप्रोग्रामिंग करने के लिए किया जा सकता है।


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


सभी मेटाप्रोग्रामिंग में जनरेटिव प्रोग्रामिंग शामिल नहीं है। यदि प्रोग्राम रनटाइम पर संशोधित किए जा सकते हैं या यदि वृद्धिशील संकलन उपलब्ध है (जैसे सी शार्प (प्रोग्रामिंग भाषा) | सी #, [[फोर्थ (प्रोग्रामिंग भाषा)]], फ्रिंक (प्रोग्रामिंग भाषा), [[ग्रूवी (प्रोग्रामिंग भाषा)]], [[जावास्क्रिप्ट]], लिस्प (प्रोग्रामिंग भाषा) , [[अमृत ​​​​(प्रोग्रामिंग भाषा)]], [[लुआ (प्रोग्रामिंग भाषा)]], [[निम (प्रोग्रामिंग भाषा)]], [[पर्ल]], [[पीएचपी]], पायथन (प्रोग्रामिंग भाषा), आरईबीओएल, [[रूबी (प्रोग्रामिंग भाषा)]], [[जंग (प्रोग्रामिंग भाषा)]], [[एसएएस (सॉफ्टवेयर)]], स्मॉलटॉक,एवं [[टीसीएल]]), तो तकनीकों का उपयोग वास्तव में स्रोत कोड उत्पन्न किए बिना मेटाप्रोग्रामिंग करने के लिए किया जा सकता है।
=== कोड उपकरण ===


जनरेटिव दृष्टिकोण की एक शैली [[डोमेन-विशिष्ट भाषा]]ओं (डीएसएल) को नियोजित करना है। डीएसएल का उपयोग करने के एक काफी सामान्य उदाहरण में जनरेटिव मेटाप्रोग्रामिंग शामिल है: [[लेक्स प्रोग्रामिंग टूल]]एवं वाईएसीसी, दो उपकरण जो लेक्सिकल विश्लेषणएवं [[पदच्छेद]] उत्पन्न करने के लिए उपयोग किए जाते हैं, उपयोगकर्ता को [[नियमित अभिव्यक्ति]]एवं संदर्भ-मुक्त व्[[याक]]रण का उपयोग करके भाषा का वर्णन करने देते हैं,एवं कुशलता से आवश्यक जटिल एल्गोरिदम को एम्बेड करते हैं। भाषा का विश्लेषण करें।
डायनेमिक प्रोग्राम विश्लेषण करने के लिए मेटाप्रोग्रामिंग का उपयोग उपकरण प्रोग्राम के लिए है।


=== कोड इंस्ट्रूमेंटेशन ===
== लक्ष्य ==
 
कुछ लोगों का तर्क है कि मेटाप्रोग्रामिंग सुविधाओं का पूर्ण उपयोग करने के लिए तीव्र गति से ज्ञान लेने की अवस्था होती है।<ref name="challenges">{{cite web |last1=Bicking|first1=Ian|title=The challenge of metaprogramming|url=http://www.ianbicking.org/the-challenge-of-metaprogramming.html|website=IanBicking.org|access-date=21 September 2016}}</ref> चूंकि मेटाप्रोग्रामिंग रनटाइम पर अधिक कोमलता एवं स्थापन देता है, मेटाप्रोग्रामिंग के दुरुपयोग या त्रुटिपूर्ण उपयोग के परिणामस्वरूप अवांछित एवं अप्रत्याशित त्रुटियां हो सकती हैं जो औसत डेवलपर को डीबग करना अत्यधिक कठिन हो सकती हैं। यह प्रणाली में संकट उत्पन्न कर सकता है एवं यदि सावधानी से उपयोग नहीं किया जाता है तो इसे अधिक कमजोर बना सकता है। कुछ सामान्य समस्याएं जो मेटाप्रोग्रामिंग के गलत उपयोग के कारण हो सकती हैं, वे हैं गुप्त स्थापन पैरामीटर की पहचान करने के लिए ज़िलाधिकारी की अक्षमता, अमान्य या त्रुटिपूर्ण डेटा के परिणामस्वरूप अज्ञात असामान्यता या भिन्न परिणाम हो सकते हैं।<ref>{{cite web|last1=Terry|first1=Matt|title=Beware of Metaprogramming|url=https://medium.com/@macterry/beware-of-metaprogramming-3afdc931cadf#.6a4hskoxk|website=Medium.com|date=21 August 2013|publisher=Medium Corporation|access-date=21 August 2014}}</ref> इसके कारण कुछ का मानना ​​है<ref name="challenges"/> कि केवल उच्च-कुशल डेवलपर्स को उन विशेषताओं को विकसित करने पर कार्य करना चाहिए जो किसी भाषा या प्लेटफॉर्म में मेटाप्रोग्रामिंग का प्रयोग करते हैं एवं औसत डेवलपर्स को यह ज्ञान प्राप्त करना चाहिए कि, सम्मेलन के भाग के रूप में इन सुविधाओं का उपयोग कैसे कर सकते हैI
डायनेमिक प्रोग्राम विश्लेषण करने के लिए मेटाप्रोग्रामिंग का एक उपयोग इंस्ट्रूमेंट प्रोग्राम के लिए है।
 
== चुनौतियां ==
कुछ लोगों का तर्क है कि मेटाप्रोग्रामिंग सुविधाओं का पूरा उपयोग करने के लिए एक तेज सीखने की अवस्था है।<ref name="challenges">{{cite web |last1=Bicking|first1=Ian|title=The challenge of metaprogramming|url=http://www.ianbicking.org/the-challenge-of-metaprogramming.html|website=IanBicking.org|access-date=21 September 2016}}</ref> चूंकि मेटाप्रोग्रामिंग रनटाइम पर अधिक लचीलापनएवं कॉन्फ़िगरेशन देता है, मेटाप्रोग्रामिंग के दुरुपयोग या गलत उपयोग के परिणामस्वरूप अवांछितएवं अप्रत्याशित त्रुटियां हो सकती हैं जो औसत डेवलपर को डीबग करना बेहद मुश्किल हो सकती हैं। यह सिस्टम में जोखिम पैदा कर सकता हैएवं अगर सावधानी से उपयोग नहीं किया जाता है तो इसेएवं अधिक कमजोर बना सकता है। कुछ सामान्य समस्याएं जो मेटाप्रोग्रामिंग के गलत उपयोग के कारण हो सकती हैं, वे हैं लापता कॉन्फ़िगरेशन पैरामीटर की पहचान करने के लिए कंपाइलर की अक्षमता, अमान्य या गलत डेटा के परिणामस्वरूप अज्ञात अपवाद या भिन्न परिणाम हो सकते हैं।<ref>{{cite web|last1=Terry|first1=Matt|title=Beware of Metaprogramming|url=https://medium.com/@macterry/beware-of-metaprogramming-3afdc931cadf#.6a4hskoxk|website=Medium.com|date=21 August 2013|publisher=Medium Corporation|access-date=21 August 2014}}</ref> इसके कारण कुछ का मानना ​​है<ref name="challenges"/>कि केवल उच्च-कुशल डेवलपर्स को उन विशेषताओं को विकसित करने पर कार्य करना चाहिए जो किसी भाषा या प्लेटफॉर्म में मेटाप्रोग्रामिंग का प्रयोग करते हैंएवं औसत डेवलपर्स को यह सीखना चाहिए कि सम्मेलन के हिस्से के रूप में इन सुविधाओं का उपयोग कैसे करें।


== प्रोग्रामिंग भाषाओं में उपयोग ==
== प्रोग्रामिंग भाषाओं में उपयोग ==


=== मैक्रो सिस्टम ===
=== मैक्रो प्रणाली ===
{{main|Macro (computer science)}}
{{main|मैक्रो (कंप्यूटर विज्ञान)}}
* [[सामान्य लिस्प]]एवं अधिकांश लिस्प (प्रोग्रामिंग भाषा) बोलियाँ।
* [[सामान्य लिस्प]] एवं अधिकांश लिस्प (प्रोग्रामिंग भाषा) भाषाये।
* योजना [[स्वच्छ मैक्रो]]ज़
* योजना [[स्वच्छ मैक्रो|स्वच्छ मैक्रोज़]]
* [[मैक्रोएमएल]]
* [[मैक्रोएमएल]]
* [[रैकेट (प्रोग्रामिंग भाषा)]]
* [[रैकेट (प्रोग्रामिंग भाषा)]]
Line 62: Line 52:
* [[क्लोजर (प्रोग्रामिंग भाषा)]] मैक्रोज़
* [[क्लोजर (प्रोग्रामिंग भाषा)]] मैक्रोज़
* निम (प्रोग्रामिंग भाषा)
* निम (प्रोग्रामिंग भाषा)
* जंग (प्रोग्रामिंग भाषा)
* रस्ट (प्रोग्रामिंग भाषा)
* [[मिला हुआ]]
* [[मिला हुआ]]
* [[जूलिया (प्रोग्रामिंग भाषा)]]
* [[जूलिया (प्रोग्रामिंग भाषा)]]
Line 68: Line 58:


=== मैक्रो असेंबलर ===
=== मैक्रो असेंबलर ===
{{main|Macro assembler}}
{{main|मैक्रो असेंबलर}}
IBM/360एवं डेरिवेटिव में शक्तिशाली [[मैक्रो कोडांतरक]] सुविधाएं थीं जिनका उपयोग प्रायःर पूर्ण असेंबली भाषा प्रोग्राम बनाने के लिए किया जाता था {{Citation needed|date=August 2011}} या कार्यक्रमों के अनुभाग (उदाहरण के लिए विभिन्न ऑपरेटिंग सिस्टम के लिए)। [[CICS]] [[लेनदेन प्रक्रिया]] सिस्टम के साथ प्रदान किए गए मैक्रोज़ में असेंबलर मैक्रोज़ थे जो [[COBOL]] स्टेटमेंट को प्री-प्रोसेसिंग स्टेप के रूप में उत्पन्न करते थे।


अन्य असेंबलर, जैसे [[एमएएसएम]], मैक्रोज़ का भी समर्थन करते हैं।
आईबीएम (IBM)/360 एवं डेरिवेटिव में शक्तिशाली [[मैक्रो कोडांतरक]] सुविधाएं थीं, जिनका उपयोग प्रायः पूर्ण असेंबली भाषा प्रोग्राम बनाने या कार्यक्रमों के अनुभाग के लिए किया जाता थाI (उदाहरण के लिए विभिन्न ऑपरेटिंग प्रणाली के लिए) के लिए किया जाता था। सीआईसीएस ([[CICS|CICS)]] [[लेनदेन प्रक्रिया|अदान-प्रदान प्रक्रिया]] प्रणाली के साथ प्रदान किए गए मैक्रोज़ में असेंबलर मैक्रोज़ थे, जो [[COBOL|कोबोल (COBOL)]] स्टेटमेंट को प्री-प्रोसेसिंग स्टेप के रूप में उत्पन्न करते थे। अन्य असेंबलर, जैसे [[एमएएसएम]], मैक्रोज़ का भी समर्थन करते हैं।


=== मेटाक्लास ===
=== मेटाक्लास ===
{{main|Metaclass}}
{{main|मेटाक्लास}}
[[मेटाक्लास]] निम्नलिखित प्रोग्रामिंग भाषाओं द्वारा प्रदान किए जाते हैं:
[[मेटाक्लास]] निम्नलिखित प्रोग्रामिंग भाषाओं द्वारा प्रदान किए जाते हैं:
* सामान्य लिस्प<ref>Through [[Common Lisp Object System]]'s "Meta Object Protocol"</ref>
* सामान्य लिस्प<ref>Through [[Common Lisp Object System]]'s "Meta Object Protocol"</ref>
Line 81: Line 70:
* ग्रूवी (प्रोग्रामिंग भाषा)
* ग्रूवी (प्रोग्रामिंग भाषा)
* रूबी (प्रोग्रामिंग भाषा)
* रूबी (प्रोग्रामिंग भाषा)
* गपशप
* मनोरंजन
* लुआ (प्रोग्रामिंग भाषा)
* लुआ (प्रोग्रामिंग भाषा)


=== टेम्पलेट मेटाप्रोग्रामिंग ===
=== टेम्पलेट मेटाप्रोग्रामिंग ===
{{main|Template metaprogramming}}
{{main|टेम्पलेट मेटाप्रोग्रामिंग}}
* एक्स मैक्रो | सी एक्स मैक्रोज़
* सी "एक्स मैक्रोज़"
* [[सी ++ टेम्पलेट्स]]<ref>{{Cite web |title=C++ Template Metaprogramming |url=http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s04.html |access-date=2022-07-23 |website=aszt.inf.elte.hu}}</ref>
* [[सी ++ टेम्पलेट्स]]<ref>{{Cite web |title=C++ Template Metaprogramming |url=http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s04.html |access-date=2022-07-23 |website=aszt.inf.elte.hu}}</ref>
* [[डी (प्रोग्रामिंग भाषा)]]
* [[डी (प्रोग्रामिंग भाषा)]]
* कॉमन लिस्प, स्कीम (प्रोग्रामिंग भाषा)एवं अधिकांश लिस्प बोलियों में क्वासिकोट (बैककोट) ऑपरेटर का उपयोग किया जाता है।<ref>[[Lisp (programming language)]] "Self-evaluating forms and quoting", quasi-quote operator.</ref>
* कॉमन लिस्प, स्कीम (प्रोग्रामिंग भाषा) एवं अधिकांश लिस्प भाषाओ में क्वासिकोट (बैककोट) ऑपरेटर का उपयोग किया जाता है।<ref>[[Lisp (programming language)]] "Self-evaluating forms and quoting", quasi-quote operator.</ref>
* निम (प्रोग्रामिंग भाषा)
* निम (प्रोग्रामिंग भाषा)


=== अनुभव मेटाप्रोग्रामिंग ===
=== अनुभव मेटाप्रोग्रामिंग ===
{{main|Multi-stage programming}}
{{main|मल्टी-स्टेज प्रोग्रामिंग}}
* [[चिंताग्रस्त]]
* [[चिंताग्रस्त|मेटाएमएल]]
* ओकैमल#मेटाओकैमल
* मेटाओकैमल
* स्काला (प्रोग्रामिंग भाषा) [https://docs.scala-lang.org/scala3/reference/metaprogramming.html मूल रूप से] या [[लाइटवेट मॉड्यूलर स्टेजिंग]] फ्रेमवर्क का उपयोग करना<ref>{{Cite web|url=https://scala-lms.github.io/|title=LMS: Program Generation and Embedded Compilers in Scala|website=scala-lms.github.io|language=en|access-date=2017-12-06}}</ref><ref>{{Cite journal|last1=Rompf|first1=Tiark|last2=Odersky|first2=Martin|date=June 2012|title=Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs|journal=Commun. ACM|volume=55|issue=6|pages=121–130|doi=10.1145/2184319.2184345|s2cid=52898203|issn=0001-0782|url=http://infoscience.epfl.ch/record/178274}}</ref>
* स्काला (प्रोग्रामिंग भाषा) [https://docs.scala-lang.org/scala3/reference/metaprogramming.html मूल रूप से] या [[लाइटवेट मॉड्यूलर स्टेजिंग]] फ्रेमवर्क का उपयोग करना<ref>{{Cite web|url=https://scala-lms.github.io/|title=LMS: Program Generation and Embedded Compilers in Scala|website=scala-lms.github.io|language=en|access-date=2017-12-06}}</ref><ref>{{Cite journal|last1=Rompf|first1=Tiark|last2=Odersky|first2=Martin|date=June 2012|title=Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs|journal=Commun. ACM|volume=55|issue=6|pages=121–130|doi=10.1145/2184319.2184345|s2cid=52898203|issn=0001-0782|url=http://infoscience.epfl.ch/record/178274}}</ref>
* [http://terralang.org टेरा]
* [http://terralang.org टेरा]


=== आश्रित प्रकार ===
=== आश्रित प्रकार ===
{{main|Dependent type}}
{{main|आश्रित प्रकार}}
[[आश्रित प्रकार]]ों का उपयोग यह साबित करने की अनुमति देता है कि उत्पन्न कोड कभी भी अमान्य नहीं होता है।<ref>{{cite journal|last=Chlipala|first=Adam|title=Ur: statically-typed metaprogramming with type-level record computation|journal=ACM SIGPLAN Notices|date=June 2010|volume=45|series=PLDI '10|issue=6|pages=122–133|doi=10.1145/1809028.1806612|url=http://adam.chlipala.net/papers/UrPLDI10/UrPLDI10.pdf|access-date=29 August 2012}}</ref> हालांकि, यह दृष्टिकोण खून बह रहा हैएवं अनुसंधान प्रोग्रामिंग भाषाओं के बाहर शायद ही कभी पाया जाता है।
[[आश्रित प्रकार|आश्रित प्रकारो]] का उपयोग यह प्रमाणित करने की अनुमति देता है, कि उत्पन्न कोड कभी भी अमान्य नहीं होता है।<ref>{{cite journal|last=Chlipala|first=Adam|title=Ur: statically-typed metaprogramming with type-level record computation|journal=ACM SIGPLAN Notices|date=June 2010|volume=45|series=PLDI '10|issue=6|pages=122–133|doi=10.1145/1809028.1806612|url=http://adam.chlipala.net/papers/UrPLDI10/UrPLDI10.pdf|access-date=29 August 2012}}</ref> चूँकि, यह दृष्टिकोण एवं अनुसंधान प्रोग्रामिंग भाषाओं के बाहर संभवतः ही कभी पाया जाता है।


== कार्यान्वयन ==
== कार्यान्वयन ==


उल्लेखनीय मेटाप्रोग्रामिंग सिस्टम [[कार्यक्रम परिवर्तन प्रणालियों की सूची]] की सूची में रखी गई है।
उल्लेखनीय मेटाप्रोग्रामिंग प्रणाली [[कार्यक्रम परिवर्तन प्रणालियों की सूची]] में रखी गई है।


== यह भी देखें ==
== यह भी देखें ==


<!-- No programming languages, please -->
{{div col|colwidth=30em}}
{{div col|colwidth=30em}}
*[[पहलू बुनकर]]
*[[आस्पेक्ट वीवर]]
* [[कोड जनरेशन टूल्स की तुलना]]
* [[कोड जनरेशन उपकरण की तुलना]]
* [[संकलन-समय फ़ंक्शन निष्पादन]]
* [[संकलन-समय प्रोग्राम निष्पादन]]
* [[संकलन-समय प्रतिबिंब]]
* [[संकलन-समय प्रतिबिंब]]
* [[आनुवंशिक प्रोग्रामिंग]]
* [[आनुवंशिक प्रोग्रामिंग]]
Line 119: Line 107:
* अनुमानित प्रोग्रामिंग
* अनुमानित प्रोग्रामिंग
* [[निर्देश सेट सिम्युलेटर]]
* [[निर्देश सेट सिम्युलेटर]]
* [[जानबूझकर प्रोग्रामिंग]]
* [[विचारपूर्वक प्रोग्रामिंग]]
* [[व्याख्या की गई भाषा]]
* [[व्याख्या की गई भाषा]]
*[[यंत्र अधिगम]]
*[[यंत्र अधिगम]]
Line 126: Line 114:
*[[आंशिक मूल्यांकन]]
*[[आंशिक मूल्यांकन]]
*[[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]]
*[[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]]
*स्वयं दुभाषिया
*स्वयं दो भाषाये
* स्व-संशोधित कोड
* स्व-संशोधित कोड
* [[स्रोत कोड पीढ़ी]]
* [[स्रोत कोड पीढ़ी]]
*[[ट्रांसकंपलर]] (जिसे ट्रांसपिलेशन के रूप में भी जाना जाता है)
*[[ट्रांसकंपलर]] (जिसे ट्रांसपिलेशन के रूप में भी जाना जाता है)
* [[बड़े पैमाने पर एकीकरण]]
* [[बड़े स्तर पर एकीकरण]]
{{div col end}}
{{div col end}}


Line 144: Line 132:
*[https://web.archive.org/web/20160503055316/http://solenoid.schematronic.org/ "Solenoid"]: The first metaprogramming framework for [http://exist-db.org eXist-db]
*[https://web.archive.org/web/20160503055316/http://solenoid.schematronic.org/ "Solenoid"]: The first metaprogramming framework for [http://exist-db.org eXist-db]


{{Types of programming languages}}
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category: मेटाप्रोग्रामिंग| मेटाप्रोग्रामिंग]] [[Category: प्रोग्रामिंग प्रतिमान]]  
[[Category:CS1 English-language sources (en)]]
 
[[Category:Collapse templates]]
 
 
[[Category: Machine Translated Page]]
[[Category:Created On 19/02/2023]]
[[Category:Created On 19/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Multi-column templates]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages using div col with small parameter]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:Templates using under-protected Lua modules]]
[[Category:Wikipedia fully protected templates|Div col]]

Latest revision as of 15:49, 27 October 2023

मेटाप्रोग्रामिंग प्रोग्रामिंग प्रौद्योगिकी है जिसमें कंप्यूटर प्रोग्राम अन्य प्रोग्रामों को अपने डेटा के रूप में व्यवहार करने की क्षमता रखते हैं। इसका अर्थ है कि अन्य प्रोग्रामों को पढ़ने, उत्पन्न करने, विश्लेषण करने या परिवर्तित करने के लिए डिज़ाइन किया जा सकता है, एवं यहां तक ​​कि चलते समय स्वयं को संशोधित भी किया जा सकता है।[1][2] कुछ स्थितियों में, यह प्रोग्रामर को समाधान व्यक्त करने के लिए कोड की पंक्तियों की संख्या को अर्घ्य करने की अनुमति देता है, विकास के समय को अर्घ्य करता है।[3] यह कार्यक्रमों को पुनर्संकलन के बिना नई स्थितियों को कुशलतापूर्वक विधारण के लिए अधिक कोमलता की भी अनुमति देता है।

मेटाप्रोग्रामिंग का उपयोग रन टाइम (प्रोग्राम जीवनचक्र चरण) से कम्प्यूटेशंस को स्थानांतरित करने के लिए किया जा सकता है। रन-टाइम से संकलन समय तक, कंपाइल-समय_प्रोग्राम_एक्सेक्यूशन का उपयोग करके कोड उत्पन्न करने के लिए, एवं स्व-संशोधित कोड को सक्षम करने के लिए प्रोग्रामिंग भाषा की अपनी मेटल भाषा होने की क्षमता को प्रतिबिंब (कंप्यूटर विज्ञान) कहा जाता है।[4] परावर्तन मेटाप्रोग्रामिंग की सुविधा के लिए मूल्यवान भाषा विशेषता है।

मेटाप्रोग्रामिंग 1970 एवं 1980 के दशक में लिस्प (LISP) जैसी सूची प्रसंस्करण भाषाओं का उपयोग करके लोकप्रिय था। 1980 के दशक में [[लिस्प मशीन]] लोकप्रिय थीं एवं उन अनुप्रयोगों को सक्षम करती थीं जो कोड को संसाधित कर सकते थे। वे प्रायः कृत्रिम बुद्धिमत्ता अनुप्रयोगों के लिए उपयोग किए जाते थे।

दृष्टिकोण

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

मेटाप्रोग्रामिंग सामान्यतः तीन उपायों में कार्य करता है।[5]

  1. प्रथम उपाए रन-टाइम इंजन के इंटर्नल्स को प्रोग्रामिंग कोड के लिए अप्लिकेशन प्रोग्रामिंग अंतरफलक (एपीआई) के माध्यम से प्रकाशित करना है, जैसे कि, नेट (NET) फ्रेमवर्क, नेट (NET) माइक्रोसॉफ्ट इंटरमीडिएट भाषा एमिटर के लिए किया जाता है।
  2. दूसरा दृष्टिकोण अभिव्यक्ति का गतिशील निष्पादन है जिसमें प्रोग्रामिंग कमांड होते हैं, जो प्रायः स्ट्रिंग्स से बने होते हैं, किन्तु तर्क या संदर्भ का उपयोग करने वाले अन्य उपायों से भी हो सकते हैं, जैसे कि जावास्क्रिप्ट है।[6] इस प्रकार प्रोग्राम लिख सकते हैं। यद्यपि दोनों दृष्टिकोणों का उपयोग भाषा में किया जा सकता है, अधिकांश भाषाएँ एक या दूसरे की ओर अग्रेषित हैं।
  3. तीसरा दृष्टिकोण पूर्ण रूप से भाषा के बाहर चरण रखना है। सामान्य प्रयोजन कार्यक्रम परिवर्तन प्रणाली जैसे संकलक, जो भाषा के विवरण को स्वीकार करते हैं एवं उन भाषाओं पर इच्छानुसार परिवर्तन करते हैं, सामान्य मेटाप्रोग्रामिंग के प्रत्यक्ष कार्यान्वयन हैं। यह मेटाप्रोग्रामिंग को वस्तुतः किसी भी लक्ष्य भाषा पर प्रारम्भ करने की अनुमति देता है, उस लक्ष्य भाषा की स्वयं कोई मेटाप्रोग्रामिंग क्षमता हो। कोई इसे स्कीम (प्रोग्रामिंग भाषा) के साथ कार्य पर देख सकता है एवं यह कैसे सी (C) (प्रोग्रामिंग भाषा) में आने वाली कुछ सीमाओं से व्यवहार की अनुमति देता है, जो सी (C) का विस्तार करने के लिए स्कीम भाषा का भाग था।[7]

लिस्प (प्रोग्रामिंग भाषा) संभवतः मेटाप्रोग्रामिंग सुविधाओं के साथ सर्वोत्कृष्ट भाषा है, दोनों इसकी ऐतिहासिक उदाहरण के कारण एवं इसकी मेटाप्रोग्रामिंग की सरलता एवं शक्ति के कारण लिस्प मेटाप्रोग्रामिंग में, अनकोट ऑपरेटर (सामान्यतः अल्प विराम) कोड का परिचय देता है जिसका मूल्यांकन रन टाइम के अतिरिक्त प्रोग्राम डेफिनिशन टाइम पर किया जाता है; लिस्प देखें (प्रोग्रामिंग भाषा) स्व-मूल्यांकन प्रपत्र एवं उद्धरण लिस्प में स्व-मूल्यांकन फ़ॉर्म एवं उद्धरण मेटाप्रोग्रामिंग भाषा इस प्रकार प्रोग्रामिंग भाषा के समान है, एवं उपस्थित लिस्प रूटीन को मेटाप्रोग्रामिंग के लिए पुन: उपयोग किया जा सकता है, यदि वांछित हो। प्रोग्राम में दो भाषाओ को सम्मिलित करके इस दृष्टिकोण को अन्य भाषाओं में प्रारम्भ किया गया है, जो प्रोग्राम के डेटा के साथ उपयुक्त कार्य करता है। कुछ सामान्य उच्च-स्तरीय भाषाओं के लिए इसके जैसे कार्यान्वयन हैं, जैसे वस्तु पास्कल के लिए रेमऑब्जेक्ट्स (RemObjects) की पास्कल स्क्रिप्ट होती हैI

उपयोग

कोड जनरेशन

मेटाप्रोग्राम का सरल उदाहरण यह यूनिक्स शेल स्क्रिप्ट (कंप्यूटर प्रोग्रामिंग) है, जो जनरेटिव प्रोग्रामिंग का उदाहरण है:

#!/bin/sh  # metaprogram
echo '#!/bin/sh' > program
for i in $(seq 992)
do
    echo "echo $i" >> program
done
chmod +x program

यह स्क्रिप्ट (या प्रोग्राम) नयी 993-लाइन प्रोग्राम बनाता है जो 1-992 नंबर प्रिंट करता है। यह केवल उदाहरण है कि अधिक कोड लिखने के लिए कोड का उपयोग कैसे करें; यह संख्याओं की सूची को प्रिंट करने का अधिक लाभदायक उपाय नहीं है। प्रोग्रामर इस मेटाप्रोग्राम को मिनट से भी अर्घ्य समय में लिख एवं निष्पादित कर सकता है, एवं उस समय की मात्रा में कोड की 1000 से अधिक पंक्तियाँ उत्पन्न करेगा। क्विन (कंप्यूटिंग) विशेष प्रकार का मेटाप्रोग्राम है जो स्वयं के स्रोत कोड को स्वयं आउटपुट के रूप में उत्पन्न करता है। क्वीन्स (Quines) सामान्यतः केवल मनोरंजक या सैद्धांतिक रुचि के होते हैं।

सभी मेटाप्रोग्रामिंग में जनरेटिव प्रोग्रामिंग सम्मिलित नहीं है। यदि प्रोग्राम रनटाइम पर संशोधित किए जा सकते हैं या वृद्धिशील संकलन उपलब्ध है (जैसे C Sharp (सी शार्प) (प्रोग्रामिंग भाषा) सी फोर्थ (प्रोग्रामिंग भाषा) (C Forth), फ्रिंक (प्रोग्रामिंग भाषा), ग्रूवी (प्रोग्रामिंग भाषा), जावास्क्रिप्ट, लिस्प (प्रोग्रामिंग भाषा), अमृत ​​​​(प्रोग्रामिंग भाषा), लुआ (प्रोग्रामिंग भाषा), निम (प्रोग्रामिंग भाषा), पर्ल, पीएचपी, पायथन (प्रोग्रामिंग भाषा), आरईबीओएल, रूबी (प्रोग्रामिंग भाषा), रस्ट (प्रोग्रामिंग भाषा), एसएएस (सॉफ्टवेयर), स्मॉलटॉक, एवं टीसीएल), जो प्रौद्योगिकीयो का उपयोग वास्तव में स्रोत कोड उत्पन्न किए बिना मेटाप्रोग्रामिंग करने के लिए किया जा सकता है।

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

कोड उपकरण

डायनेमिक प्रोग्राम विश्लेषण करने के लिए मेटाप्रोग्रामिंग का उपयोग उपकरण प्रोग्राम के लिए है।

लक्ष्य

कुछ लोगों का तर्क है कि मेटाप्रोग्रामिंग सुविधाओं का पूर्ण उपयोग करने के लिए तीव्र गति से ज्ञान लेने की अवस्था होती है।[8] चूंकि मेटाप्रोग्रामिंग रनटाइम पर अधिक कोमलता एवं स्थापन देता है, मेटाप्रोग्रामिंग के दुरुपयोग या त्रुटिपूर्ण उपयोग के परिणामस्वरूप अवांछित एवं अप्रत्याशित त्रुटियां हो सकती हैं जो औसत डेवलपर को डीबग करना अत्यधिक कठिन हो सकती हैं। यह प्रणाली में संकट उत्पन्न कर सकता है एवं यदि सावधानी से उपयोग नहीं किया जाता है तो इसे अधिक कमजोर बना सकता है। कुछ सामान्य समस्याएं जो मेटाप्रोग्रामिंग के गलत उपयोग के कारण हो सकती हैं, वे हैं गुप्त स्थापन पैरामीटर की पहचान करने के लिए ज़िलाधिकारी की अक्षमता, अमान्य या त्रुटिपूर्ण डेटा के परिणामस्वरूप अज्ञात असामान्यता या भिन्न परिणाम हो सकते हैं।[9] इसके कारण कुछ का मानना ​​है[8] कि केवल उच्च-कुशल डेवलपर्स को उन विशेषताओं को विकसित करने पर कार्य करना चाहिए जो किसी भाषा या प्लेटफॉर्म में मेटाप्रोग्रामिंग का प्रयोग करते हैं एवं औसत डेवलपर्स को यह ज्ञान प्राप्त करना चाहिए कि, सम्मेलन के भाग के रूप में इन सुविधाओं का उपयोग कैसे कर सकते हैI

प्रोग्रामिंग भाषाओं में उपयोग

मैक्रो प्रणाली

मैक्रो असेंबलर

आईबीएम (IBM)/360 एवं डेरिवेटिव में शक्तिशाली मैक्रो कोडांतरक सुविधाएं थीं, जिनका उपयोग प्रायः पूर्ण असेंबली भाषा प्रोग्राम बनाने या कार्यक्रमों के अनुभाग के लिए किया जाता थाI (उदाहरण के लिए विभिन्न ऑपरेटिंग प्रणाली के लिए) के लिए किया जाता था। सीआईसीएस (CICS) अदान-प्रदान प्रक्रिया प्रणाली के साथ प्रदान किए गए मैक्रोज़ में असेंबलर मैक्रोज़ थे, जो कोबोल (COBOL) स्टेटमेंट को प्री-प्रोसेसिंग स्टेप के रूप में उत्पन्न करते थे। अन्य असेंबलर, जैसे एमएएसएम, मैक्रोज़ का भी समर्थन करते हैं।

मेटाक्लास

मेटाक्लास निम्नलिखित प्रोग्रामिंग भाषाओं द्वारा प्रदान किए जाते हैं:

  • सामान्य लिस्प[10]
  • पायथन (प्रोग्रामिंग भाषा)
  • निल (प्रोग्रामिंग भाषा)
  • ग्रूवी (प्रोग्रामिंग भाषा)
  • रूबी (प्रोग्रामिंग भाषा)
  • मनोरंजन
  • लुआ (प्रोग्रामिंग भाषा)

टेम्पलेट मेटाप्रोग्रामिंग

अनुभव मेटाप्रोग्रामिंग

आश्रित प्रकार

आश्रित प्रकारो का उपयोग यह प्रमाणित करने की अनुमति देता है, कि उत्पन्न कोड कभी भी अमान्य नहीं होता है।[15] चूँकि, यह दृष्टिकोण एवं अनुसंधान प्रोग्रामिंग भाषाओं के बाहर संभवतः ही कभी पाया जाता है।

कार्यान्वयन

उल्लेखनीय मेटाप्रोग्रामिंग प्रणाली कार्यक्रम परिवर्तन प्रणालियों की सूची में रखी गई है।

यह भी देखें


संदर्भ

  1. Harald Sondergaard. "Course on Program Analysis and Transformation". Retrieved 18 September 2014.
  2. Czarnecki, Krzysztof; Eisenecker, Ulrich W. (2000). Generative Programming. ISBN 0-201-30977-7.
  3. Walker, Max. "The Art of Metaprogrmming in Java". New Circle. Retrieved 28 January 2014.
  4. Krauss, Aaron. "Programming Concepts: Type Introspection and Reflection". The Societa. Retrieved 14 September 2014.
  5. Joshi, Prateek (5 April 2014). "What Is Metaprogramming? – Part 2/2". Perpetual Enigma. Retrieved 14 August 2014.
  6. for example, instance_eval in Ruby takes a string or an anonymous function. "Rdoc for Class: BasicObject (Ruby 1.9.3) - instance_eval". Retrieved 30 December 2011.
  7. "Art of Metaprogramming". IBM.
  8. 8.0 8.1 Bicking, Ian. "The challenge of metaprogramming". IanBicking.org. Retrieved 21 September 2016.
  9. Terry, Matt (21 August 2013). "Beware of Metaprogramming". Medium.com. Medium Corporation. Retrieved 21 August 2014.
  10. Through Common Lisp Object System's "Meta Object Protocol"
  11. "C++ Template Metaprogramming". aszt.inf.elte.hu. Retrieved 2022-07-23.
  12. Lisp (programming language) "Self-evaluating forms and quoting", quasi-quote operator.
  13. "LMS: Program Generation and Embedded Compilers in Scala". scala-lms.github.io (in English). Retrieved 2017-12-06.
  14. Rompf, Tiark; Odersky, Martin (June 2012). "Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs". Commun. ACM. 55 (6): 121–130. doi:10.1145/2184319.2184345. ISSN 0001-0782. S2CID 52898203.
  15. Chlipala, Adam (June 2010). "Ur: statically-typed metaprogramming with type-level record computation" (PDF). ACM SIGPLAN Notices. PLDI '10. 45 (6): 122–133. doi:10.1145/1809028.1806612. Retrieved 29 August 2012.


बाहरी संबंध