एक कंपाइलर खुद को कैसे संकलित कर सकता है?


168

मैं http://coffeescript.org/ वेबसाइट पर CoffeeScript पर शोध कर रहा हूं , और इसमें टेक्स्ट है

CoffeeScript कंपाइलर को खुद CoffeeScript में लिखा गया है

एक कंपाइलर खुद को कैसे संकलित कर सकता है, या इस कथन का क्या अर्थ है?


14
संकलक के लिए एक और शब्द जो खुद को संकलित कर सकता है वह एक self-hostingसंकलक है। प्रोग्रामर
।stackexchange.com

37
एक संकलक को खुद को संकलित करने में सक्षम क्यों नहीं होना चाहिए?
user253751

48
संकलक की कम से कम दो प्रतियां शामिल हैं। पहले से मौजूद एक नई प्रति संकलित करता है। नया एक पुराने के समान हो भी सकता है और नहीं भी।
bdsl

12
आपको Git में भी रुचि हो सकती है: इसके स्रोत कोड को ट्रैक किया जाता है, निश्चित रूप से, Git रिपॉजिटरी में।
ग्रेग डी'ऑन

7
यह पूछने के बारे में है कि "ज़ीरक्सा प्रिंटर अपने आप में योजनाबद्ध कैसे प्रिंट कर सकता है?" कंपाइलर टेक्स्ट को बाइट कोड के लिए संकलित करता है। यदि कंपाइलर किसी भी प्रयोग करने योग्य बाइट कोड को संकलित कर सकता है, तो आप संबंधित भाषा में कंपाइलर कोड लिख सकते हैं और फिर आउटपुट उत्पन्न करने के लिए कंपाइलर के माध्यम से कोड को पास कर सकते हैं।
RLH

जवाबों:


219

एक संकलक का पहला संस्करण एक प्रोग्रामिंग भाषा से मशीन-जनरेट नहीं किया जा सकता है जो इसके लिए विशिष्ट है; आपका भ्रम समझ में आता है। पहले संकलक द्वारा अधिक भाषा सुविधाओं (नई भाषा के पहले संस्करण में फिर से लिखे गए स्रोत) के साथ संकलक का एक बाद का संस्करण बनाया जा सकता है। वह संस्करण फिर अगले संकलक को संकलित कर सकता है, और इसी तरह। यहाँ एक उदाहरण है:

  1. पहला CoffeeScript कम्पाइलर Ruby में लिखा गया है, जो CoffeeScript के संस्करण 1 का निर्माण कर रहा है
  2. CS कंपाइलर का स्रोत कोड CoffeeScript 1 में फिर से लिखा गया है
  3. मूल CS कंपाइलर संकलक के संस्करण 2 में नया कोड (CS 1 में लिखा गया) संकलित करता है
  4. नई भाषा सुविधाओं को जोड़ने के लिए संकलक स्रोत कोड में परिवर्तन किए जाते हैं
  5. दूसरा सीएस कंपाइलर (सीएस में लिखा गया पहला) संकलक के संस्करण 3 में संशोधित नए स्रोत कोड को संकलित करता है
  6. प्रत्येक पुनरावृत्ति के लिए चरण 4 और 5 दोहराएं

नोट: मुझे यकीन नहीं है कि कॉफ़ीस्क्रिप्ट संस्करण कैसे गिने जाते हैं, यह सिर्फ एक उदाहरण था।

इस प्रक्रिया को आमतौर पर बूटस्ट्रैपिंग कहा जाता है । बूटस्ट्रैपिंग कंपाइलर का एक और उदाहरण rustc, रस्ट भाषा के लिए कंपाइलर है ।


5
संकलक को बूटस्ट्रैप करने का दूसरा मार्ग अपनी भाषा के लिए (उपसमूह) दुभाषिया लिखना है।
एरोन

