2009-03-27 10 views
9

मैं लंबे समय से सी # और नेट डेवलपर रहा हूं, और सी ++ सीखने के विचार के साथ खेल रहा हूं।आईएस सी ++ एमएसआईएल में परिवर्तित हो गया है?

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

तो मेरा प्रश्न वास्तव में यह है: एक संदर्भ संदर्भ के सी ++ घटक हैं। "पारंपरिक" तरीके से संकलित नेट असेंबली, या एमएसआईएल में संकलित?

उत्तर

25

वैसे यह उससे थोड़ा अधिक जटिल है। वास्तव में .NET-support C++ के दो पूरी तरह से अलग संस्करण हैं।

पुराना, सी ++ के लिए प्रबंधित एक्सटेंशन, दृश्य सी ++ 2002/2003 में उपलब्ध एकमात्र विकल्प था। यह विकल्प/clr: oldSyntax के तहत नए कंपाइलर्स में उपलब्ध है। यह थोड़े बेकार है क्योंकि यह मानक सी ++ के साथ एकीकृत करने के लिए कड़ी मेहनत करता है, इसलिए सभी नए कीवर्ड (और उनमें से बहुत सारे हैं) डबल अंडरस्कोर के साथ प्रीफ़िक्स्ड हैं। इस कंपाइलर द्वारा उत्पन्न कोड देशी और एमएसआईएल कोड का मिश्रण है, जिसे आईजेडब्लू डब किया गया है " बस काम करता है "।

सी ++/सीएलआई नामक नया, विज़ुअल सी ++ 2005 और नए में उपलब्ध एक स्वच्छ नई भाषा है। सबसे महत्वपूर्ण बात यह है कि यह कोड पीढ़ी के कई तरीकों का समर्थन करता है। /clr विकल्प फिर देशी और एमएसआईएल कोड के आईजेडब्ल्यू मिश्रण उत्पन्न करता है। /clr: एक प्रबंधित-केवल असेंबली में शुद्ध परिणाम, हालांकि यह देशी प्रकारों को संबंधित .NET संरचनाओं में अनुवाद कर सकता है। इसलिए कोड टाइप-सुरक्षित नहीं हो सकता है और पॉइंटर अंकगणित का उपयोग कर सकता है, जो सी # के साथ/असुरक्षित है। और विकल्प का सबसे सख्त/clr है: सुरक्षित, जो टाइप-सुरक्षित, सत्यापन योग्य एमएसआईएल-केवल असेंबली उत्पन्न करता है, ठीक उसी तरह सी # कंपाइलर करता है (बिना/असुरक्षित, वह है)।

एमसी ++ और सी ++/सीएलआई के बीच अंतर के लिए, wikipedia देखें।

कंपाइलर स्विच के विवरण के लिए, MSDN देखें।

पीएस। .NET बाइट-कोड को या तो एमएसआईएल (माइक्रोसॉफ्ट इंटरमीडिएट लैंग्वेज) या सीआईएल (कॉमन इंटरमीडिएट लैंग्वेज) कहा जाता है। एमआईएल मीडिया इंटीग्रेशन लेयर, डब्ल्यूपीएफ और विस्टा डेस्कटॉप विंडो मैनेजर द्वारा उपयोग की जाने वाली अनियंत्रित निम्न-स्तरीय लाइब्रेरी के लिए खड़ा हो सकता है।

6

This प्रबंधित बनाम अप्रबंधित सी ++ की एक बहुत अच्छी (यदि दिनांकित) चर्चा है।

अखरोट खोल में, सी ++ या तो प्रबंधित किया जा सकता है (एमआईएल के लिए संकलित) या अप्रबंधित (देशी कोड में संकलित)।

+5

"नेट खोल" में :) –

2

सी ++ सीखने के इच्छुक होने के आपके कारणों के बावजूद यह अधिक भाषाओं को जानना हमेशा अच्छा होता है क्योंकि यह आपके दिमाग को बढ़ाता है ताकि सीखना सी ++ अपने आप में एक मूल्यवान सबक है।

सी ++ के साथ आप या तो इसे .NET अनुप्रयोग C++/CLI या मूल के रूप में चला सकते हैं। यह विजुअल स्टूडियो में सिर्फ एक कंपाइलर स्विच है, हालांकि दोनों के बीच काफी सारे वाक्यविन्यास अंतर हैं। मैं व्यक्तिगत रूप से सोचता हूं कि स्वाद दोनों सीखना उपयोगी है।

आपकी परियोजनाओं में से कौन सा चयन करना आवश्यकताओं पर थोड़ा सा निर्भर करता है उदा। यदि आपके प्रोग्राम को प्रबंधित किए गए और अप्रबंधित कोड के बीच कुछ ओवरहेड स्विचिंग से बचने के लिए सी #+/सीएलआई का उपयोग करने के लिए बेहतर है तो अन्य प्रबंधित मॉड्यूल जैसे अन्य प्रबंधित मॉड्यूल से बातचीत करने की आवश्यकता है।

19

अवधारणाओं को अलग रखना शायद एक अच्छा विचार है।

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

