क्या आधुनिक C ++ अधिक प्रचलित हो रहा है? [बन्द है]


132

जब मैंने पहली बार C ++ 6-7 साल पहले सीखा था, तो मैंने जो सीखा वह मूल रूप से "C with Classes" था। std::vectorनिश्चित रूप से एक उन्नत विषय था, अगर आप वास्तव में चाहते थे तो कुछ आप इसके बारे में जान सकते हैं । और निश्चित रूप से कोई भी मुझे नहीं बता रहा था कि स्मृति को प्रबंधित करने में मदद करने के लिए विनाशकों का दोहन किया जा सकता है। आज, हर जगह मुझे लगता है कि मैं RAII और SFINAE और STL और बूस्ट देखता हूं और, आधुनिक C ++। यहां तक ​​कि जो लोग सिर्फ भाषा के साथ शुरुआत कर रहे हैं उन्हें लगता है कि इन अवधारणाओं को लगभग 1 दिन से पढ़ाया जा रहा है।

मेरा सवाल यह है कि क्या यह केवल इसलिए है क्योंकि मैं केवल "सर्वश्रेष्ठ" देख रहा हूं, अर्थात्, एसओ पर यहां प्रश्न, और अन्य प्रोग्रामिंग साइटों पर जो शुरुआती (gamedev.net) को आकर्षित करते हैं, या यह वास्तव में प्रतिनिधि है सी ++ समुदाय एक पूरे के रूप में?

क्या आधुनिक C ++ वास्तव में डिफ़ॉल्ट बन रहा है? विशेषज्ञों द्वारा लिखी जाने वाली कुछ फैंसी चीज़ों के बजाय, क्या यह "C ++ का तरीका" है? या क्या मैं अभी भी उन हजारों लोगों को देखने में असमर्थ हूं जो अभी भी "सी विद क्लासेस" सीखते हैं और उपयोग करने के बजाय अपने स्वयं के डायनेमिक सरणियों को लिखते हैं std::vector, और अपने शीर्ष-स्तरीय कोड से मैन्युअल रूप से नए / डिलीट करके मेमोरी मैनेजमेंट करते हैं?

जितना मैं इस पर विश्वास करना चाहता हूं, यह अविश्वसनीय लगता है अगर मूल रूप से कुछ वर्षों में सी ++ समुदाय इतना विकसित हुआ है। आपके अनुभव और इंप्रेशन क्या हैं?

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


2
दुर्भाग्य से मुझे लगता है कि C ++ समुदाय से पहले यह थोड़ी देर के लिए होगा क्योंकि यह पूरी तरह से उन्नत होगा कि मानक पुस्तकालय का उपयोग कैसे करें और आगामी C ++ 0x परिवर्धन के साथ-साथ प्रभावी रूप से समान कार्यप्रणाली का उपयोग करके अकेले कोड को लागू करने दें। हालांकि, मुझे लगता है कि C ++ की लोकप्रियता बढ़ाने के लिए C ++ 0x बहुत आशा लाता है। दैनिक वाक्य-रचना संबंधी असुविधाओं में बहुत सुधार हुआ है। मैंने हमेशा इन चीजों को क्षुद्र माना है, लेकिन बाहरी लोगों को भाषा को देखते हुए, यह शिकायत का एक सामान्य स्रोत है।
बदबूदार 472

15
मेरे मामले में, जब भी मैं किसी ऐसे पेशेवर से मुठभेड़ करता हूं जो RAII और अपवाद सुरक्षा जैसी आधुनिक C ++ तकनीकों को समझता है (जरूरी नहीं कि वह अलेक्जेंड्रेस्कु की पुस्तक का उल्लेख कर रहा हो) या यहां तक ​​कि सबसे बुनियादी अवधारणाओं जैसे कि पुनरावृत्तियां और जेनेरिक एल्गोरिदम, मुझे दस से अधिक समझ में नहीं आता है। कम से कम जब यह पेशेवरों की बात आती है, तो उनमें से बहुत से कुछ भी जानने के लिए समय सीमा में पकड़े जाते हैं, इसलिए स्व-घोषित सी ++ पेशेवरों को अक्सर बहुत कुछ सीखना होता है। मुझे डर है कि मैं भी C ++ 0x वालों में से एक बन जा रहा हूं: बहुत कुछ है जिसे मुझे सीखना होगा और उसके लिए एडजस्ट करना होगा और मिलने की समय सीमा तय करनी होगी।
stinky472

