क्या सी, पर्ल, पायथन, आदि के बजाय सी ++ का उपयोग करने का कोई कारण है? [बन्द है]


164

लिनक्स (सर्वर साइड) डेवलपर के रूप में, मुझे नहीं पता कि मुझे C ++ कहां और क्यों उपयोग करना चाहिए।

जब मैं प्रदर्शन के लिए जा रहा हूं, पहली और आखिरी पसंद सी है।

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

लगभग सभी खुले स्रोत अनुप्रयोग जो मुझे पता है कि इस क्षेत्र में C, पर्ल, पायथन, बैश स्क्रिप्ट, AWK या यहां तक ​​कि PHP में लिखा गया है , लेकिन कोई भी C ++ का उपयोग नहीं करता है।

मैं GUI या वेब एप्लिकेशन जैसे अन्य क्षेत्रों के बारे में चर्चा नहीं कर रहा हूं, मैं सिर्फ लिनक्स, सीएलआई और डेमॉन के बारे में बात कर रहा हूं।

क्या C ++ का उपयोग करने का कोई संतोषजनक कारण है?


5
मैं केवल एसटीएल के कारण सी ++ पर विचार करता हूं।
dan_waterworth

46
तो सी, पर्ल और पायथन का उपयोग करके कुछ किया जा सकता है, केवल सी ++ का उपयोग करके किया जा सकता है। और आप पूछ रहे हैं कि C ++ का उपयोग क्यों करें?
मनोज आर

36
«जब मैं प्रदर्शन करने जा रहा हूं, तो पहली और आखिरी पसंद सी है।» हाँ सुनिश्चित करें: डी यह एक अप्रमाणित है, और तुच्छ रूप से गलत दावा है।
deadalnix 17

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

4
सबसे अच्छा कारण, पोस्ट किए गए उत्तरों में नहीं माना गया, सीधे ओपी के प्रश्न से संबंधित है। DEPENDANCIES !!!!, ऐसा नहीं है कि आपके औसत सिस्टम में c ++ लिबास की कमी है, लेकिन एक एम्बेडेड सिस्टम उन्हें उपलब्ध नहीं हो सकता है। प्रत्येक प्रोग्राम में अपना प्रोग्राम प्राप्त करने का एकमात्र तरीका है, अपने प्रोग्राम को नियमित सी में लिखना। बाकी सब सिर्फ बहस कर रहा है कि आपको क्यों, या कम प्रतिनिधित्व किया जाना चाहिए, सी ++ का उपयोग नहीं करना चाहिए। उस पते में से कोई भी पता नहीं क्यों C ++ का अधिक बार उपयोग नहीं किया जाता है, और योग्यता की परवाह किए बिना, कारण निर्भरता है .... O और साथ ही लिनस का प्रसिद्ध c ++ रैंट भी।
जेएम बेकर

जवाबों:


308

जब मैं प्रदर्शन करने जा रहा हूं, तो पहली और आखिरी पसंद सी है।

और यहीं से आपको बैकअप लेना चाहिए। अब, मैं नहीं, कर सकते हैं सब पर , सर्वर विकास के लिए बोलते हैं। शायद विकल्प के ऊपर C ++ पसंद करने के लिए वास्तव में कोई सम्मोहक कारण नहीं है।

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

यह बहुत ही कुशल कोड लिखने की अनुमति देता है जो अभी भी बहुत अधिक अमूर्त स्तर है।

सामान्य अमूर्तता पर विचार करें: वर्चुअल फ़ंक्शंस, फ़ंक्शन पॉइंटर्स और PIMPL मुहावरा। ये सभी अप्रत्यक्ष पर निर्भर करते हैं जो सूचक अंकगणितीय द्वारा हल किए गए रनटाइम पर है। दूसरे शब्दों में, यह एक प्रदर्शन लागत (हालांकि छोटा हो सकता है) को बढ़ाता है।

सी ++, दूसरी ओर, एक अप्रत्यक्ष तंत्र प्रदान करता है जो कि नो (प्रदर्शन) लागत: टेम्प्लेट को स्थापित करता है। (यह लाभ कभी-कभी संकलन समय में वृद्धि के साथ भुगतान किया जाता है।)

जेनेरिक सॉर्ट फ़ंक्शन के उदाहरण पर विचार करें।

सी में, फ़ंक्शन qsortएक फ़ंक्शन पॉइंटर लेता है जो तर्क को लागू करता है जिसके द्वारा तत्वों को एक दूसरे के सापेक्ष ऑर्डर किया जाता है। जावा का Arrays.sortकार्य कई प्रकारों में आता है; उनमें से एक मनमानी वस्तुओं को सॉर्ट करता है और इसके लिए एक Comparatorऑब्जेक्ट पास करने की आवश्यकता होती है जो C के फंक्शन पॉइंटर की तरह काम करता है qsort। लेकिन "देशी" जावा प्रकारों के लिए कई अधिक अधिभार हैं। और उनमें से प्रत्येक के पास sortविधि की एक प्रति है - एक भयानक कोड दोहराव।

जावा यहां एक सामान्य द्विभाजन का चित्रण करता है: या तो आपके पास कोड दोहराव है या आप एक रनवे ओवरहेड को उकसाते हैं।

C ++ में, sortफ़ंक्शन qsortC की तरह काम करता है, जिसमें एक छोटा लेकिन मौलिक अंतर होता है: फ़ंक्शन में पारित होने वाले तुलनित्र एक टेम्पलेट पैरामीटर है। इसका मतलब है कि इसके कॉल को इनलाइन किया जा सकता है । दो वस्तुओं की तुलना के लिए कोई अप्रत्यक्ष रूप से आवश्यक नहीं है। एक तंग पाश में (जैसा कि यहां मामला है) यह वास्तव में एक पर्याप्त अंतर बना सकता है।

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

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


16
अब मैं C ++ के बारे में पर्याप्त रूप से जानता हूं कि क्या आप गलत हैं या गलत। लेकिन यह भी आप को जोड़ने के लिए केवल 1 downvote तो आराम करना चाहते हैं। यह इंटरनेट और डाउनवोट होता है। महान जवाब हालांकि इसकी तकनीकी रूप से ध्वनि!
क्रिस

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

