संकलक: Difference between revisions

From Vigyanwiki
No edit summary
Line 69: Line 69:


कोड जनरेशन प्रक्रिया में पीक्यूसीसी अनुसंधान वास्तव में स्वचालित संकलक-लेखन प्रणाली बनाने का प्रयास करता है। पीक्यूसी के प्रयास ने  चरण संरचना की खोज की और परिकल्पित किया। ब्लिस-11 संकलक ने प्रारंभिक संरचना प्रदान की।<ref>W. Wulf, K. Nori, "[https://apps.dtic.mil/sti/pdfs/ADA125935.pdf Delayed binding in PQCC generated compilers]", CMU Research Showcase Report, CMU-CS-82-138, 1982
कोड जनरेशन प्रक्रिया में पीक्यूसीसी अनुसंधान वास्तव में स्वचालित संकलक-लेखन प्रणाली बनाने का प्रयास करता है। पीक्यूसी के प्रयास ने  चरण संरचना की खोज की और परिकल्पित किया। ब्लिस-11 संकलक ने प्रारंभिक संरचना प्रदान की।<ref>W. Wulf, K. Nori, "[https://apps.dtic.mil/sti/pdfs/ADA125935.pdf Delayed binding in PQCC generated compilers]", CMU Research Showcase Report, CMU-CS-82-138, 1982
</ref> चरणों में विश्लेषण (फ्रंट एंड), आभासी मशीन (मध्य अंत) में मध्यवर्ती अनुवाद और लक्ष्य (बैक एंड) में अनुवाद सम्मिलित हैं। मध्यवर्ती प्रतिनिधित्व में भाषा विशिष्ट निर्माणों को संचलन के लिए पीक्यूसीसी अनुसंधान के लिए टीसीओएल विकसित किया गया था।<ref>Joseph M. Newcomer, David Alex Lamb, Bruce W. Leverett, Michael Tighe, William A. Wulf - Carnegie-Mellon University and David Levine, Andrew H. Reinerit - Intermetrics: "TCOL Ada: Revised Report on An Intermediate Representation for the DOD Standard Programming Language", 1979
</ref> चरणों में विश्लेषण (फ्रंट एंड), आभासी मशीन (मिडिल एंड) में मध्यवर्ती अनुवाद और लक्ष्य (बैक एंड) में अनुवाद सम्मिलित हैं। मध्यवर्ती प्रतिनिधित्व में भाषा विशिष्ट निर्माणों को संचलन के लिए पीक्यूसीसी अनुसंधान के लिए टीसीओएल विकसित किया गया था।<ref>Joseph M. Newcomer, David Alex Lamb, Bruce W. Leverett, Michael Tighe, William A. Wulf - Carnegie-Mellon University and David Levine, Andrew H. Reinerit - Intermetrics: "TCOL Ada: Revised Report on An Intermediate Representation for the DOD Standard Programming Language", 1979
</ref> टीसीओएल के विभिन्न रूपों ने विभिन्न भाषाओं का समर्थन किया। पीक्यूसीसी परियोजना ने स्वचालित संकलक निर्माण की तकनीकों की जांच की। डिजाइन अवधारणाएं (1995 से, वस्तु-उन्मुख [[एडा (प्रोग्रामिंग भाषा)|(प्रोग्रामिंग भाषा)]] एडीए (प्रोग्रामिंग भाषा) के लिए संकलक और संकलक के अनुकूलन में उपयोगी प्रमाणित हुईं।
</ref> टीसीओएल के विभिन्न रूपों ने विभिन्न भाषाओं का समर्थन किया। पीक्यूसीसी परियोजना ने स्वचालित संकलक निर्माण की तकनीकों की जांच की। डिजाइन अवधारणाएं (1995 से, वस्तु-उन्मुख [[एडा (प्रोग्रामिंग भाषा)|(प्रोग्रामिंग भाषा)]] एडीए (प्रोग्रामिंग भाषा) के लिए संकलक और संकलक के अनुकूलन में उपयोगी प्रमाणित हुईं।


Line 89: Line 89:


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


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


कुछ स्थितियों में, एक भाषा सुविधा के डिजाइन के लिए स्रोत पर एक से अधिक पास करने के लिए एक संकलक की आवश्यकता हो सकती है। उदाहरण के लिए, स्रोत की पंक्ति 20 पर प्रकट होने वाली एक घोषणा पर विचार करें जो पंक्ति 10 पर प्रदर्शित होने वाले कथन के अनुवाद को प्रभावित करती है। इस स्थिति में, पहले पास को उन घोषणाओं के बारे में जानकारी एकत्र करने की आवश्यकता होती है जो उन कथनों के बाद दिखाई देती हैं जो वास्तविक अनुवाद को प्रभावित करते हैं। बाद के पास के समय।
कुछ स्थितियों में, एक भाषा सुविधा के डिजाइन के लिए स्रोत पर एक से अधिक पास करने के लिए एक संकलक की आवश्यकता हो सकती है। उदाहरण के लिए, स्रोत की पंक्ति 20 पर प्रकट होने वाली एक घोषणा पर विचार करें जो पंक्ति 10 पर प्रदर्शित होने वाले कथन के अनुवाद को प्रभावित करती है। इस स्थिति में, पहले पास को उन घोषणाओं के बारे में जानकारी एकत्र करने की आवश्यकता होती है जो बाद के पास के समय होने वाले वास्तविक अनुवाद के साथ प्रभावित होती हैं।


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


एक संकलक को छोटे प्रोग्रामों में विभाजित करना एक ऐसी तकनीक है जिसका उपयोग शोधकर्ताओं द्वारा उपयुक्त रूप से सही संकलक बनाने में रुचि रखने वाले द्वारा किया जाता है। छोटे प्रोग्रामों के एक समूह की शुद्धता को प्रमाणित करने के लिए प्रायः एक बड़े, एकल, समकक्ष प्रोग्राम की शुद्धता को प्रमाणित करने से कम प्रयास की आवश्यकता होती है।
एक संकलक को छोटे प्रोग्रामों में विभाजित करना एक ऐसी तकनीक है जिसका उपयोग शोधकर्ताओं द्वारा उपयुक्त रूप से सही संकलक बनाने में रुचि रखने वाले द्वारा किया जाता है। छोटे प्रोग्रामों के एक समूह की शुद्धता को प्रमाणित करने के लिए प्रायः एक बड़े, एकल, समकक्ष प्रोग्राम की शुद्धता को प्रमाणित करने से कम प्रयास की आवश्यकता होती है।


=== तीन चरण संकलक संरचना ===
=== तीन चरण संकलक संरचना ===
[[File:Compiler design.svg|thumb|center|upright=2.5|संकलक डिजाइन]]संकलक डिजाइन में चरणों की शुद्धता से संख्या के होने पर भी, चरणों को तीन चरणों में से एक को सौंपा जा सकता है। चरणों में एक फ्रंट एंड, एक मिडिल एंड और एक बैक एंड सम्मिलित है।
[[File:Compiler design.svg|thumb|center|upright=2.5|संकलक डिजाइन]]संकलक डिजाइन में चरणों की शुद्धता से संख्या के होने पर भी, चरणों को तीन चरणों में से एक को नियुक्त किया जा सकता है। चरणों में एक फ्रंट एंड, एक मिडिल एंड और एक बैक एंड सम्मिलित है।
* फ्रंट एंड इनपुट को स्कैन करता है और एक विशिष्ट स्रोत भाषा के अनुसार सिंटैक्स और सिमेंटिक्स की पुष्टि करता है। [[टाइप सिस्टम|टाइप प्रणाली]] के लिए यह टाइप की जानकारी एकत्र करके [[प्रकार की जाँच]] करता है। यदि इनपुट प्रोग्राम वाक्यात्मक रूप से गलत है या इसमें टाइप त्रुटि है, तो यह त्रुटि और/या चेतावनी संदेश उत्पन्न करता है, सामान्यतः स्रोत कोड में उस स्थान की पहचान करता है जहां समस्या का पता चला था; कुछ स्थितियों में वास्तविक त्रुटि प्रोग्राम में पहले (बहुत) हो सकती है। फ्रंट एंड के पहलुओं में लेक्सिकल विश्लेषण, सिंटैक्स एनालिसिस और सिमेंटिक एनालिसिस सम्मिलित हैं। मध्य छोर द्वारा आगे की प्रक्रिया के लिए फ्रंट एंड इनपुट प्रोग्राम को एक मध्यवर्ती प्रतिनिधित्व (आईआर) में बदल देता है। यह मध्यवर्ती प्रतिनिधित्व सामान्यतः स्रोत कोड के संबंध में प्रोग्राम का निम्न स्तर का प्रतिनिधित्व है।
* फ्रंट एंड इनपुट को स्कैन करता है और एक विशिष्ट स्रोत भाषा के अनुसार सिंटैक्स और सिमेंटिक्स की पुष्टि करता है। [[टाइप सिस्टम|टाइप प्रणाली]] के लिए यह टाइप की जानकारी एकत्र करके [[टाइप]] [[प्रकार की जाँच|की जाँच]] करता है। यदि इनपुट प्रोग्राम वाक्यात्मक रूप से गलत है या इसमें टाइप त्रुटि है, तो यह त्रुटि और/या चेतावनी संदेश उत्पन्न करता है, सामान्यतः स्रोत कोड में उस स्थान की पहचान करता है जहां समस्या का पता चला था; कुछ स्थितियों में वास्तविक त्रुटि प्रोग्राम में पहले (बहुत) हो सकती है। फ्रंट एंड के पहलुओं में लेक्सिकल विश्लेषण, सिंटैक्स एनालिसिस और सिमेंटिक एनालिसिस सम्मिलित हैं। मिडिल एंड द्वारा आगे की प्रक्रिया के लिए फ्रंट एंड इनपुट प्रोग्राम को एक मध्यवर्ती प्रतिनिधित्व (आईआर) में परिवर्तित कर देता है। यह मध्यवर्ती प्रतिनिधित्व सामान्यतः स्रोत कोड के संबंध में प्रोग्राम का निम्न स्तर का प्रतिनिधित्व है।
* मध्य अंत मध्यवर्ती प्रतिनिधित्व पर अनुकूलन करता है जो योजनाबद्ध सीपीयू संरचना से स्वतंत्र होते हैं। इस स्रोत कोड/मशीन कोड स्वतंत्रता का उद्देश्य विभिन्न भाषाओं और टारगेट प्रोसेसर का समर्थन करने वाले संकलक के संस्करणों के बीच साझा किए जाने वाले सामान्य अनुकूलन को सक्षम करना है। मिडिल एंड  अनुकूलन के उदाहरण बेकार ([[डेड-कोड उन्मूलन]]) या अगम्य कोड ([[पहुंच क्षमता विश्लेषण]]) को हटाना, निरंतर मूल्यों की खोज और प्रसार (निरंतर प्रचार), कम बार-बार निष्पादित स्थान पर गणना का स्थानांतरण (जैसे, लूप से बाहर) ), या संदर्भ के आधार पर गणना की विशेषज्ञता, अंततः अनुकूलित मध्यवर्ती प्रतिनिधित्व का उत्पादन करती है जिसका उपयोग बैक एंड द्वारा किया जाता है।
* मिडिल एंड मध्यवर्ती प्रतिनिधित्व पर अनुकूलन करता है जो योजनाबद्ध सीपीयू संरचना से स्वतंत्र होते हैं। इस स्रोत कोड/मशीन कोड स्वतंत्रता का उद्देश्य विभिन्न भाषाओं और टारगेट प्रोसेसर का समर्थन करने वाले संकलक के संस्करणों के बीच साझा किए जाने वाले सामान्य अनुकूलन को सक्षम करना है। मिडिल एंड  अनुकूलन के उदाहरण अनुपयोगी ([[निष्क्रिय]][[डेड-कोड उन्मूलन|-कोड उन्मूलन]]) या अगम्य कोड ([[पहुंच क्षमता विश्लेषण|अभिगम्यता विश्लेषण]]) को हटाना, निरंतर मूल्यों की खोज और प्रसार (निरंतर प्रचार), बार-बार कम निष्पादित स्थान पर गणना का स्थानांतरण (जैसे, लूप से बाहर) ), या संदर्भ के आधार पर गणना की विशेषज्ञता, अंततः अनुकूलित मध्यवर्ती प्रतिनिधित्व का उत्पादन करती है जिसका उपयोग बैक एंड द्वारा किया जाता है।
* पिछला अंत मध्य छोर से अनुकूलित मध्यवर्ती प्रतिनिधित्व लेता है। यह अधिक विश्लेषण, परिवर्तन और अनुकूलन कर सकता है जो टारगेट सीपीयू संरचना के लिए विशिष्ट हैं। बैक एंड टारगेट-निर्भर असेंबली कोड उत्पन्न करता है, प्रक्रिया में रजिस्टर आवंटन करता है। बैक एंड [[निर्देश समयबद्धन]] करता है, जो [[देरी स्लॉट]] को भरकर समानांतर एक्जीक्यूटेबल इकाइयों को व्यस्त रखने के निर्देशों को पुनः आदेश देता है। हालांकि अधिकांश अनुकूलन समस्याएं [[एनपी-कठोरता]] | एनपी-हार्ड हैं, उन्हें हल करने के लिए ह्यूरिस्टिक (कंप्यूटर विज्ञान) तकनीकें अच्छी तरह से विकसित हैं और वर्तमान में उत्पादन-गुणवत्ता वाले कंपाइलरों में क्रियान्वित हैं। सामान्यतः बैक एंड का आउटपुट एक विशेष प्रोसेसर और ऑपरेटिंगप्रणाली के लिए विशिष्ट मशीन कोड होता है।
* बैक एंड मिडिल एंड से अनुकूलित मध्यवर्ती प्रतिनिधित्व लेता है। यह अधिक विश्लेषण, परिवर्तन और अनुकूलन कर सकता है जो टारगेट सीपीयू संरचना के लिए विशिष्ट हैं। बैक एंड टारगेट-निर्भर असेंबली कोड उत्पन्न करता है, प्रक्रिया में लिपिबद्ध  आवंटन करता है। बैक एंड [[निर्देश समयबद्धन|अनुदेश अनुसूचन]] करता है, जो [[देरी स्लॉट|विलंब स्लॉट]] को भरकर समानांतर एक्जीक्यूटेबल इकाइयों को कार्यरत रखने के निर्देशों को पुनः आदेश देता है। हालांकि अधिकांश अनुकूलन समस्याएं [[एनपी-कठोरता|एनपी-हार्ड]] |हैं, उन्हें हल करने के लिए ह्यूरिस्टिक (कंप्यूटर विज्ञान) तकनीकें अच्छी तरह से विकसित हैं और वर्तमान में उत्पादन-गुणवत्ता वाले कंपाइलरों में क्रियान्वित हैं। सामान्यतः बैक एंड का आउटपुट एक विशेष प्रोसेसर और ऑपरेटिंग सिस्टम के लिए विशिष्ट मशीन कोड होता है।