जवाबों:


76

यहाँ मुझे लगता है कि चीजें कैसे विकसित हुई हैं।

सी ++ प्रोग्रामर की पहली पीढ़ी सी प्रोग्रामर थे, जो वास्तव में सी ++ को कक्षाओं के साथ सी का उपयोग कर रहे थे। इसके अलावा, एसटीएल अभी तक जगह में नहीं था, इसलिए कि सी ++ अनिवार्य रूप से क्या था।

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

अब, हमारे पास प्रशिक्षक और पुस्तक लेखक हैं जो पूरे C ++ का उपयोग कर रहे हैं, और अपने निर्देशों को उस परिप्रेक्ष्य से प्राप्त कर रहे हैं, जैसे Koenig & Moo का त्वरित C ​​++ और स्ट्रॉस्ट्रुप की नई पाठ्यपुस्तक। इसलिए हम नहीं सीखतेchar* तबstd::strings

यह एक दिलचस्प सबक है कि "विरासत" के तरीकों को बदलने में कितना समय लगता है, खासकर जब उनके पास प्रभावशीलता का रिकॉर्ड होता है।


13
हाँ। C कोडर्स के विशाल संस्थापित बेस के कारण C ++ को C के साथ अत्यधिक पीछे की ओर संगत करना बहुत ही स्मार्ट था। हमेशा डॉस के साथ पीछे की संगतता बनाए रखने के लिए एमएस की सफल रणनीति के समान। (देखें रेमंड चेन का अक्सर दर्दनाक लंबाई के लिए उत्कृष्ट ब्लॉग जो वे गए थे ...)
j_random_hacker

2
वूप्स, वहाँ एक स्पर्शरेखा के एक बिट पर चला गया ... कहने का मतलब है कि मुझे लगता है कि आप उन लोगों के बीच "जेनरल डिवाइड" के बारे में सही हैं जो सी से स्विच करते हैं (लेकिन सी-स्टाइल सोच रखते हैं) और उन लोगों के लिए जिनका "पहला स्वाद है" "पोस्ट-एसटीएल सी ++ था।
j_random_hacker

57

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


4
+1; मैंने "आधुनिक सी ++" शैली को जल्दी से उठाया क्योंकि यह ऐसा करने का प्राकृतिक तरीका है (यदि आप कक्षाओं के साथ सी नहीं सोच रहे हैं)।
एडम हैव्स

21
"बस सी का उपयोग करें?" सी लानत है शक्तिशाली।
क्लार्क गैबेल

4
सुनिश्चित करें कि रोबोट C ++ में प्रोग्रामिंग नहीं करेंगे, वे बहुत बेवकूफ नहीं हैं, और इसे संकलित करने की कोशिश कर रहे हैं।
मैट जॉइनर

6
@ क्लार्कगैबेल, यदि C शक्तिशाली है, तो C ++ अपने मुद्दों के बिना C से विरासत के द्वारा है :)
किंवदंतियों २

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

25

विंडोज 3.1 के दिनों में, C मानक था। जब C ++ ने डेवलपर बाजार को मारा और बाद में ANSI मानक बन गया, तो यह नया हॉटनेस था। इसने ओओपी संक्षिप्तिकरण और बहुरूपता का उपयोग करते हुए कुछ मूल डिजाइन पैटर्न को लोकप्रिय बनाया।