19
@Jaroslaw, @Steve: लेकिन एक ही (= कोड ब्लोट, इंस्ट्रक्शन कैश मिस) हाथ से अनुकूलित कोड के लिए सही है जो प्रत्येक डेटा प्रकार (जावा के विभिन्न Arrays.sortकार्यान्वयन देखें) के लिए अनुकूलित है । केवल आप उच्च अमूर्तता का लाभ खो देते हैं। यह टेम्पलेट्स का कोई विशिष्ट नुकसान नहीं है, यह सामान्य रूप से कोड डुप्लीकेशन का नुकसान है। इसके अलावा, यह तंग छोरों के बाद से मायने नहीं रखता है, यह आमतौर पर एक ही कोड होता है जो लोड होता है।
कोनराड रुडोल्फ

18
@Jaroslaw: इंस्ट्रक्शन कैश के बारे में मजेदार बात यह है कि यह कैशे है । यही है, यह सब कुछ स्टोर करने की कोशिश नहीं करता है , केवल हाल ही में उपयोग किए गए कोड । टेम्पलेट विभिन्न प्रकारों के लिए समान कोड के बहुत सारे उत्पन्न कर सकते हैं (एक के vector.push_backलिए vector<int>, और दूसरे के लिए vector<float>, लेकिन एक के साथ काम करते समय vector<int>, इस कारण से बहुत कम कारण है कि vector<float>कोड अनुदेश कैश में होगा। इसलिए मैं यह नहीं देखता कि वास्तव में यह कैसे मायने रखता है। प्रत्येक) व्यक्तिगत टेम्पलेट तात्कालिकता अत्यधिक अनुकूलित है और आम तौर पर जेनेरिक कैच-सभी कार्यान्वयन की तुलना में अधिक कॉम्पैक्ट है
jalf

29
@ स्टीव 314: जिसे आप "ब्लोट" कहते हैं, वह वह है जो सी और जावा के लिए मैन्युअल रूप से किया जाता है। सी ++ में, इसे स्वचालित किया जा सकता है, और विक्रेता उतने ही स्मार्ट हो सकते हैं जितना कि विक्रेताओं ने उन्हें ब्लोट से बचने के लिए बनाने की हिम्मत की। अगर मुझे या तो धीमे होने (सी के रूप में) के बीच फैसला करना है या डुप्लिकेट कोड (जावा में) का उपयोग करना है, तो कंपाइलर को डुप्लिकेट करने का काम कर रहा है (और शायद इसके बारे में स्मार्ट होने के नाते) बहुत अच्छा लगता है, नहीं?
एसबीएआई

166

मुझे C ++ से नफरत करने वाले कई C प्रोग्रामर भी दिखाई देते हैं। धीरे-धीरे यह समझने में कि मुझे क्या अच्छा है और क्या बुरा लगता है, इसमें मुझे काफी समय (वर्ष) लगा। मुझे लगता है कि वाक्यांश का सबसे अच्छा तरीका यह है:

कम कोड, कोई रन-टाइम ओवरहेड, अधिक सुरक्षा नहीं।

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

यहां मेरे रेंडर से एक सरल उदाहरण दिया गया है : जब एक त्रिकोण की स्कैनलाइन में पिक्सेल मूल्यों को प्रक्षेपित किया जाता है। मुझे एक X निर्देशांक X1 से शुरू करना है, और एक X समन्वय x2 तक पहुंचना है (एक त्रिकोण के बाईं ओर से)। और प्रत्येक चरण के पार, प्रत्येक पिक्सेल के पार, मैं मूल्यों को प्रक्षेपित करना चाहता हूं।

जब मैं पिक्सेल तक पहुंचने वाले परिवेश प्रकाश को प्रक्षेपित करता हूं:

  typedef struct tagPixelDataAmbient {
      int x;
      float ambientLight;
  } PixelDataAmbient;

  ...
  // inner loop
  currentPixel.ambientLight += dv;

जब मैं रंग को प्रक्षेपित करता हूं (जिसे "गॉर्ड" छायांकन कहा जाता है, जहां "लाल", "हरा" और "नीला" फ़ील्ड प्रत्येक पिक्सेल पर एक चरण मान द्वारा प्रक्षेपित होते हैं):

  typedef struct tagPixelDataGouraud {
      int x;
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  } PixelDataGouraud;

  ...
  // inner loop
  currentPixel.red += dred;
  currentPixel.green += dgreen;
  currentPixel.blue += dblue;

जब मैं "फोंग" छायांकन में प्रस्तुत करता हूं, तो मैं अब एक तीव्रता (परिवेश) या एक रंग (लाल / हरा / नीला) को प्रक्षेपित नहीं करता हूं - मैं एक सामान्य वेक्टर (एनएक्स, एनवाई, एनजेड) और प्रत्येक चरण पर प्रक्षेप करता हूं, मुझे फिर से करना होगा प्रक्षेपित सामान्य वेक्टर के आधार पर प्रकाश समीकरण को बढ़ाएं:

  typedef struct tagPixelDataPhong {
      int x;
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  } PixelDataPhong;

  ...
  // inner loop
  currentPixel.nX += dx;
  currentPixel.nY += dy;
  currentPixel.nZ += dz;

अब, सी प्रोग्रामर्स की पहली वृत्ति "हेक, मानों को प्रक्षेपित करने वाले तीन कार्यों को लिखने और उन्हें सेट मोड के आधार पर कॉल करने की होगी"। सबसे पहले, इसका मतलब है कि मुझे एक प्रकार की समस्या है - मैं किसके साथ काम करता हूं? क्या मेरे पिक्सेल PixelDataAmbient हैं? PixelDataGouraud? PixelDataPhong? ओह, रुको, कुशल सी प्रोग्रामर कहते हैं, एक संघ का उपयोग करें!

  typedef union tagSuperPixel {
      PixelDataAmbient a;
      PixelDataGouraud g;
      PixelDataPhong   p;
  } SuperPixel;

