C # संकलक किस भाषा में लिखा गया है?


148

मैंने http://referencesource.microsoft.com/ पर स्रोत कोड को देखा , और ऐसा प्रतीत होता है कि सभी स्रोत कोड C # में हैं।

मैंने नए C # संकलक प्लेटफ़ॉर्म ( रोज़लिन ) के स्रोत कोड को भी देखा , और यह C # में भी है। वो कैसे संभव है? C # भाषा संकलक C # में लिखा गया है? या मैं कुछ स्पष्ट याद कर रहा हूँ? यदि C # कंपाइलर C # में लिखा जाता है तो यह कैसे काम करता है?


12
कई कंपाइलर उस भाषा में लिखे जाते हैं जिसे वे संकलित करते हैं - अधिक जानने के लिए Google बूटस्ट्रैपिंग
पॉल रौब

19
मुझे लगता है कि मूल संकलक C ++ में लिखा गया था।
PoweredByOrange

44
खैर, एक हथौड़ा दूसरे हथौड़ा का उपयोग करके जाली हो सकता है। इसका पिछला संस्करण ...
यूजीन श।

10
आपके द्वारा पोस्ट किया गया लिंक फ्रेमवर्क लाइब्रेरी के स्रोत कोड का लिंक है, संकलक के लिए नहीं।
स्टीव

जवाबों:


229

मूल C # कंपाइलर C # में नहीं लिखा गया था, यह C और C ++ में था। नया रोसलिन कंपाइलर C # में लिखा गया था, लेकिन शुरू में इसे पुराने कंपाइलर के साथ संकलित किया गया था। एक बार नया कंपाइलर हो जाने के बाद, यह अपने स्वयं के सोर्स कोड को संकलित करने में सक्षम था: इसे बूटस्ट्रैपिंग कहा जाता है ।


2
इसलिए जब "मूल संकलक" में परिवर्तन किया जाना है, तो क्या पुराने संकलक (सी, सी ++ में लिखे गए) के साथ संकलित किया जाना है ?
CriketerOnSO

10
"मूल संकलक" को बदलने की कोई आवश्यकता नहीं होगी नए संस्करणों को संशोधित किया जाएगा
छद्म नाम

1
@CriketerOnSO, नया संकलक पुराने को बदल देगा, इसलिए पुराने को संशोधित करने की कोई आवश्यकता नहीं होगी। लेकिन अगर एमएस ऐसा करना चाहता था, तो वे पुराने कंपाइलर को C ++ कंपाइलर के साथ फिर से जोड़ देंगे, जैसा कि उन्होंने पहले किया था।
थॉमस लेवेस्क

3
@ThomasLevesque स्व-होस्टिंग बूट-स्ट्रैपिंग का अंतिम परिणाम है।
arx

2
@ श्रीरामसैथिवेल, संकलक का कोड नए खोजशब्दों का उपयोग नहीं कर सकता है, कम से कम तब तक नहीं जब तक कि एक संकलक नहीं है जो उन्हें समझता है। आप हमेशा नए को बनाने के लिए कंपाइलर के पुराने संस्करण का उपयोग करते हैं।
थॉमस लेवेस्क

32

कंपाइलर उपयोगिता कार्यक्रम हैं - वे प्रोग्रामिंग भाषा पाठ को मशीन कोड में बदल देते हैं। यदि प्रोग्रामिंग भाषा सॉफ्टवेयर का वर्णन करती है जो सिर्फ एक संकलक होता है ....।

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

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

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


9
और कागज टेप सिर्फ कागज में छेद के माध्यम से स्विच flipping है। :-)
ज़ैन लिंक्स

2
भंडारण तकनीक के रूप में पेपर टेप कभी भी बंद नहीं होगा। यह सिर्फ बहुत जटिल है और त्रुटि-प्रवण है, साथ ही यह आसानी से जलता है अगर पाठक में शॉर्ट सर्किट है और यह आपके प्रोग्राम को पूरी तरह से नष्ट कर देगा।
बजे एक CVn

16

एक कंपाइलर किसी अन्य प्रोग्राम की तरह ही एक प्रोग्राम है। इसके बारे में कुछ भी जादुई या विशेष नहीं है। यह कुछ इनपुट लेता है और कुछ आउटपुट उत्पन्न करता है। इस विशेष मामले में, इनपुट सिर्फ C # होता है और आउटपुट सिर्फ CIL होता है, लेकिन यह इनपुट टैक्स रिटर्न की एक श्रृंखला और आउटपुट रिपोर्ट होने से अलग नहीं है।


10
यह अलग है - यह बहुत आसान है, -)।
पीटर - मोनिका

3
@PeterSchneider: लोग पौराणिक जादुई प्राणियों के रूप में संकलक डालना पसंद करते हैं, लेकिन अंत में, वे सिर्फ ऐसे प्रोग्राम हैं जो इनपुट को आउटपुट में बदलते हैं। बहुत ज्यादा हर ग्रह पर कोई न कोई इनपुट पार्स करता है, उसे समझने की कोशिश करता है और उसे कुछ आउटपुट में बदल देता है। कुछ अर्थों में, हर इनपुट किसी न किसी भाषा में लिखा गया प्रोग्राम है, हर प्रोग्राम एक कंपाइलर है।
जोर्ग डब्ल्यू मित्तग

3
मैं और अधिक सहमत नहीं हो सकता। मैं यह कहना चाहता था कि कर कानून एक भयानक गड़बड़ है। इसके विपरीत, औपचारिक भाषाओं को आमतौर पर एक तरह से परिभाषित किया जाता है जो स्वचालितकरण के लिए उपयुक्त है। जो करों से निपटने वाले कार्यक्रम की तुलना में एक साधारण संकलक को यकीनन लिखना आसान बनाता है। हालांकि एरिक लिपर्ट wrt C # कंपाइलर, cf असहमत हो सकते हैं। blogs.msdn.com/b/ericlippert/archive/2010/02/04// । एक पास सी कंपाइलर से लंबा रास्ता तय किया।
पीटर - मोनिका

1
@PeterSchneider: आह, माफ करना, मैं 180 डिग्री :-D द्वारा अपनी टिप्पणी का गलत मतलब निकाला
Jörg डब्ल्यू Mittag

मुझे यह उत्तर सबसे अच्छा लगता है क्योंकि यह ओपी के विचार को सबसे सीधे संबोधित करता है। यह धुंध को साफ करता है जो "सभी शक्तिशाली" संकलक को घेरता है।
असाफ लेवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.