कोड जनरेशन (कंपाइलर)

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

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

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

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

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

निर्देश का चयन सामान्य तौर पर एब्स्ट्रैक्ट सिंटैक्स ट्री पर रिकर्सिव पोस्टोरडर ट्रैवर्सल करके किया जाता है, जो टेम्प्लेट के विरुद्ध विशेष ट्री कॉन्फ़िगरेशन का मिलान करता है; उदाहरण के लिए, ट्री  के लिए अनुक्रमों को पुनरावर्ती रूप से उत्पन्न करके निर्देशों के रैखिक अनुक्रम में परिवर्तित किया जा सकता है   और , और फिर

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

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

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

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

यह भी देखें

 * आटोमेटिक प्रोग्रामिंग
 * कोड जनरेशन टूल्स की तुलना
 * सोर्स-टू-सोर्स कंपाइलर: कंप्यूटर प्रोग्राम का प्रोग्रामिंग लैंग्वेज से दूसरी प्रोग्रामिंग लैंग्वेज में आटोमेटिक ट्रांसलेशन