ध्यान रखें कि मैं ASFAC++B बोलता हूं। :) मैंने पहले सबसे महत्वपूर्ण अंतरंग कारक रखा है।
कूड़ा संग्रह
कूड़ा संग्रह (जीसी) इन भाषाओं के बीच अंतर करने में सबसे महत्वपूर्ण कारक है।
C और C++ जीसी साथ प्रयोग किया जा सकता है, यह है एक बोल्ट-ऑन बाद का विचार और साथ ही (the best known is here) काम करने के लिए नहीं किया जा सकता है - यह "परंपरागत" जिसका अर्थ है कि यह सब अप्रयुक्त स्मृति जमा नहीं कर सकता हो गया है।
सी # ग्राउंड अप से जीसी मंच पर काम करने के लिए बनाया गया है, मानक पुस्तकालयों ने भी इस तरह से डिजाइन किया है। यह डेवलपर उत्पादकता के लिए एक बिल्कुल मौलिक अंतर बनाता है जिसे विश्वास किया जाना चाहिए।
सी/सी ++ उपयोगकर्ताओं के बीच एक धारणा व्यापक है कि जीसी "खराब प्रदर्शन" के साथ समान है। लेकिन यह पुरानी लोक कथा है (यहां तक कि सी/सी ++ पर बोहेम कलेक्टर भी अधिकांश लोगों की अपेक्षा से बेहतर प्रदर्शन करता है)। सामान्य डर "लंबे विराम" का है जहां कार्यक्रम बंद हो जाता है ताकि जीसी कुछ काम कर सके। लेकिन हकीकत में इन लंबे विराम गैर-जीसी कार्यक्रमों के साथ होते हैं, क्योंकि वे वर्चुअल मेमोरी सिस्टम के शीर्ष पर चलते हैं, जो कभी-कभी भौतिक स्मृति और डिस्क के बीच डेटा को स्थानांतरित करने में बाधा डालता है।
यह भी व्यापक विश्वास है कि जीसी को shared_ptr के साथ प्रतिस्थापित किया जा सकता है, लेकिन यह नहीं हो सकता है; विडंबना यह है कि एक बहु थ्रेडेड प्रोग्राम में, shared_ptr
एक जीसी-आधारित प्रणाली से धीमा है।
ऐसे वातावरण हैं जो इतने मितव्ययी हैं कि जीसी व्यावहारिक नहीं है - लेकिन ये तेजी से दुर्लभ हैं। सेल फोन में आमतौर पर जीसी है। सीएलआर का जीसी जो सी # आमतौर पर चलता है, वह अत्याधुनिक प्रतीत होता है।
18 महीने पहले सी # को अपनाने के बाद से मैं एक प्रोफाइलर के साथ शुद्ध प्रदर्शन ट्यूनिंग के कई चरणों से गुजर चुका हूं, और जीसी इतना कुशल है कि यह कार्यक्रम के संचालन के दौरान व्यावहारिक रूप से अदृश्य है।
जीसी एक पैनसिया नहीं है, यह सभी प्रोग्रामिंग समस्याओं को हल नहीं करता है, यह केवल स्मृति आवंटन को साफ़ करता है, अगर आप बहुत बड़ी मेमोरी ब्लॉक आवंटित कर रहे हैं तो आपको अभी भी कुछ देखभाल करने की आवश्यकता होगी, और यह अभी भी एक पर्याप्त जटिल कार्यक्रम में स्मृति रिसाव के लिए क्या मात्रा हो सकती है - और फिर भी, उत्पादकता पर जीसी का प्रभाव यह एक पैनसिया के लिए एक बहुत करीब निकटता बनाता है!
अपरिभाषित व्यवहार
सी ++ अपरिभाषित व्यवहार की धारणा पर आधारित है। यही है, भाषा विनिर्देश भाषा सुविधाओं के कुछ संकुचित परिभाषित उपयोगों के परिणाम को परिभाषित करता है, और अपरिभाषित व्यवहार के कारण अन्य सभी उपयोगों का वर्णन करता है, जिसका अर्थ यह है कि ऑपरेशन का कोई परिणाम हो सकता है (अभ्यास में इसका मतलब कठिन है डेटा के जाहिर तौर पर गैर-निर्धारिती भ्रष्टाचार से जुड़े बगों का निदान करें)।
सी ++ के बारे में लगभग हर चीज अपरिभाषित व्यवहार पर छूती है।यहां तक कि लैम्ब्डा अभिव्यक्तियों जैसी बहुत अच्छी आने वाली विशेषताओं को आसानी से ढेर को भ्रष्ट करने के लिए सुविधाजनक तरीके के रूप में उपयोग किया जा सकता है (संदर्भ द्वारा स्थानीय को कैप्चर करें, लैम्ब्डा इंस्टेंस को स्थानीय रूप से बाहर निकालने दें)।
सी # इस सिद्धांत पर स्थापित किया गया है कि सभी संभावित संचालनों को परिभाषित व्यवहार होना चाहिए। सबसे बुरा जो हो सकता है वह एक अपवाद फेंक दिया जाता है। यह सॉफ्टवेयर निर्माण के अनुभव को पूरी तरह बदल देता है।
(वहाँ असुरक्षित मोड है, जो संकेत दिए गए हैं और इसलिए अपरिभाषित व्यवहार है, लेकिन वह दृढ़ता से सामान्य उपयोग के लिए हतोत्साहित किया जाता है - यह एम्बेडेड विधानसभा भाषा के रूप में अनुरूप के बारे में सोच।)
जटिलता
संदर्भ में जटिलता के, सी ++ को अलग किया जाना चाहिए, खासकर अगर हम जल्द ही मानकीकृत नए संस्करण पर विचार करते हैं। सी ++ जीसी को संभालने से कम, खुद को प्रभावी बनाने के लिए पूरी तरह से कर सकता है, और नतीजतन यह एक अद्भुत सीखने की वक्र है। भाषा डिजाइनर यह कहकर बहुत अधिक बहाना करते हैं कि "वे सुविधाएं केवल लाइब्रेरी लेखकों के लिए हैं, सामान्य उपयोगकर्ताओं के लिए नहीं हैं" - लेकिन किसी भी भाषा में वास्तव में प्रभावी होने के लिए, आपको अपने कोड को पुन: प्रयोज्य पुस्तकालयों के रूप में बनाना होगा। तो आप भाग नहीं सकते हैं।
सकारात्मक तरफ, सी ++ इतना जटिल है, यह नरों के लिए एक खेल का मैदान जैसा है! मैं आपको आश्वस्त कर सकता हूं कि आपको बहुत मज़ा आएगा कि यह सब कैसे एक साथ फिट बैठता है। लेकिन मैं मुख्यधारा के प्लेटफॉर्म पर उत्पादक नए काम (ओह, बर्बाद वर्षों ...) के आधार के रूप में इसे गंभीरता से अनुशंसा नहीं कर सकता।
सी भाषा को सरल रखता है ("कंपाइलर लिखना आसान है" के अर्थ में सरल), लेकिन यह कोडिंग तकनीक को अधिक आर्केन बनाता है।
ध्यान दें कि सभी नई भाषा विशेषताएं अतिरिक्त जटिलता के समान नहीं हैं। कुछ भाषा विशेषताओं को "सिंटेक्टिक चीनी" के रूप में वर्णित किया जाता है, क्योंकि वे कमजोर हैं कि संकलक आपके लिए फैलता है। हाल के वर्षों में सी # में वृद्धि के बारे में सोचने का यह एक अच्छा तरीका है। भाषा मानक भी लंबे समय तक अनुवाद देकर कुछ विशेषताओं को निर्दिष्ट करता है, उदा। using
कथन try
/finally
में फैला हुआ है।
एक बिंदु पर, सी ++ टेम्पलेट्स को उसी तरह से सोचना संभव था। लेकिन वे तब से इतने शक्तिशाली हो गए हैं कि वे अब अपने enthusiastic user communities and idioms के साथ भाषा के एक अलग अलग आयाम का आधार बन गए हैं।
पुस्तकालय
C और C++ के बारे में अजीब बात यह है कि वे पहले से संकलित पुस्तकालय का एक मानक विनिमेय रूप नहीं है। अपनी परियोजना में किसी और के कोड को एकीकृत करना हमेशा थोड़ा सा स्पष्ट रूप से होता है, इस बारे में अस्पष्ट निर्णय किए जाने के साथ कि आप इसे कैसे जोड़ रहे हैं।
इसके अलावा, मानक पुस्तकालय बेहद बुनियादी है - सी ++ में डेटा संरचनाओं का एक पूरा सेट है और तारों का प्रतिनिधित्व करने का एक तरीका है (std::string
), लेकिन यह अभी भी न्यूनतम है। निर्देशिका में फ़ाइलों की सूची खोजने का कोई मानक तरीका है? आश्चर्यजनक रूप से, नहीं! एक्सएमएल पार्सिंग या जेनरेट करने के लिए मानक लाइब्रेरी समर्थन है? नहीं। डेटाबेस तक पहुंचने के बारे में क्या? गंभीर हो जाओ! एक वेब साइट बैक एंड लिखना? क्या तुम पागल हो? आदि
तो आपको आगे की ओर शिकार करना होगा। एक्सएमएल के लिए, Xerces आज़माएं। लेकिन क्या यह तारों का प्रतिनिधित्व करने के लिए std::string
का उपयोग करता है? बिलकूल नही!
और क्या इन सभी तृतीय पक्ष पुस्तकालयों के वर्ग और कार्यों का नामकरण करने के लिए अपने स्वयं के विचित्र रीति-रिवाज हैं? आप बेट्चा हो!
सी # की स्थिति और अधिक अलग नहीं हो सकती; मौलिक सिद्धांत शुरुआत से ही थे, इसलिए सबकुछ खूबसूरती से संचालित होता है (और क्योंकि मूलभूत सिद्धांत सीएलआर द्वारा प्रदान किए जाते हैं, वहां क्रॉस-भाषा समर्थन होता है)।
यह बिल्कुल सही नहीं है; जेनेरिक शुरुआत से ही हो सकते थे लेकिन ऐसा नहीं था, जो कुछ पुराने पुस्तकालयों पर एक दृश्यमान निशान छोड़ देता है; लेकिन यह बाहरी रूप से ठीक करने के लिए आमतौर पर तुच्छ है। इसके अलावा जावा से कई लोकप्रिय पुस्तकालयों को पोर्ट किया गया है, जो पहले जैसा दिखता है उतना अच्छा नहीं है।
क्लोजर (स्थानीय चर पर कब्जा के साथ बेनामी तरीके)
जावा और सी व्यावहारिक रूप से अंतिम शेष मुख्यधारा भाषाओं बंद की कमी करने के लिए कर रहे हैं, और पुस्तकालयों बनाया गया है और बिना की तुलना में उन लोगों के साथ भी बहुत कुछ बड़े करीने से इस्तेमाल किया जा सकता है (यह है जावा पुस्तकालयों को पोर्ट करने का एक कारण कभी-कभी सी # उपयोगकर्ता के लिए घबराहट लगता है)।
सी ++ के बारे में मनोरंजक बात यह है कि इसकी मानक लाइब्रेरी को डिज़ाइन किया गया था जैसे कि भाषा में कंटेनर प्रकार, कंटेनर प्रकार, <algorithm>
, <functional>
) उपलब्ध थे। फिर दस साल बीत गए, और अब उन्हें अंत में जोड़ा जा रहा है! उनके पास एक बड़ा प्रभाव होगा (हालांकि, जैसा ऊपर बताया गया है, वे अव्यवस्थित व्यवहार को रिसाव करते हैं)।
सी # और जावास्क्रिप्ट सबसे व्यापक रूप से उपयोग की जाने वाली भाषाएं हैं जिनमें बंद "idiomatically स्थापित" हैं। (उन भाषाओं के बीच बड़ा अंतर यह है कि सी # स्थिर रूप से टाइप किया गया है जबकि जावास्क्रिप्ट गतिशील रूप से टाइप किया गया है)।
प्लेटफार्म समर्थन
मैं यह पिछले डाल दिया है केवल क्योंकि यह जितना आप सोच सकते हैं इन भाषाओं अंतर करने के लिए प्रकट नहीं होता। ये सभी भाषाएँ एकाधिक ओएस और मशीन आर्किटेक्चर पर चल सकती हैं। सी सबसे व्यापक रूप से समर्थित है, फिर सी ++, और अंत में सी # (हालांकि सी # का उपयोग अधिकांश प्रमुख प्लेटफॉर्म पर किया जा सकता है, जिसे Mono नामक ओपन सोर्स कार्यान्वयन के लिए धन्यवाद दिया जाता है)।
विंडोज और विभिन्न यूनिक्स स्वादों के बीच सी ++ प्रोग्राम पोर्ट करने का मेरा अनुभव अप्रिय था। मैंने सी # में मोनो में बहुत जटिल कुछ भी पोर्ट करने की कोशिश नहीं की है, इसलिए मैं उस पर टिप्पणी नहीं कर सकता।
क्या आप स्पष्टीकरण दे सकते हैं यदि आप किसी वेब-एप्लिकेशन परिप्रेक्ष्य की तुलना में रूचि रखते हैं? –
क्या आप एक वेब डेवलपर रहना चाहते हैं, या आप कुछ अलग करना चाहते हैं? जैसे आईफोन एप्स प्रोग्रामिंग भाषा मुख्य रूप से उद्देश्य-सी –