एक अन्य भाषा में लिखे गए संकलक या दुभाषिया के साथ बूटस्ट्रैपिंग के लिए एक और विकल्प के रूप में, बहुत पुराने-विद्यालय मार्ग संकलक स्रोत को हाथ से इकट्ठा करना होगा। चक मूर अध्याय 9 में एक फोर्थ दुभाषिया के लिए यह करने के लिए कैसे चलता है, "प्रोग्राम जो बूटस्ट्रैप है", एक समस्या-उन्मुख भाषा के प्रोग्रामिंग के अंत में ( web.archive.org/web/20160327044521/www.colorforth.com/POL .htm ), हाथ से पहले दो बार करने के आधार पर। यहां कोड प्रविष्टि एक फ्रंट पैनल के माध्यम से की जाती है जो बिट्स के लिए टॉगल स्विच द्वारा नियंत्रित मेमोरी एड्रेस को मूल्यों के प्रत्यक्ष भंडारण की अनुमति देता है।
जेरेमी डब्ल्यू।

59

ट्रस्टिंग ट्रस्ट पर पेपर रिफ्लेक्शंस में , यूनिक्स के प्रवर्तकों में से एक, केन थॉम्पसन, सी कंपाइलर खुद को कैसे संकलित करता है, इसका एक आकर्षक (और आसानी से पठनीय) अवलोकन लिखते हैं। इसी तरह की अवधारणाओं को कॉफीस्क्रिप्ट या किसी अन्य भाषा में लागू किया जा सकता है।

संकलक का विचार जो अपने स्वयं के कोड को संकलित करता है, वह बिल्कुल एक क्वीन के समान होता है : स्रोत कोड जो निष्पादित होने पर, मूल स्रोत कोड के आउटपुट के रूप में उत्पन्न होता है। यहां एक कॉफ़ीस्क्रिप्ट क्वीन का एक उदाहरण है। थॉम्पसन ने C quine का उदाहरण दिया:

char s[] = {
    '\t',
    '0',
    '\n',
    '}',
    ';',
    '\n',
    '\n',
    '/',
    '*',
    '\n',
    … 213 lines omitted …
    0
};

/*
 * The string s is a representation of the body
 * of this program from '0'
 * to the end.
 */

main()
{
    int i;

    printf("char\ts[] = {\n");
    for(i = 0; s[i]; i++)
        printf("\t%d,\n", s[i]);
    printf("%s", s);
}

इसके बाद, आप आश्चर्यचकित हो सकते हैं कि कंपाइलर को कैसे सिखाया जाता है कि '\n'ASCII कोड 10 का एक एस्केप सीक्वेंस होता है । इसका उत्तर यह है कि कहीं न कहीं C कंपाइलर में एक रुटीन होता है जो चरित्र शाब्दिकों की व्याख्या करता है, जिसमें कुछ शर्तें होती हैं जैसे बैकस्लैम सीक्वेंस को पहचानना:

…
c = next();
if (c != '\\') return c;        /* A normal character */
c = next();
if (c == '\\') return '\\';     /* Two backslashes in the code means one backslash */
if (c == 'r')  return '\r';     /* '\r' is a carriage return */
…

तो, हम ऊपर दिए गए कोड में एक शर्त जोड़ सकते हैं ...

if (c == 'n')  return 10;       /* '\n' is a newline */

... एक संकलक का उत्पादन करने के लिए जो जानता है कि '\n'ASCII 10 का प्रतिनिधित्व करता है। दिलचस्प बात यह है कि संकलक, और इसके बाद संकलित सभी संकलक , "मैपिंग" जानते हैं, ताकि स्रोत कोड की अगली पीढ़ी में, आप उस अंतिम पंक्ति को बदल सकें।

if (c == 'n')  return '\n';

... और यह सही काम करेगा! 10संकलक से आता है, और अब स्पष्ट रूप से संकलक के स्रोत कोड में परिभाषित करने की आवश्यकता। 1