अब, कम-बैरियर-टू-एंट्री प्रबंधित प्लेटफार्मों की अधिक से अधिक स्वीकृति के साथ, जैसे कि C # /। NET, का उपयोग करने का एक कारण कम है + 1। इतने डेवलपर बेस में एक विकल्प होगा और चलो ईमानदार रहें: सी ++ एक नौसिखिया के लिए सीखने के लिए एक भालू है। C # के साथ, आप बस इसके साथ चल सकते हैं।

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

तो हां, मेरा मानना ​​है कि "आधुनिक सी ++", जैसा कि आप कहते हैं, यह अधिक प्रचलित हो रहा है। यद्यपि, पूर्व में इसका उपयोग करने की तुलना में यह एक अलग दर्शकों के साथ प्रचलित है।


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

4
तो आप कह रहे हैं कि अधिक औसत डेवलपर्स C # और जैसे बंद हो गए, जबकि अधिक हार्ड-कोर C ++ के साथ अधिक अटक गया? (ऐसा नहीं है कि वास्तव में स्मार्ट सी # /। नेट लोग नहीं हैं, लेकिन कम स्मार्ट की एक पूरी बहुत कुछ कर रहे हैं।) समझदारी की एक निश्चित राशि बनाता है।
डेविड थॉर्नले

3
मुझे लगता है कि यह एक वैध बिंदु है। बेशक, यह सभी के लिए सच नहीं है, लेकिन काफी हद तक, मैं सहमत हूं, ज्यादातर लोग जिनके पास पसंद है, वे पहले से ही सी # या जावा या ऐसी अन्य भाषाओं के लिए जा चुके हैं।
jalf

3
मामलों का उपयोग करें: मैं अपने db पर CRUD करने के लिए एक विंडोज़ क्लाइंट चाहता हूं। C # /। NET या C ++ / MFC का उपयोग करें? मुझे एक वेब ऐप चाहिए ... C # / ASP.NET या C ++ / ISAPI का उपयोग करें? मुझे DirectX C # /। NET या C ++ / MFC / WTL का उपयोग करके एक साधारण "Nybbles" क्लोन चाहिए? मैं असेंबली 09 पर एक विजयी डेमो चाहता हूँ ... निश्चित रूप से C ++ (बनाम C #)।
स्पूलसन

8
मुझे नहीं पता कि यह अमूर्त की अधिक परतों या अधिक डाई-हार्ड-नेस की बात है। मुझे संदेह है कि सिर्फ टेम्प्लेट के माध्यम से उपलब्ध अमूर्तता के प्रकार सिर्फ जावा या सी # में उपलब्ध नहीं थे, इसलिए जिन लोगों को पसंद आया या उनकी आवश्यकता थी वे सी ++ के साथ रहे।
१४:१४ बजे क्रैगन जेवियर सीटेकर

16

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

लेकिन दोस्तों के साथ बात करते हुए मैंने यह भी कहा कि कुछ कंपनियां अभी भी "C with Classes" के साथ काम करती हैं, न कि "मॉडर्न C ++"। हो सकता है कि "मॉडर्न C ++" के लेखकों और उपयोगकर्ताओं द्वारा प्रस्तावित संस्कृति किसी दिन प्रबल हो जाएगी :)


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

12

मुझे लगता है कि आपको बस एक बुरा अनुभव शुरू करना था।

आपको अपने आप को स्कॉट मेयर्स इफेक्टिव सी ++ पुस्तकें प्राप्त करने की आवश्यकता है । मैंने 1999 में गुस्से में C ++ पर शुरुआत की, मेरी टीम लीड ने मुझे बैठने और प्रभावी C ++ और अधिक प्रभावी C ++ पढ़ने से पहले मुझे किसी भी कोड में जांच करने की अनुमति दी।

उनकी ज्यादातर सलाह "इस सुविधा का उपयोग न करें , लेकिन अगर आपको यह ध्यान में रखना है"