..और फिर, आपके पास एक फ़ंक्शन है ...

  RasterizeTriangleScanline(
      enum mode, // { ambient, gouraud, phong }
      SuperPixel left,
      SuperPixel right)
  {
      int i,j;
      if (mode == ambient) {
          // handle pixels as ambient...
          int steps = right.a.x - left.a.x;
          float dv = (right.a.ambientLight - left.a.ambientLight)/steps;
          float currentIntensity = left.a.ambientLight;
          for (i=left.a.x; i<right.a.x; i++) {
              WorkOnPixelAmbient(i, dv);
              currentIntensity+=dv;
          }
      } else if (mode == gouraud) {
          // handle pixels as gouraud...
          int steps = right.g.x - left.g.x;
          float dred = (right.g.red - left.g.red)/steps;
          float dgreen = (right.g.green - left.a.green)/steps;
          float dblue = (right.g.blue - left.g.blue)/steps;
          float currentRed = left.g.red;
          float currentGreen = left.g.green;
          float currentBlue = left.g.blue;
          for (j=left.g.x; i<right.g.x; j++) {
              WorkOnPixelGouraud(j, currentRed, currentBlue, currentGreen);
              currentRed+=dred;
              currentGreen+=dgreen;
              currentBlue+=dblue;
          }
...

क्या आप अराजकता में फिसलते हुए महसूस करते हैं?

सबसे पहले, एक टाइपो वह सब है जो मेरे कोड को क्रैश करने के लिए आवश्यक है, क्योंकि कंपाइलर मुझे फ़ंक्शन के "गौर्ड" अनुभाग में कभी नहीं रोकेंगे, वास्तव में ".a" तक पहुंचने के लिए। (परिवेश) मूल्य। सी प्रकार प्रणाली (जो कि संकलन के दौरान) द्वारा पकड़ा गया बग नहीं है, इसका मतलब है कि एक बग जो रन-टाइम पर प्रकट होता है, और डिबगिंग की आवश्यकता होगी। क्या आपने देखा कि मैं left.a.green"डग्रीन" की गणना में पहुंच रहा हूं ? संकलक ने निश्चित रूप से आपको ऐसा नहीं बताया।

फिर, हर जगह पुनरावृत्ति होती है - forलूप वहां कई बार होता है जैसे कि रेंडरिंग मोड हैं, हम "सही माइनस लेफ्ट बाई स्टेप्स द्वारा विभाजित" करते रहते हैं। बदसूरत, और त्रुटि-प्रवण। क्या आपने गौर किया कि मैं "मैं" का उपयोग गौर्ड लूप में करता हूं, जब मुझे "जे" का उपयोग करना चाहिए था? संकलक फिर से, मौन है।

अगर मोड के लिए / और / सीढ़ी के बारे में क्या? यदि मैं तीन सप्ताह में एक नया रेंडरिंग मोड जोड़ूँ तो क्या होगा? क्या मुझे अपने सभी कोड में "अगर मोड ==" सभी में नया मोड संभालना याद होगा?

अब उपरोक्त कुरूपता की तुलना करें, C ++ स्ट्रक्चर्स और एक टेम्प्लेट फ़ंक्शन के इस सेट के साथ:

  struct CommonPixelData {
      int x;
  };
  struct AmbientPixelData : CommonPixelData {
      float ambientLight;
  };
  struct GouraudPixelData : CommonPixelData {
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  };
  struct PhongPixelData : CommonPixelData {
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  };

  template <class PixelData>
  RasterizeTriangleScanline(
      PixelData left,
      PixelData right)
  {
      PixelData interpolated = left;
      PixelData step = right;
      step -= left;
      step /= int(right.x - left.x); // divide by pixel span
      for(int i=left.x; i<right.x; i++) {
          WorkOnPixel<PixelData>(interpolated);
          interpolated += step;
      }
  }

अब ये देखिए। हम अब एक संघ प्रकार-सूप नहीं बनाते हैं: हमारे पास प्रत्येक मोड पर विशिष्ट प्रकार हैं। वे बेस क्लास ( CommonPixelData) से विरासत में अपने सामान्य सामान ("x" फ़ील्ड) का फिर से उपयोग करते हैं । और टेम्पलेट कंपाइलर बनाता है (अर्थात, कोड-जनरेट) तीन अलग-अलग फंक्शन्स जो हमने खुद C में लिखे होते हैं, लेकिन एक ही समय में, टाइप्स के बारे में बहुत सख्त होते हैं!

टेम्प्लेट में हमारा लूप नासमझ नहीं हो सकता है और अमान्य क्षेत्रों तक नहीं पहुंच सकता है - यदि हम करते हैं तो कंपाइलर छाल देगा।

टेम्पलेट सामान्य कार्य करता है (लूप, प्रत्येक समय में "चरण" से बढ़ रहा है), और यह इस तरीके से कर सकता है कि बस रनटाइम त्रुटियों का कारण नहीं बन सकता है। प्रकार के अनुसार प्रक्षेप ( AmbientPixelData, GouraudPixelData, PhongPixelData) के साथ किया जाता operator+=()है कि हम structs में जोड़ना होगा - जो मूल रूप से हुक्म कैसे प्रत्येक प्रकार अंतर्वेशित है।

और क्या आप देखते हैं कि हमने WorkOnPixel <T> के साथ क्या किया? हम प्रति प्रकार अलग-अलग काम करना चाहते हैं? हम बस एक टेम्पलेट विशेषज्ञता कहते हैं:

void WorkOnPixel<AmbientPixelData>(AmbientPixelData& p)
{
    // use the p.ambientLight field
}


void WorkOnPixel<GouraudPixelData>(GouraudPixelData& p)
{
    // use the p.red/green/blue fields
}

वह है - कॉल करने का कार्य, प्रकार के आधार पर तय किया जाता है। संकलन-समय पर!

इसे फिर से समझने के लिए:

  1. हम कोड (टेम्पलेट के माध्यम से) को कम करते हैं, आम भागों का फिर से उपयोग करते हैं,
  2. हम बदसूरत हैक्स का उपयोग नहीं करते हैं, हम एक सख्त प्रकार की प्रणाली रखते हैं, ताकि कंपाइलर हर समय हमारी जांच कर सके।
  3. और सभी का सबसे अच्छा: जो कुछ भी हमने नहीं किया उसका कोई भी रनटाइम प्रभाव नहीं है। यह कोड JUST के बराबर C कोड के रूप में तेजी से चलेगा - वास्तव में, अगर C कोड विभिन्न WorkOnPixelसंस्करणों को कॉल करने के लिए फ़ंक्शन पॉइंटर्स का उपयोग कर रहा था , C ++ कोड C की तुलना में तेजी से होगा, क्योंकि कंपाइलर टाइप-विशिष्ट WorkOnPixelटेम्पलेट विशेषज्ञता को इनलाइन करेगा कहते हैं!

कम कोड, कोई रन-टाइम ओवरहेड, अधिक सुरक्षा नहीं।

क्या इसका मतलब यह है कि C ++ भाषाओं का सभी-और अंत वाला है? बिलकूल नही। आपको अभी भी व्यापार-नाप को मापना है। अज्ञानी लोग C ++ का उपयोग करेंगे जब उन्हें बैश / पर्ल / पायथन स्क्रिप्ट लिखनी चाहिए। ट्रिगर-हैप्पी C ++ newbies आभासी एकाधिक वंशानुक्रम के साथ गहरी नेस्टेड कक्षाएं बनाएंगे, इससे पहले कि आप उन्हें रोक सकें और उन्हें पैकिंग भेज सकें। वे यह महसूस करने से पहले जटिल बूस्ट मेटा-प्रोग्रामिंग का उपयोग करेंगे कि यह आवश्यक नहीं है। वे अभी भी उपयोग करेगा char*, strcmpऔर मैक्रो के बजाय std::stringऔर टेम्पलेट्स।

लेकिन यह कहता है कि इससे ज्यादा कुछ नहीं ... देखो कि तुम किसके साथ काम करते हो। अक्षम उपयोगकर्ताओं (नहीं, यहां तक ​​कि जावा) से आपको ढालने के लिए कोई भाषा नहीं है।

C ++ का अध्ययन और उपयोग करते रहें - बस ओवरडिज़ाइन न करें।


18
+1 के लिए "नहीं, यहां तक ​​कि जावा भी नहीं" :)
नथन उस्मान

53
उदाहरण के लिए +1। यह एक लंबी पोस्ट थी, लेकिन C और C ++ कोड के बीच तुलना प्रभावशाली है।
पियरसबल

और यह, महिलाओं और सज्जनों, यही कारण है कि lex / yacc मौजूद है। समान तर्क, मुझे लगता है कि सी + + के कुछ हिस्सों को कभी भी एक ही कोड पीढ़ी के दर्शन में नहीं मिला। मुझे कुछ समय बाद फिर से देखना पड़ेगा।
स्पेंसर रथबुन

2
मैंने बहुत सारे 2D रेंडरिंग कोड (एक दशक से अधिक समय पहले) लिखे हैं, और C से C ++ तक पोर्ट करते समय इस समस्या में भाग गया है: आप एक पिक्सेल संरचना को कैसे परिभाषित करते हैं, यदि आपकी स्कैनलाइन 1-बिट पिक्सल (8 पिक्सेल) से बनी हो बाइट)? और जब आपकी स्कैनलाइन आर, जी और बी बाइट्स (3 बाइट्स प्रति पिक्सेल) से बनी हो? और जब आपके पास आर, जी और बी के लिए तीन अलग-अलग बफ़र्स हैं? आप इसका उत्तर जानते हैं: C ++ की कोई मदद नहीं की गई है, और टेम्प्लेट का उपयोग करने पर जोर देने से आप बहुत अधिक स्थान और समय के अनुकूलन को ढीला कर देंगे
Walter Tross

