क्या C ++ टेम्पलेट्स महज एक तरह का महिमामंडित मैक्रो हैं?


27

C ++ टेम्प्लेट और C # / Java जेनेरिक के बीच विभिन्न तुलनाओं से यह एक-

/programming/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929

मुझे एक धारणा मिली कि, C ++ टेम्प्लेट को किसी प्रकार के प्रीप्रोसेसिंग (सादे पाठ प्रतिस्थापन से पहले पार्सिंग) द्वारा लागू किया जाता है, संकलन नहीं। क्योंकि C ++ टेम्प्लेट में जाँच करने का प्रकार C मैक्रोज़ जैसा दिखता है। मेरा मतलब है, अगर कुछ त्रुटियां हैं, तो वे टेम्पर्ड कोड ब्लॉक को संसाधित करने के बाद उत्पन्न कोड से त्रुटियां हैं, न कि स्वयं टेम्पलेट्स से। दूसरे शब्दों में, वे सी में मैक्रोज़ के ऊपरी संस्करण का एक प्रकार हैं।

तब मुझे इसके समर्थन में कुछ अन्य तथ्य मिले-

  • मैंने सोचा, यदि C ++ टेम्प्लेट प्रीप्रोसेसिंग द्वारा कार्यान्वित किए जाते हैं, तो डायनेमिक लिंकिंग (.dll) का उपयोग करते हुए समस्याएँ होंगी। और एक त्वरित googling ने इसका समर्थन किया।

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

हालांकि सी मैक्रोज़ के विपरीत, इसमें कुछ बेहतर क्षमताएं हैं। लेकिन क्या C ++ टेम्पलेट किसी प्रकार के प्रीप्रोसेसिंग के साथ लागू नहीं किया गया है? इसे विभिन्न C ++ कंपाइलरों में कैसे लागू किया जाता है?


19
नहीं। C ++ टेम्प्लेट संकलित हैं।
एडवर्ड स्ट्रेंज

2
"प्रीप्रोसेसिंग" की आपकी परिभाषा क्या है? और "संकलन"? "प्रीप्रोसेसिंग" की पर्याप्त व्यापक परिभाषा में वह सब कुछ शामिल हो सकता है जो एक कंपाइलर करता है; सब के बाद, एक संकलक वास्तव में स्रोत को संसाधित करता है इससे पहले कि वह निष्पादित हो जाए, नहीं?
जेम्स मैकनेलिस

@ जेम्स मैकनेलिस आईएमएचओ यदि आप संकलन के लिए किए गए अन्य सभी चीजों से सिर्फ प्रीप्रोसेसिंग को अलग कर सकते हैं, तो यह मेरे प्रश्न को समझने के लिए पर्याप्त है। प्रीप्रोसेसर को स्पष्ट करने के लिए- en.wikipedia.org/wiki/Preprocessor#Lexical_preprocessors
Gulshan

6
यदि आप प्रीप्रोसेसिंग के उस रूप का उल्लेख कर रहे हैं, तो नहीं, C ++ टेम्प्लेट बिल्कुल कुछ प्रकार के महिमामंडित मैक्रो नहीं हैं।
जेम्स मैकनेलिस

1
टेम्प्लेट लैंग्वेज वास्तव में पूरी तरह से ट्यूरिंग होती है, इसलिए वे मैक्रोज़ की तुलना में बहुत अधिक हैं।
davidk01

जवाबों:


9

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


2
"लेकिन यह गंभीर रूप से सीमित है क्योंकि उस भाषा से अंतर्निहित C ++ वातावरण तक कोई पहुंच नहीं है।" -- इसका क्या मतलब है? मैंने इस कथन को पार्स करने की कोशिश की, लेकिन असफल रहा।
क्वांट_देव

2
उह, वास्तव में ... github.com/kmichel/bf0x
एंटोन गोलोव

3
@ SK-तर्क: जैसा कि एक अलग रूप में, सी ++ 11 है सी ++, जब तक आप (pedantically) विभिन्न भाषाओं के रूप में एक ही भाषा के विभिन्न संस्करणों का इलाज।
जॉन प्यूरी

3
इस उत्तर के समय तक @Jon Purdy, C ++ 11 मौजूद नहीं था (आधिकारिक तौर पर)। आजकल एक उदाहरण और अधिक जटिल हो गया होगा, जैसे डेटा संरचना को विघटित करना, लाइब्रेरी फ़ंक्शन का उपयोग करना, आदि
SK-logic

1
@ एसके-लॉजिक: क्या आपको लिस्प की तरह मैक्रो के साथ सी ++ के कार्यान्वयन का पता है? मैं टेम्पलेट सीमाओं से बीमार हो रहा हूं। H ++ में शक्तिशाली मैक्रो सिस्टम के साथ C ++ - शैली वाक्य रचना भाषा का एक उदाहरण: haxe.org/manual/macros । (मेरी मदद नहीं करता है क्योंकि मैं अपने उद्देश्य के लिए C ++ का उपयोग करता हूं - 8-बिट माइक्रोकंट्रोलर प्रोग्रामिंग; कुछ और के लिए बेहतर भाषाएं हैं)।
pfalcon

41

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

