सी ++: सी ++ सुविधाओं के बजाय एक कंपाइलर एपीआई के साथ मेटाप्रोग्रामिंग


10

यह एक SO प्रश्न के रूप में शुरू हुआ, लेकिन मुझे एहसास हुआ कि यह काफी अपरंपरागत है और वेबसाइटों पर वास्तविक विवरण के आधार पर, यह प्रोग्रामर के लिए बेहतर हो सकता है। क्योंकि प्रश्न में बहुत अधिक वैचारिक वजन है।

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

अब मुझे एक पल के लिए पीछे हटने दें।

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

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

मेरा मतलब है, चलो इसका सामना करते हैं, दोस्तों, तार बहुत सरल और बुनियादी हैं। हम में से कुछ बस मशीन कोड का उत्सर्जन करने के लिए एक सुविधाजनक तरीका चाहते हैं जिसमें कुछ स्ट्रिंग्स "पके हुए" हैं, जबकि हम इसे सीधे तरीके से कोडिंग करते हैं। हमारे C ++ कोड में।

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

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

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

एक समस्या नहीं है। मुझे लगता है कि कुछ नो-ऑप मैक्रो फ़ंक्शन इस कार्य को संभाल सकते हैं।

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

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

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

इसलिए, मैं सोच रहा हूं कि हर कोई ऐसा क्यों नहीं कर रहा है। क्या यह है कि क्लैंग से यह कार्यक्षमता इतनी नई है और कोई भी क्लैंग एएसटी के विशाल वर्ग पदानुक्रम से परिचित नहीं है? यह नहीं हो सकता।

शायद मैं इसे थोड़ा मुश्किल से कम कर रहा हूं, लेकिन एक क्लैंग टूल के साथ "संकलन-समय स्ट्रिंग हेरफेर" करना लगभग सरल है। यह क्रिया है, लेकिन यह बिल्कुल सीधा है। सभी की जरूरत है कि वास्तविक वास्तविक std::stringसंचालन के लिए नक्शे कि कोई सेशन मैक्रो कार्यों का एक गुच्छा रहे हैं । क्लैंग प्लगइन सभी प्रासंगिक नो-ऑप मैक्रो कॉल प्राप्त करके इसे लागू करता है, और स्ट्रिंग्स के साथ संचालन करता है। यह उपकरण तब निर्माण प्रक्रिया के एक भाग के रूप में डाला जाता है। निर्माण के दौरान, ये नो-ऑप मैक्रो फ़ंक्शन कॉल स्वचालित रूप से उनके परिणामों में मूल्यांकन किए जाते हैं, और फिर प्रोग्राम में सादे पुराने संकलन-समय के तार के रूप में वापस डाले जाते हैं। कार्यक्रम को हमेशा की तरह संकलित किया जा सकता है। वास्तव में यह परिणामी कार्यक्रम बहुत अधिक पोर्टेबल है, परिणामस्वरूप, C ++ 11 का समर्थन करने वाले फैंसी नए संकलक की आवश्यकता नहीं है।


यह एक असामान्य रूप से लंबा सवाल है। क्या आप शायद इसे अपने सबसे प्रासंगिक बिंदुओं के लिए गाढ़ा कर सकते हैं?
अमोन

मैं बहुत से लंबे सवाल पोस्ट करता हूं। लेकिन विशेष रूप से इस एक के साथ, सवाल के सभी हिस्से महत्वपूर्ण हैं, मुझे लगता है। शायद पहले 6 पैराग्राफ को छोड़ दें? Haha।
स्टीवन लू

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

हाँ इसकी मेटा-इफाइंग C ++। जिसका मतलब बेहतर, तेज कोड हो सकता है। उन भाषाओं के लिए के रूप में । खैर मैं कहाँ से शुरू करूँगा उन भाषाओं में से किसी में भी बहु-मिलियन डॉलर का वीडियो गेम लागू किया गया है? उन भाषाओं में से किसी में भी आधुनिक वेब ब्राउज़र लागू किया गया है? OS कर्नेल? ठीक है, यह वास्तव में ऐसा लगता है जैसे हेक्स में कुछ मात्रा में कर्षण है, लेकिन आपको यह विचार मिलता है।
स्टीवन लू

