मुझे D के बारे में अधिक जानकारी नहीं है, लेकिन बहुत से, कई C ++ प्रोग्रामर जिन्हें मैं जानता हूं, वे इसे नापसंद करते हैं, और मुझे व्यक्तिगत रूप से सहमत होना होगा- मुझे D का लुक पसंद नहीं है और मैं एक करीब नहीं जाऊंगा।
यह समझने के लिए कि डी अधिक कर्षण क्यों नहीं प्राप्त कर रहा है, आपको यह समझने की आवश्यकता है कि लोगों को C ++ के लिए क्या आकर्षित करता है। एक शब्द में, नंबर एक कारण नियंत्रण है। जब आप C ++ में प्रोग्राम करते हैं, तो आपका अपने प्रोग्राम पर पूरा नियंत्रण होता है। मानक पुस्तकालय को बदलना चाहते हैं? आप ऐसा कर सकते हैं। असुरक्षित सूचक जाति करना चाहते हैं? आप ऐसा कर सकते हैं। कांस्टिट्यूशन का उल्लंघन करना चाहते हैं? आप ऐसा कर सकते हैं। मेमोरी एलोकेटर को बदलना चाहते हैं? आप ऐसा कर सकते हैं। इसके प्रकार के संबंध के बिना कच्ची मेमोरी के आसपास कॉपी करना चाहते हैं? अगर तुम सच में चाहते हो। कई कार्यान्वयन से विरासत चाहते हैं? तुम्हारा अंतिम संस्कार है। नरक, आप बोहेम कलेक्टर की तरह कचरा संग्रह पुस्तकालय भी प्राप्त कर सकते हैं। फिर आपके पास प्रदर्शन जैसे मुद्दे हैं, जो नियंत्रण का बारीकी से अनुसरण करता है- एक प्रोग्रामर के पास जितना अधिक नियंत्रण होता है, उतना ही अधिक अनुकूलित वह अपना कार्यक्रम बना सकता है।
यहाँ कुछ चीजें हैं जो मैंने देखा है जब थोड़ा शोध करते हैं और कुछ ऐसे लोगों से बात करते हैं जिन्होंने इसे आज़माया है:
एकीकृत प्रकार पदानुक्रम। C ++ उपयोगकर्ता वंशानुक्रम का उपयोग बहुत कम करते हैं, अधिकांश C ++ प्रोग्रामर रचना पसंद करते हैं, और प्रकारों को केवल विरासत के माध्यम से जोड़ा जाना चाहिए यदि ऐसा करने का एक बहुत अच्छा कारण है। ऑब्जेक्ट की अवधारणा हर प्रकार को जोड़कर इस सिद्धांत का दृढ़ता से उल्लंघन करती है। इसके अलावा, यह C ++ के सबसे बुनियादी सिद्धांतों में से एक का उल्लंघन कर रहा है- आप केवल उसी चीज का उपयोग करते हैं जो आप चाहते हैं। ऑब्जेक्ट से विरासत में लेने के बारे में कोई विकल्प नहीं दिया जा रहा है, और लागत जो इसके साथ जाती हैं, प्रोग्रामर को अपने प्रोग्राम पर नियंत्रण देने के मामले में एक भाषा के रूप में सी ++ के लिए बहुत मजबूत हैं।
मैंने कार्यों और प्रतिनिधियों के साथ समस्याओं के बारे में सुना है। जाहिर है, डी के पास रन-टाइम कॉल करने योग्य फ़ंक्शन प्रकारों के रूप में कार्य और प्रतिनिधि दोनों हैं, और वे समान नहीं हैं, लेकिन वे विनिमेय हैं या ... कुछ? मेरे मित्र को उनसे कुछ समस्याएँ थीं। यह निश्चित रूप से C ++ से डाउनग्रेड है, जो अभी-अभी हुआ है std::function
और आप कर रहे हैं।
तब आपको अनुकूलता मिली है। D, C ++ के साथ विशेष रूप से संगत नहीं है। मेरा मतलब है, कोई भी भाषा सी ++ के साथ संगत नहीं है, चलो इसका सामना करते हैं, सी ++ / सीएलआई को छोड़कर, जो धोखा देने की तरह है, लेकिन प्रवेश के लिए एक बाधा के रूप में, इसका उल्लेख किया जाना चाहिए।
फिर, कुछ और बातें हैं। उदाहरण के लिए, सिर्फ विकिपीडिया प्रविष्टि पढ़ें।
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
सबसे अन-सेफ फंक्शंस में से एक है, जिसे उसी परिवार में gets
पुरानी सी स्टैंडर्ड लाइब्रेरी जैसी बड़ी समस्याओं के रूप में तैयार किया गया है । यदि आप इसे स्टैक ओवरफ्लो पर खोजते हैं, तो आपको इसके गलत उपयोग से संबंधित कई प्रश्न मिलेंगे। मौलिक रूप से, DRY काprintf
उल्लंघन है- आप प्रारूप स्ट्रिंग में प्रकार दे रहे हैं, और जब आप इसे तर्क देते हैं तो इसे फिर से दे रहे हैं। DRY का उल्लंघन जहां यदि आप इसे गलत पाते हैं, तो बहुत खराब चीजें होती हैं- कहते हैं, यदि आपने 16-बिट पूर्णांक से 32-बिट के लिए एक टाइफाइड को बदल दिया है। यह बिल्कुल भी विस्तार योग्य नहीं है- कल्पना करें कि यदि सभी ने अपने स्वयं के प्रारूप विनिर्देशकों का आविष्कार किया तो क्या होगा। C ++ की आईस्ट्रीम धीमी हो सकती है, और ऑपरेटर की उनकी पसंद सबसे बड़ी नहीं हो सकती है, और उनका इंटरफ़ेस काम का उपयोग कर सकता है, लेकिन उन्हें सुरक्षित रूप से सुरक्षित होने की गारंटी दी जाती है, और DRY का उल्लंघन नहीं किया जाता है, और उन्हें आसानी से बढ़ाया जा सकता है। यह ऐसी चीज नहीं है जिसके बारे में कहा जा सकता है printf
।
कोई बहु विरासत नहीं है। यही कारण है कि बहुत है नहीं सी ++ रास्ता। C ++ प्रोग्रामर से अपेक्षा की जाती है कि वे अपने प्रोग्राम पर पूरी तरह से नियंत्रण रखें और जिस भाषा से आपको विरासत में नहीं मिल सकता है वह उस सिद्धांत का उल्लंघन है। इसके अलावा, यह इनहेरिटेंस (और भी अधिक) नाजुक बनाता है, क्योंकि यदि आप इंटरफ़ेस से एक वर्ग में एक प्रकार बदलते हैं क्योंकि आप डिफ़ॉल्ट कार्यान्वयन या कुछ प्रदान करना चाहते हैं, तो अचानक आपके उपयोगकर्ता का सभी कोड टूट जाता है। यह अच्छी बात नहीं है।
एक अन्य उदाहरण है string
और wstring
। C ++ में, उनके बीच में रूपांतरण करना पहले से ही काफी दर्दनाक है, और क्या यह लाइब्रेरी यूनिकोड का समर्थन करती है, और यह पुरानी सी लाइब्रेरी केवल उपयोग करती है const char*
, और स्ट्रिंग फ़ंक्शन प्रकार के आधार पर एक ही फ़ंक्शन के विभिन्न संस्करणों को लिखना होता है। विशेष रूप से, विंडोज हेडर, उदाहरण के लिए, समस्या से निपटने के लिए कुछ बेहद परेशान करने वाले मैक्रो हैं जो अक्सर अपने स्वयं के कोड के साथ हस्तक्षेप कर सकते हैं। dstring
मिश्रण में जोड़ना केवल चीजों को खराब करने वाला है, क्योंकि अब दो स्ट्रिंग प्रकारों के बजाय, आपको तीन का प्रबंधन करना होगा। एक से अधिक स्ट्रिंग प्रकार होने से मेंटेनेंस पेन बढ़ जाता है और स्ट्रिंग्स से निपटने के लिए दोहराए जाने वाले कोड की शुरुआत होती है।
स्कॉट मेयर्स लिखते हैं:
डी एक प्रोग्रामिंग भाषा है जो प्रोग्रामर को आधुनिक सॉफ्टवेयर विकास की चुनौतियों से निपटने में मदद करने के लिए बनाई गई है। यह सटीक इंटरफेस के माध्यम से आपस में जुड़े मॉड्यूल को बढ़ावा देने के द्वारा करता है, कसकर एकीकृत प्रोग्रामिंग प्रतिमानों का एक संघ, भाषा-लागू धागा अलगाव, मॉड्यूलर प्रकार की सुरक्षा, एक कुशल मेमोरी मॉडल, और बहुत कुछ।
भाषा-लागू थ्रेड अलगाव एक से अधिक नहीं है। सी ++ प्रोग्रामर अपने कार्यक्रमों पर पूर्ण नियंत्रण की उम्मीद करते हैं, और कुछ के लिए मजबूर करने वाली भाषा निश्चित रूप से डॉक्टर द्वारा आदेशित नहीं है।
मैं संकलन-समय स्ट्रिंग हेरफेर का भी उल्लेख करने जा रहा हूं। डी में संकलन-समय में डी कोड की व्याख्या करने की क्षमता है। यह एक प्लस नहीं है। सी के अपेक्षाकृत सीमित प्रीप्रोसेसर के कारण होने वाले भारी सिरदर्द पर गौर करें, जो सभी अनुभवी C ++ प्रोग्रामर्स द्वारा जाना जाता है, और फिर कल्पना करें कि यह सुविधा कितनी बुरी तरह से दुरुपयोग होने वाली है। संकलन-समय पर डी कोड बनाने की क्षमता महान है, लेकिन इसे शब्दार्थ होना चाहिए , वाक्य-विन्यास नहीं।
इसके अलावा, आप एक निश्चित पलटा की उम्मीद कर सकते हैं। D के पास कचरा संग्रह है, जिसे C ++ प्रोग्रामर जावा और C # जैसी भाषाओं के साथ जोड़ेंगे, जो प्रत्यक्ष रूप से दर्शनशास्त्र में इसके विपरीत हैं, और वाक्यगत समानताएं उन्हें भी ध्यान में लाएंगी। यह अनिवार्य रूप से न्यायोचित नहीं है, लेकिन यह कुछ ऐसा है जिसे निश्चित रूप से नोट किया जाना चाहिए।
मौलिक रूप से, यह इतना नहीं पेश करता है कि C ++ प्रोग्रामर पहले से ही ऐसा नहीं कर सकता है। शायद डी में एक फैक्टरियल मेटाप्रोग्राम लिखना आसान है, लेकिन हम पहले से ही सी + + में फैक्टरियल मेटाप्रोग्राम लिख सकते हैं । हो सकता है कि D में आप कंपाइल-टाइम रे-ट्रेसर लिख सकते हैं , लेकिन वास्तव में कोई भी ऐसा नहीं करना चाहता है। सी ++ दर्शन के मौलिक उल्लंघनों की तुलना में, आप डी में क्या कर सकते हैं, विशेष रूप से उल्लेखनीय नहीं है।
यहां तक कि अगर इन चीजों को सतह पर केवल समस्याएं हैं, तो मुझे पूरा यकीन है कि सतह पर डी वास्तव में सी ++ की तरह नहीं दिखता है, शायद यह एक अच्छा कारण है कि कई सी ++ प्रोग्रामर डी की ओर पलायन नहीं कर रहे हैं। शायद डी को खुद ही एक बेहतर विज्ञापन देने की जरूरत है।