यह फ्रंट/मध्य/बैक-एंड दृष्टिकोण मध्य अंत के अनुकूलन को साझा करते हुए विभिन्न सेंट्रल प्रोसेसिंग यूनिट के लिए बैक एंड के साथ विभिन्न भाषाओं के लिए फ्रंट एंड को जोड़ना संभव बनाता है।<ref>Cooper and Torczon 2012, p. 8</ref> इस दृष्टिकोण के व्यवहार्य उदाहरण जीएनयू संकलक संग्रह, [[बजना]] ([[एलएलवीएम]]-आधारित सी/सी++ संकलक) हैं।<ref name=LattnerBook1st>{{cite book | author = Lattner, Chris |editor = Brown, Amy |editor2=Wilson, Greg | date = 2017 | chapter = LLVM | title = ओपन सोर्स एप्लिकेशन का आर्किटेक्चर| chapter-url = http://www.aosabook.org/en/llvm.html | access-date = 28 February 2017 | url-status = live | archive-url = https://web.archive.org/web/20161202070941/http://aosabook.org/en/llvm.html | archive-date = 2 December 2016}}</ref> और [[एम्स्टर्डम संकलक किट]], जिसमें कई फ्रंट-एंड, साझा अनुकूलन और कई बैक-एंड हैं।
ययह फ्रंट/मिडल/बैक-एंड दृष्टिकोण मिडिल एंड के अनुकूलन को साझा करते हुए विभिन्न सेंट्रल प्रोसेसिंग यूनिट के लिए बैक एंड के साथ विभिन्न भाषाओं के लिए फ्रंट एंड को जोड़ना संभव बनाता है।<ref>Cooper and Torczon 2012, p. 8</ref> इस दृष्टिकोण के व्यवहार्य उदाहरण जीएनयू संकलक संग्रह,क्लैंग (एलएलवीएम-आधारित सी/सी++ कंपाइलर),<ref name=LattnerBook1st>{{cite book | author = Lattner, Chris |editor = Brown, Amy |editor2=Wilson, Greg | date = 2017 | chapter = LLVM | title = ओपन सोर्स एप्लिकेशन का आर्किटेक्चर| chapter-url = http://www.aosabook.org/en/llvm.html | access-date = 28 February 2017 | url-status = live | archive-url = https://web.archive.org/web/20161202070941/http://aosabook.org/en/llvm.html | archive-date = 2 December 2016}}</ref> और [[एम्स्टर्डम संकलक किट]], जिसमें कई फ्रंट-एंड, साझा अनुकूलन और कई बैक-एंड हैं।


==== फ्रंट एंड ====
==== फ्रंट एंड ====
Line 120: Line 120:


==== मध्य भाग ====
==== मध्य भाग ====
मध्य अंत, जिसे ऑप्टिमाइज़र के रूप में भी जाना जाता है, प्रदर्शन और उत्पादित मशीन कोड की गुणवत्ता में सुधार के लिए मध्यवर्ती प्रतिनिधित्व पर अनुकूलन करता है।<ref name="Hjort Blindell, Gabriel">{{Cite book |title=निर्देश चयन: सिद्धांत, तरीके और अनुप्रयोग|last= Blindell |first=Gabriel Hjort|isbn=9783319340197|location= Switzerland |oclc=951745657|date= 3 June 2016 }}</ref> मध्य छोर में वे अनुकूलन सम्मिलित हैं जो योजनाबद्ध किए जा रहे सीपीयू संरचना से स्वतंत्र हैं।
मिडिल एंड, जिसे ऑप्टिमाइज़र के रूप में भी जाना जाता है, प्रदर्शन और उत्पादित मशीन कोड की गुणवत्ता में सुधार के लिए मध्यवर्ती प्रतिनिधित्व पर अनुकूलन करता है।<ref name="Hjort Blindell, Gabriel">{{Cite book |title=निर्देश चयन: सिद्धांत, तरीके और अनुप्रयोग|last= Blindell |first=Gabriel Hjort|isbn=9783319340197|location= Switzerland |oclc=951745657|date= 3 June 2016 }}</ref> मिडिल एंड में वे अनुकूलन सम्मिलित हैं जो योजनाबद्ध किए जा रहे सीपीयू संरचना से स्वतंत्र हैं।


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


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


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

Revision as of 11:08, 2 January 2023

यह लेख कंप्यूटर भाषाओं का अनुवाद करने वाले सॉफ्टवेयर के बारे में है। मंगा के लिए, संकलक (मंगा) देखें।

"कंपाइल" और "संकलन" यहां पुनर्निर्देशित करें। सॉफ्टवेयर कंपनी के लिए, कंपाइल (कंपनी) देखें। अन्य उपयोगों के लिए, संकलन देखें।

कंप्यूटिंग, संकलक (कंपाइलर) एक कंप्यूटर प्रोग्राम है जो प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा टारगेट-भाषा में अनुवादित करता है। ''संकलक'' नाम मुख्य रूप से उन प्रोग्रामों के लिए उपयोग किया जाता है जो एक एक्जीक्यूटेबल प्रोग्राम बनाने के लिए एक उच्च-स्तरीय प्रोग्रामिंग भाषा से एक निम्न-स्तरीय प्रोग्रामिंग भाषा (जैसे असेंबली भाषा, ऑब्जेक्ट कोड, या मशीन कोड) में स्रोत कोड का अनुवाद करता है।[1][2]: p1 <रेफरी नाम = सुदर्शनम मलिक फुजिता 2002 पीपी। 506–515 >SUDARSANAM, ASHOK; MALIK, SHARAD; FUJITA, MASAHIRO (2002). "A Retargetable Compilation Methodology for Embedded Digital Signal Processors Using a Machine-Dependent Code Optimization Library". हार्डवेयर/सॉफ्टवेयर सह-डिजाइन में रीडिंग. Elsevier. pp. 506–515. doi:10.1016/b978-155860702-6/50045-4. ISBN 9781558607026. एक कंपाइलर एक कंप्यूटर प्रोग्राम है जो एक उच्च-स्तरीय भाषा (HLL) में लिखे गए प्रोग्राम का अनुवाद करता है, जैसे C, एक समतुल्य असेंबली लैंग्वेज प्रोग्राम [2] में।</रेफरी>

कई अलग-अलग प्रकार के संकलक हैं जो विभिन्न उपयोगी रूपों में आउटपुट उत्पन्न करते हैं। क्रॉस-कंपाइलर (व्‍यति अनुभाषक) एक अलग सेंट्रल प्रोसेसिंग यूनिट (सीपीयू) या ऑपरेटिंग सिस्टम के लिए कोड तैयार करता है, जिस पर क्रॉस-कंपाइलर स्वयं सक्रिय है। एक बूटस्ट्रैप संकलक प्रायः एक अस्थायी संकलक होता है, जिसका उपयोग किसी भाषा के लिए अधिक स्थायी या अपेक्षाकृत अधिक अनुकूलित संकलक के संकलन के लिए किया जाता है।

एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह एक डिकंपाइलर है जो संबंधित सॉफ़्टवेयर में सम्मिलित हैं, एक प्रोग्राम जो उच्च-स्तरीय भाषाओं के बीच अनुवाद करता है, जिसे सामान्यतः सोर्स-टू-सोर्स कंपाइलर (एस2एस) या ट्रांसपिलर कहा जाता है। एक भाषा पुनर्लेखन सामान्यतः एक ऐसा प्रोग्राम है जो भाषा में परिवर्तन के बिना अभिव्यक्ति (कंप्यूटर विज्ञान) के रूप का अनुवाद करता है। एक संकलक-संकलक एक संकलक है जो एक संकलक (या एक का भाग) बनाता है, प्रायः एक सामान्य और पुन: प्रयोज्य तरीके से ताकि कई अलग-अलग कंपाइलरों का उत्पादन करने में सक्षम हो सके।

कंपाइलर निम्नलिखित में से कुछ या सभी कार्यों को करने की संभावना रखता है: प्रीप्रोसेसिंग, लेक्सिकल विश्लेषण, पार्सिंग, सिमेंटिक एनालिसिस (सिंटेक्स-निर्देशित अनुवाद (एसडीटी)), कोड ऑप्टिमाइज़ेशन और कोड जनरेशन इनपुट प्रोग्राम्स को मध्यवर्ती प्रतिनिधित्व में बदलना जिन्हें प्रायः चरण कहा जाता है। संकलक सामान्यतः इन चरणों को मॉड्यूलर घटकों के रूप में क्रियान्वित करते हैं, प्रभावशाली डिजाइन को बढ़ावा देते हैं और टारगेट आउटपुट के लिए स्रोत इनपुट के प्रोग्राम परिवर्तन की शुद्धता को बढ़ावा देते हैं। प्रोग्राम मे गलत संकलक गतिविधि के कारण होने वाले दोषों को पता लगाना और उनके आसपास कार्य करना अधिक कठिन हो सकता है; इसलिए, संकलक शुद्धता सुनिश्चित करने के लिए संकलक कार्यान्वयनकर्ता महत्वपूर्ण प्रयास करते हैं। रेफ नाम = सूर्य2016>Sun, Chengnian; Le, Vu; Zhang, Qirun; Su, Zhendong (2016). "GCC और LLVM में कंपाइलर बग्स को समझने की ओर". ACM. Issta 2016: 294–305. doi:10.1145/2931037.2931074. ISBN 9781450343909. S2CID 8339241.</रेफरी>

स्रोत प्रोग्राम को बदलने के लिए उपयोग किए जाने वाले संकलक एकमात्र भाषा प्रोसेसर नहीं हैं। एक अनुवादक (कंप्यूटिंग) कंप्यूटर सॉफ्टवेयर है जो संकेतित कार्यों को रूपांतरित करता है और फिर निष्पादित करता है।[2]: p2  अनुवाद प्रक्रिया कंप्यूटर भाषाओं के डिजाइन को प्रभावित करती है, जिससे संकलन या व्याख्या की प्राथमिकता होती है। सिद्धांत रूप में, एक प्रोग्रामिंग भाषा में एक संकलक और अनुवादक दोनों हो सकते हैं। गतिविधि में, प्रोग्रामिंग भाषाएँ केवल एक (एक संकलक या एक अनुवादक) से जुड़ी होती हैं।