यह C भाषा सुविधा का एक उदाहरण है जिसे C कोड में लागू किया गया था। अब, हर एक भाषा सुविधा के लिए उस प्रक्रिया को दोहराएं, और आपके पास "स्वयं-होस्टिंग" संकलक है: एक सी संकलक जो कि सी में लिखा गया है।


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


7
हालांकि यह जानकारी का एक दिलचस्प सा है, मुझे नहीं लगता कि यह सवाल का जवाब देता है। आपके उदाहरण मानते हैं कि आपके पास पहले से बूटस्ट्रैप्ड कंपाइलर है, या फिर सी कंपाइलर किस भाषा में लिखा गया है?
आर्टुरो टॉरेस सेंचेज

9
@ ArturoTorresSánchez अलग-अलग लोगों के लिए अलग-अलग स्पष्टीकरण अच्छा काम करते हैं। मैं अन्य उत्तरों में कही गई बातों को दोहराना नहीं चाहता। इसके बजाय, मुझे लगता है कि मुझे लगता है कि कैसे की तुलना में एक उच्च स्तर पर अन्य जवाब बोलते हैं। मैं व्यक्तिगत रूप से इस बात का ठोस चित्रण पसंद करता हूं कि कैसे एक एकल सुविधा को जोड़ा जाता है, और एक उथले अवलोकन के बजाय पाठक को इससे अलग किया जाता है।
200_सेक्यूट

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

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

1
@ ArturoTorresSánchez: "[I] n सी संकलक किस भाषा में लिखा गया है?" बहुत पहले मैंने पुराने के एंड आर परिशिष्ट (आईबीएम 360 के लिए एक) में उल्लेखित मूल सी कंपाइलर को बनाए रखा था। बहुत से लोग जानते हैं कि पहले बीसीपीएल था, फिर बी, और वह सी बी का बेहतर संस्करण था। वास्तव में, कई थे उस पुराने संकलक के कुछ हिस्सों को अभी भी बी में लिखा गया था, और सी के लिए कभी भी फिर से नहीं लिखा गया था। चर एकल पत्र / अंक के थे, सूचक अंकगणित को स्वचालित रूप से छोटा नहीं माना जाता था, आदि। पुराने कोड की गवाही दी गई थी B से C. तक बूटस्ट्रैपिंग पहला "C" कंपाइलर B. में लिखा गया था
एलियाहू स्कोज़िलस

29

आपने पहले ही बहुत अच्छा उत्तर प्राप्त कर लिया है, हालांकि मैं आपको एक अलग दृष्टिकोण प्रदान करना चाहता हूं, जो कि आपके लिए ज्ञानवर्धक होगा। आइए पहले दो तथ्यों को स्थापित करें, जिन पर हम दोनों सहमत हो सकते हैं:

  1. CoffeeScript कंपाइलर एक प्रोग्राम है, जो CoffeeScript में लिखे प्रोग्राम्स को कंपाइल कर सकता है।
  2. CoffeeScript कंपाइलर, CoffeeScript में लिखा गया एक प्रोग्राम है।

मुझे यकीन है कि आप सहमत हो सकते हैं कि दोनों # 1 और # 2 सच हैं। अब, दो कथनों को देखें। क्या अब आप देखते हैं कि कॉफ़ीस्क्रिप्ट संकलक के लिए कॉफ़ीस्क्रिप्ट संकलक को संकलित करना पूरी तरह से सामान्य है?

संकलक को परवाह नहीं है कि वह क्या संकलित करता है। जब तक यह कॉफीस्क्रिप्ट में लिखा गया एक कार्यक्रम है, तब तक यह इसे संकलित कर सकता है। और CoffeeScript संकलक ही इस तरह के एक कार्यक्रम होने के लिए होता है। कॉफीस्क्रिप्ट कंपाइलर को इस बात की परवाह नहीं है कि यह कॉफीस्क्रिप्ट कंपाइलर है जो इसे संकलित कर रहा है। यह सब देखता है कुछ CoffeeScript कोड है। अवधि।

