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

From Vigyanwiki
No edit summary
No edit summary
Line 11: Line 11:


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


मेटाप्रोग्रामिंग आमतौर पर तीन तरीकों में से एक में काम करता है।<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 Microsoft इंटरमीडिएट भाषा एमिटर के लिए।
# प्रथम उपाए रन-टाइम इंजन के इंटर्नल्स को प्रोग्रामिंग कोड के लिए [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]] (एपीआई) के माध्यम से प्रकाशित करना है, जैसे कि, नेट (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>
# तीसरा दृष्टिकोण पूर्ण रूप से भाषा के बाहर चरण रखना है। सामान्य प्रयोजन [[कार्यक्रम परिवर्तन]] प्रणाली जैसे संकलक, जो भाषा के विवरण को स्वीकार करते हैं एवं उन भाषाओं पर इच्छानुसार परिवर्तन करते हैं, सामान्य मेटाप्रोग्रामिंग के प्रत्यक्ष कार्यान्वयन हैं। यह मेटाप्रोग्रामिंग को वस्तुतः किसी भी लक्ष्य भाषा पर लागू करने की अनुमति देता है, उस लक्ष्य भाषा की स्वयं कोई मेटाप्रोग्रामिंग क्षमता हो। कोई इसे स्कीम (प्रोग्रामिंग भाषा) के साथ कार्य पर देख सकता है एवं यह कैसे [[सी (प्रोग्रामिंग भाषा)]] में आने वाली कुछ सीमाओं से व्यवहार की अनुमति देता है, जो सी का विस्तार करने के लिए स्कीम भाषा का भाग था।<ref>{{cite web|title=Art of Metaprogramming|website=[[IBM]] |url=http://www.ibm.com/developerworks/library/l-metaprog1/}}</ref>
लिस्प (प्रोग्रामिंग भाषा) संभवतः मेटाप्रोग्रामिंग सुविधाओं के साथ सर्वोत्कृष्ट भाषा है, दोनों इसकी ऐतिहासिक मिसाल के कारणएवं इसकी मेटाप्रोग्रामिंग की सादगीएवं शक्ति के कारण। लिस्प मेटाप्रोग्रामिंग में, अनकोट ऑपरेटर (आमतौर पर अल्पविराम) कोड का परिचय देता है जिसका मूल्यांकन रन टाइम के बजाय प्रोग्राम डेफिनिशन टाइम पर किया जाता है; लिस्प देखें (प्रोग्रामिंग भाषा)#स्व-मूल्यांकन प्रपत्रएवं उद्धरण|लिस्प में स्व-मूल्यांकन फ़ॉर्मएवं उद्धरण। मेटाप्रोग्रामिंग भाषा इस प्रकार मेजबान प्रोग्रामिंग भाषा के समान है,एवं मौजूदा लिस्प रूटीन को मेटाप्रोग्रामिंग के लिए सीधे पुन: उपयोग किया जा सकता है, यदि वांछित हो। प्रोग्राम में एक दुभाषिया शामिल करके इस दृष्टिकोण को अन्य भाषाओं में लागू किया गया है, जो प्रोग्राम के डेटा के साथ सीधे काम करता है। कुछ सामान्य उच्च-स्तरीय भाषाओं के लिए इस तरह के कार्यान्वयन हैं, जैसे [[वस्तु पास्कल]] के लिए [[RemObjects]] की [[पास्कल स्क्रिप्ट]]।
लिस्प (प्रोग्रामिंग भाषा) संभवतः मेटाप्रोग्रामिंग सुविधाओं के साथ सर्वोत्कृष्ट भाषा है, दोनों इसकी ऐतिहासिक मिसाल के कारणएवं इसकी मेटाप्रोग्रामिंग की सादगीएवं शक्ति के कारण। लिस्प मेटाप्रोग्रामिंग में, अनकोट ऑपरेटर (सामान्यतः अल्पविराम) कोड का परिचय देता है जिसका मूल्यांकन रन टाइम के बजाय प्रोग्राम डेफिनिशन टाइम पर किया जाता है; लिस्प देखें (प्रोग्रामिंग भाषा)#स्व-मूल्यांकन प्रपत्रएवं उद्धरण|लिस्प में स्व-मूल्यांकन फ़ॉर्मएवं उद्धरण। मेटाप्रोग्रामिंग भाषा इस प्रकार मेजबान प्रोग्रामिंग भाषा के समान है,एवं मौजूदा लिस्प रूटीन को मेटाप्रोग्रामिंग के लिए सीधे पुन: उपयोग किया जा सकता है, यदि वांछित हो। प्रोग्राम में एक दुभाषिया शामिल करके इस दृष्टिकोण को अन्य भाषाओं में लागू किया गया है, जो प्रोग्राम के डेटा के साथ सीधे कार्य करता है। कुछ सामान्य उच्च-स्तरीय भाषाओं के लिए इस तरह के कार्यान्वयन हैं, जैसे [[वस्तु पास्कल]] के लिए [[RemObjects]] की [[पास्कल स्क्रिप्ट]]।