यदि आप उनकी सलाह का पालन करते हैं तो आप अच्छा या "आधुनिक" C ++ लिखेंगे।

उनके पास अब एसटीएल पर एक किताब भी है, लेकिन मैंने पढ़ा नहीं है।


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

9

मेरी सी ++ नौकरियों में, मैंने आधुनिक सुविधाओं का तेजी से उपयोग किया है, और अधिक लोगों ने मुझसे फोन स्क्रीनिंग और साक्षात्कार में उनके बारे में पूछा। जहाँ तक मैं बता सकता हूँ, वे पकड़ रहे हैं।

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

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

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


यहां तक ​​कि एसटीएल के पहले संस्करण अपवाद-सुरक्षित नहीं थे।
१०:१५ बजे क्रेजेन जेवियर सिटेकर

2
उस समय, कोई भी वास्तव में अपवाद-सुरक्षित कोड लिखना नहीं जानता था। यह मानक के प्रकाशन के बाद के वर्षों में काम किया गया था। मुझे C ++ रिपोर्ट के कुछ लेख याद हैं।
डेविड थॉर्नले

7

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

सबसे हालिया विकास सी ++ 0x लैम्ब्डा के लिए एक सनक लगता है - जिसका इसमें एक सकारात्मक पक्ष है कि यह हाथ से कोड किए गए छोरों पर मानक एल्गोरिदम का उपयोग करने के पक्ष में संतुलन को भी झुकाता है, क्योंकि अब आपके पास सभी कोड इनलाइन हो सकते हैं साथ ही एल्गोरिदम।


6

मैं यह नहीं कहूंगा कि एसटी :: वेक्टर इन दिनों "आधुनिक" के रूप में योग्य है। यह वास्तव में बुनियादी है।

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


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

4
लेकिन मुझे लगता है कि ऐसा इसलिए है क्योंकि कुछ पीपीएल for_each और दोस्तों को मूल रूप से हर चीज के लिए उपयोग करने की कोशिश करते हैं, यहां तक ​​कि सामान के लिए भी, जहां एक सरल-पाश के लिए अधिक संक्षिप्त तरीका होगा - 10 लाइनों तक 2 लाइन लूप को फुलाना। मैं उम्मीद करता हूं कि अधिक लोग for_each और मित्रों का उपयोग करेंगे जब लैम्ब्डा C ++ 1x में उपलब्ध होगा, हालांकि
जोहान्स स्काउब -

7
वेक्टर बेसिक होना बिल्कुल सही बात है। यह हमेशा बुनियादी नहीं रहा है। एक बार, यह आमतौर पर एक सुपर-कॉम्प्लेक्स (TEMPLATES का इस्तेमाल किया गया) और अक्षम (यह एक कच्चा सरणी नहीं है) के रूप में देखा गया था। कुछ विशेषज्ञ जिनके बारे में प्रचार कर सकते हैं, लेकिन बहुत से लोगों को भरोसा नहीं था।
जलफ

2
हो सकता है क्योंकि std :: for_each शायद ही कभी ऐसा हो जो आपको कहने की तुलना में आवश्यक हो ... std :: transform? एल्गोरिथ्म का उपयोग करना आपको एक बहुत ही सामान्य बग से छुटकारा पाने में मदद करता है: गलत लूप स्थिति।
एडुआर्ड ए।

वेक्टर <bool> निश्चित रूप से बुनियादी नहीं है ...
Kugel

6

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

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

हालाँकि, जैसा कि मैंने कहा, ऐसा लगता है कि सामान्य रूप से प्रोग्रामिंग (और विशेष रूप से प्रोग्रामिंग भाषा) को बहुत गंभीरता से नहीं लिया जाता है, क्योंकि यह एक अस्थायी कार्य प्रतीत होता है जब वे नौकरी शुरू करते हैं, तो भूल जाते हैं कि कैसे प्रोग्राम करना है क्योंकि वे ऊपर जाते हैं उद्यम वृक्ष। कई उद्यमों ने यहां और विश्वविद्यालय ने स्वयं महसूस किया है कि प्रोग्रामिंग किसी के द्वारा भी की जा सकती है।

