2011-10-03 15 views
17

मुझे लगता था कि मेटाप्रोग्रामिंग प्रोग्राम को संशोधित करने में शामिल था, और (What is reflection and why is it useful? के कुछ उत्तरों के रूप में) कि प्रतिबिंब में केवल एक कार्यक्रम का आत्मनिरीक्षण शामिल था। हालांकि, प्रतिबिंब टैग विकी कहतेमेटाप्रोग्रामिंग प्रतिबिंब का सबसेट है?

प्रतिबिंब प्रक्रिया है जिसके द्वारा एक कार्यक्रम का निरीक्षण कर सकते हैं और रनटाइम पर अपनी ही संरचना और व्यवहार को संशोधित है।

प्रतिबिंब वह प्रक्रिया है जिसके द्वारा कोई प्रोग्राम आत्मनिरीक्षण कर सकता है। यह आत्मनिरीक्षण आमतौर पर निरीक्षण करने के लिए और रनटाइम पर अपनी ही संरचना और व्यवहार को संशोधित करने की क्षमता शामिल है। सैद्धांतिक दृष्टिकोण प्रतिबिंब से तथ्य यह है कि कार्यक्रम निर्देश डेटा के रूप में जमा हो जाती है से संबंधित है। प्रोग्राम कोड और डेटा के बीच अंतर यह है कि जानकारी का इलाज कैसे किया जाता है। इसलिए कार्यक्रमों डेटा के रूप में अपने स्वयं के कोड का इलाज और निरीक्षण या उन्हें संशोधित कर सकते हैं।

[जोर जोड़ा]

और metaprogramming के लिए विवरण

Metaprogramming प्रोग्राम हैं जो लिख सकते हैं या अपने डेटा के रूप में अन्य कार्यक्रमों में हेरफेर लिख रहा है है।

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

(मुझे लगता है कि मान "लिखने" एक फाइल करने के लिए स्रोत कोड लिखने मतलब यह नहीं है, क्योंकि वह कोड पीढ़ी होगी।)

इस metaprogramming केवल प्रतिबिंब के एक सबसेट होगा?

या शर्तें अलग हैं क्योंकि कुछ प्रोग्रामिंग भाषाएं किसी अन्य भाषा द्वारा मेटाप्रोग्राम की जाती हैं, इस मामले में मेटाप्रोग्रामिंग होती है लेकिन प्रतिबिंब नहीं होती है? (metaprogramming Wikipedia article में यह दावा करने वाला एक भी अनिश्चित वाक्य था)

या क्या "प्रतिबिंब" और "मेटाप्रोग्रामिंग" शब्द अलग-अलग उपयोग करते हैं, इस पर निर्भर करता है कि व्यक्ति किस प्रोग्रामिंग भाषा का उपयोग कर रहा है?

उत्तर

12

नहीं बल्कि, प्रतिबिंब उन सुविधाओं को प्रदान करता है जो मेटाप्रोग्रामिंग कर सकते हैं।

Metaprogramming "प्रोग्राम जो कार्यक्रमों लिखने" है। इसमें ऐसे कार्यक्रम शामिल हैं जो प्रोग्राम के पाठ को पढ़ते हैं (तर्कसंगत रूप से स्वयं सहित लेकिन यह दुर्लभ है), उस कोड का विश्लेषण करें और परिवर्तन करें। हां, इसमें फाइलों के लिए लेखन स्रोत टेक्स्ट शामिल है। कोड जनरेशन मेटाप्रोग्रामिंग का एक विशेष मामला है।

प्रतिबिंब के रूप में मैं समझता हूं कि यह प्रोग्राम की अपनी संरचना के बारे में पूछताछ करने की क्षमता है। लगभग हर प्रणाली मैंने देखा है, जिसमें प्रतिबिंब संभव है (लिस्प और बराबर वेरिएंट की वास्तव में असाधारण मामलों के साथ) में, प्रतिबिंब मशीनरी केवल आत्मनिरीक्षण की एक सीमित साधन उपलब्ध कराए। जावा और सी # आपको कक्षाओं और विधियों के नामों का पता लगाने देगा, लेकिन आप इन सिस्टमों को किसी विधि, कथन या स्थानीय घोषणा की सामग्री के लिए नहीं पूछ सकते हैं।न ही आप इस तरह के प्रतिबिंबित लैंगुग से वास्तव में अपनी संरचना को बदलने के लिए कह सकते हैं, यानी, आप प्रतिबिंब सुविधाओं का उपयोग करके नए वर्ग या फ़ील्ड नहीं जोड़ सकते हैं। अधिकांश लैंगुग (उदाहरण के लिए, सी ++) मूल रूप से "प्रतिबिंबित" करने की कोई अंतर्निहित क्षमता नहीं है। जबकि लैंगुग में निर्मित प्रतिबिंब उपयोगिता उपयोगी हो सकती है, लेकिन भाषा डिजाइनरों/कंपाइलर बिल्डरों ने रनटाइम पर रहने का फैसला करने के संबंध में वे मूर्खतापूर्ण होते हैं।

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

उदाहरण के तौर पर, हमारे DMS Software Reengineering Toolkit एक प्रोग्राम रूपांतरण उपकरण है जिसमें प्रोग्राम के सार वाक्यविन्यास पेड़ और विभिन्न DMS language front ends द्वारा व्युत्पन्न कई अन्य तथ्यों तक पूर्ण पहुंच है। तो डीएमएस प्रक्रिया के बारे में मनमाने ढंग से "प्रतिबिंबित" (निरीक्षण/विश्लेषण/कारण) कर सकता है। और यह सी, कोबोल, जावा, सी # और सी ++ के लिए ऐसा कर सकता है; इनमें से कई लैंगुगों के लिए, यह केवल एएसटी तक पहुंच प्रदान नहीं कर सकता है, बल्कि प्रतीक तालिका की जानकारी और नियंत्रण और डेटा प्रवाह के विभिन्न रूपों तक पहुंच प्रदान करता है, जो मैंने कभी भी देखा है कि कोई प्रतिबिंब सुविधाएं आपको प्रदान नहीं करती हैं।

साथ ही, डीएमएस की तरह एक कार्यक्रम परिवर्तन उपकरण "प्रतिबिंब" के आधार पर नए कोड,, पुनर्गठन, साधन, ... प्राप्त प्रभाव की विविधता इस तरह से आश्चर्यजनक रूप से व्यापक है उत्पन्न अनुकूलन करने के लिए कोड को संशोधित कर सकते

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

3

प्रतिबिंब निष्पादन के दौरान भी हो सकता है, उदाहरण के लिए जब कोई प्रोग्राम अपनी कॉल का निरीक्षण करने में सक्षम होता है स्टैक (कॉल फ्रेम अंदर देखकर) और मेटाप्रोग्रामिंग उन कॉलों को भी बदल सकती है जिन्हें कॉल कहा जाता है (जिनके कॉल कॉल स्टैक में फ्रेम कम होते हैं) उनके कॉल फ्रेम के साथ।

आप जैक्स पितृत्र की पुस्तक Artificial Beings - the conscience of a conscious machine पर पढ़ने पर विचार कर सकते हैं जो विवरण में समझाता है कि यह उपयोगी क्यों है और इसे कैसे कार्यान्वित किया जा सकता है। his blog भी देखें।

संबंधित मुद्दे