== उपयोग ==
== उपयोग ==
Line 48: Line 48:


== चुनौतियां ==
== चुनौतियां ==
कुछ लोगों का तर्क है कि मेटाप्रोग्रामिंग सुविधाओं का पूरा उपयोग करने के लिए एक तेज सीखने की अवस्था है।<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"/>कि केवल उच्च-कुशल डेवलपर्स को उन विशेषताओं को विकसित करने पर काम करना चाहिए जो किसी भाषा या प्लेटफॉर्म में मेटाप्रोग्रामिंग का प्रयोग करते हैंएवं औसत डेवलपर्स को यह सीखना चाहिए कि सम्मेलन के हिस्से के रूप में इन सुविधाओं का उपयोग कैसे करें।
कुछ लोगों का तर्क है कि मेटाप्रोग्रामिंग सुविधाओं का पूरा उपयोग करने के लिए एक तेज सीखने की अवस्था है।<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"/>कि केवल उच्च-कुशल डेवलपर्स को उन विशेषताओं को विकसित करने पर कार्य करना चाहिए जो किसी भाषा या प्लेटफॉर्म में मेटाप्रोग्रामिंग का प्रयोग करते हैंएवं औसत डेवलपर्स को यह सीखना चाहिए कि सम्मेलन के हिस्से के रूप में इन सुविधाओं का उपयोग कैसे करें।


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


अन्य असेंबलर, जैसे [[एमएएसएम]], मैक्रोज़ का भी समर्थन करते हैं।
अन्य असेंबलर, जैसे [[एमएएसएम]], मैक्रोज़ का भी समर्थन करते हैं।

Revision as of 14:23, 25 February 2023

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

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

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

दृष्टिकोण

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

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

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

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

उपयोग

कोड जनरेशन

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

<वाक्यविन्यास लैंग = बैश>

  1. !/बिन/श
  2. मेटाप्रोग्राम

इको '#!/बिन/श'> प्रोग्राम मेरे लिए $(seq 992) में करना

   इको इको $i >> प्रोग्राम

पूर्ण चामोद + एक्स कार्यक्रम </वाक्यविन्यास हाइलाइट>

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

एक क्विन (कंप्यूटिंग) एक विशेष प्रकार का मेटाप्रोग्राम है जो अपने स्वयं के स्रोत कोड को अपने आउटपुट के रूप में उत्पन्न करता है। Quines आम तौर पर केवल मनोरंजक या सैद्धांतिक रुचि के होते हैं।

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

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

कोड इंस्ट्रूमेंटेशन

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

चुनौतियां

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

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

मैक्रो सिस्टम

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

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

अन्य असेंबलर, जैसे एमएएसएम, मैक्रोज़ का भी समर्थन करते हैं।

मेटाक्लास

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

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

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

  • एक्स मैक्रो | सी एक्स मैक्रोज़
  • सी ++ टेम्पलेट्स[11]
  • डी (प्रोग्रामिंग भाषा)
  • कॉमन लिस्प, स्कीम (प्रोग्रामिंग भाषा)एवं अधिकांश लिस्प बोलियों में क्वासिकोट (बैककोट) ऑपरेटर का उपयोग किया जाता है।[12]
  • निम (प्रोग्रामिंग भाषा)

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

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

आश्रित प्रकारों का उपयोग यह साबित करने की अनुमति देता है कि उत्पन्न कोड कभी भी अमान्य नहीं होता है।[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.


बाहरी संबंध