प्रोग्रामिंग प्रतियोगिताओं और प्रतियोगिताओं में C ++ प्रमुख क्यों है? [बन्द है]


23

मैं समझता हूँ कि C ++ एक बहुत तेज़ भाषा है, लेकिन C कुछ मामलों में तेज़, या तेज़ नहीं है?

तब आप कह सकते हैं कि C ++ में OOP है, लेकिन अधिकांश प्रोग्रामिंग पहेलियों के लिए आपको जितनी OOP की आवश्यकता है, वह उतनी बड़ी नहीं है, और मेरी राय में C वह संभाल सकेगा।

यहां मैं यह क्यों पूछ रहा हूं: मुझे प्रोग्रामिंग प्रतियोगिताओं और प्रतियोगिताओं में बहुत दिलचस्पी है, और मुझे उन पर सी में कोडिंग करने की आदत है। हालाँकि, मैंने देखा कि अधिकांश लोग C ++ का उपयोग करते हैं (उदाहरण के लिए, Google कोड Jam 2011 पर 25 में से 17 ने इसका इस्तेमाल किया, जबकि कोई भी C का उपयोग नहीं करता है), इसलिए मैं सोच रहा हूं कि क्या मैं C के साथ जा रहा हूं।

ऑब्जेक्ट ओरिएंटेशन के अलावा, C ++ प्रोग्रामिंग प्रतियोगिताओं के लिए एक अधिक उपयुक्त भाषा क्या है? प्रतियोगिताओं में बेहतर प्रदर्शन करने के लिए मुझे कौन सी भाषा सीखनी चाहिए और उसका उपयोग करना चाहिए?

पृष्ठभूमि के लिए, मैं अपने आप को सी में बहुत कुशल मानता हूं, लेकिन मैं अभी C ++ सीखना शुरू कर रहा हूं।

जवाबों:


56

शुरू करने के लिए, हमेशा कुछ समस्याएं होंगी जो एक भाषा में दूसरे की तुलना में बेहतर हल होती हैं। हमेशा ऐसी भाषाएं होंगी जो किसी भी अन्य भाषा की तुलना में "बेहतर" की कुछ परिभाषा के लिए विशिष्ट समस्याओं को "बेहतर" हल करती हैं। हालांकि, बहुत बड़ी संख्या में समस्याओं की बहुत समान आवश्यकताएं होती हैं (कुछ I / O, कुछ संगणना) और समान आवश्यकताओं (उचित विश्वसनीयता, उचित प्रदर्शन) का सामना करना पड़ता है।

जैसा कि आप सी को पहले से ही जानते हैं, वहां की अधिकांश समस्याओं के लिए, मैं बताता हूं कि सी ++ कोई महत्वपूर्ण गिरावट और कई महत्वपूर्ण सुधार प्रदान नहीं करता है। साहसिक? कुछ लोगों को ऐसा लगता है, लेकिन यह वास्तव में मामला है। आइए कुछ बहुत ही सामान्य सी ++ गलतफहमी को दूर करके शुरू करें:

  • C ++ गलत है। C गलत है! कई C प्रोग्राम मान्य C ++ प्रोग्राम भी हैं - और ऐसे C प्रोग्राम को समान गति से चलना चाहिए जब C कंपाइलर या C ++ कंपाइलर के साथ संकलित किया जाए।

  • C ++ की विशिष्ट विशेषताओं में ओवरहेड की आवश्यकता होती है। गलत! कुछ खास ++ फीचर्स (जैसे वर्चुअल फंक्शन कॉल्स या अपवाद) द्वारा शुरू किया गया तथाकथित ओवरहेड, ओवरहेड के साथ तुलनीय है, जिसे आप खुद बताएंगे कि आपको सी में एक समान फीचर लागू करना चाहिए।

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

