2011-01-11 9 views
5

मैं मेटाप्रोग्रामिंग का बहुत उपयोग कर रहा हूं, लेकिन कभी-कभी सी मैक्रोज़ और टेम्पलेट्स का संयोजन पर्याप्त नहीं होता है।क्या टेम्पलेट्स के अलावा कोई सी ++ मेटाप्रोग्रामिंग विकल्प हैं?

मुझे लगता है दोष यह संभावित रूप से पार मंच संगतता की कमी हो सकता है अगर metaprogramming मंच, लिनक्स आदि के लिए ही कहते हैं, है

तो, हाँ, इस तरह बात उपलब्ध अभी टेम्पलेट्स के अलावा है? metaprogramming के लिए गूगल खोज टेम्पलेट metaprogramming का प्रभुत्व है, तो यह अभी पता लगाने के लिए मुश्किल है ..

संपादित: यहाँ कुछ मैं पर काम कर रहा है पर एक उदाहरण है।

मान लीजिए कि मेरे पास बफर में फ़ाइलों को सहेजने/लोड करने के लिए एक सामान्य वर्ग है। आइए इसे फाइलपैक कहते हैं।

मैं जो लग रहा है यह मूल रूप से एक वर्ग "BaseClassPack" कहा जाता है, जो एक उपवर्ग होने के लिए परिभाषित किया गया है बनाता है

तरह
defineFilePack(BaseClass, "code-a") 

मैक्रो निर्धारित है,। नीचे वह बात है।

class FilePack{ 
    public: 
     char * thebuffer; 
     int bufsize; 
     string packcode; 

     // and constructors etc 
     FilePack(const string& thecode, int bufsize); 
     void operator=(FilePack& rhs); 
     void saveToFile(const string& filename); 
     void loadFromFile(const string& filename); 
     // .. and all the function you'd expect to see in a class like this 

}; 

// the person details 

class PersonDetails{ 
    public: 
     solidstring<64> name; 
     int age; 
     DateTime birthday; 
     // .. yada yada yada 
}; 


defineFilePack(PersonDetails, "psd") 

// the above creates the following class 

class PersonDetailsPack : public FilePack{ 
    public: 
     PersonDetailsPack(): 
     FilePack("psd", sizeof(PersonDetails)){ // etc 

     } 

     PersonDetails& get(){ 
     return *(PersonDetails*)getBuffer(); 
     } 

     // and a lot more convenience function 

}; 

अब, वहाँ वास्तव में है कि घोषित कोड आकार के साथ मेल खाता है, एक वैश्विक मानचित्र का उपयोग कर FilePack के निर्माता द्वारा एक में निर्मित की जांच है।

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

मेटाप्रोग्रामिंग एक और चीज जो यहां सहायता कर सकती है वह फ़ाइलपैक के विभिन्न संस्करणों को लोड करने का समर्थन करना है। मान लीजिए मैं PersonDetails वर्ग को अद्यतन करने के लिए किया था .. मैं तो बस एक नया वर्ग बनाना, विरासत घोषित करने के लिए metaprogramming किसी तरह का उपयोग करें, और जादुई FilePack पता इतना है कि जब यह PersonDetails के एक पुराने संस्करण लोड हो रहा है यह रूपांतरण समारोह कॉल कर सकते हैं बनाने के लिए, या जो कुछ।

इसके अलावा, आप उस वास्तुकला पर टिप्पणी करने के लिए स्वागत करते हैं, और मैं इसके बारे में कोई टिप्पणी सुनना चाहता हूं, लेकिन यह थोड़ा सा विषय हो सकता है?

+0

क्या आप कुछ ऐसा उदाहरण प्रदान कर सकते हैं जहां टेम्पलेट्स + मैक्रोज़ पर्याप्त नहीं हैं? चर्चा के लिए यह एक अच्छा प्रारंभ बिंदु होगा। –

+2