इसलिए: C ++ टेम्प्लेट एक ही अर्थ में प्रीप्रोसेस नहीं कर रहे हैं मैक्रोज़ हैं, वे एक तरह के C मैक्रो नहीं हैं, और C मैक्रोज़ का उपयोग करना असंभव है जो टेम्प्लेट करते हैं।

टेम्प्लेट हेडर फ़ाइलों में रहते हैं, लिंक किए गए पुस्तकालयों में नहीं, सच है, लेकिन यदि आप आपूर्ति कर रहे हैं, तो आप निश्चित रूप से इसका उपयोग करने के लिए हेडर फ़ाइल की आपूर्ति कर रहे हैं।


12
उन्हें हेडर फ़ाइल में रहने की आवश्यकता नहीं है (जो कि उन्हें इस्तेमाल करने की सबसे सरल तकनीक है)। आप उन्हें एक स्रोत फ़ाइल में परिभाषित कर सकते हैं और मैन्युअल रूप से स्रोत फ़ाइल (संकलन इकाई) में टेम्पलेट की तात्कालिकता को मजबूर कर सकते हैं। इसके बाद लिंकिंग सामान्य के रूप में इंस्टेंटेशन्स उठाएगा (यह टेम्पलेट को विशिष्ट प्रकारों तक सीमित करने और सभी सामान्य प्रकारों को अनुमति नहीं देने के लिए एक तकनीक है)।
मार्टिन यॉर्क

@ मर्टिन: मुझे यकीन नहीं है कि यह टेक्निक (समर्थित होने पर) वास्तव में मानक द्वारा स्पष्ट रूप से समर्थित है। अन्यथा सभी कंपाइलर exportपहले ही लागू हो जाते। मुझे पता है कि यह कार्यों के लिए काम करता है, लेकिन मुझे संदेह है कि यह कक्षाओं के लिए काम करता है: आप उनके आकार को कैसे जानेंगे?
मथिउ एम।

@ मैथ्यू एम: इसका एक्सपोर्ट कीवर्ड से कोई लेना-देना नहीं है। यह "स्पष्ट" टेम्पलेट तात्कालिकता से संबंधित है और मानक में अच्छी तरह से परिभाषित है।
मार्टिन यॉर्क

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

मुझे पता है कि यह काम करता है, निश्चित रूप से, विशेष कार्यों के लिए। हालाँकि मुझे भी पूरा यकीन है, कि यह कक्षाओं के लिए काम नहीं करता है, जो कि मेरी बात थी। मुझे लगता है कि यह विशेष वर्गों से भी तरीकों के लिए काम करता है, लेकिन यह नहीं जानता कि यह मानक है या नहीं।
मथिउ एम।

5

क्या इससे कोई फर्क नहीं पड़ता कि उन्हें कैसे लागू किया जाता है? शुरुआती C ++ कंपाइलर सिर्फ प्री-प्रोसेसर थे जिन्होंने कोड को एसी कंपाइलर को खिलाया, इसका मतलब यह नहीं है कि C ++ सिर्फ एक महिमा वाला मैक्रो है।

टेम्पलेट कई प्रकारों के लिए कोड को लागू करने के तरीके को सुरक्षित, अधिक कुशल और विशेष (यहां तक ​​कि मुझे लगता है कि एक वास्तविक शब्द नहीं लगता है) प्रदान करके मैक्रोज़ की आवश्यकता को दूर करते हैं।

सी में टेम्प्लेटिंग टाइप कोड को करने के कई तरीके हैं, जिनमें से कोई भी एक बहुत ही अच्छा होता है जब आप सरल प्रकारों से परे हो जाते हैं।


मैंने C ++ के महिमामंडित होने के बारे में नहीं कहा है। मैं C ++ की बहुत प्रशंसा करता हूं। बस जिज्ञासु हो रहा है।
गुलशन

2
@ गुलशन: नहीं, आपने इस बारे में कुछ नहीं कहा। फिर भी, यह है कि सी ++ संकलक ने कितनी जल्दी काम किया (सिवाय इसके कि सीफ्रॉस्ट केवल एक मैक्रो प्रीप्रोसेसर के बजाय एक कंपाइलर का कुछ था), और सी ++ टेम्पलेट्स के बारे में आपके बयान प्रारंभिक सी ++ के बारे में ही लागू होते हैं।
डेविड थॉर्नले

CFront संकलित C ++ to C. प्रीप्रोसेसर और कंपाइलर के बीच की रेखा को स्पष्ट रूप से परिभाषित किया गया है: एक कंपाइलर इसके इनपुट को समझने का प्रयास करता है- पार्सिंग, एएसटी बिल्डिंग, और सी के माध्यम से - जबकि एक प्रीप्रोसेसर केवल उदाहरण के लिए या टोकन प्रतिस्थापन का उपयोग नहीं करता है।
जॉन प्यार्डी

1
मुझे लगता है कि डेविड का मतलब यह है कि सी ++ का एक अंतर्निहित सबसेट है और उस टेम्पलेट को कुछ प्रकार के मैक्रो के रूप में माना जा सकता है जो इस उपसेट में एक प्रोग्राम को सामान्य करने के लिए उपयोग किया जाता है, जिसे बाद में एक और, अलग चरण के रूप में संकलित किया जा सकता है।
जियोर्जियो

5

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

एक और अंतर यह है कि टेम्पलेट नेमस्पेस को सम्मानित करते हैं।


2

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

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