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


10

मैंने अभी C ++ डेवलपर के रूप में अपनी यात्रा शुरू की है, और मैं हाल ही में मेटा-प्रोग्रामिंग नामक विषय पर शोध कर रहा हूं। अब तक, मैंने इस विषय पर बहुत सारी जानकारी प्राप्त की है, और कुछ प्रश्न हैं।

  1. C ++ में प्रतिबिंब का उपयोग: क्या यह संभव है? मेरी समझ के अनुसार प्रतिबिंब एक मेटा-प्रोग्रामिंग तकनीक है जिसमें किसी कार्यक्रम की स्थिति में हेरफेर करने की क्षमता होती है, और इसका हेरफेर आत्मनिरीक्षण या अंतर्मुखता हो सकता है।

  2. चिंतनशील वास्तुकला और मेटा-स्तर वास्तुकला के बीच अंतर क्या है? मेटा-प्रोग्रामिंग आर्किटेक्चर किस श्रेणी में आता है?

  3. मेटा-प्रोग्रामिंग दो स्तरों में आता है: मेटा स्तर और आधार स्तर। मेरी समझ में, ऑब्जेक्ट प्रोग्राम या जांच के तहत प्रणाली आधार स्तर है, और मेटा प्रोग्राम जो कि जांच के तहत सिस्टम पर काम करने वाला है, मेटा स्तर है। क्या मैं सही हूँ?

C ++ में टेम्पलेट मेटाप्रोग्रामिंग पर काम करने के बारे में कुछ दिशानिर्देश प्रदान करके मेरी मदद करें।
क्या आप मुझे कुछ व्यावहारिक उदाहरण सुझा सकते हैं, जिन्हें मैं इस प्रोग्रामिंग तकनीक में शामिल कर सकता हूँ?


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

यह SO उत्तर बताता है कि C ++ में प्रतिबिंब क्यों नहीं है: stackoverflow.com/q/359237/120163 , और कुछ कमजोर C ++ तकनीकों को बुरी तरह से अनुकरण करने के लिए।
इरा बैक्सटर

यदि आप मेटाप्रोग्रामिंग में बहुत रुचि रखते हैं, तो मेरा सुझाव है कि आप डी भाषा पर एक नज़र डालें, जो इस बिंदु पर सी ++ की तुलना में स्पष्ट है।
deadalnix

जवाबों:


10

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

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

मेटाप्रोग्रामिंग के अन्य उदाहरणों में कोड जनरेटर, सेल्फ-मॉडिफाइंग बायनेरिज़ (हालांकि ये आज भी उतने लोकप्रिय नहीं हैं, जितने दो दशक पहले थे), सी मैक्रोज़; एक तर्क दे सकता है कि करी और इसी तरह की कार्यात्मक-प्रोग्रामिंग तकनीकें भी एक प्रकार का मेटाप्रोग्रामिंग हैं।


+1 मैं वास्तव में आपके उत्तर को पसंद करता हूं और मैं कंपाइलर को C # की सेवा के रूप में उपयोग करने या जावा में स्क्रिप्टिंग इंजन का उपयोग करने के बारे में पूछना चाहता हूं, जो रन-टाइम में निर्मित कोड को निष्पादित करने के लिए है। क्या यह भी मेटाप्रोग्रामिंग का एक रूप नहीं है?
M.Sameer

तो जो कोई C में पायथन इंटरप्रेटर का निर्माण करता है, वह मेटाप्रोग्रामिंग है? ORM के कार्यान्वयन के बारे में क्या है जो ऑब्जेक्ट ऑब्जेक्ट भाषा को SQL में मैप करता है? क्या हर वेब फ्रेमवर्क मेटाप्रोग्रामिंग का एक उदाहरण है?
कोजिरो

1
  1. यह नहीं है। C ++ प्रोग्राम को मशीन कोड के लिए संकलित किया जाता है और कक्षाओं आदि के बारे में सभी जानकारी खो जाती हैं (जब तक कि .NET पर्यावरण के लिए C ++ / CLI का उपयोग नहीं किया जाता है, लेकिन यह शुद्ध C ++ नहीं है)।

2-3। मुझे नहीं पता - उस उत्तर के साथ मदद करने वाले किसी अन्य उत्तर की प्रतीक्षा करें :-)

C ++ टेम्प्लेट का उपयोग करके मेटा प्रोग्रामिंग बहुत शक्तिशाली है, लेकिन जटिल भी है। टेम्पलेट विस्तार को अनिवार्य प्रोग्रामिंग के बजाय प्रोग्रामिंग की कार्यात्मक शैली की आवश्यकता होती है जो C ++ का उपयोग करता है। यदि आपके पास कार्यात्मक प्रोग्रामिंग के साथ पिछला अनुभव नहीं है, तो मैं आपको अलग-अलग बुनियादी लिस्प, हैस्केल या स्कीम सीखने और बनाने की सलाह दूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.