2010-11-24 16 views
10

संभावित डुप्लिकेट:
How can a language's compiler be written in that language?
implementing a compiler in “itself”आप उस भाषा में किसी भाषा के लिए संकलक कैसे लिखते हैं?

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

+0

क्षमा करें, उसे नहीं देखा। – jergason

उत्तर

16

सरल बनाने के लिए: आप पहले एक अलग भाषा में कंपाइलर के लिए एक कंपाइलर लिखते हैं। फिर, आप संकलक, और voila संकलित!

तो, आपको किसी प्रकार की भाषा की आवश्यकता है जिसमें पहले से ही एक कंपाइलर है - लेकिन चूंकि ऐसे कई हैं, आप रूबी कंपाइलर कंपाइलर (!) उदा। सी में, जो रूबी कंपाइलर को संकलित करेगा, जो तब रूबी कार्यक्रमों को संकलित कर सकता है, यहां तक ​​कि अपने और भी संस्करण।

बेशक, मूल संकलक मशीन कोड में लिखे गए थे, असेंबली के लिए संकलित संकलक, जो बदले में संकलित संकलक उदाहरण के लिए सी या फोरट्रान, जो संकलक संकलित ... के लिए बहुत कुछ सब कुछ। Iterative development in action.

प्रक्रिया bootstrapping कहा जाता है - के बाद बैरन Munchhausen की कहानी है, जिसमें वह खुद को एक दलदल से बाहर अपने ही बूटस्ट्रैप :) द्वारा खींचा संभवतः नामित

0

खैर यह निम्न क्रम में यह करने के लिए संभव है:

  1. किसी भी भाषा में एक कंपाइलर लिखें, अपने रूबी कोड के लिए सी कहें।
  2. अब जब आप रूबी कोड संकलित कर सकते हैं, तो आप एक कंपाइलर लिख सकते हैं जो रूबी कोड को संकलित करता है और चरण 1 में आपके द्वारा लिखे गए सी कंपाइलर के साथ इस कंपाइलर को संकलित करता है। वाह यह वाक्य अजीब है!
  3. अब से तुम पर संकलक 2. :)

मज़ा में लिखा के साथ अपने सभी गहरे लाल रंग का कोड संकलन कर सकते हैं! :)

0

एक कंपाइलर केवल कुछ ऐसा है जो स्रोत कोड को निष्पादन योग्य में बदल देता है। इसलिए इससे कोई फर्क नहीं पड़ता कि इसमें क्या लिखा गया है - यह वही भाषा हो सकती है जो संकलित हो या पर्याप्त शक्ति की कोई अन्य भाषा हो।

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

2

मुझे बस उस वाक्य को पढ़ने में भ्रमित हो जाता है।

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

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

एक अंतिम नोट: रूबी प्रोग्राम मनमाने ढंग से मशीन कोड का आह्वान नहीं कर सकते हैं। रूबिनीस का वह हिस्सा वास्तव में सी ++ में लिखा गया है।

0

यह एक 2 कदम प्रक्रिया है:

  1. , सी जैसे कुछ अन्य lanaguage में एक रूबी संकलक लिखने एक रूबी संकलक संभालने तक मौजूद नहीं है
  2. के बाद से अब आप एक रूबी संकलक है, तो आप लिख सकते हैं एक रूबी कार्यक्रम एक (नया) रूबी संकलक

है कि चूंकि किसी को पहले से ही एक रूबी संकलक (Matz) ने लिखा है, आप "केवल" दूसरे भाग क्या करना है। कहना आसान है करना मुश्किल।

3

एक कंपाइलर के बूटस्ट्रैपिंग के संबंध में यह इस शैतानी चालाक हैक के बारे में पढ़ने लायक है।

http://catb.org/jargon/html/B/back-door.html

0
जवाब अब तक एक अलग संकलक का उपयोग करके संकलक bootstrap करने के लिए कैसे समझा दिया है की

सभी। हालांकि, एक विकल्प है: हाथ से कंपाइलर संकलित। एक मशीन द्वारा संकलक को निष्पादित करने का कोई कारण नहीं है, यह मानव द्वारा निष्पादित किया जा सकता है।

+0

क्या आप इस उत्तर पर थोड़ा सा विस्तार कर सकते हैं? क्या आप मशीन कोड में सामान लिखने वाले लोगों के बारे में बात कर रहे हैं, या कुछ और? –

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