कोड जनरेशन (संकलक)

From alpha
Jump to navigation Jump to search

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

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

कोड जनरेटर के इनपुट में आमतौर पर एक पार्स पेड़ या एक सार वाक्य रचना का पेड़ होता है।[1] पेड़ को निर्देशों के एक रैखिक अनुक्रम में परिवर्तित किया जाता है, आमतौर पर एक मध्यवर्ती भाषा में जैसे कि तीन-पता कोड। संकलन के आगे के चरणों को कोड जनरेशन के रूप में संदर्भित किया जा सकता है या नहीं, यह इस बात पर निर्भर करता है कि क्या वे कार्यक्रम के प्रतिनिधित्व में महत्वपूर्ण परिवर्तन शामिल करते हैं। (उदाहरण के लिए, एक पीपहोल अनुकूलन पास को संभवतः कोड जेनरेशन नहीं कहा जाएगा, हालाँकि एक कोड जनरेटर एक पीपहोल ऑप्टिमाइज़ेशन पास को शामिल कर सकता है।)

प्रमुख कार्य

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

कार्य जो आम तौर पर एक परिष्कृत कंपाइलर के कोड जनरेशन चरण का हिस्सा होते हैं उनमें शामिल हैं:

निर्देश चयन आमतौर पर अमूर्त सिंटैक्स ट्री पर एक प्रत्यावर्तन मेल ऑर्डर ट्रैवर्सल करके किया जाता है, जो टेम्प्लेट के विरुद्ध विशेष ट्री कॉन्फ़िगरेशन से मेल खाता है; उदाहरण के लिए, पेड़ W := ADD(X,MUL(Y,Z)) अनुक्रमों को पुनरावर्ती रूप से उत्पन्न करके निर्देशों के एक रैखिक अनुक्रम में परिवर्तित किया जा सकता है t1 := X और t2 := MUL(Y,Z), और फिर निर्देश जारी करना ADD W, t1, t2.

एक कंपाइलर में जो एक मध्यवर्ती भाषा का उपयोग करता है, दो निर्देश चयन चरण हो सकते हैं- एक पार्स ट्री को मध्यवर्ती कोड में बदलने के लिए, और दूसरा चरण बहुत बाद में मध्यवर्ती कोड को लक्ष्य मशीन के निर्देश सेट से निर्देशों में परिवर्तित करने के लिए। इस दूसरे चरण में ट्री ट्रैवर्सल की आवश्यकता नहीं होती है; यह रैखिक रूप से किया जा सकता है, और आम तौर पर उनके संबंधित opcode के साथ मध्यवर्ती भाषा के संचालन का एक सरल प्रतिस्थापन शामिल होता है। हालाँकि, यदि कंपाइलर वास्तव में एक ट्रांसकंपलर है (उदाहरण के लिए, वह जो जावा (प्रोग्रामिंग भाषा) को C ++ में परिवर्तित करता है), तो दूसरे कोड-जेनरेशन चरण में रैखिक मध्यवर्ती कोड से एक ट्री बनाना शामिल हो सकता है।

रनटाइम कोड जनरेशन

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

संबंधित अवधारणाएं

एक भाषा में इनपुट लेने और गैर-तुच्छ रूप से भिन्न भाषा में आउटपुट तैयार करने के मौलिक कार्य को औपचारिक भाषा सिद्धांत के मूल [[परिवर्तनकारी व्वाईएसीसीरण]] संचालन के संदर्भ में समझा जा सकता है। नतीजतन, कुछ तकनीकें जो मूल रूप से कंपाइलर्स में उपयोग के लिए विकसित की गई थीं, उन्हें अन्य तरीकों से भी नियोजित किया गया है। उदाहरण के लिए, YACC (फिर भी एक अन्य संकलक-संकलक | कंपाइलर-कंपाइलर) बैकस-नौर रूप में इनपुट लेता है और इसे सी (प्रोग्रामिंग भाषा) में पार्सर में परिवर्तित करता है। यद्यपि यह मूल रूप से एक संकलक के लिए एक पार्सर की स्वचालित पीढ़ी के लिए बनाया गया था, yacc का उपयोग अक्सर लेखन कोड को स्वचालित करने के लिए भी किया जाता है जिसे हर बार संशोधित करने की आवश्यकता होती है।[3] कई एकीकृत विकास वातावरण (आईडीई) स्वत: स्रोत-कोड पीढ़ी के कुछ रूपों का समर्थन करते हैं, अक्सर संकलक कोड जनरेटर के साथ आम तौर पर एल्गोरिदम का उपयोग करते हैं, हालांकि आमतौर पर कम जटिल होते हैं। (यह भी देखें: कार्यक्रम परिवर्तन, डेटा परिवर्तन।)

प्रतिबिंब

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

यह भी देखें

संदर्भ

  1. Steven Muchnick; Muchnick and Associates (15 August 1997). Advanced Compiler Design Implementation. Morgan Kaufmann. ISBN 978-1-55860-320-2. code generation.
  2. Aho, Alfred V.; Ravi Sethi; Jeffrey D. Ullman (1987). Compilers: Principles, Techniques, and Tools. Addison-Wesley. p. 15. ISBN 0-201-10088-6.
  3. Code Generation: The Real Lesson of Rails. Artima.com (2006-03-16). Retrieved on 2013-08-10.