आप इसके लिए C ++ में टेम्प्लेट का उपयोग क्यों करते हैं? आपका तरीका मेरे [सी # प्रोग्रामर] के दृष्टिकोण से बेस क्लास के एक पैरामीटर को घोषित करता है, ऐसा लगता है कि आप बेस-टाइप पैरामीटर के लिए व्युत्पन्न-प्रकार का उदाहरण पारित कर सकते हैं। मुझे C ++ का पता नहीं है, क्या आप कृपया बता सकते हैं?
व्लाद

79

जीत बच्चे के लिए RAII

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


20
"C ++: एकमात्र गंभीर रूप से निर्धारक विकल्प। अपने डॉक्टर से आज ही पूछें।"
काइल स्ट्रैंड

2
अनुवर्ती: जंग अब इस क्षेत्र में एक प्रतियोगी है। Rust के विध्वंसक तरीकों के बारे में एक बुनियादी RAII उदाहरण और प्रलेखन देखें ।
काइल स्ट्रैंड

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

1
@Baldrickk C में आपको एक संसाधन का उपयोग करते हुए हर जगह सफाई कोड लिखना होगा। C ++ में, आप इसे संसाधन की परिभाषा में एक बार लिखते हैं । सी और जावा दोनों "डिस्पोजल के बाद उपयोग किए जाने वाले संसाधन" और "लीक रिसोर्स" बग से ग्रस्त हैं, क्योंकि सफाई स्वचालित नहीं है । स्मृति केवल संसाधन नहीं है।
कैलथ

70

क्या C ++ का उपयोग करने का कोई संतोषजनक कारण है?

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

    अपने सिर को चारों ओर लपेटने में कुछ समय लगता है (मुझे क्लिक करने से पहले कुछ साल लगे), लेकिन एक बार ऐसा करने के बाद आप जीवन को बहुत सरल बना सकते हैं ।

  2. C ++ में टेक्स्ट प्रोसेसिंग, C की तुलना में कम दर्दनाक परिमाण का आदेश है।


35
टेक्स्ट प्रोसेसिंग के लिए +1, जिसे मैं अपने उत्तर में पूरी तरह से भूल गया था।
कोनराड रुडोल्फ

8
हेह ने पायथन को कहने की तुलना में विशेष रूप से पाठ प्रसंस्करण दर्दनाक पाया ..
निल्स

7
बूस्ट एकमात्र कारण है जो मैं अभी भी C ++ का उपयोग करता हूं।
फेरुशियो

33
@ निल्स: 1 से दर्द-दर-गधा के पैमाने पर, सी ++ में पाठ प्रसंस्करण निश्चित रूप से पायथन जैसे अधिक आधुनिक भाषाओं की तुलना में खराब है। यह सिर्फ इतना है कि सी में पाठ प्रसंस्करण दर्द-में-गधा को परिभाषित करता है। यदि चुनाव उस विशेष एप्लिकेशन के लिए C और C ++ के बीच है, तो C ++ आसानी से जीत जाता है।
जॉन बोडे

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

41

हाँ।

यदि आप निष्पादन योग्य दक्षता की तलाश में हैं, तो आप C या C ++ के लिए नीचे हैं, इसलिए मैं उस पर ध्यान केंद्रित करूंगा।

इससे पहले कि टेम्प्लेट आम थे, मैंने 1990 के दशक के मध्य में दो बहुत ही सरल कारणों से चर्चा करने वाले निष्पादनयोग्य के प्रकारों के लिए C ++ ओवर सी का उपयोग करना पसंद किया: वस्तु बहुरूपता और आरएआई

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

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

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

मैं GTK + और अव्यवस्था जैसी GNOME तकनीकों के साथ बहुत सारे काम भी करता हूं, जिनमें से सभी को GObject सिस्टम का उपयोग करके C में लिखा गया है। GObject, C ++ ऑब्जेक्ट सिस्टम की तरह है, जिसमें अच्छे कवर को हटा दिया गया है और सभी बदसूरत इंटर्नल को उजागर किया गया है, और आमतौर पर एक-लाइन C ++ विधि कॉल करने के लिए कोड की आधा दर्जन लाइनों की आवश्यकता होती है। मैं वर्तमान में कुछ लिख रहा हूं ClutterActors, और जबकि गणित वास्तव में दिलचस्प है, मैं लगातार सोच रहा हूं, "यह सब सी ++ में बहुत अधिक रसीला और समझदार होगा"।

मैं भी अक्सर सोचता हूं, "आप जानते हैं, अगर मैं सी के बजाय सी ++ में लिख रहा था, तो मैं रात 9 बजे मेरे कार्यालय में बैठने के बजाय मायथबस्टर्स को अपनी पत्नी के साथ देखने वाले कमरे में रहूंगा।"


9
मैं वास्तव में आप यहाँ क्या कह रहा हूँ, विशेष रूप से 1) RAII और 2 के बारे में बात कर सकते हैं) सोचा "आप जानते हैं, अगर मैं इसे C ++ के बजाय C ++ में लिख रहा था ..." मैं बहुत सारे एम्बेडेड सिस्टम डेवलपमेंट करता हूं , और यहां तक ​​कि अगर टीम बहुत "सी" या "सी" कक्षाओं के साथ "तरह की दुकान" है, तो मैं वास्तव में रुकावट को रोकना, म्यूटेक्स संचालन और ट्रेसिंग / लॉगिंग (एस्प) जैसे चीजों के लिए RAII को प्रोत्साहित करने की कोशिश करता हूं। लाइनों)। और पॉलीमॉर्फिक फ्रेम बफ़र्स के आपके विवरण ने मुझे एक वितरित प्रणाली में पॉलीमॉर्फिक संदेश बफ़र्स के मेरे उपयोग की याद दिला दी।
रेडियन