@ डेविड रोड्रिगेज: उदाहरण के लिए कोड उत्पन्न करना जो नेटवर्क कनेक्शन पर कक्षाओं को क्रमबद्ध करता है या सामान्य रूप से प्रत्येक सदस्य के लिए कुछ करता है। – 6502

+0

"लेकिन कभी-कभी सी मैक्रोज़ और टेम्पलेट्स का संयोजन पर्याप्त नहीं होता है" - क्या गुम है/पर्याप्त नहीं है? – Naveen

उत्तर

5

आप प्रीप्रोसेसर के साथ मेटाप्रोग्राम भी कर सकते हैं।

आप "मेटाप्रोग्रामिंग" के रूप में कोड उत्पन्न करने के लिए विशेष उद्देश्य प्रीप्रोसेसरों का उपयोग करने पर विचार कर सकते हैं। फिर आप लेक्स/वाईएसीसी और क्यूटी एमओसी जैसी चीजें शामिल कर सकते हैं।

+0

वह एमओसी चीज जो मैं खोज रहा था, बहुत बुरा है यह क्यूटी है:/लेकिन अवधारणा में यह अभी सबसे व्यावहारिक बात प्रतीत होता है .. शायद मुझे लगता है कि किसी भाषा के शीर्ष पर एक भाषा के रूप में गिना जाता है? – kamziro

+0

मुझे नहीं पता कि इसका "बहुत बुरा यह क्यूटी क्यों है"। मुझे लगता है कि क्यूटी को इसके लिए और अधिक के लिए उत्कृष्ट बनाया गया है! अज्ञात अस्पष्ट ड्राइव-डाउनवोट द्वारा काउंटर करने के लिए –

1

मुझे लगता है कि यह काम पाइथन के लिए उदाहरण के लिए बिल्कुल सही है। आसान तरीका हुए बताया कि कैसे कक्षाएं बना रहे हैं के लिए एक कस्टम फ़ाइल स्वरूप का उपयोग करने के लिए है और फिर आप दोनों कार्यान्वयन और इंटरफेस (कई भाषाओं में भी) उत्पन्न कर सकते हैं।

मौजूदा सी ++ हेडर फाइल पार्स बजाय जटिल सी ++ वाक्य रचना की वजह से एक बुरा सपना की तरह ... है (और क्या आप व्यक्त करना चाहता हूँ में अपने आप को सीमित क्यों?)।

अजगर बहु ​​है और एक बहुत अच्छी भाषा से प्रति ...

एक उदाहरण निम्नलिखित के रूप में मैं था, "संवर्धित" सी ++ का एक उदाहरण है ...

// 
// U8 -> F32 format converter 
// 
// - src(Image:U8) ............ source image 
// - dst(pImage:F32:src) ...... destination image 
// 
ImgFilter u8_to_f32(Image& src, Image& dst) 
{ 
    const double k = 1.0/255; 
    for (int y=0; y<src.h; y++) 
    { 
     unsigned char *rp = src.u8(0, y); 
     float *wp = dst.f32(0, y); 
     for (int x=0,w=src.w; x<w; x++) 
      *wp++ = *rp++ * k; 
    } 
} 

समारोह और नाम/मानकों के ऊपर टिप्पणी Python स्क्रिप्ट है जो समारोह, सी ++ कोड है कि स्मृति आवंटन, आकार और स्वरूप संगतता चेक, कमांड लाइन तर्क पार्स संभालती के लिए ज उत्पन्न द्वारा पढ़ा जाता है, ऑनलाइन सहायता और एक अजगर बाध्यकारी। असल में मैं केवल "मांस" लिख सकता हूं और मेरे लिए जेनरेट किए गए सभी बॉयलरप्लेट को लिख सकता हूं। यह पाइथन स्क्रिप्ट यह 200 लाइनों है और जेनरेट कोड की मात्रा को केवल कुछ फिल्टर के लिए सी ++ बॉयलरप्लेट की मात्रा पहले से ही अधिक है।