एक कंपाइलर खुद को कैसे संकलित कर सकता है, या इस कथन का क्या अर्थ है?

हां, यह वही है जो इस कथन का अर्थ है, और मुझे आशा है कि आप अब देख सकते हैं कि यह कथन सत्य कैसे है।


2
मुझे कॉफ़ी लिपि के बारे में ज़्यादा जानकारी नहीं है, लेकिन आप यह बताकर पॉइंट 2 को स्पष्ट कर सकते हैं कि यह कॉफ़ी लिपि में लिखा गया था, लेकिन तब से संकलित था और फिर मशीन कोड है। और किसी भी तरह, आप चिकन और अंडे की समस्या को समझा सकते हैं। यदि कंपाइलर ऐसी भाषा में लिखा गया था जिसके लिए कंपाइलर अभी तक नहीं लिखा गया है, तो कंपाइलर कैसे चल सकता है या संकलित किया जा सकता है?
बार्लोप

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

2
@barlop: कथन 2 को " आज , कॉफ़ीस्क्रिप्ट कंपाइलर एक प्रोग्राम है जो कॉफ़ीस्क्रिप्ट में लिखा गया है।" क्या यह आपको इसे बेहतर समझने में मदद करता है? एक कंपाइलर "बस" एक प्रोग्राम है जो एक इनपुट (कोड) को आउटपुट (प्रोग्राम) में तब्दील करता है। इसलिए यदि आपके पास भाषा फू के लिए एक कंपाइलर है, तो भाषा फू में एक फू-कंपाइलर के लिए स्रोत कोड लिखें, और उस स्रोत को अपने पहले फू-कंपाइलर को खिलाएं, आपको आउटपुट के रूप में दूसरा फू-कंपाइलर मिलता है। यह बहुत सी भाषाओं द्वारा किया गया (उदाहरण के लिए, मेरे द्वारा ज्ञात सभी C संकलक… C) में लिखे गए हैं।
डार्कडस्ट

3
संकलक खुद को संकलित नहीं कर सकता है। आउटपुट फ़ाइल कंपाइलर के समान नहीं है जो आउटपुट फ़ाइल का उत्पादन करता है। मुझे आशा है कि अब आप देख सकते हैं कि यह कथन कैसे गलत है।
पब्रम

3
@ पब्रम आप ऐसा क्यों मानते हैं? उत्पादन अच्छी तरह से यह उत्पादन करने के लिए इस्तेमाल किया संकलक के समान हो सकता है। उदाहरण के लिए, यदि मैं GCC 6.1 के साथ GCC 6.1 संकलित करता हूं, तो मुझे GCC 6.1 के साथ संकलित GCC 6.1 का एक संस्करण मिलता है। और फिर अगर मैं GCC 6.1 को संकलित करने के लिए उपयोग करता हूं, तो मुझे GCC 6.1 के साथ संकलित GCC 6.1 का एक संस्करण भी मिलता है, जो समान होना चाहिए (टाइमस्टैम्प जैसी चीजों को अनदेखा करना)।
user253751

9

एक कंपाइलर खुद को कैसे संकलित कर सकता है, या इस कथन का क्या अर्थ है?

इसका मतलब बिल्कुल यही है। सबसे पहले, कुछ बातों पर विचार करें। चार वस्तुओं को देखने की जरूरत है:

  • किसी भी मनमाने ढंग से CoffeScript प्रोग्राम का स्रोत कोड
  • किसी भी मनमाने ढंग से CoffeScript कार्यक्रम की (उत्पन्न) विधानसभा
  • CoffeScript संकलक का स्रोत कोड
  • कॉफ़ीस्क्रिप्ट संकलक की (उत्पन्न) विधानसभा