इसलिए, यदि आप मुझ पर विश्वास करते हैं, तो हमने स्थापित किया है कि "C ++, C से बहुत अधिक खराब नहीं है"। आइए नजर डालते हैं कि C ++ को बेहतर C कौन बनाता है:

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

  • पैरामीटर प्रकार टेम्प्लेट कीवर्ड प्रोग्रामर को एल्गोरिदम के जेनेरिक (प्रकार-अज्ञेयवादी) कार्यान्वयन को लिखने की अनुमति देता है। जहाँ C में, कोई एक जेनेरिक सूची कार्यान्वयन को एक तत्व के साथ लिख सकता है जैसे:

    struct element_t {
      struct element_t *next, *prev;
      void *element;
     };

C ++ किसी को कुछ लिखने की अनुमति देता है:

template <typename T>
struct element_t {
   element_t<T> *next, *prev;
   T element;
};

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

सी दिनचर्या के रूप में परिभाषित किया गया है:

void qsort(void *base, size_t nmemb, size_t size,
           int(*compar)(const void *, const void *));

जबकि C ++ दिनचर्या के रूप में परिभाषित किया गया है

template void sort(RandomAccessIterator first, RandomAccessIterator last);

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

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

बेशक, एसटीएल कोई चांदी की गोली नहीं है - लेकिन यह सामान्य समस्याओं को हल करते समय बहुत बार बहुत मदद करता है। आपने कितनी बार C में एक सूची लागू की है? आरबी-ट्री कितनी बार एक बेहतर समाधान होता, अगर केवल आपके पास इसे करने का समय होता? एसटीएल के साथ आपको इस तरह के समझौते करने की आवश्यकता नहीं है - पेड़ का उपयोग करें यदि यह बेहतर फिट है, तो सूची का उपयोग करना उतना आसान है।

ठीक है, इसलिए मैं केवल अच्छे हिस्सों पर चर्चा कर रहा हूं। क्या कोई डाउनसाइड है? जरूर हैं। हालांकि, उनकी संख्या दिन-प्रतिदिन सिकुड़ती जा रही है। मुझे समझाने दो:

  • कोई अच्छा C ++ कंपाइलर नहीं हैं यह लंबे समय से ऐसा है। लेकिन आपको याद होगा, कि 1998 में भाषा को मानकीकृत किया गया था - यह एक जटिल भाषा है, सी से अधिक जटिल है। इसे संकलक को मानक तक पकड़ने में लंबा समय लगा है। लेकिन इस लेखन के रूप में, वहाँ बाहर सबसे व्यापक रूप से उपयोग किए जाने वाले प्लेटफार्मों के लिए अच्छे संकलक उपलब्ध हैं; संस्करणों में GCC 3.X आम तौर पर बहुत अच्छे होते हैं, और यह GNU / Linux और अधिकांश UNIX प्लेटफार्मों पर चलता है। Win32 के लिए इंटेल का एक अच्छा संकलक है - यह भी बहुत अच्छा है, लेकिन दुर्भाग्य से यह अभी भी एमएस एसटीएल पर निर्भर करता है जो कि सब-बराबर है।

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

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


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

@DocBrown: यह इस बात पर निर्भर करता है कि आप C ++ का उपयोग कैसे करते हैं। यदि आप बहुत सारे पुराने कोड के साथ काम कर रहे हैं, तो आपको यह समझने की आवश्यकता है कि यह कैसे काम करता है, और इसलिए संभवतः C ++ के विस्तृत ज्ञान की आवश्यकता है। यदि आप सिर्फ नया कोड लिख रहे हैं (जैसे कि एक प्रतियोगिता में), तो आप अपने आप को सिर्फ उसी चीज़ तक सीमित कर सकते हैं जिसका आप उपयोग करने जा रहे हैं, बहुत सारे क्रॉफ्ट से बचें (जैसे, कहते हैं, auto_ptr<>)।
डेविड थॉर्नले

महान जवाब, लेकिन मुझे लगता है कि "कई सी प्रोग्राम मान्य सी ++ प्रोग्राम हैं और साथ ही" काफी मजबूत नहीं है क्योंकि अंतर कोड पीढ़ी को नहीं बदलते हैं। लगभग हर सी कार्यक्रम को अपेक्षाकृत कम प्रयास के साथ एक वैध रूप से मान्य सी ++ प्रोग्राम के रूप में फिर से लिखा जा सकता है।
रोबोट

3

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


2

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

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

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