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

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

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

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

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

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

कोड जनरेशन
मेटाप्रोग्राम का सरल उदाहरण यह यूनिक्स खोल स्क्रिप्ट (कंप्यूटर प्रोग्रामिंग) है, जो जनरेटिव प्रोग्रामिंग का उदाहरण है:
 * 1) !/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) सामान्यतः केवल मनोरंजक या सैद्धांतिक रुचि के होते हैं।

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

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

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

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

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

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

मैक्रो असेंबलर
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