अब, यह स्पष्ट होना चाहिए कि आप किसी भी मनमाने ढंग से कॉफ़ीस्क्रिप्ट प्रोग्राम को संकलित करने के लिए उत्पन्न विधानसभा - निष्पादन योग्य - कॉफ़ीस्क्रिप्ट कंपाइलर का उपयोग कर सकते हैं, और उस कार्यक्रम के लिए विधानसभा उत्पन्न कर सकते हैं।

अब, CoffeScript संकलक स्वयं एक मनमाना CoffeScript प्रोग्राम है, और इस प्रकार, इसे CoffeScript संकलक द्वारा संकलित किया जा सकता है।

ऐसा लगता है कि आपका भ्रम इस तथ्य से उपजा है कि जब आप अपनी नई भाषा बनाते हैं, तो आपके पास कोई कंपाइलर नहीं होता है फिर भी आप अपने कंपाइलर का उपयोग कर सकते हैं। यह निश्चित रूप से चिकन-अंडे की समस्या की तरह दिखता है , है ना?

बूटस्ट्रैपिंग नामक प्रक्रिया का परिचय दें ।

  1. आप पहले से मौजूद भाषा में एक संकलक लिखते हैं (कॉफ़ीस्क्रिप्ट के मामले में, मूल संकलक रूबी में लिखा गया था) जो नई भाषा के एक उपसमुच्चय को संकलित कर सकता है
  2. आप एक कंपाइलर लिखते हैं जो नई भाषा में ही नई भाषा के सबसेट को संकलित कर सकता है। आप केवल भाषा सुविधाओं का उपयोग कर सकते हैं ऊपर दिए गए चरण से कंपाइलर संकलन कर सकते हैं।
  3. चरण 2 से संकलक को संकलित करने के लिए आप चरण 1 से कंपाइलर का उपयोग करते हैं। यह आपको एक ऐसी असेंबली के साथ छोड़ता है जो मूल रूप से नई भाषा के सबसेट में लिखी गई थी, और जो नई भाषा के सबसेट को संकलित करने में सक्षम है।

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

कुल्ला और दोहराएं जब तक कि वांछित सभी भाषा सुविधाएँ संकलक के साथ संकलित नहीं की जा सकती हैं।

whileऔर forस्पष्ट रूप से केवल उदाहरण थे, लेकिन यह किसी भी नई भाषा सुविधा के लिए काम करता है जिसे आप चाहते हैं। और फिर आप इस स्थिति में हैं कि कॉफस्क्रिप्ट अब में है: संकलक खुद को संकलित करता है।

वहाँ बहुत साहित्य है। ट्रस्टिंग ट्रस्ट पर विचार एक क्लासिक है जो उस विषय में रुचि रखने वाले सभी को कम से कम एक बार पढ़ना चाहिए।