यदि आप इस दर्शन का पालन करते हैं, तो ज्यादातर लोगों को मैं जानता हूं, सी ++ हमेशा "सी विद क्लासेस" होगा।

सादर,


कंप्यूटर विज्ञान में यह बहुत आम है, और कुल मिलाकर, मुझे नहीं लगता कि यह एक बुरी बात है। (भाषा पर ध्यान केंद्रित नहीं है, अर्थात। जो भाषाएं सिखाई जाती हैं उन्हें स्पष्ट रूप से अभी भी ठीक से पढ़ाया जाना चाहिए)।
jalf

+1: "(भाषा पर ध्यान केंद्रित नहीं करना, यही है। जो भाषाएं सिखाई जाती हैं, उन्हें स्पष्ट रूप से अभी भी ठीक से पढ़ाया जाना चाहिए)"
जेरेड अपडेटाइक

6

मेरे अनुभव में यह काफी हद तक सॉफ्टवेयर उत्पाद / परियोजना की आयु पर निर्भर करता है। अधिकांश नई परियोजनाएं जिनके बारे में मुझे पता है कि वे आधुनिक C ++ (RAII, STL, Boost) का उपयोग करते हैं। हालाँकि, कई C ++ प्रोजेक्ट्स हैं जो 10 साल से अधिक पुराने हैं, और आप वहां आधुनिक C ++ नहीं देखते हैं।

इसके अलावा, ध्यान रखें कि कुछ सबसे लोकप्रिय एसटीएल कार्यान्वयन 5 साल पहले तक (MSVC <7.0 और GNU <3.00) तक बहुत अधिक टूट गए थे।


4

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

अब जबकि सभी ने MSVC ++ 6 का उपयोग करना बंद कर दिया है, STLport मेस हमारे पीछे है। लेकिन जैसे ही टीआर 1 दरवाजे से बाहर है, हम वापस "किस संस्करण के वातावरण का समर्थन करते हैं और इसे ठीक से प्राप्त करते हैं" और एक बार फिर से यह अपनाने को धीमा कर देगा।

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


3

मैंने जिन टीमों के बारे में सुना है उनमें से कई ने बड़े "क्या हम अपवादों का उपयोग कर रहे हैं?" सवाल। यह कोड है "क्या हम आधुनिक C ++ का उपयोग कर रहे हैं?"

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

लेकिन कई पुराने कोडबेस अपवाद-कम हैं, और ऐसा माना जाता है कि अपवादों को एक कोडबेस में बदलना मुश्किल है, जो उनसे उम्मीद नहीं करता है, या एक टीम में जो उन्हें उपयोग करना नहीं जानता है, इसलिए ऐसे मामलों में जवाब है अक्सर 'नहीं।'

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

जबकि मुझे नहीं लगता कि पुराने-सी ++ कोडबेस बहुत जल्दी खत्म हो रहे हैं, मेरा मानना ​​है कि दुनिया में इन भावुक लोगों की संख्या पांच साल पहले की तुलना में अधिक है। वे उसी उथल-पुथल लड़ाई का सामना करते हैं, जो उन्होंने पांच साल पहले सामना किया था, लेकिन उनमें दयालु आत्माओं को खोजने की अधिक संभावना है।


3

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

मेरे लिए, "आधुनिक सी ++"! = "टेम्पलेट मेटाप्रोग्रामिंग"। मैं कहूंगा कि C के शीर्ष पर C ++ की विशेषताएं इन श्रेणियों में आएंगी:

  • कक्षाएं (कंस्ट्रक्टर्स, डिस्ट्रक्टर्स, RAII, डायनामिक कास्टिंग और RTTI)
  • अपवाद
  • संदर्भ
  • मानक लाइब्रेरी (STL) में डेटा संरचनाएं और एल्गोरिदम
  • iostreams
  • सरल वर्ग और फ़ंक्शन टेम्पलेट
  • टेम्पलेट मेटाप्रोग्रामिंग

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

