C ++ अभी भी "हाइब्रिड" क्यों है


16

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

* हाइब्रिड से मेरा मतलब है कि यह तय करना प्रोग्रामर पर निर्भर करता है कि वह / वह उपयोग करेगा या नहीं: मानक तार और धाराएँ, कक्षाएं, डिफ़ॉल्ट के अलावा अन्य नाम स्थान इत्यादि।


क्या कोई मौजूदा संकलक / आईडीई सेटिंग्स हैं जो इसे लागू कर सकती हैं?
फ्रस्ट्रेटेडविथफॉर्म्सडिजाइनर

@FrustratedWithFormsDesigner मुझे ऐसा करने वाले किसी भी उपकरण के बारे में पता नहीं है। लेकिन इस तरह के एक उपकरण (संकलक, आईडीई, आदि) को लिखने के लिए और अधिक समझ में आता है अगर वे विशेषताएं मानक मानक सी ++ थीं।
साकिस

2
सी ++ के किशमिश है पश्च संगतता और संभावना सब गंदा चाल है कि सी में संभव थी कि ले उपयोग करने के लिए है, और यह सिर्फ एक और सी #, डी या जावा क्लोन है। यदि आप चाहते थे कि, C #, D या Java का उपयोग क्यों न किया जाए?
निकी

5
@ मिक्की: हाहाहाहा। क्योंकि टेम्प्लेट, मूल्य प्रकार, मजबूत संदर्भ, नियतात्मक विनाश, कई विरासत, निष्पादन की गति, कम स्मृति उपयोग, उन चीजों का कोई अस्तित्व नहीं है।
डेडएमजी

2
@ मिनी: सिवाय इसके डी के भी घृणित Objectऔर द्विआधारी कॉपी करने वाले rvalues ​​और भाषा-विभाजन वाले साहचर्य सरणियों (क्यों ...) के साथ ही इसके अन्य संदिग्ध डिजाइन निर्णय हैं। इसके अलावा, यह प्रभावी रूप से दूसरों के समान ही जीसी प्रतिमान है, इसलिए मैं सवाल करूंगा कि यह कम मेमोरी उपयोग है।
मृतक 16

जवाबों:


26

हां, एक मजबूत तर्क है: C ++ कोड को हमेशा मौजूदा C कोड को कॉल करना पड़ता है। हम जो सबसे अच्छा कर सकते हैं, वह अच्छा कोड लिखना आसान बनाता है। ऐसा कुछ भी नहीं है जो भाषा डिजाइनर बुरा कोड लिखना असंभव बना सकता है।


1
ज़रूर, लेकिन चूंकि यह केवल विरासत कोड के लिए है, इसलिए C ++ के नए संस्करणों को संगत बने रहने की आवश्यकता है? विरासत कोड अभी भी C ++ के पुराने संस्करण का उपयोग कर सकता है।
साकिस

15
@ अल्फा, मेरी नौकरी में मैं हर समय नए C ++ कोड को लिखता हूं, जिसे नए C कोड के साथ इंटरफ़ेस करने की आवश्यकता होती है। यह सिर्फ एक विरासत का मुद्दा नहीं है।
कार्ल बेज़ेलफेल्ट

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

4
The best we can do is make it easy to write good code.- क्या हम उसी C ++ की बात कर रहे हैं?
ब्लूराजा - डैनी पफ्लुगुएट

4
@ BlueRaja-DannyPflughoeft: मुझे जावा या C # की तुलना में C ++ में अच्छा कोड लिखना बहुत आसान लगता है। सी ++ के साथ, मैं एक कक्षा पढ़ सकता हूं और यदि अन्य सभी कक्षाएं व्यवहार करती हैं, तो मुझे पता है कि स्मृति और संसाधन लीक नहीं होंगे। जावा और C # के साथ मैं ऐसा नहीं कर सकता; मुझे यह देखने के लिए अन्य कक्षाओं का निरीक्षण करना होगा कि क्या उनमें से किसी को अंतिम रूप देने की आवश्यकता है। C ++ टेम्प्लेट भी मुझे कोड को सूखने देता है जिसे जावा में दोहराया जाना है।
केविन क्लाइन

20

IMHO, यह बेहतर होगा यदि भाषा / संकलक कुछ हद तक प्रोग्रामर को अधिक सुरुचिपूर्ण कोड लिखने के लिए मजबूर करें।

नहीं, यह नहीं होगा। बिल्कुल भी। क्यों के एक तुच्छ प्रदर्शन के रूप में, सुरुचिपूर्ण परिभाषित करें, और फिर मैंने शर्त लगाई कि दस लोग आपसे असहमत होंगे।

भाषा-लागू कोडिंग शैली वास्तव में बहुत खराब हैं। सभी विरासत कोड का उल्लेख नहीं किया जाएगा जो टूट जाएगा।

विशेष रूप से, मानक स्ट्रिंग और स्ट्रीम कक्षाएं वास्तव में चूसती हैंstd::stringकोई यूनिकोड समर्थन नहीं है और सबसे खराब फूला हुआ इंटरफ़ेस जिसकी आप संभवतः कल्पना कर सकते हैं। धाराओं में भयावह ओवरहेड और एक खराब डिज़ाइन है, यहां तक ​​कि वर्चुअल इनहेरिटेंस, और फंक्शन पॉइंटर्स const char*और इस तरह की बदसूरत चीजों का सहारा भी । मैं उन दोनों वर्गों / वर्ग समूहों को पूरी तरह से कस्टम लोगों के साथ बदलने के लिए किसी को भी दंडित नहीं करूंगा।

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