1
@ एनडब्ल्यूपी, ठीक है, मैं मदद नहीं कर सकता लेकिन आपको लगता है कि आपको पोस्ट के पूरे बिंदु याद आ गए हैं। संकलन-समय के तार अभी हमारे लिए उपलब्ध क्षमताओं का सबसे अधिक वंचित और न्यूनतम ठोस उदाहरण हैं।
स्टीवन लू

जवाबों:


7

हां, वर्जीनिया, वहां सांता क्लॉस है।

कार्यक्रमों को संशोधित करने के लिए कार्यक्रमों का उपयोग करने की धारणा लंबे समय से है। मूल विचार जॉन-वॉन न्यूमैन से संग्रहीत प्रोग्राम कंप्यूटर के रूप में आया था । लेकिन मशीन कोड को मनमाने तरीके से संशोधित करना मशीन कोड बहुत असुविधाजनक है।

लोग आमतौर पर स्रोत कोड को संशोधित करना चाहते हैं । यह ज्यादातर प्रोग्राम ट्रांसफॉर्मेशन सिस्टम (पीटीएस) के रूप में महसूस किया जाता है ।

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

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

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

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

एक प्रमेय है जो कहता है कि यदि आप स्ट्रिंग पुनर्लेखन कर सकते हैं [तो वृक्ष पुनर्लेखन] आप मनमाना परिवर्तन कर सकते हैं; और इस तरह से पीटीएस की एक संख्या इस पर दावा करती है कि आप कुछ भी कर सकते हैं बस पेड़ के साथ कुछ भी लिख सकते हैं। जबकि प्रमेय इस अर्थ में संतुष्ट है कि आप अब निश्चित हैं कि आप कुछ भी कर सकते हैं, यह उसी तरह से असंतोषजनक है कि कुछ करने की ट्यूरिंग मशीन की क्षमता प्रोग्रामिंग को ट्यूरिंग मशीन की पसंद का तरीका नहीं बनाती है। (समान प्रक्रियात्मक एपीआई वाले सिस्टम के लिए भी सही है, अगर वे आपको एएसटी [और वास्तव में मुझे लगता है कि यह क्लैंग का सच नहीं है] में मनमाना बदलाव करने देगा]।

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

  • रास्कल (एमपीएल) मेटाप्रोग्रामिंग भाषा
  • हमारे डीएमएस सॉफ्टवेयर रीइंजीनियरिंग टूलकिट

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

रास्कल "ओपीपी" (अन्य लोगों के पार्सर्स) का सह-चयन करके ऐसा करने की कोशिश करता है, लेकिन यह स्थिर विश्लेषण भाग के साथ मदद नहीं करता है। मुझे लगता है कि उनके हाथ में जावा बहुत अच्छा है, लेकिन मुझे पूरा यकीन है कि वे C या C ++ नहीं करते हैं। लेकिन, इसका एक अकादमिक अनुसंधान उपकरण; उन्हें दोष देना कठिन है।

मैं जोर देता हूं, हमारे [कमर्शियल] डीएमएस टूल में जावा, सी, सी ++ फुल फ्रंट एंड उपलब्ध हैं। C ++ के लिए, यह GCC और यहां तक ​​कि Microsoft की विविधताओं (और हम अब पॉलिश कर रहे हैं), मैक्रो विस्तार और सशर्त प्रबंधन और विधि-स्तरीय नियंत्रण और डेटा प्रवाह विश्लेषण के लिए C ++ 14 में लगभग सब कुछ शामिल करता है। और हाँ, आप व्याकरण परिवर्तन को व्यावहारिक रूप से निर्दिष्ट कर सकते हैं; हमने एक क्लाइंट के लिए एक कस्टम वेक्टरसी ++ सिस्टम बनाया है जो मौलिक रूप से C ++ को F90 / APL डेटा-समांतर सरणी संचालन के लिए कितनी राशि का उपयोग करता है। डीएमएस का उपयोग बड़े सी ++ सिस्टम (जैसे, एप्लिकेशन आर्किटेक्चरल रिहापिंग) पर अन्य बड़े पैमाने पर मेट्रोपोग्रामिंग कार्यों को करने के लिए किया गया है। (मैं डीएमएस के पीछे का वास्तुकार हूं)।

हैप्पी मेटा-मेटाप्रोग्रामिंग।


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

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

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