टेम्प्लेट मेटाप्रोग्रामिंग।

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


6
IMHO टेम्प्लेट मेटाप्रोग्रामिंग लगभग कभी भी एप्लिकेशन प्रोग्रामिंग के लिए आवश्यक नहीं होता है , जहां यह केवल पठनीयता और कठिन-से-समझने वाले कीड़ों की कीमत पर सामान्यता के संभवतः-अनावश्यक स्तर प्रदान करने के लिए कार्य करता है। लेकिन पुस्तकालयों का निर्माण करते समय विशेषज्ञों के लिए यह बेहद उपयोगी है (एक ला बूस्ट), जहाँ जोड़ा सामान्यता उपयोगी है और (बदसूरत, मुश्किल, भ्रमित) तंत्र को दृश्य से छिपाया जा सकता है।
j_random_hacker

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

2

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


1
नेक्रो का मतलब यह नहीं है, लेकिन मैंने इस सिफारिश के आधार पर सिर्फ किताब खरीदी है। हमें देखना पड़ेगा!
एंड्रयू वीर

2

मैंने वास्तव में C ++ जॉब्स को देखा है और "आधुनिक" पुस्तकालयों को नौकरी विवरण में अधिक से अधिक उपयोग किया जाता है, एमएफसी जो काफी "पुरानी शैली" है c ++ लाइब्रेरी का कम उपयोग किया जाता है।


1

1990 के दशक के उत्तरार्ध में भाषा का मानकीकरण पहला कदम था, इसने संकलक निर्माताओं को "मानक" सुविधाओं के सेट पर ध्यान केंद्रित करने की अनुमति दी, साथ ही भाषा को कुछ खुरदरे किनारों को ठीक करने की अनुमति दी, जो मानकीकरण प्रक्रिया को गर्तित करते थे।

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

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

एसटीएल के पास इसके पेशेवरों और विपक्ष हैं लेकिन यह समय की कसौटी पर बच गया, यदि आप कुछ ऐसा चाहते हैं जो काम करता है और सरल है तो एसटीएल में निश्चित रूप से आपकी शुरुआत में मदद करने के लिए कुछ है। पहिया को पुन: स्थापित करने का कोई मतलब नहीं है (जब तक कि उपचारात्मक कारणों के लिए)।

कंप्यूटर हार्डवेयर ने भी 1990 के दशक से शानदार छलांग लगाई है, फिर मेमोरी और सीपीयू अब कंपाइलर के लिए बाधा नहीं हैं। इसलिए पुस्तकों से अधिकांश सैद्धांतिक अनुकूलन अब संभव है।

भाषा का अगला चरण मल्टी-कोर प्रोग्रामिंग का समर्थन है, जो 0x मानक प्रयास का हिस्सा है।


1

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


-3

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


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

ज़रूर, एसटीडी-लाइब्रेरी मेमोरी आवंटन और स्ट्रिंग हेरफेर पर कुछ स्थिरता प्रदान करता है। दुर्भाग्य से आंतरिक रूप से यह ऐसे अजीब कोडिंग सम्मेलनों का उपयोग करता है, जो आपको लगता है कि यह एलियंस या कुछ और द्वारा लिखा गया है। :)
AareP

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

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

यह उत्तर एक दशक पहले लिखा गया था। उस समय, यह आश्चर्यजनक था कि c ++ को अधिक स्थिर बनाने में कितना प्रयास किया जा रहा था । यह एक महत्वपूर्ण कारण था कि c ++ 0x को c ++ 11 के रूप में रिलीज़ होने में इतना समय लगा।
डेविड हैम्मन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.