+1 कुछ अधिक यथार्थवादी दृष्टिकोण के लिए (जब "सुरुचिपूर्ण कोड" टॉक स्टॉप होगा: /
रूक

2
"भाषा-प्रवर्तित कोडिंग शैलियाँ वास्तव में बहुत खराब हैं।" क्या आप कुछ उदाहरण दे सकते हैं? मुझे लगता है कि पायथन के लागू कोड इंडेंटेशन जैसी सरल चीजें भी कोड पठनीयता में सुधार करती हैं।
साकिस

3
मुझे यकीन नहीं है कि मैं इससे सहमत हूं। जावास्क्रिप्ट पर CoffeeScript का उपयोग करने का मुख्य कारण यह है कि CoffeeScript अधिक सुरुचिपूर्ण कोड के लेखन को लागू करने के लिए डिज़ाइन किया गया है।
user16764

3
इससे सहमत नहीं हो सकते। कुछ भाषा डिजाइन अच्छी प्रथाओं को प्रोत्साहित करने के लिए होती हैं, और अधिकतर C ++ की प्रकृति पर बोल-चाल की प्रकृति, आमतौर पर इसे पीछे छोड़ देती है। वास्तव में, भाषा को ठीक करना, अच्छे हिस्सों को रखना और बाकी को सुधारना C ++ 11 के अस्तित्व के पीछे प्रमुख प्रेरणा है ।
रॉबर्ट हार्वे

1
@ पबबी: "एक बदसूरत प्रोग्राम लिखना जो काम करता है एक सुंदर प्रोग्राम लिखने से बेहतर है कि कुछ भी न करें।" ज़रूर, मैं इससे सहमत हो सकता हूं। लेकिन यह लेख इससे परे जाता है और यह तर्क देता है कि कुरूपता वास्तव में एक गुण है। और यह सिर्फ हास्यास्पद है।
मेसन व्हीलर

8

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

IMHO, यह बेहतर होगा यदि भाषा / संकलक कुछ हद तक प्रोग्रामर को अधिक सुरुचिपूर्ण कोड लिखने के लिए मजबूर करें।

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

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

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


1
अधिक सहमत नहीं हो सका। मुझे लगता है कि जब कोई कहता है कि "सी ++ लचीला है", तो मुझे ऐसा लगता है क्योंकि यह सी की तुलना में कई अधिक प्रतिमानों का समर्थन करता है।
मिलेंगे

5

IMHO, यह बेहतर होगा यदि भाषा / संकलक कुछ हद तक प्रोग्रामर को अधिक सुरुचिपूर्ण कोड लिखने के लिए मजबूर करें।

कोई भी किसी को पहली जगह में सी ++ का उपयोग करने के लिए मजबूर नहीं कर रहा है। यदि भाषा आपको सूट नहीं करती है, तो एक अलग का उपयोग करें - "सी ++ के बिना सी" के रूप में बोली जाने वाली कई भाषाएं हैं।

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

C ++ के साथ C ++ की संगतता निश्चित रूप से सबसे कमजोर बिंदुओं में से एक है, लेकिन यह भी ध्यान रखें कि यह इसकी सबसे बड़ी में से एक है।


मैं जॉन Purdy द्वारा एक अद्भुत उद्धरण जोड़ने जा रहा हूँ जो मुझे लगता है कि अत्यंत प्रासंगिक है:

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

हाइब्रिड को हटाने से लालित्य में सुधार हो सकता है, लेकिन यह क्षमता में बाधा डालता है।


क्या आप मानते हैं कि व्यावहारिकता और लालित्य विरोधाभासी हैं? मुझे लगता है कि पायथन, रूबी, और स्काला भाषाओं के अच्छे उदाहरण हैं जो व्यावहारिक और सुरुचिपूर्ण दोनों हैं।
साकिस

1
@ अल्फा: नहीं, लेकिन पीछे की संगतता और लालित्य विरोधाभासी हैं। यह पायथन पर भी लागू होता है, (2.x बनाम 3.x)।
dan04

4

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

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

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


2

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

प्रोग्रामर के रूप में, हम कभी-कभी भूल जाते हैं कि सबसे अच्छा समाधान एक तकनीकी नहीं हो सकता है। इस मामले में सहकर्मी समीक्षा सबसे अच्छा ज्ञात समाधान है।


0

सी ++ का कोई "एक सच्चा तरीका" नहीं है; हर दृष्टिकोण में ताकत और कमजोरियाँ होती हैं। समाधान को सौ अलग-अलग तरीकों से लिखा जा सकता है।

आपको एक सॉफ्टवेयर डेवलपर के रूप में यह तय करना होगा कि कौन सा तरीका हाथ में काम के लिए सबसे अच्छा है।


0

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

प्रोग्रामिंग का उपयोग करके हमें जिन समस्याओं को हल करने की आवश्यकता है, वे बहुत ही असंगत हैं।
कुछ को अच्छी तरह से OO सिद्धांतों (जैसे GUIs) का उपयोग करके हल किया जाता है, कुछ खुद को एक विशुद्ध रूप से कार्यात्मक उपचार (जैसे संख्यात्मक सामान) के लिए बेहतर उधार देते हैं, जबकि कुछ सर्वश्रेष्ठ "सिलिकॉन के करीब" भाषा में व्यक्त किए जाते हैं।

बहुत सारे सॉफ़्टवेयर को उन सबप्रोब्लेम्स को हल करने की आवश्यकता होती है जो उन तरीकों में से किसी एक में सबसे अच्छे रूप में हल किए जाते हैं। किसी विशिष्ट रूप में समाधान के लिए मजबूर करने से केवल उस कोड का नेतृत्व होगा जो अपने उद्देश्य के लिए कम फिट है (आप "कम सुरुचिपूर्ण" भी कह सकते हैं)।

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

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