5
(वाक्य "द कॉफीस्क्रिप्ट कंपाइलर कॉफ़ीस्क्रिप्ट में ही लिखा गया है", सच है, लेकिन "एक संकलनकर्ता संकलन कर सकता है" गलत है "।
पैराबैम्स

4
नहीं, इसका पूरी तरह से सच है। संकलक खुद को संकलित कर सकता है। यह सिर्फ मतलब नहीं है। मान लें कि आपके पास निष्पादन योग्य है जो भाषा के संस्करण X को संकलित कर सकता है। आप एक संकलक लिखते हैं जो संस्करण X + 1 को संकलित कर सकता है, और आपके पास जो संकलक (जो कि संस्करण X है) के साथ संकलित कर सकता है। आप एक निष्पादन योग्य के साथ समाप्त होते हैं जो भाषा के संस्करण X + 1 को संकलित कर सकता है। अब आप जा सकते हैं और संकलक को फिर से संकलित करने के लिए उस नए निष्पादन योग्य का उपयोग कर सकते हैं। लेकिन किस अंत में? आपके पास पहले से ही निष्पादन योग्य है जो वह करता है जो आप चाहते हैं। संकलक किसी भी वैध कार्यक्रम को संकलित कर सकता है, इसलिए यह पूरी तरह से खुद को संकलित कर सकता है!
पॉलीगनोम

1
वास्तव में यह काफी कुछ बनाने के लिए अनसुना नहीं है, iirc आधुनिक freepascal कंपाइलर को कुल 5 बार बनाता है।
प्लग

1
@pabrams लेखन "स्पर्श न करें" और "गर्म वस्तु। स्पर्श न करें" वाक्यांश के इच्छित संदेश से कोई अंतर नहीं पड़ता है। जब तक संदेश के श्रोताओं (प्रोग्रामर) वाक्यांश के इच्छित संदेश को समझ लेते हैं (कंपाइलर का निर्माण उसके स्रोत को संकलित कर सकता है) चाहे वह कैसा भी हो, यह चर्चा व्यर्थ है। जैसा कि अब यह खड़ा है, आपका तर्क अमान्य है। जब तक आप यह दिखाने में सक्षम नहीं होते हैं कि संदेश के इच्छित दर्शक गैर-प्रोग्रामर हैं, तब, और केवल तभी, आप सही हैं।
DarkDestry

2
@pabrams 'Good english' वह अंग्रेज़ी है जो विचारों को स्पष्ट रूप से इच्छित श्रोताओं तक पहुँचाता है, और जिस तरह से लेखक या वक्ता का इरादा होता है। यदि इच्छित दर्शक प्रोग्रामर है, और प्रोग्रामर इसे समझते हैं, तो यह अच्छी अंग्रेजी है। यह कहना कि "प्रकाश कण और तरंग दोनों के रूप में विद्यमान है" मौलिक रूप से "प्रकाश विद्यमान दोनों फोटॉनों और विद्युत चुम्बकीय तरंगों के समान है"। एक भौतिक विज्ञानी के लिए, उनका शाब्दिक अर्थ एक ही चीज है। क्या इसका मतलब है कि हमें हमेशा लंबी और स्पष्ट भावना का उपयोग करना चाहिए? नहीं! क्योंकि यह पढ़ने को जटिल बनाता है जब अर्थ पहले से ही लक्षित दर्शकों के लिए स्पष्ट है।
DarkDestry

7

एक छोटा लेकिन महत्वपूर्ण स्पष्टीकरण

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

आप पहले फ़ाइल को दूसरे पर लागू करते हैं, एक तीसरा निर्माण करते हैं जो संकलन के समान कार्य करने में सक्षम है पहला (संभवतः अधिक, यदि दूसरी फ़ाइल पहले द्वारा लागू नहीं की गई विशेषताओं को परिभाषित करती है), और इसलिए यदि आप पहली जगह ले सकते हैं इतनी इच्छा।


4
  1. कॉफ़ीस्क्रिप्ट कंपाइलर को पहली बार रूबी में लिखा गया था।
  2. CoffeeScript कम्पाइलर को फिर से CoffeeScript में लिखा गया।

चूंकि कॉफ़ीस्क्रिप्ट कंपाइलर के रूबी संस्करण पहले से ही मौजूद थे, इसलिए इसका उपयोग कॉफ़ीस्क्रिप्ट कंपाइलर के कॉफ़ीस्क्रिप्ट संस्करण को बनाने के लिए किया गया था।

यहां छवि विवरण दर्ज करें इसे सेल्फ-होस्टिंग कंपाइलर के रूप में जाना जाता है ।

यह बेहद सामान्य है, और आमतौर पर एक लेखक की अपनी भाषा के विकास को बनाए रखने के लिए अपनी भाषा का उपयोग करने की इच्छा होती है।


3

यह यहाँ संकलक की बात नहीं है, बल्कि भाषा की अभिव्यक्ति की बात है, क्योंकि संकलक केवल किसी भाषा में लिखा गया कार्यक्रम है।

जब हम कहते हैं कि "एक भाषा लिखी / कार्यान्वित की जाती है" तो हमारा वास्तव में मतलब है कि उस भाषा के लिए एक संकलक या दुभाषिया लागू किया जाता है। प्रोग्रामिंग भाषाएं हैं जिनमें आप प्रोग्राम लागू कर सकते हैं जो भाषा को लागू करते हैं (उसी भाषा के लिए कंपाइलर / व्याख्याकार हैं)। इन भाषाओं को सार्वभौमिक भाषा कहा जाता है ।

इसे समझने में सक्षम होने के लिए, धातु के खराद के बारे में सोचें। यह एक उपकरण है जिसका उपयोग धातु को आकार देने के लिए किया जाता है। यह संभव है, उस उपकरण का उपयोग करके, उसके भागों को बनाकर, एक और समान उपकरण बनाने के लिए। इस प्रकार, वह उपकरण एक सार्वभौमिक मशीन है। बेशक, पहले एक अन्य साधनों (अन्य उपकरण) का उपयोग करके बनाया गया था, और शायद कम गुणवत्ता का था। लेकिन पहले वाले का उपयोग उच्च परिशुद्धता के साथ नए निर्माण के लिए किया गया था।

एक 3 डी प्रिंटर लगभग एक सार्वभौमिक मशीन है। आप 3D प्रिंटर का उपयोग करके पूरे 3 डी प्रिंटर को प्रिंट कर सकते हैं (आप प्लास्टिक को पिघलाने वाले टिप का निर्माण नहीं कर सकते हैं)।


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

@ भौतिकी-गणना जो कि केवल गलत है। आमतौर पर द्वेष दोष की अनुपस्थिति में संकलक का संकलन नहीं किया जाता है।
प्लग

असेंबली अनुवाद निश्चित रूप से पुनरावृत्ति से पारित होने तक विधानसभा अनुवाद तय हो जाता है। पुरानी विशेषताओं को बनाने वाली नई सुविधाएँ अंतर्निहित कार्यान्वयन को नहीं बदलती हैं। इसके बारे में कुछ देर सोचें।

@plugwash केन थॉम्पसन द्वारा " ट्रस्टिंग

3

प्रेरण द्वारा प्रमाण

आगमनात्मक कदम

संकलक का n + 1 वां संस्करण X में लिखा गया है।

इस प्रकार यह संकलक के nth संस्करण (जिसे X में भी लिखा गया है) द्वारा संकलित किया जा सकता है।

मुख्य मामला

लेकिन X में लिखे गए संकलक के पहले संस्करण को X के लिए एक संकलक द्वारा संकलित किया जाना चाहिए जो X के अलावा किसी अन्य भाषा में लिखा गया है। इस चरण को संकलक को बूटस्ट्रैपिंग कहा जाता है।


1
भाषा X के लिए पहला पहला संकलक X आसानी से X में लिखा जा सकता है। यह कैसे संभव है कि इस पहले संकलक की व्याख्या की जा सकती है । (एक एक्स दुभाषिया द्वारा एक्स के अलावा अन्य भाषा में लिखा गया है)।
कज़

0

कंपाइलर एक उच्च-स्तरीय विनिर्देश लेते हैं और इसे निम्न-स्तरीय कार्यान्वयन में बदल देते हैं, जैसे कि हार्डवेयर पर निष्पादित किया जा सकता है। इसलिए विनिर्देश के प्रारूप और वास्तविक निष्पादन के बीच कोई संबंध नहीं है इसके अलावा भाषा के शब्दार्थ को लक्षित किया जा रहा है।

क्रॉस-कंपाइलर एक सिस्टम से दूसरे सिस्टम में जाते हैं, क्रॉस-भाषा कंपाइलर एक भाषा विनिर्देश को दूसरे भाषा विनिर्देश में संकलित करते हैं।

मूल रूप से संकलन एक मात्र अनुवाद है, और स्तर आमतौर पर उच्च स्तर की भाषा से निचले स्तर की भाषा है, लेकिन कई संस्करण हैं।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.