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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

 * स्वचालित प्रोग्रामिंग
 * कोड जनरेशन टूल्स की तुलना
 * स्रोत-से-स्रोत संकलक|सोर्स-टू-सोर्स कंपाइलर: एक कंप्यूटर प्रोग्राम का एक प्रोग्रामिंग भाषा से दूसरी प्रोग्रामिंग भाषा में स्वचालित अनुवाद