आप ताली से क्लैंग या डीएमएस जैसे उपकरण बनाने का जोखिम नहीं उठा सकते। न ही आप आमतौर पर उस एप्लिकेशन को फेंक सकते हैं जिसे आपने 10 से अधिक 5 वर्षों की टीम के साथ लिखा था। हमें ऐसे उपकरणों की अधिक से अधिक बार आवश्यकता होगी, क्योंकि सॉफ्टवेयर का आकार और जीवनकाल लगातार बढ़ता जा रहा है।
इरा बैक्सटर

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

4

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

इसलिए, मैं सोच रहा हूं कि हर कोई ऐसा क्यों नहीं कर रहा है। क्या यह है कि क्लैंग से यह कार्यक्षमता इतनी नई है और कोई भी क्लैंग एएसटी के विशाल वर्ग पदानुक्रम से परिचित नहीं है? यह नहीं हो सकता।

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

वैसे, चूंकि हम कॉमन लिस्प और इसके मैक्रो सिस्टम का उल्लेख कर रहे हैं (बेसिल का जवाब देखें), मुझे कहना होगा कि कल ही, क्लैस को जारी किया गया था (मैं संबद्ध नहीं हूं):

अकवार एक आम कॉमन लिस्प कार्यान्वयन है जो LLVM IR के अनुरूप है। इसके अलावा, यह डेवलपर को क्लैंग लाइब्रेरी (एएसटी, मैचर) को उजागर करता है।

  • सबसे पहले, इसका मतलब है कि आप सीएल में लिख सकते हैं और सी ++ का उपयोग नहीं कर सकते हैं, सिवाय इसके पुस्तकालयों का उपयोग करते हुए (और यदि आपको मैक्रोज़ की आवश्यकता है, तो सीएल मैक्रोज़ का उपयोग करें)।

  • दूसरे, आप अपने मौजूदा C ++ कोड (विश्लेषण, रीफैक्टरिंग, ...) के लिए CL में उपकरण लिख सकते हैं।


3

कई C ++ कंपाइलर में कुछ अधिक या कम प्रलेखित और स्थिर API होते हैं, विशेष रूप से अधिकांश फ्री सॉफ्टवेयर कंपाइलर में।

क्लैंग / एलएलवीएम ज्यादातर पुस्तकालयों का एक बड़ा सेट है, और आप उनका उपयोग कर सकते हैं।

हालिया जीसीसी प्लगइन्स को स्वीकार कर रहा है । विशेष रूप से, आप इसे MELT (जो स्वयं एक मेटा-प्लगइन है, जीसीसी का विस्तार करने के लिए एक उच्च-स्तरीय डोमेन विशिष्ट भाषा प्रदान करके) का उपयोग करके इसे बढ़ा सकते हैं ।

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

आप मल्टी-स्टेज लैंग्वेज और कंपाइलर में रूचि ले सकते हैं, उदाहरण के लिए C.Calcagno et al द्वारा ASTs, Gensym और Reflection पेपर का उपयोग करके मल्टी-स्टेज लैंग्वेज इम्प्लीमेंट करना । और MetaOcaml के आसपास काम करते हैं । आपको निश्चित रूप से कॉमन लिस्प की मैक्रो सुविधाओं के अंदर देखना चाहिए । और आप जेआईटी पुस्तकालयों जैसे कि लिबजीत , जीएनयू लाइटनिंग , यहां तक ​​कि एलएलवीएम , या बस-रन रन-टाइम से रूबरू हो सकते हैं! - कुछ सी ++ कोड उत्पन्न करते हैं, एक साझा ऑब्जेक्ट डायनेमिक लाइब्रेरी में इसके संकलन का निर्माण करते हैं, फिर dlenen (3) जो साझा करता है वस्तु। J.Pitrat का ब्लॉग भी ऐसे चिंतनशील दृष्टिकोणों से संबंधित है। और RefPerSys भी ।


दिलचस्प। जीसीसी को यहां विकसित होते देखना बहुत अच्छा है। यह एक ऐसा उत्तर नहीं है जो मेरे द्वारा पूछे गए कुछ भी संबोधित करता है, लेकिन फिर भी मुझे यह पसंद है।
स्टीवन लू

पुन: आपके नए संपादन ... यह कोड पुनर्लेखन के बारे में एक अच्छी बात है। यह वास्तव में C ++ के लिए ऐसी मेटा-प्रोग्राम क्षमता लाने के लिए शुरू होता है, साथ ही पहले से कहीं अधिक सुलभ रूप से, जो काफी दिलचस्प भी है।
स्टीवन लू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.