+1

+1। –

+0

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

+0

आप शायद नीचे उतर गए क्योंकि लड़के ने पढ़ा "यह काम पाइथन के लिए बिल्कुल सही है", तुरंत आपको ट्रोल या कुछ के रूप में पढ़ रहा है। मुझे वह दृष्टिकोण पसंद है, लेकिन यह वास्तव में बहुत सारे काम की तरह लगता है। यह सी ++ के शीर्ष पर एक भाषा बनाने जैसा है जो अभी भी मौजूदा सामान के साथ काम करता है .. यह बहुत ही अच्छा होगा। – kamziro

2

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

हालांकि, अगर आप वहां थोड़ा और अधिक प्राप्त करना चाहते हैं, तो आप मेटाप्रोग्राम में अपनी पसंद की एक स्क्रिप्टिंग भाषा का उपयोग कर सकते हैं।

+0

मैंने हमेशा सोचा है कि उनकी चीजें कैसे बढ़ावा देती हैं। मैंने वास्तव में कभी भी उनका उपयोग नहीं किया है, लेकिन ऐसा लगता है कि उनके अंदर बहुत सारी आर्केन चीजें हैं। – kamziro

2

आपको लगता है कि कोड उत्पन्न लेखन कोड के रूप में metaprogramming निर्धारित करते हैं तो आप

  • टेम्पलेट्स है।
  • प्रीप्रोसेसर।
  • अन्य प्रीप्रोकैसिंग (आमतौर पर स्क्रिप्ट, लेकिन कभी-कभी कंपाइलर एक्सटेंशन)
  • सी ++ कोड से सी ++ स्रोत उत्पन्न करना, फ्लाई पर संकलित, साझा lib के रूप में लोड करें।
  • संभवतः, लेकिन यह इसे खींच रहा है, मशीन कोड उत्पन्न करता है, जैसे ट्रैम्पोलिन स्टब्स।

मुझे लगता है कि सबसे दिलचस्प है कि टेम्पलेट या सी ++ पूर्वप्रक्रमक नहीं, कि पार चिंता प्रोग्रामिंग, aspect-oriented programming, जैसे, प्रवेश करने प्रणाली को बुलाती है या serializing समर्थन भाषा एक्सटेंशन है।

जैसा कि मुझे याद है कि ParcPlace ने इसके लिए एक उपकरण बनाया है?

एचएम, जो मुझे याद दिलाता है कि कभी-कभी इसे जांचना न भूलें। :-)

चीयर्स & hth।,

+0

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

0

आप कोड के मनमाने ढंग से जोड़-तोड़ करना चाहते हैं, तो आप एक सामान्य प्रयोजन metaprogramming उपकरण इस तरह के कार्यक्रम परिवर्तन प्रणाली के रूप में चाहते हैं। ये उपकरण स्रोत कोड स्वीकार करते हैं, और संकलक जैसी तकनीक का उपयोग करते हुए, आपकी आवश्यकताओं के अनुसार उस कोड में मनमाने ढंग से विश्लेषण/संशोधन करते हैं।

हमारे DMS Software Reengineering Toolkit बिल्कुल ऐसी प्रणाली है। यह प्रोग्रामिंग भाषा के संसाधित होने के स्पष्ट विवरण द्वारा पैरामीटर किया गया है, और उस कार्य द्वारा जिसे आप अपने स्रोत कोड पर ले जाना चाहते हैं। डीएमएस इस तरह जेनेरिक होने में अद्वितीय है (जैकपॉट जावा-केवल प्रोग्राम ट्रांसफॉर्मेशन सिस्टम है), और एक मजबूत C++ Front End होने में दोगुनी अद्वितीय है जिसका उपयोग उत्पादन सी ​​++ सिस्टम पर बड़े पैमाने पर परिवर्तन कार्यों के लिए किया गया है।

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

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