29

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

इसके लिए आप जो कीमत अदा करते हैं, वह काफी गंदा सीखने की अवस्था है, और इसमें उन अन्य भाषाओं की तुलना में सूक्ष्म गलतियां करना आसान है जिनसे मैं परिचित हूं।

इसलिए, मैं यह नहीं बता सकता कि क्या आप अभी जो कर रहे हैं उसके लिए इसे सीखना आपके लिए सार्थक होगा। आप निश्चित रूप से पायथन या पर्ल और सी के संयोजन से प्राप्त कर सकते हैं, लेकिन सी ++ एक हार्ड-टू-गेट-यूज़-टू-पैकेज पैकेज में अमूर्त और प्रदर्शन दोनों प्रदान करता है।


13
ऐसा कोई मामला नहीं है जिसमें C ++ C की तुलना में धीमा है क्योंकि आप हमेशा C तरीके का उपयोग कर सकते हैं यदि यह तेज है (और आप परवाह करते हैं)।
जैक एदले

1
@ जेकएडली - सिवाय इसके कि सी ++ प्रतिबंधित और स्टेटिक ऐरे पैरामीटर का समर्थन नहीं करता है। और सिवाय इसके कि एक स्थान पर C ++ - शैली का उपयोग आपको अन्य स्थानों पर इसका उपयोग करने के लिए मजबूर करता है।
मार्टिंकव

@martinkunev restrictका उपयोग अलियासिंग ऑप्टिमाइज़ेशन से बहिष्करण बनाने के लिए किया जाता है, इसलिए यह कैसे चीजों को तेज करने में मदद करता है ? और "स्थैतिक सरणी पैरामीटर" क्या है? और "शैली" प्रदर्शन को कैसे प्रभावित करती है?
अंडरस्कोर_ड

1
नॉन-अलियासिंग के लिए गारंटी के आधार पर @underscore_d प्रतिबंधित अनुकूलन अनुमति देता है; स्थैतिक सरणी पैरामीटर संकलक को यह मानने देते हैं कि एक सूचक तर्क NULL नहीं है और यह सूचक कम से कम तत्वों की संख्या को इंगित करता है; शब्द "शैली" के कई अर्थ हैं और इसे संदर्भ से बाहर रखने से इसका अर्थ बदल जाता है - मैं बात कर रहा हूं कि कैसे, उदाहरण के लिए, अपवाद स्मार्ट पॉइंटर्स के उपयोग को लागू करते हैं।
Martinkunev

1
@martinkunev हम्म, इसलिए मुझे आश्चर्य है कि क्या एक स्थिर सरणी पैरामीटर एक सी + + टेम्पलेट का उपयोग करके कार्यात्मक रूप से कुछ भी अलग से सक्षम करता है T (&arr)[n]या std::array<T, n>- इस पर एक और शोध करना होगा, क्योंकि वहां बहुत अधिक जानकारी नहीं है। यह स्मार्ट संकेत के बारे में समझ में आता है, निश्चित रूप से एक अच्छा उदाहरण है। यदि एक समान खेल के मैदान पर कोडिंग, हम अपवादों का उपयोग नहीं करेंगे, तो संभावित लागतों में से कोई भी खर्च नहीं किया जाएगा ... हालांकि मुझे संदेह है कि आप कैसे हो सकता है, एक बार 3-पार्टी लाइब्रेरी चित्र में दर्ज करें, बहुत सारी धारणाएं। वे जोखिम में हैं।
अंडरस्कोर_ड

