2010-06-08 11 views
17

संभावित डुप्लिकेट:
implementing a compiler in “itself”
Bootstrapping a languageउस भाषा में भाषा का कंपाइलर कैसे लिखा जा सकता है?

कैसे आप भाषा आप के लिए है कि संकलक लिख रहे हैं के रूप में एक ही भाषा में एक संकलक लिख सकता है? क्या इस तरह का रिकर्सिव नहीं है?

संपादित: यह नष्ट कर दिया जा सकता है लेकिन अन्यथा ...:

कैसे bootstrap करने के लिए:

क्यों bootstrap करने के लिए:

+2

विभिन्न पुराने संस्करण और संबंधित लिंक: http://stackoverflow.com/questions/13537/bootstrapping-a-language http://stackoverflow.com/questions/1493747/bootstrapping-a-compiler- क्यों http: // stackoverflow.com/questions/193560/implementing-a-compiler-in-itself http://stackoverflow.com/questions/1173780/programming-language-and-compiler http://stackoverflow.com/questions/2035838/what- भाषा-डू-वे-बिल्ड-अन्य-भाषाओं-http://stackoverflow.com/questions/2740994/what-is-the-language-of-compilersare-they-written-with- अलग-अलग भाषाएं जो शब्द आप चाहते थे "बूटस्ट्रैपिंग" था। – dmckee

+0

मुझे आश्चर्य है कि लोग कितनी बार गूढ़ व्यक्तियों का उपयोग करते हुए मुख्यधारा के भाषाओं के लिए कंपाइलर लागू करते हैं। – JAB

+0

@ फिल रॉस - वाह, धन्यवाद, आपको यह कैसे मिला? सुनिश्चित नहीं था कि कैसे खोज करें :) – froadie

उत्तर

24

आम तौर पर संकलक का पहला संस्करण एक अलग भाषा में लिखा है, और उसके बाद प्रत्येक बाद के संस्करण है कि भाषा में लिखा जाता है और पुराने संस्करण के साथ संकलित। एक बार जब आप संस्करण संस्करण x-1 के साथ संकलित कर लेते हैं, तो आप संस्करण के परिचय के किसी भी नए अनुकूलन का लाभ उठाते हुए, नए निर्मित संस्करण x का उपयोग अपने आप को पुन: संकलित करने के लिए कर सकते हैं; जीसीसी इसकी रिलीज करता है जिस तरह से

+0

+1 मैंने जावा में एक साधारण लिस्प दुभाषिया बनाया है। – Achilles

+1

तो ... आप संकलक के पहले संस्करण का उपयोग क्यों नहीं कर सकते? आप डबल-स्तरीय कंपाइलर क्यों चाहते हैं? – froadie

+3

@froadie आपका मतलब है कि संस्करण 1 के साथ हर संस्करण को संकलित क्यों नहीं करें? आमतौर पर एक कंपाइलर के नए संस्करण पिछले संस्करणों की तुलना में बेहतर मशीन कोड उत्पन्न करते हैं, इसलिए नवीनतम संस्करण के साथ निर्माण करने से संकलक स्वयं जितना संभव हो सके तेज़/कुशल बना देगा। इसके अलावा यदि भाषा स्वयं बदल रही है और आप कंपाइलर के स्रोत कोड में उन नई सुविधाओं का उपयोग करना चाहते हैं, तो आपको एक हालिया संस्करण –

11

यह है। आपको आमतौर पर किसी अन्य भाषा से संकलित या व्याख्या की गई भाषा के बूटस्ट्रैप संस्करण की आवश्यकता होती है।

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

+0

मुझे यह प्रश्न आश्चर्य हुआ कि इस तरह की बग स्थिति में कोई क्या करेगा। हाथ-पैचिंग मेरे लिए नहीं हुई थी। अजीब कहानी। हाहा – GabrielF

1

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

4

यह पहले संस्करण के लिए केवल एक समस्या है। एक बार मेरे पास कंपाइलर काम करने का V1.0 है, तो मैं अपनी भाषा में V2.0 लिख सकता हूं और इसे संकलित करने के लिए V1.0 कंपाइलर का उपयोग कर सकता हूं। फिर मैं V3.0 लिख सकता हूं और इसे संकलित करने के लिए V2.0 का उपयोग कर सकता हूं, V4.0 को संकलित करने के लिए V3.0 का उपयोग करें और इसी तरह।

1

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

1

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

+1

जरूरी नहीं है। पहला "कंपाइलर" भी एक इंसान हो सकता है, इस मामले में आपको एक अलग भाषा * में बूटस्ट्रैप कंपाइलर की आवश्यकता नहीं है *। इस प्रकार निकलॉस विर्थ की अधिकांश भाषाओं के लिए पहले संकलक लिखे गए थे: उन्होंने मूल रूप से उन्हें अपने छात्रों को सौंपा :-) –

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