माइक्रोसॉफ्ट रोजलिन बनाम कोडडोम


110

नए Microsoft Roslyn के बारे में InfoWorld पर कल एक प्रेस विज्ञप्ति से :

इस तरह के "डिकंस्ट्रक्टेड" संकलक का सबसे स्पष्ट लाभ यह है कि यह संपूर्ण संकलन-निष्पादित प्रक्रिया को .Net अनुप्रयोगों से लागू करने की अनुमति देता है। हेजेल्सबर्ग ने सी # प्रोग्राम का प्रदर्शन किया जो स्ट्रिंग्स के रूप में सी # कंपाइलर को कुछ कोड स्निपेट पास करता था; संकलक परिणामी IL असेंबली कोड को एक ऑब्जेक्ट के रूप में लौटाता है, जिसे तब निष्पादन के लिए कॉमन लैंग्वेज रनटाइम (CLR) में पारित किया गया था। देखा! रोसलिन के साथ, C # रनिंग के समय कोड उत्पन्न करने और आह्वान करने के लिए एक गतिशील भाषा की क्षमता प्राप्त करता है।

मैं .NET 4 की रिलीज़ के बाद से ऐसा करने में सक्षम CSharpCodeProvider.CompileAssemblyFromSourceरहा हूं, जिसके साथ मैं एक एएसपी .नेट प्रोजेक्ट में उपयोग करता हूं जो थोड़ी देर पहले लिखा गया था जो वास्तव में ऐसा करता है - एक उपयोगकर्ता को एक टेक्स्टबॉक्स में कोड टाइप करने की अनुमति देता है, असेंबली / नेमस्पेस चुनें संदर्भ के लिए, और फिर निष्पादित करें और उस कोड से आउटपुट को विंडोज एज़्योर पर लाइव पर्यावरण कोड परीक्षण के लिए मक्खी पर प्रदर्शित करें।

है CodeDomकी / रोसलिन करने के लिए एक precurser हिस्सा है? रोजलिन पर विशेष लाभ क्या है CodeDom?

जवाबों:


240

अस्वीकरण : मैं रोजलिन टीम पर Microsoft के लिए काम करता हूं।

कोडडॉम रोजलिन के लिए एक अग्रदूत है, लेकिन केवल मामूली रूप से संबंधित है। अनिवार्य रूप से, कोडडोम एक सरल और (कुछ हद तक) भाषा को कोड उत्पन्न करने के लिए अज्ञेयवादी तरीका है जो डिजाइनरों को समर्थन करने के लिए .NET 1.0 में जोड़ा गया था (एक ला WinForms)। क्योंकि कोडडॉम एक एकीकृत मॉडल प्रदान करने का एक प्रयास था जो सी #, वीबी और अन्य भाषाओं में कोड उत्पन्न कर सकता है, इसमें किसी भी भाषा के साथ उच्च निष्ठा का अभाव होता है जो इसका समर्थन करता है (इसीलिए आप कोडडॉम के साथ स्विच स्टेटमेंट नहीं बना सकते हैं)। CSharpCodeProvider.CompileAssemblyFromSource, csc.exe निष्पादित करने के लिए एक आवरण है।

रोजलिन एक पूरी तरह से अलग जानवर है। यह प्रबंधित कोड - C # में C # और VB में VB (csc.exe और vbc.exe के संस्करण जो आज मूल कोड में लिखे गए हैं) का उपयोग करके जमीन से C # और VB दोनों कंपाइलरों का पुनर्लेखन है। प्रबंधित कोड में उनके निर्माण का लाभ यह है कि उपयोगकर्ता वास्तविक संकलक को .NET अनुप्रयोगों से पुस्तकालयों के रूप में संदर्भित कर सकते हैं (कोई आवरण आवश्यक नहीं)।

कंपाइलर पाइपलाइन के प्रत्येक घटक का निर्माण करते समय, हमने सार्वजनिक एपीआई को शीर्ष पर उजागर किया है:

  • पार्सर -> सिंटेक्स ट्री एपीआई
  • प्रतीक तालिका / मेटाडेटा आयात -> प्रतीक एपीआई
  • बाइंडर -> बाइंडिंग और फ्लो एनालिसिस एपीआई
  • आईएल एमिटर -> ईएमटी एपीआई

रोसलिन का उपयोग परिष्कृत सी # और वीबी स्रोत कोड जनरेटर के रूप में किया जा सकता है, लेकिन जहां कोडडॉम की समानता समाप्त होती है। रोसलिन कंपाइलर एपीआई का उपयोग कोड को पार्स करने, सिमेंटिक विश्लेषण करने, कोड को गतिशील रूप से संकलित करने और मूल्यांकन करने आदि के लिए किया जा सकता है।

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

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


2
@ डस्टिन: क्या रोसलिन अन्य भाषाओं का समर्थन करेगी? उदाहरण के लिए जावास्क्रिप्ट (.NET)?
डिएगो बैरोस

@ डस्टिन: यह एक पूर्ण आईडीई अनुभव के निर्माण के लिए एकदम सही है जो मेरे संगठन में कोड गुणवत्ता को लागू कर सकता है, हालांकि मुझे मैनुअल कोड समीक्षा का पूर्ण प्रतिस्थापन नहीं दिखता है लेकिन मुझे गुणवत्ता में काफी वृद्धि दिखाई देती है। जल्द ही!
जेरिक लिन ने जॉन