27

मैं सी ++ को 1990 के दशक की एक भाषा के रूप में मानता हूं, जो एक युग की भाषा है।

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

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

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


11
तो संकेत का उपयोग कर यादृच्छिक बाइट्स बदल नहीं है। यह बचना इतना मुश्किल नहीं है, है ना?
डेविड थॉर्नले

11
@ बेलगॉस्ट: मैं आपके साथ C ++ की जटिलता के बारे में सहमत हूं और मैं इसका उपयोग कभी भी ऑब्जेक्ट-ओरिएंटेड भाषा को बदलने के लिए नहीं करूंगा। लेकिन इसकी जटिलता के बावजूद यह अभी भी सी के लिए मुझ पर जीतता है क्योंकि इसके कई फायदे अलग-अलग उत्तरों (अमूर्त, संसाधन सौंपने, स्ट्रिंग हैंडलिंग…) में वर्तनी में हैं। वास्तव में, आपने कुछ मान्य क्षेत्रों को नाम दिया है जहां C ++ अभी भी प्रासंगिक है, और जहां यह C. से बेहतर है
कोनराड रुडोल्फ

6
@ बेलगॉस्ट: यही कारण है कि मैं अंधेरे कोनों से बाहर रहता हूं। मुझे पता है कि किसी भी अन्य भाषा की तुलना में C ++ में वहां जाना आसान है। इसका उपयोग करके, मैं RAII से लाभ उठाता हूं, बहुत बेहतर स्ट्रिंग हैंडलिंग सी, एसटीएल-टाइप टेम्प्लेट क्लासेस, ओओ फीचर्स और अन्य फायदे इसके सी। पर हैं
डेविड थॉर्नले

24
@ बिलगॉस्ट: नहीं, आप नहीं। उदाहरण के लिए, आपने जो उल्लेख किया है वह RAII को प्राप्त करने के लिए अपर्याप्त है, और कंटेनर कक्षाओं में कार्यक्षमता है जो सरल हाथ से तैयार की गई डेटा संरचनाओं से परे है। यदि आपको लगता है कि यह संभव है, तो आपने कभी भी C ++ अच्छी तरह से नहीं सीखा।
डेविड थॉर्नले

5
@Jaroslaw मैं यह देखने में असफल रहा कि मल्टी-कोर मशीनें OOP को कब्र में क्यों डालती हैं। यदि आपका मतलब C ++ है, तो मैं देख सकता हूं कि आप कहां से आ रहे थे। ओओपी कई आधुनिक प्रोग्रामिंग भाषाओं, खासकर उच्च-स्तरीय भाषाओं में एक मौलिक अवधारणा है। यहां तक ​​कि सी भी ओओ हो सकता है, अगर आप इसे इस तरह से प्रोग्राम करते हैं। यह C ++ IMO की तरह सुविधाजनक नहीं है।
वेदोसिटी

21

लिनुस के अनुसार , नहीं:

जब मैंने पहली बार Git source कोड को देखा तो दो चीजें मुझे अजीब लगीं: 1. C ++ के विपरीत शुद्ध C। पता नहीं क्यों। कृपया पोर्टेबिलिटी की बात न करें, यह बी.एस.

आप बकवास से भरे हुए हैं।

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

दूसरे शब्दों में: C का चुनाव एकमात्र समझदार विकल्प है। मुझे पता है कि माइल्स बैडर ने मजाक में कहा था कि "तुम्हें पेशाब करना है", लेकिन यह वास्तव में सच है। मैं इस नतीजे पर पहुंचा हूं कि कोई भी प्रोग्रामर जो प्रोजेक्ट को C ++ में पसंद करेगा, सी पर एक प्रोग्रामर होने की संभावना है, मैं वास्तव में पेशाब करना पसंद करूंगा, ताकि वह न आए और किसी भी प्रोजेक्ट को स्क्रू करें, जिसमें मैं शामिल हूं साथ में।

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

  • दर्द की अनंत मात्रा में जब वे काम नहीं करते हैं (और कोई भी जो मुझे बताता है कि एसटीएल और विशेष रूप से बूस्ट स्थिर हैं और पोर्टेबल बस बीएस से इतना भरा है कि यह मजाकिया भी नहीं है)

  • अकुशल अमूर्त प्रोग्रामिंग मॉडल जहां सड़क के नीचे दो साल आप नोटिस करते हैं कि कुछ अमूर्त बहुत कुशल नहीं था, लेकिन अब आपका सभी कोड इसके आसपास के सभी अच्छे ऑब्जेक्ट मॉडल पर निर्भर करता है, और आप इसे अपने ऐप को फिर से लिखे बिना ठीक नहीं कर सकते।

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

इसलिए मुझे खेद है, लेकिन गिट जैसी चीज के लिए, जहां दक्षता एक प्राथमिक उद्देश्य था, सी ++ का "लाभ" सिर्फ एक बड़ी गलती है। यह तथ्य कि हम उन लोगों को भी नाराज करते हैं जो यह नहीं देख सकते हैं कि यह एक बड़ा अतिरिक्त लाभ है।

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

लेकिन मुझे यकीन है कि आप इसे git से अधिक पसंद करेंगे।

      Linus

62
मुझे नहीं लगता कि लाइनस को यहाँ तर्कों के लिए जाना चाहिए। उनके शेख़ी बहुत ही व्यक्तिपरक और अपरिपक्व हैं। उसके पास वास्तव में कुछ अच्छे अंक हैं, लेकिन वे बहुत गहराई से ("बुलशिट" और साथ ही बुलशिट के नीचे) दफन हैं, जो उन्हें ढूंढना बहुत कठिन है।
कोनराड रुडोल्फ

19
हाहा, वह अच्छी हंसी थी। मैं इस आदमी से कभी नहीं मिलना चाहता।
फेलिक्स डॉम्बेक

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

