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

From Vigyanwiki

मेटाप्रोग्रामिंग प्रोग्रामिंग प्रौद्योगिकी है जिसमें कंप्यूटर प्रोग्राम अन्य प्रोग्रामों को अपने डेटा के रूप में व्यवहार करने की क्षमता रखते हैं। इसका अर्थ है कि अन्य प्रोग्रामों को पढ़ने, उत्पन्न करने, विश्लेषण करने या परिवर्तित करने के लिए डिज़ाइन किया जा सकता है, एवं यहां तक ​​कि चलते समय स्वयं को संशोधित भी किया जा सकता है।[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.


बाहरी संबंध