कोड जनरेशन (कंपाइलर): Difference between revisions

From Vigyanwiki
No edit summary
Line 16: Line 16:
* यदि आवश्यक हो तो [[डिबगिंग|डेबगु]] डेटा प्रारूप जेनेरशन जिससे कि कोड डिबगिंग हो सकता है।
* यदि आवश्यक हो तो [[डिबगिंग|डेबगु]] डेटा प्रारूप जेनेरशन जिससे कि कोड डिबगिंग हो सकता है।


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


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


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


==संबंधित अवधारणाएँ==
==संबंधित अवधारणाएँ==
एक भाषा में इनपुट लेने और एक गैर-तुच्छ भिन्न भाषा में आउटपुट तैयार करने के मौलिक कार्य को [[औपचारिक भाषा सिद्धांत]] के मूल [[परिवर्तनकारी व्याकरण]] संचालन के संदर्भ में समझा जा सकता है। नतीजतन, कुछ तकनीकें जो मूल रूप से कंपाइलरों में उपयोग के लिए विकसित की गई थीं, उन्हें अन्य तरीकों से भी नियोजित किया जाने लगा है। उदाहरण के लिए, [[YACC]] (फिर भी एक और [[ संकलक-संकलक ]] | कंपाइलर-कंपाइलर) बैकस-नौर फॉर्म में इनपुट लेता है और इसे [[सी (प्रोग्रामिंग भाषा)]] में एक पार्सर में परिवर्तित करता है। हालाँकि यह मूल रूप से एक कंपाइलर के लिए पार्सर की स्वचालित पीढ़ी के लिए बनाया गया था, yacc का उपयोग अक्सर लेखन कोड को स्वचालित करने के लिए भी किया जाता है जिसे हर बार विनिर्देशों को बदलने पर संशोधित करने की आवश्यकता होती है।<ref>[http://www.artima.com/weblogs/viewpost.jsp?thread=152273 Code Generation: The Real Lesson of Rails]. Artima.com (2006-03-16). Retrieved on 2013-08-10.</ref>
भाषा में इनपुट लेने और अतुच्छ भिन्न भाषा में आउटपुट तैयार करने के मौलिक कार्य को [[औपचारिक भाषा सिद्धांत|फॉर्मल भाषा सिद्धांत]] के मूल [[परिवर्तनकारी व्याकरण]] संचालन के संदर्भ में समझा जा सकता है। नतीजतन, कुछ तकनीकें जो मूल रूप से कंपाइलरों में उपयोग के लिए विकसित की गई थीं, उन्हें अन्य तरीकों से भी नियोजित किया जाने लगा है। उदाहरण के लिए, [[YACC]] (फिर भी एक और [[ संकलक-संकलक ]] | कंपाइलर-कंपाइलर) बैकस-नौर फॉर्म में इनपुट लेता है और इसे [[सी (प्रोग्रामिंग भाषा)]] में एक पार्सर में परिवर्तित करता है। हालाँकि यह मूल रूप से एक कंपाइलर के लिए पार्सर की स्वचालित पीढ़ी के लिए बनाया गया था, yacc का उपयोग अक्सर लेखन कोड को स्वचालित करने के लिए भी किया जाता है जिसे हर बार विनिर्देशों को बदलने पर संशोधित करने की आवश्यकता होती है।<ref>[http://www.artima.com/weblogs/viewpost.jsp?thread=152273 Code Generation: The Real Lesson of Rails]. Artima.com (2006-03-16). Retrieved on 2013-08-10.</ref>
कई एकीकृत विकास वातावरण (आईडीई) स्वचालित [[स्रोत-कोड पीढ़ी]] के कुछ रूपों का समर्थन करते हैं, अक्सर कंपाइलर कोड जेनरेटर के साथ आम तौर पर एल्गोरिदम का उपयोग करते हैं, हालांकि आमतौर पर कम जटिल होते हैं। (यह भी देखें: प्रोग्राम परिवर्तन, [[डेटा परिवर्तन]]।)
कई एकीकृत विकास वातावरण (आईडीई) स्वचालित [[स्रोत-कोड पीढ़ी]] के कुछ रूपों का समर्थन करते हैं, अक्सर कंपाइलर कोड जेनरेटर के साथ आम तौर पर एल्गोरिदम का उपयोग करते हैं, हालांकि आमतौर पर कम जटिल होते हैं। (यह भी देखें: प्रोग्राम परिवर्तन, [[डेटा परिवर्तन]]।)



Revision as of 10:20, 9 August 2023

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

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

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

प्रमुख कार्य

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

जो कार्य सामान्य तौर पर सोफस्टिकेटेड कंपाइलर के कोड जनरेशन चरण का भाग होते हैं उनमें सम्मिलित हैं:

  • निर्देश चयन: कौन से निर्देश का उपयोग करना है।
  • निर्देश शेड्यूलिंग: उन निर्देशों को किस क्रम में रखा जाए। शेड्यूलिंग गति अनुकूलन है जो निर्देश पाइपलाइन वाली मशीनों पर महत्वपूर्ण प्रभाव डाल सकता है।
  • रजिस्टर आवंटन: प्रोसेसर रजिस्टरों को वेरिएबल्स (प्रोग्रामिंग) का आवंटन है।[2]
  • यदि आवश्यक हो तो डेबगु डेटा प्रारूप जेनेरशन जिससे कि कोड डिबगिंग हो सकता है।

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

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

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

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

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

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

प्रतिबिंब

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

यह भी देखें

संदर्भ

  1. Steven Muchnick; Muchnick and Associates (15 August 1997). उन्नत कंपाइलर डिज़ाइन कार्यान्वयन. Morgan Kaufmann. ISBN 978-1-55860-320-2. कोड जनरेशन.
  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.