5

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

मेरा मानना ​​है कि मेरे पास वर्चुअल मशीन और असेंबलर काम करेगा, साथ ही साथ कंपाइलर के कुछ हिस्सों के बारे में एक सभ्य वैचारिक समझ है।

यहां मैं क्या जानना चाहता हूं: कंपाइलर में, मान लीजिए कि मैंने स्रोत कोड को सिंटैक्स पेड़ में बदल दिया है। इस वाक्यविन्यास पेड़ को असेंबली में बदलने के लिए मैं किस प्रक्रिया के माध्यम से जाता हूं?

(के, कुछ सरल भाषा निर्माणों मान की तरह अगर और जब तक। मैं एक न्यूनतम और सरल व्याख्या के लिए यहाँ देख रहा हूँ करते हैं।)

मैं विशेष रूप से जटिल समाधान में कोई दिलचस्पी नहीं है, या मौजूदा उपकरणों के आधार पर समाधान कर रहा हूँ । इसके बजाय, मुझे 1 पृष्ठ के क्रम में कुछ चाहिए, सिंटैक्स पेड़ से असेंबली जाने के पीछे विचारों का विस्तृत व्यापक विवरण।

कोई भी ऐसे संसाधन के बारे में जानता है? (: सिद्धांत, तकनीक और उपकरण संकलनकर्ता)

धन्यवाद :)

+0

निश्चित रूप से। किसी भी कंपाइलर पुस्तक के अध्याय 1 के दूसरे और तीसरे पृष्ठ। लेकिन मुझे लगता है कि आप उम्मीद कर रहे हैं कि आपको बस इतना ही चाहिए, और लंबे शॉट से नहीं है। समस्या यह है कि * अच्छे * मशीन कोड (यहां तक ​​कि वर्चुअल मशीन के लिए) प्रक्रियात्मक लैंगुग का अनुवाद करने के लिए बहुत सारी मशीनरी की आवश्यकता होती है, और जब वे 2 पृष्ठ आवश्यकतानुसार अस्पष्ट भाव देंगे, तो आप निर्माण करने में सक्षम नहीं होंगे संकलक पुस्तक के अन्य 200 पृष्ठों को पढ़ने के बिना किसी भी तरह का समझदार कोड जेनरेटर। –

उत्तर

6

एक संकलक सवाल का अनिवार्य प्रतिक्रिया ड्रैगन किताब पढ़ने के लिए है। जब आप कहते हैं कि आपने स्रोत कोड को सिंटैक्स पेड़ में बदल दिया है, तो आपका क्या मतलब है? आम तौर पर पार्सिंग में पहला चरण एक अमूर्त वाक्यविन्यास पेड़ (एएसटी) बनाना है। अगला चरण आम तौर पर विशेषता करने के लिए है। गुण एएसटी में नोड्स के गुण होते हैं जिनके पास स्रोत भाषा के साथ कुछ भी नहीं है, लेकिन कोड पीढ़ी के लिए आवश्यक हैं। आमतौर पर मेमोरी आकार की आवश्यकताओं को निर्धारित करने के लिए टाइप ऑब्जेक्ट की कुछ प्रकार यहां की जाती है और ऑब्जेक्ट उन्मुख भाषाओं में, किस फ़ंक्शन को कॉल किया जाना है। उदाहरण के लिए, यदि आपका स्रोत obj1 = obj2 + obj3 है, तो आप वास्तव में नहीं जानते कि प्लस साइन को क्या करना है जब तक कि आप obj2 के प्रकार को निर्धारित न करें।

तो अपने प्रश्न का उत्तर देने के लिए एक शॉट देने के लिए। 1) एएसटी पर पार्स स्रोत कोड। 2) एएसटी पर एट्रिब्यूशन करें। 3) इंटरमीडिएट कोड उत्पन्न करें (क्या कल्पना है कि आप असेंबली के रूप में संदर्भित हैं)।

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