8
लिनुस के पास एक बिंदु है लेकिन इसे गंभीरता से लिए जाने के लिए बहुत कठोर तरीके से व्यक्त करता है।
ब्लागॉवेस्ट बुचुकलाइव

39
मैं @ डैनियल से सहमत हूं, अगर कोई ऐसा है जो हार्डवेयर की सीमाओं को आगे बढ़ाने के बारे में बात कर सकता है, तो जॉन कयामत, भूकंप और अन्य खेलों के निर्माता जॉन कार्मैक निर्माता हैं और आईडी सॉफ्टवेयर के संस्थापक हैं। वह कुछ महीने पहले सी और सी ++ के बारे में यह लिखता है: "IMO, अच्छा C ++ कोड अच्छे C कोड से बेहतर है, लेकिन बुरा C ++, खराब C कोड की तुलना में बहुत बुरा हो सकता है।" twitter.com/#//ID_AA_Carmack/status/26560399301
Onema

18

मुझे नहीं लगता कि C ++ का उपयोग करने के लिए कोई बाध्यकारी कारण है। यदि आप OO प्रोग्रामिंग करना चाहते हैं, तो आप इसके बजाय Python का उपयोग कर सकते हैं और उन भागों को लिख सकते हैं जिन्हें C में तेज़ प्रदर्शन की आवश्यकता है।

संपादित करें: सी के साथ अच्छी तरह से इंटरफ़ेस करने वाली अन्य भाषाएं हैं, इसलिए यदि आप पायथन को पसंद नहीं करते हैं, तो विकल्प हैं।


3
एम्बेडेड विकास के बारे में क्या? पायथन हमेशा उपलब्ध नहीं होता है, और सी और अच्छी तरह से लिखे गए सी ++ के बीच गति का अंतर प्रसंस्करण शक्ति के एक निश्चित स्तर के अतीत के उपकरणों पर नगण्य है। बेशक, मुझे लगता है कि C ++ कंपाइलर हमेशा या तो उपलब्ध नहीं होगा ...
James