दूसरा, सामान्य अनिश्चितता के साथ, माइक्रोसॉफ्ट ने दो सी ++ - व्युत्पन्न भाषाओं को .NET को लक्षित किया है। सबसे पहले, उन्होंने "सी ++ के लिए प्रबंधित एक्सटेंशन" बनाए। फिर उन्होंने फैसला किया कि यह चूस गया है, इसे छीन लिया है और नाटक करने की कोशिश की है कि यह कभी अस्तित्व में नहीं था।

अब .NET-style C++ के लिए उनकी सर्वश्रेष्ठ शर्त को C++/CLI कहा जाता है, लेकिन यह C++ नहीं है। यह कई गैर-मानक तरीकों से भाषा को बढ़ाता है और बदलता है। (और मुझे विश्वास है कि सी ++ मानक समिति ने अनुरोध किया है कि वे भ्रम से बचने के लिए नाम बदल दें। लेकिन उन्होंने नहीं किया)

विजुअल स्टूडियो 2005 और नया सी ++/सीएलआई का समर्थन करता है। ("प्रोजेक्ट जोड़ें" में, वे विजुअल सी ++ -> सीएलआर के तहत सूचीबद्ध हैं)

हालांकि (आपने नहीं सोचा था कि यह इतना आसान था, क्या आपने किया?), माइक्रोसॉफ्ट ने इसे फिर से किया है। सी ++/सीएलआई निर्दिष्ट करने के बाद, जो वास्तव में सीएलआई के साथ सी ++ को एकीकृत करने के लिए एक उचित रूप से अच्छी तरह से डिज़ाइन किया गया प्रयास है, उन्होंने महसूस किया कि लगभग कोई भी इसका उपयोग नहीं करता है! यह पता चला है कि सी ++ प्रोग्रामर आम तौर पर सी # का उपयोग करना पसंद करते हैं जब वे .NET में काम कर रहे हैं, और उचित, मूल C++ अन्यथा।

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

विजुअल स्टूडियो (हमेशा के लिए) देशी सी ++ अनुप्रयोगों का भी समर्थन करता है, जो x86 मशीन कोड से संकलित है, जो .NET द्वारा अनचाहे है। ये Visual C++ -> Win32 के अंतर्गत "प्रोजेक्ट जोड़ें" संवाद में सूचीबद्ध हैं।

तो यदि आप सी ++ सीखना चाहते हैं, तो आपके पास दो विकल्प हैं: सी ++/सीएलआई सीखें, जो आपको एमएस-केवल भाषा तक सीमित करता है, जो हाँ, मूल मशीन कोड के बजाय एमएसआईएल उत्पन्न करता है, और चलाने के लिए .NET की आवश्यकता होती है, और आम तौर पर परेशान नहीं है क्योंकि यदि आप .NET पर निर्भरता लेने जा रहे हैं, तो, क्यों नहीं सी # में लिखें?

या उचित सी ++ सीखें, जो .NET से पूरी तरह से अलग है और सीधे .NET असेंबली का संदर्भ नहीं दे सकता है।

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

और अंत में, सावधानी का एक नोट। उपरोक्त मेरे शब्द के बावजूद ("उचित सी ++" और ".NET द्वारा अनचाहे"), सी ++ "बेहतर" नहीं है। कई मामलों में, यह या तो तेज़ नहीं है। C++ में संभावित तेज होने के लिए है, लेकिन यह प्रोग्रामर पर बहुत अधिक निर्भर करता है।

सी # कंपाइलर काफी कुछ भी उचित रूप से कुशल कोड में बदल देगा। दूसरी तरफ सी ++, संकट से भरा है जो आपके कोड समकक्ष समकक्ष सी # से बना देगा।

http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspx और ब्लॉग पोस्ट के संदर्भ दो भाषाओं में लिखे गए समान कोड के प्रदर्शन के बारे में उत्सुक किसी के लिए पढ़ने के लायक हैं।

केवल एक ऐसा क्षेत्र है जहां सी ++ अनुप्रयोग लगातार तेज़ी से होंगे, और यह स्टार्टअप समय में है। एक .NET अनुप्रयोग को .NET ढांचे और जेआईटी को एमएसआईएल कोड लोड करना पड़ सकता है, जहां एक मूल आवेदन ... बस शुरू होता है।

लेकिन इसके अलावा, यह संभवतः यह मानने की गलती है कि सी ++ तेज होगा। यह हो सकता है, क्योंकि यह आपको थोड़ा अधिक नियंत्रण देता है। लेकिन आमतौर पर, इसका मतलब यह है कि संकलक आपको आपके कोड में बनाए गए अक्षमता से बचाने में कम सक्षम है।

1

सी ++ घटक आसानी से संदर्भित नहीं कर सकते हैं। नेट असेंबली (आपको COM का उपयोग करने की आवश्यकता है)। प्रबंधित सी ++ को सीआईएल में संकलित किया गया है और सी # के लिए समान प्रदर्शन प्रोफ़ाइल है।

सी ++ अधिकांश कोड के लिए ऑप्टोमाइज़ेशन के समान स्तर के लिए लगभग 10% तेज है, हालांकि सी # में लिखने के लिए आधा समय लगता है और उसी समय के लिए डीबग करता है, इसलिए मैं तर्क दूंगा कि आप जो ऑप्टोमाइजेशन कर सकते हैं, वह सी # तेज़ी से बना देगा ...

संबंधित मुद्दे