यह एक SO प्रश्न के रूप में शुरू हुआ, लेकिन मुझे एहसास हुआ कि यह काफी अपरंपरागत है और वेबसाइटों पर वास्तविक विवरण के आधार पर, यह प्रोग्रामर के लिए बेहतर हो सकता है। क्योंकि प्रश्न में बहुत अधिक वैचारिक वजन है।
मैं क्लैबट लिबुलिंग सीख रहा हूं और यह एक बहुत शक्तिशाली उपकरण है जो कोड के संपूर्ण " किटी ग्रिट्टी " को एक दोस्ताना तरीके से, अर्थात् एक अर्थपूर्ण तरीके से, और न ही अनुमान लगाकर उजागर करने में सक्षम है । यदि क्लैंग आपके कोड को संकलित कर सकता है, तो क्लैंग उस कोड के अंदर हर एक वर्ण के शब्दार्थ के बारे में निश्चित है ।
अब मुझे एक पल के लिए पीछे हटने दें।
जब C ++ टेम्पलेट मेटाप्रोग्रामिंग (और विशेष रूप से चतुर एल्बिटिट मैक्रो के क्षेत्र में टेम्प्लेट से आगे निकलते हैं) में संलग्न होने पर कई व्यावहारिक समस्याएं उत्पन्न होती हैं। ईमानदार होने के लिए, कई प्रोग्रामर के लिए, खुद को शामिल किया, कई सामान्य उपयोग के टेम्पलेट भी कुछ हद तक भयानक हैं।
मुझे लगता है कि एक अच्छा उदाहरण संकलन-समय के तार होंगे । यह एक ऐसा सवाल है जो अब एक साल से अधिक पुराना है, लेकिन यह स्पष्ट है कि सी ++ के रूप में अभी यह आसान नश्वर लोगों के लिए आसान नहीं है। हालांकि इन विकल्पों को देखना मेरे लिए मतली को प्रेरित करने के लिए पर्याप्त नहीं है, फिर भी यह मेरे सॉफ्टवेयर के लिए जो भी फैंसी एप्लीकेशन है, उसके अनुरूप जादुई, अधिकतम कुशल मशीन कोड का उत्पादन करने में सक्षम होने के बारे में मुझे अपुष्ट छोड़ देता है।
मेरा मतलब है, चलो इसका सामना करते हैं, दोस्तों, तार बहुत सरल और बुनियादी हैं। हम में से कुछ बस मशीन कोड का उत्सर्जन करने के लिए एक सुविधाजनक तरीका चाहते हैं जिसमें कुछ स्ट्रिंग्स "पके हुए" हैं, जबकि हम इसे सीधे तरीके से कोडिंग करते हैं। हमारे C ++ कोड में।
क्लेंग और लिबटूलिंग दर्ज करें, जो स्रोत कोड के अमूर्त वाक्यविन्यास ट्री (एएसटी) को उजागर करता है और एएसटी Rewriter
में सब कुछ के एक समृद्ध अर्थ-ऑब्जेक्ट-उन्मुख मॉडल के साथ कच्चे स्रोत कोड (उपयोग करके ) को सही और विश्वसनीय ढंग से हेरफेर करने के लिए एक सरल कस्टम सी ++ आवेदन की अनुमति देता है । यह बहुत सी चीजों को संभालता है। यह मैक्रो विस्तार के बारे में जानता है, और आपको उन जंजीरों का पालन करने देता है। हां, मैं स्रोत-से-स्रोत कोड परिवर्तन या अनुवाद के बारे में बात कर रहा हूं।
यहां मेरी मौलिक थीसिस यह है कि क्लैंग अब हमें निष्पादन योग्य बनाने में सक्षम बनाता है जो स्वयं हमारे C ++ सॉफ़्टवेयर के लिए आदर्श कस्टम प्रीप्रोसेसर चरणों के रूप में कार्य कर सकते हैं, और हम C ++ के साथ इन मेटाप्रोग्रामिंग चरणों को लागू कर सकते हैं। हम केवल इस तथ्य से विवश हैं कि इस चरण को इनपुट लेना होगा जो कि सी ++ कोड मान्य है और आउटपुट के रूप में अधिक वैध सी ++ कोड का उत्पादन करता है। इसके अलावा जो कुछ भी आपके निर्माण प्रणाली को लागू करता है वह बाधा डालता है।
इनपुट को मान्य C ++ कोड के कम से कम बहुत करीब होना चाहिए, क्योंकि आखिरकार, क्लैंग कंपाइलर फ्रंट-एंड है और हम इसके एपीआई के साथ रचनात्मक रूप से इधर-उधर घूम रहे हैं। मुझे नहीं पता कि क्या उपयोग करने के लिए नए वाक्यविन्यास को परिभाषित करने में सक्षम होने का कोई प्रावधान है, लेकिन स्पष्ट रूप से हमें इसे ठीक से पार्स करने और इसे करने के लिए इसे क्लैंग प्रोजेक्ट में जोड़ने के तरीके विकसित करने होंगे। किसी भी अधिक उम्मीद करने के लिए क्लैंग प्रोजेक्ट में कुछ ऐसा होना चाहिए जो दायरे से बाहर हो।
एक समस्या नहीं है। मुझे लगता है कि कुछ नो-ऑप मैक्रो फ़ंक्शन इस कार्य को संभाल सकते हैं।
मैं जो वर्णन कर रहा हूं, उसे देखने का एक और तरीका यह है कि भाषा में उपलब्ध अधिक सीमित साधनों का उपयोग करके उन्हें लागू करने के बजाय हमारे स्रोत कोड (धन्यवाद और उसके एपीआई के धन्यवाद) के एएसटी में हेरफेर करके रनटाइम सी ++ का उपयोग करके मेटाप्रोग्रामिंग निर्माणों को लागू करना है। यह स्पष्ट संकलन प्रदर्शन लाभ के साथ ही (टेम्पलेट-भारी हेडर धीमा संकलन समानुपातिक रूप से कितनी बार आप उनका उपयोग करते हैं। संकलित सामान के बहुत सारे तो ध्यान से मिलान और लिंकर द्वारा दूर फेंक दिया जाता है)।
यह, हालांकि, निर्माण प्रक्रिया में एक अतिरिक्त कदम या दो को शुरू करने की लागत पर आता है और कुछ (संयुक्त रूप से) कुछ और अधिक वर्बोज़ सॉफ़्टवेयर लिखने की आवश्यकता में होता है (लेकिन कम से कम यह सीधा रनटाइम सी ++ है) हमारे उपकरण के हिस्से के रूप में ।
यह पूरी तस्वीर नहीं है। मुझे पूरा यकीन है कि कार्यक्षमता का एक बहुत बड़ा स्थान है जो कोड उत्पन्न करने से हो सकता है जो कि मुख्य भाषा सुविधाओं के साथ अत्यंत कठिन या असंभव है। C ++ में आप एक टेम्प्लेट या एक मैक्रो या दोनों का एक पागल संयोजन लिख सकते हैं, लेकिन एक क्लैंग टूल में आप क्लास और फ़ंक्शंस को किसी भी तरह से संशोधित कर सकते हैं जिसे आप C ++ के साथ रनटाइम पर प्राप्त कर सकते हैं , जबकि सिमेंटिक सामग्री तक पूरी पहुँच हो सकती है, टेम्पलेट और मैक्रोज़ के अलावा और सब कुछ।
इसलिए, मैं सोच रहा हूं कि हर कोई ऐसा क्यों नहीं कर रहा है। क्या यह है कि क्लैंग से यह कार्यक्षमता इतनी नई है और कोई भी क्लैंग एएसटी के विशाल वर्ग पदानुक्रम से परिचित नहीं है? यह नहीं हो सकता।
शायद मैं इसे थोड़ा मुश्किल से कम कर रहा हूं, लेकिन एक क्लैंग टूल के साथ "संकलन-समय स्ट्रिंग हेरफेर" करना लगभग सरल है। यह क्रिया है, लेकिन यह बिल्कुल सीधा है। सभी की जरूरत है कि वास्तविक वास्तविक std::string
संचालन के लिए नक्शे कि कोई सेशन मैक्रो कार्यों का एक गुच्छा रहे हैं । क्लैंग प्लगइन सभी प्रासंगिक नो-ऑप मैक्रो कॉल प्राप्त करके इसे लागू करता है, और स्ट्रिंग्स के साथ संचालन करता है। यह उपकरण तब निर्माण प्रक्रिया के एक भाग के रूप में डाला जाता है। निर्माण के दौरान, ये नो-ऑप मैक्रो फ़ंक्शन कॉल स्वचालित रूप से उनके परिणामों में मूल्यांकन किए जाते हैं, और फिर प्रोग्राम में सादे पुराने संकलन-समय के तार के रूप में वापस डाले जाते हैं। कार्यक्रम को हमेशा की तरह संकलित किया जा सकता है। वास्तव में यह परिणामी कार्यक्रम बहुत अधिक पोर्टेबल है, परिणामस्वरूप, C ++ 11 का समर्थन करने वाले फैंसी नए संकलक की आवश्यकता नहीं है।