यह बहुत अच्छा होगा अगर किसी ने कोड-कोड का उपयोग करने वाले कोड को कोड में परिवर्तित करने के लिए पहले से ही रोजलिन-आधारित टूल बनाया हो जो रोजलिन के सिंटैक्सफैक्टरी का उपयोग करता है ... (आंशिक रूप से क्योंकि .Net कोर में रोजलिन नहीं है लेकिन कोई कोडडोम नहीं है और मैं कोडडॉम के आसपास एक काम का उपयोग कर रहा हूं। )
एमिर

43

कोडडॉम आपको संकलन करने की अनुमति देता है - लेकिन यह आपको कोड के बारे में वास्तव में जानकारी प्राप्त करने की क्षमता नहीं देता है (संकलक त्रुटियों के अलावा)। असल में, यह एक ब्लैक बॉक्स है जहाँ आप कहते हैं "इसे संकलित करें" और यह कहता है कि "मैं सफल हुआ" या "मैं असफल रहा, यहाँ कुछ त्रुटियां हैं"।

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

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


12

एक बड़ा अंतर जो मैं देख रहा हूं: कोडडॉम के साथ, हर बार जब आप कुछ C # या VB.NET संकलित करते हैं, तो यह प्रक्रिया से बाहर हो जाता है। CSC.exe या VBC.exe दृश्य के पीछे वास्तविक कार्यकर्ता हैं।

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

रोजलिन के साथ यह प्रक्रिया में है।

मुझे लगता है कि यह एक कारण है कि वे इसे "कंपाइलर एक सेवा के रूप में" कहते हैं।

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

PS: CSC.exe और VBC.exe से एक उल्लेखनीय अंतर: Roslyn शुद्ध .NET प्रतीत होता है (और CCI का उपयोग करता है )।


8

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

कोडडॉम "बस कंपाइलर का उपयोग कर रहा है" जबकि रोसलिन "कंपाइलर (पूरी तरह से पुर्जे) के साथ एक सेवा के रूप में संकलक है ... रोसलिन के साथ आप" संकलक के अंदर "हैं और यह देख सकते हैं कि कोड एक कंपाइलर के नजरिए से कैसा दिखता है। वर्तमान में संभव नहीं है कि आप चीजों को बदल सकें।

उदाहरण के लिए, आप रोज़लिन का उपयोग C # को विस्तारित करने के लिए कर सकते हैं - AOP कार्यान्वयन की वर्तमान स्थिति की तुलना में बहुत आसान और बहुत कुछ।

वर्तमान रोसलिन राज्य और इसके उपयोग और नियंत्रण के विभिन्न स्तरों के अवलोकन के लिए, http://msdn.microsoft.com/en-us/hh500769 देखें

अपडेट करें

Microsoft ने अतिरिक्त सुविधाओं और बहुत सारे API परिवर्तनों / परिवर्धन के साथ एक नया CTP उपलब्ध कराया। जानकारी के लिए यहां देखें ।


1
वास्तव में, यह सही नहीं है कि आप अतिरिक्त कीवर्ड के साथ C # का विस्तार करने के लिए रोजलिन का उपयोग कर सकते हैं।
डस्टिन कैंपबेल

धन्यवाद ... सही ... हालांकि पहली रिलीज में मैं सुंदर नहीं हूं कि यह संभव हो जाएगा ...
याहिया

2
@ डस्टिनकैम्पबेल, यदि आप कोड संकलित करने के कारण छद्म कीवर्ड जो भी संकलक त्रुटि करते हैं, तो क्या होगा?
रोड्रिक चैपमैन

3
संकलक के पास जाने से पहले आपको फिर से लिखना होगा। सबसे पहले, अपने विशेष कीवर्ड के साथ कोड पार्स करें। कोड पार्स करेगा और, जब तक कि पार्सर उसके सिर या पूंछ नहीं बना सकता, तब तक अमान्य कीवर्ड परिणामी पेड़ में SkippedTokenTrivia के रूप में दिखाई देंगे। फिर, स्किप किए गए कीवर्ड का पता लगाएं और मान्य कोड (जैसे AOP बुनाई) से पेड़ को फिर से लिखें। अंत में, नए पेड़ को संकलक को पास करें। यह निश्चित रूप से एक हैक है, और यह रोज़लिन के भविष्य के संस्करणों के साथ काम करने की गारंटी नहीं है। उदाहरण के लिए, पार्सर भविष्य के रिलीज में टूटे हुए कोड के लिए एक ही पेड़ का उत्पादन नहीं कर सकता है।
डस्टिन कैंपबेल

@ डस्टिनकैम्पबेल: लेकिन क्या रोस्मिन फाइनल में AOP को बुनाई की अनुमति देने की अनुमति होगी? मेरे Mono.Cecil INPC बुनाई ठीक काम करता है, लेकिन अगर मैं लिख सकता है public notifying string Name {get;set;}कि यह और भी भयानक होगा
TDaver
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.