6
@ नाम "अच्छी तरह से लिखा सी ++" - वहाँ पकड़ है :(
dss539

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

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

1
@suslik: वाह, मैं हैरान हूं कि कोई भी वास्तव में उस तरह के सिस्टम के लिए अजगर का उपयोग करेगा। मैं बुरा noob अजगर कोड के बारे में आप के साथ सहमत हूँ; मैंने खुद कुछ देखा है।
लैरी कोलमैन

13

क्या C ++ का उपयोग करने का कोई कारण है? निश्चित रूप से।

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

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

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


12

मैं बस C से C ++ में स्विच कर रहा हूं, और मुझे लगता है कि लाभ काफी है, भले ही आपको टेम्प्लेट और OOP की आवश्यकता न हो।

  • बेहतर स्मृति प्रबंधन
  • मजबूत प्रकार की प्रणाली
  • एक बेहतर मानक पुस्तकालय
  • नेमस्पेस
  • आदि।

8

मुझे आश्चर्य है कि किसी ने भी अभी तक इसका उल्लेख नहीं किया है, लेकिन C ++ ने हमें संदर्भों से परिचित कराया , जो लगभग सभी समस्याओं और बिंदुओं के नुकसान को हल करते हैं:

void ModifyVar(int& var)
{
    var = 5;
}

int test = 4;
ModifyVar(test);

के बजाय:

void ModifyVar(int * var)
{
    *var = 5;
}

int test = 4;
ModifyVar(&test);

बहुत सुरक्षित और आसान भी ... और बिना पास-पास के मूल्य के ओवरहेड के बिना।


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

3
@ फिर: क्या आप कृपया बता सकते हैं कि यह एक बुरा उदाहरण क्यों है?
नाथन उस्मान

6
@ जॉर्ज: क्योंकि कुछ भी नहीं बदला है, सिवाय इसके कि दो (गिनती ') अक्षर छोटे हैं? यह किसी भी समस्या को हल नहीं कर रहा है, यह किसी भी नुकसान को उजागर नहीं कर रहा है, यह कुछ भी शांत नहीं करता है जैसे एक अस्थायी चर के जीवनकाल का विस्तार (जो संदर्भ अच्छे हैं)।
बेन वोइगट

@ पता: आप कुछ भूल रहे हैं - संदर्भ हमेशा मान्य है। पॉइंटर्स किसी भी चीज़ (NULL सहित) को इंगित कर सकते हैं जो कि सभी प्रकार की मेमोरी त्रुटियों को जन्म दे सकता है यदि चीजें सही नहीं की जाती हैं। संदर्भ कभी भी NULL नहीं हो सकते हैं और जिस पते पर वे इंगित करते हैं उसे कभी नहीं बदला जा सकता है।
नाथन उस्मान

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

5

आमतौर पर कहां और क्यों होने जा रहे हैं:

  • सुपरिचय
  • वांछित भाषा सुविधाएँ
  • विशिष्ट पुस्तकालयों का आप उपयोग करना चाहते हैं
  • प्रदर्शन संबंधी जरूरतें

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

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


2
परिचितता नंबर 1 कारण है, और मुझे आश्चर्य है कि आप इसका उल्लेख करने वाले पहले व्यक्ति हैं।
पॉल कसाई

4

सी ++ बनाम पायथन बनाम पर्ल आसानी से आंका नहीं जा सकता। यह परियोजना और आवश्यकताओं पर निर्भर करता है।

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

दूसरी ओर C ++, पुस्तकालयों पर निर्भरता के साथ एक भयानक सौदा है। एक बार जब आप जीसीसी एक्स या वीसी ++ वाई में कुछ संकलित करते हैं, तो आप भरोसा नहीं कर सकते कि कोड उन उपकरणों के अगले संस्करण से चलेगा। वही नरक विंडोज पर है, वही नरक यूनिक्स पर भी है।

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

अजगर आसान, लचीला और एक गतिशील भाषा है। इतना आसान है कि आप किसी फ़ंक्शन में पूर्णांक भेज सकते हैं, स्क्रिप्ट स्ट्रिंग की उम्मीद करती है, फिर भी आपके पास एक परिणाम हो सकता है! हालांकि अप्रत्याशित, लेकिन एक परिणाम। तो यह प्रोग्रामर को बहुत सतर्क रहने की जरूरत है। IDLE कुछ डिबगिंग प्रदान करता है, लेकिन जब आपके पास एक सिस्टम में TELNET'ed होता है, या SSH'ed तीन स्तरों में नीचे होता है और आप अपनी समस्या का पता लगाना चाहते हैं, तो डिबगर आपके बगल में खड़ा नहीं होगा। लेकिन, यह कुछ महान गणित कार्य तेजी से कर सकता है।

जावा buzzwords, विदेशी प्रौद्योगिकियों और बड़े शब्दों का एक पारिस्थितिकी तंत्र है और जब आप किसी फ़ाइल को वेबसर्वर पर अपलोड करना चाहते हैं, तो आप पाते हैं कि आप इसे तभी कर सकते हैं जब सर्वर में JSP हो । यदि आप सिस्टम लाइब्रेरी या सिस्टम फ़ंक्शंस को मॉनीटर करना चाहते हैं, तो आपको लगता है कि आपको बहुत खुदाई करनी होगी। और शायद जेएनआई तक पहुंचने के लिए और ठीक है ... आप तब सोचते हैं ... "क्यों, भगवान?"

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

एक कार्यक्रम बनाने और अपने सीवी को दिखाने के लिए उपवास करें "ओह, मुझे वह तकनीक भी पता है" और आपके चाहने वाले बॉस, आश्चर्यचकित हो जाएं! भले ही, तकनीक की ज़रूरत नहीं हो सकती है ... (ठीक है, दोस्तों, मुझे स्प्रिंग फ्रेमवर्क से नफरत है ...)


1
अफसोस, आपको यह विचार करना होगा कि पायथन में संस्करण निर्भरताएं हैं - विशेष रूप से एक बार जब आप पायथन 3 पर जाते हैं, तो पर्ल के साथ ही .. या किसी ने अभी तक पर्ल 6 में जाने की जहमत नहीं उठाई है? सब कुछ बुरा निर्भरता है :(
gbjbaanb

3

भाषा चुनते समय ध्यान रखने वाली बात यह है कि इसका उपयोग करने से आपको क्या लाभ होगा, और इसे प्राप्त करने में कितना समय लगेगा।

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

C / C ++ का लाभ यह है कि वे तेज़ हैं, लेकिन सिंटैक्स और मजबूत टाइपिंग की कीमत पर: आपको खुद बहुत कुछ करना होगा ताकि कंप्यूटर को संकलन समय पर इसे चुनना न पड़े।

जब आप एक कोड बनाते हैं, तो कुछ लाइनें दूसरों की तुलना में बहुत अधिक भाग जाएंगी, और वे रेखाएं हैं जो एक समस्या पैदा करती हैं। दूसरी ओर, शेष सभी कोड, जिस पर आपने बहुत समय बिताया था, बहुत कम बार निष्पादित किया जाता है। आपने इसे सुना होगा, लेकिन यह 80/20 का कुख्यात नियम है, और आप इस तरह के नियम को दरकिनार नहीं कर पाएंगे।

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

आप इसकी तुलना इतनी जल्दी करेंगे अगर आपने इसे C या C ++ के साथ किया होता, तो इससे बहुत अधिक दिमागी दर्द होता।

आपका कार्यक्रम धीमा होगा, लेकिन एक प्रोफाइलर के साथ, आप उस हिस्से को अलग कर देते हैं, जो 80% भाग जाता है, और आप उन्हें C या C ++ के साथ करते हैं।

इस तरह से prorgamming करके, आपने बहुत समय बचाया, और आपका प्रोग्राम उतना ही कुशल है, जितना तेज़, मेमोरी को लीक करने की संभावना कम है, और आपने समय की बचत की है।

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



2

C ++ I का उपयोग C को कक्षाओं के साथ किया जाता है!


8
हुर्रे, आपने 'क्लास' कीवर्ड का इस्तेमाल किया। अब आप समझते हैं OO डिज़ाइन!
dss539 17

मेरा सी ++ को नामस्थान के साथ सी कहा जाता है।
jsz

6
मेरा C ++ कहलाता है, umm .. मनोज का C ++।
मनोज आर

+1 यह एकमात्र कारण है कि मैं C ++ का उपयोग क्यों करता हूं।
mbq

... ठीक है, अपवाद भी।
mbq

0

इस तरह गठित सभी प्रश्नों का वास्तव में एक ही उत्तर है। टेक वाई के बजाय टेक एक्स का उपयोग करने का सबसे अच्छा कारण (जहां एक्स और वाई लगभग समान स्तर पर हैं [जैसे कि सभी समकालीन प्रोग्रामिंग भाषाओं के बारे में हैं]) क्योंकि आप एक्स को पहले से ही जानते हैं और वाई को नहीं जानते हैं।

(लेकिन हास्केल के आने के बाद, कुछ और उपयोग करने का कोई कारण नहीं है)


0

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

हालाँकि, मैं सी का उपयोग करने से बचने के लिए पायथन, पर्ल इत्यादि का उपयोग नहीं करूंगा। मेरी पसंद वास्तव में सी # है, क्योंकि मुझे एक अच्छी लाइब्रेरी (जो .NET की ताकत है) पसंद है, और मुझे सांख्यिकीय रूप से टाइप की गई भाषाएं पसंद हैं। बू एक अच्छा विकल्प है। लेकिन वास्तव में हास्केल , ओकेमेल , डी , एमएल और ऐसे सभी ठीक हैं।


7
तुम चूक गए।
मैट जॉइनर

@Matt Joiner: मुझे यकीन है कि मैंने नहीं किया है। मुझसे क्या छूट गया?

प्रश्न C ++ का उपयोग नहीं करने के बारे में है।
मैट जॉइनर

@ मैट जॉइनर: हम्म, एक और लुक पर मैं देख सकता हूं कि पूछा जा रहा है। लेकिन ऐसा लगता है जैसे मैंने उत्तर दिया कि (मैंने कहा कि परेशान न हों और जिन विकल्पों का मैं उपयोग करता हूं)

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