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

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

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

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

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

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

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

<वाक्यविन्यास लैंग = बैश> इको '#!/बिन/श'> प्रोग्राम मेरे लिए $(seq 992) में करना इको इको $i >> प्रोग्राम पूर्ण चामोद + एक्स कार्यक्रम 
 * 1) !/बिन/श
 * 2) मेटाप्रोग्राम

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

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

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

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

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

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

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

 * सामान्य लिस्प और अधिकांश लिस्प (प्रोग्रामिंग भाषा) बोलियाँ।
 * योजना स्वच्छ मैक्रोज़
 * मैक्रोएमएल
 * रैकेट (प्रोग्रामिंग भाषा)
 * टेम्पलेट हास्केल
 * स्काला (प्रोग्रामिंग भाषा) मैक्रोज़
 * क्लोजर (प्रोग्रामिंग भाषा) मैक्रोज़
 * निम (प्रोग्रामिंग भाषा)
 * जंग (प्रोग्रामिंग भाषा)
 * मिला हुआ
 * जूलिया (प्रोग्रामिंग भाषा)
 * अमृत_(प्रोग्रामिंग_भाषा)

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

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

मेटाक्लास
मेटाक्लास निम्नलिखित प्रोग्रामिंग भाषाओं द्वारा प्रदान किए जाते हैं:
 * सामान्य लिस्प
 * पायथन (प्रोग्रामिंग भाषा)
 * निल (प्रोग्रामिंग भाषा)
 * ग्रूवी (प्रोग्रामिंग भाषा)
 * रूबी (प्रोग्रामिंग भाषा)
 * गपशप
 * लुआ (प्रोग्रामिंग भाषा)

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

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

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

 * चिंताग्रस्त
 * ओकैमल#मेटाओकैमल
 * स्काला (प्रोग्रामिंग भाषा) मूल रूप से या लाइटवेट मॉड्यूलर स्टेजिंग फ्रेमवर्क का उपयोग करना
 * टेरा

आश्रित प्रकार
आश्रित प्रकारों का उपयोग यह साबित करने की अनुमति देता है कि उत्पन्न कोड कभी भी अमान्य नहीं होता है। हालांकि, यह दृष्टिकोण खून बह रहा है और अनुसंधान प्रोग्रामिंग भाषाओं के बाहर शायद ही कभी पाया जाता है।

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

यह भी देखें

 * पहलू बुनकर
 * कोड जनरेशन टूल्स की तुलना
 * संकलन-समय फ़ंक्शन निष्पादन
 * संकलन-समय प्रतिबिंब
 * आनुवंशिक प्रोग्रामिंग
 * समरूपता
 * अनुमानित प्रोग्रामिंग
 * निर्देश सेट सिम्युलेटर
 * जानबूझकर प्रोग्रामिंग
 * व्याख्या की गई भाषा
 * यंत्र अधिगम
 * मेटाकंपलर
 * मेटाऑब्जेक्ट
 * आंशिक मूल्यांकन
 * प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)
 * स्वयं दुभाषिया
 * स्व-संशोधित कोड
 * स्रोत कोड पीढ़ी
 * ट्रांसकंपलर (जिसे ट्रांसपिलेशन के रूप में भी जाना जाता है)
 * बड़े पैमाने पर एकीकरण

बाहरी संबंध

 * c2.com Wiki: Metaprogramming article
 * Meta Programming on the Program Transformation Wiki
 * Code generation Vs Metaprogramming
 * "Solenoid": The first metaprogramming framework for eXist-db