संकलक: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 4: Line 4:
{{Use dmy dates|date=October 2020}}
{{Use dmy dates|date=October 2020}}
{{Program execution}}
{{Program execution}}
कंप्यूटिंग, एक '''''संकलक (कंपाइलर)''''' एक कंप्यूटर प्रोग्राम है जो एक प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा (लक्ष्य भाषा) में अनुवादित करता है। <nowiki>''</nowiki>संकलक<nowiki>''</nowiki> नाम मुख्य रूप से उन प्रोग्रामों के लिए उपयोग किया जाता है जो एक एक्जीक्यूटेबल प्रोग्राम बनाने के लिए एक उच्च-स्तरीय प्रोग्रामिंग भाषा से एक निम्न-स्तरीय प्रोग्रामिंग भाषा (जैसे असेंबली भाषा, ऑब्जेक्ट कोड, या मशीन कोड) में स्रोत कोड का अनुवाद करता है।<ref>{{cite web |author= |date= |title=एनसाइक्लोपीडिया: कंपाइलर की परिभाषा|url=https://www.pcmag.com/encyclopedia/term/compiler |url-status=live |access-date=2 July 2022 |work=PCMag.com}}</ref><ref name=dragon>[[Compilers: Principles, Techniques, and Tools]] by Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman - Second Edition, 2007</ref>{{rp|p1}}<रेफरी नाम = सुदर्शनम मलिक फुजिता 2002 पीपी। 506–515 >{{cite book | last1=SUDARSANAM | first1=ASHOK | last2=MALIK | first2=SHARAD | last3=FUJITA | first3=MASAHIRO | title=हार्डवेयर/सॉफ्टवेयर सह-डिजाइन में रीडिंग| chapter=A Retargetable Compilation Methodology for Embedded Digital Signal Processors Using a Machine-Dependent Code Optimization Library | publisher=Elsevier | year=2002 | doi=10.1016/b978-155860702-6/50045-4 | pages=506–515 | isbn=9781558607026 | quote=एक कंपाइलर एक कंप्यूटर प्रोग्राम है जो एक उच्च-स्तरीय भाषा (HLL) में लिखे गए प्रोग्राम का अनुवाद करता है, जैसे C, एक समतुल्य असेंबली लैंग्वेज प्रोग्राम [2] में। }}</रेफरी>
कंप्यूटिंग, '''''संकलक (कंपाइलर)''''' एक कंप्यूटर प्रोग्राम है जो प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा (लक्ष्य भाषा) में अनुवादित करता है। <nowiki>''</nowiki>संकलक<nowiki>''</nowiki> नाम मुख्य रूप से उन प्रोग्रामों के लिए उपयोग किया जाता है जो एक एक्जीक्यूटेबल प्रोग्राम बनाने के लिए एक उच्च-स्तरीय प्रोग्रामिंग भाषा से एक निम्न-स्तरीय प्रोग्रामिंग भाषा (जैसे असेंबली भाषा, ऑब्जेक्ट कोड, या मशीन कोड) में स्रोत कोड का अनुवाद करता है।<ref>{{cite web |author= |date= |title=एनसाइक्लोपीडिया: कंपाइलर की परिभाषा|url=https://www.pcmag.com/encyclopedia/term/compiler |url-status=live |access-date=2 July 2022 |work=PCMag.com}}</ref><ref name=dragon>[[Compilers: Principles, Techniques, and Tools]] by Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman - Second Edition, 2007</ref>{{rp|p1}}<रेफरी नाम = सुदर्शनम मलिक फुजिता 2002 पीपी। 506–515 >{{cite book | last1=SUDARSANAM | first1=ASHOK | last2=MALIK | first2=SHARAD | last3=FUJITA | first3=MASAHIRO | title=हार्डवेयर/सॉफ्टवेयर सह-डिजाइन में रीडिंग| chapter=A Retargetable Compilation Methodology for Embedded Digital Signal Processors Using a Machine-Dependent Code Optimization Library | publisher=Elsevier | year=2002 | doi=10.1016/b978-155860702-6/50045-4 | pages=506–515 | isbn=9781558607026 | quote=एक कंपाइलर एक कंप्यूटर प्रोग्राम है जो एक उच्च-स्तरीय भाषा (HLL) में लिखे गए प्रोग्राम का अनुवाद करता है, जैसे C, एक समतुल्य असेंबली लैंग्वेज प्रोग्राम [2] में। }}</रेफरी>


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


एक संकलक निम्न में से कुछ या सभी ऑपरेशन करने की संभावना रखता है, जिन्हें प्रायः चरण कहा जाता है: [[पूर्वप्रक्रमक]], [[शाब्दिक विश्लेषण]], [[पदच्छेद]], सिमेंटिक एनालिसिस (कंपाइलर्स) ([[सिंटैक्स-निर्देशित अनुवाद]]), इनपुट प्रोग्राम्स को [[मध्यवर्ती प्रतिनिधित्व]], [[कोड अनुकूलन]] और कोड में बदलना। पीढ़ी (संकलक)। संकलक सामान्यतः इन चरणों को मॉड्यूलर घटकों के रूप में लागू करते हैं, कुशल डिजाइन को बढ़ावा देते हैं और लक्ष्य आउटपुट के लिए स्रोत इनपुट के [[कार्यक्रम परिवर्तन|प्रोग्राम परिवर्तन]]ों की शुद्धता को बढ़ावा देते हैं। गलत संकलक व्यवहार के कारण होने वाले प्रोग्राम दोषों को ट्रैक करना और उनके आसपास काम करना अधिक कठिन हो सकता है; इसलिए, [[संकलक शुद्धता]] सुनिश्चित करने के लिए संकलक कार्यान्वयनकर्ता महत्वपूर्ण प्रयास करते हैं।
कंपाइलर निम्नलिखित में से कुछ या सभी कार्यों को करने की संभावना रखता है: प्रीप्रोसेसिंग, लेक्सिकल विश्लेषण, पार्सिंग, सिमेंटिक एनालिसिस (सिंटेक्स-निर्देशित अनुवाद (एसडीटी)), कोड ऑप्टिमाइज़ेशन और कोड जनरेशन इनपुट प्रोग्राम्स को मध्यवर्ती प्रतिनिधित्व में बदलना जिन्हें प्रायः चरण कहा जाता है। संकलक सामान्यतः इन चरणों को मॉड्यूलर घटकों के रूप में लागू करते हैं, कुशल डिजाइन को बढ़ावा देते हैं और लक्ष्य आउटपुट के लिए स्रोत इनपुट के [[कार्यक्रम परिवर्तन|प्रोग्राम परिवर्तन]]ों की शुद्धता को बढ़ावा देते हैं। गलत संकलक व्यवहार के कारण होने वाले प्रोग्राम दोषों को ट्रैक करना और उनके आसपास काम करना अधिक कठिन हो सकता है; इसलिए, [[संकलक शुद्धता]] सुनिश्चित करने के लिए संकलक कार्यान्वयनकर्ता महत्वपूर्ण प्रयास करते हैं।
रेफ नाम = सूर्य2016>{{cite journal |last1=Sun|first1=Chengnian|last2=Le|first2=Vu|last3=Zhang|first3=Qirun|last4=Su|first4=Zhendong|date=2016|title=GCC और LLVM में कंपाइलर बग्स को समझने की ओर|url=http://dl.acm.org/citation.cfm?doid=2931037.2931074|journal=ACM|series=Issta 2016|pages=294–305|doi=10.1145/2931037.2931074|isbn=9781450343909|s2cid=8339241}}</रेफरी>
रेफ नाम = सूर्य2016>{{cite journal |last1=Sun|first1=Chengnian|last2=Le|first2=Vu|last3=Zhang|first3=Qirun|last4=Su|first4=Zhendong|date=2016|title=GCC और LLVM में कंपाइलर बग्स को समझने की ओर|url=http://dl.acm.org/citation.cfm?doid=2931037.2931074|journal=ACM|series=Issta 2016|pages=294–305|doi=10.1145/2931037.2931074|isbn=9781450343909|s2cid=8339241}}</रेफरी>


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


Line 104: Line 104:
[[File:Xxx Scanner and parser example for C.gif|thumb|right|400px| संदर्भ-मुक्त भागों को ग्रहण करते हैं।]]फ्रंट एंड प्रोग्राम का आंतरिक प्रतिनिधित्व बनाने के लिए स्रोत कोड का विश्लेषण करता है, जिसे इंटरमीडिएट प्रतिनिधित्व (आईआर) कहा जाता है। यह [[प्रतीक तालिका]] का प्रबंधन भी करता है, एक डेटा संरचना जो स्रोत कोड में प्रत्येक प्रतीक को संबंधित जानकारी जैसे स्थान, प्रकार और दायरे से मैप करती है।
[[File:Xxx Scanner and parser example for C.gif|thumb|right|400px| संदर्भ-मुक्त भागों को ग्रहण करते हैं।]]फ्रंट एंड प्रोग्राम का आंतरिक प्रतिनिधित्व बनाने के लिए स्रोत कोड का विश्लेषण करता है, जिसे इंटरमीडिएट प्रतिनिधित्व (आईआर) कहा जाता है। यह [[प्रतीक तालिका]] का प्रबंधन भी करता है, एक डेटा संरचना जो स्रोत कोड में प्रत्येक प्रतीक को संबंधित जानकारी जैसे स्थान, प्रकार और दायरे से मैप करती है।


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


फ्रंट एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं:
फ्रंट एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं:
*{{visible anchor|Line reconstruction}}पार्सर के लिए तैयार इनपुट वर्ण अनुक्रम को एक विहित रूप में परिवर्तित करता है। भाषाएं जो अपने खोजशब्दों को स्ट्रॉपिंग (वाक्यविन्यास) करती हैं या पहचानकर्ताओं के अंदर एकपक्षीय रूप से से रिक्त स्थान की स्वीकृति देती हैं, उन्हें इस चरण की आवश्यकता होती है। 1960 के दशक में उपयोग किए जाने वाले [[टॉप-डाउन पार्सिंग]]|टॉप-डाउन, [[पुनरावर्ती वंश पार्सर]]|रिकर्सिव-डिसेंट, टेबल-ड्रिवन पार्सर्स सामान्यतः स्रोत को एक समय में एक वर्ण पढ़ते हैं और इसके लिए एक [[अल्गोल]] टोकनिंग चरण की आवश्यकता नहीं होती है। [[एटलस ऑटोकोड]] और [[एडिनबर्ग आईएमपी]] (और एएलजीओएल और [[मूंगा 66]] के कुछ कार्यान्वयन) सीमित भाषाओं के उदाहरण हैं जिनके संकलक के पास लाइन पुनर्निर्माण चरण होगा।
*{{visible anchor|Line reconstruction}}पार्सर के लिए तैयार इनपुट वर्ण अनुक्रम को एक विहित रूप में परिवर्तित करता है। भाषाएं जो अपने खोजशब्दों को स्ट्रॉपिंग (वाक्यविन्यास) करती हैं या पहचानकर्ताओं के अंदर एकपक्षीय रूप से से रिक्त स्थान की स्वीकृति देती हैं, उन्हें इस चरण की आवश्यकता होती है। 1960 के दशक में उपयोग किए जाने वाले [[टॉप-डाउन पार्सिंग]]|टॉप-डाउन, [[पुनरावर्ती वंश पार्सर]]|रिकर्सिव-डिसेंट, टेबल-ड्रिवन पार्सर्स सामान्यतः स्रोत को एक समय में एक वर्ण पढ़ते हैं और इसके लिए एक [[अल्गोल]] टोकनिंग चरण की आवश्यकता नहीं होती है। [[एटलस ऑटोकोड]] और [[एडिनबर्ग आईएमपी]] (और एएलजीओएल और [[मूंगा 66]] के कुछ कार्यान्वयन) सीमित भाषाओं के उदाहरण हैं जिनके संकलक के पास लाइन पुनर्निर्माण चरण होगा।
* प्रीप्रोसेसर [[मैक्रो (कंप्यूटर विज्ञान)]] प्रतिस्थापन और [[सशर्त संकलन]] का समर्थन करता है। सामान्यतः प्रीप्रोसेसिंग चरण सिंटैक्टिक या सिमेंटिक विश्लेषण से पहले होता है; उदा. सी के स्थिति में, प्रीप्रोसेसर वाक्यात्मक रूपों के बजाय शाब्दिक टोकन में हेरफेर करता है। हालाँकि, कुछ भाषाएँ जैसे कि स्कीम (प्रोग्रामिंग भाषा) सिंटैक्टिक रूपों के आधार पर मैक्रो प्रतिस्थापन का समर्थन करती हैं।
* प्रीप्रोसेसर [[मैक्रो (कंप्यूटर विज्ञान)]] प्रतिस्थापन और [[सशर्त संकलन]] का समर्थन करता है। सामान्यतः प्रीप्रोसेसिंग चरण सिंटैक्टिक या सिमेंटिक विश्लेषण से पहले होता है; उदा. सी के स्थिति में, प्रीप्रोसेसर वाक्यात्मक रूपों के बजाय शाब्दिक टोकन में हेरफेर करता है। हालाँकि, कुछ भाषाएँ जैसे कि स्कीम (प्रोग्रामिंग भाषा) सिंटैक्टिक रूपों के आधार पर मैक्रो प्रतिस्थापन का समर्थन करती हैं।
* लेक्सिकल एनालिसिस (जिसे लेक्सिंग या टोकेनाइजेशन के रूप में भी जाना जाता है) सोर्स कोड टेक्स्ट को लेक्सिकल टोकन कहे जाने वाले छोटे टुकड़ों के अनुक्रम में तोड़ देता है।<ref>Aho, Lam, Sethi, Ullman 2007, p. 5-6, 109-189</ref> इस चरण को दो चरणों में विभाजित किया जा सकता है: स्कैनिंग, जो इनपुट टेक्स्ट को लेक्सेम नामक सिंटैक्टिक इकाइयों में विभाजित करती है और उन्हें एक श्रेणी प्रदान करती है; और मूल्यांकन, जो लेक्सेम को संसाधित मूल्य में परिवर्तित करता है। एक टोकन एक जोड़ी है जिसमें एक टोकन नाम और एक वैकल्पिक टोकन मान होता है।<ref>Aho, Lam, Sethi, Ullman 2007, p. 111</ref> सामान्य टोकन श्रेणियों में पहचानकर्ता, कीवर्ड, विभाजक, ऑपरेटर, शाब्दिक और टिप्पणियां सम्मिलित हो सकती हैं, हालांकि टोकन श्रेणियों का सेट विभिन्न प्रोग्रामिंग भाषाओं में भिन्न होता है। लेक्सेम सिंटैक्स सामान्यतः एक [[नियमित भाषा]] है, इसलिए इसे पहचानने के लिए एक [[नियमित अभिव्यक्ति]] से निर्मित एक परिमित अवस्था ऑटोमेटन का उपयोग किया जा सकता है। लेक्सिकल एनालिसिस करने वाले सॉफ्टवेयर को [[शाब्दिक विश्लेषक]] कहा जाता है। यह एक अलग कदम नहीं हो सकता है - इसे [[स्कैनर रहित पार्सिंग]] में पार्सिंग चरण के साथ जोड़ा जा सकता है, इस स्थिति में पार्सिंग चरित्र स्तर पर की जाती है, टोकन स्तर पर नहीं।
* लेक्सिकल विश्लेषण (जिसे लेक्सिंग या टोकेनाइजेशन के रूप में भी जाना जाता है) सोर्स कोड टेक्स्ट को लेक्सिकल   टोकन कहे जाने वाले छोटे टुकड़ों के अनुक्रम में तोड़ देता है।<ref>Aho, Lam, Sethi, Ullman 2007, p. 5-6, 109-189</ref> इस चरण को दो चरणों में विभाजित किया जा सकता है: स्कैनिंग, जो इनपुट टेक्स्ट को लेक्सेम नामक सिंटैक्टिक इकाइयों में विभाजित करती है और उन्हें एक श्रेणी प्रदान करती है; और मूल्यांकन, जो लेक्सेम को संसाधित मूल्य में परिवर्तित करता है। एक टोकन एक जोड़ी है जिसमें एक टोकन नाम और एक वैकल्पिक टोकन मान होता है।<ref>Aho, Lam, Sethi, Ullman 2007, p. 111</ref> सामान्य टोकन श्रेणियों में पहचानकर्ता, कीवर्ड, विभाजक, ऑपरेटर, शाब्दिक और टिप्पणियां सम्मिलित हो सकती हैं, हालांकि टोकन श्रेणियों का सेट विभिन्न प्रोग्रामिंग भाषाओं में भिन्न होता है। लेक्सेम सिंटैक्स सामान्यतः एक [[नियमित भाषा]] है, इसलिए इसे पहचानने के लिए एक [[नियमित अभिव्यक्ति]] से निर्मित एक परिमित अवस्था ऑटोमेटन का उपयोग किया जा सकता है। लेक्सिकल विश्लेषण करने वाले सॉफ्टवेयर को [[शाब्दिक विश्लेषक]] कहा जाता है। यह एक अलग कदम नहीं हो सकता है - इसे [[स्कैनर रहित पार्सिंग]] में पार्सिंग चरण के साथ जोड़ा जा सकता है, इस स्थिति में पार्सिंग चरित्र स्तर पर की जाती है, टोकन स्तर पर नहीं।
* सिंटैक्स विश्लेषण (पार्सिंग के रूप में भी जाना जाता है) में प्रोग्राम की सिंटैक्टिक संरचना की पहचान करने के लिए टोकन अनुक्रम को पार्स करना सम्मिलित है। यह चरण सामान्यतः एक पार्स पेड़ बनाता है, जो एक [[औपचारिक व्याकरण]] के नियमों के अनुसार निर्मित वृक्ष संरचना के साथ टोकन के रैखिक अनुक्रम को बदलता है जो भाषा के वाक्य-विन्यास को परिभाषित करता है। पार्स ट्री का प्रायः विश्लेषण, संवर्द्धन और संकलक में बाद के चरणों द्वारा रूपांतरित किया जाता है।<ref>Aho, Lam, Sethi, Ullman 2007, p. 8, 191-300</ref>
* सिंटैक्स विश्लेषण (पार्सिंग के रूप में भी जाना जाता है) में प्रोग्राम की सिंटैक्टिक संरचना की पहचान करने के लिए टोकन अनुक्रम को पार्स करना सम्मिलित है। यह चरण सामान्यतः एक पार्स पेड़ बनाता है, जो एक [[औपचारिक व्याकरण]] के नियमों के अनुसार निर्मित वृक्ष संरचना के साथ टोकन के रैखिक अनुक्रम को बदलता है जो भाषा के वाक्य-विन्यास को परिभाषित करता है। पार्स ट्री का प्रायः विश्लेषण, संवर्द्धन और संकलक में बाद के चरणों द्वारा रूपांतरित किया जाता है।<ref>Aho, Lam, Sethi, Ullman 2007, p. 8, 191-300</ref>
* सिमेंटिक एनालिसिस (संकलक) पार्स ट्री में सिमेंटिक जानकारी जोड़ता है और सिंबल टेबल बनाता है। यह चरण सिमेंटिक चेक करता है जैसे कि टाइप चेकिंग (टाइप एरर के लिए चेकिंग), या [[वस्तु बंधन]] (परिवर्तनशील और फंक्शन रेफरेंस को उनकी परिभाषाओं के साथ जोड़ना), या निश्चित [[निश्चित असाइनमेंट विश्लेषण]] उपयोग से पहले सभी स्थानीय परिवर्तनशील को इनिशियलाइज़ करने की आवश्यकता होती है), गलत प्रोग्राम को अस्वीकार करना या चेतावनी जारी करना। सिमेंटिक विश्लेषण के लिए सामान्यतः एक पूर्ण पार्स ट्री की आवश्यकता होती है, जिसका अर्थ है कि यह चरण तार्किक रूप से पार्सिंग चरण का अनुसरण करता है, और तार्किक रूप से कोड जनरेशन (संकलक) चरण से पहले होता है, हालांकि एक संकलक कार्यान्वयन में कोड के ऊपर एक पास में कई चरणों को मोड़ना प्रायः संभव होता है।
* सिमेंटिक एनालिसिस (संकलक) पार्स ट्री में सिमेंटिक जानकारी जोड़ता है और सिंबल टेबल बनाता है। यह चरण सिमेंटिक चेक करता है जैसे कि टाइप चेकिंग (टाइप एरर के लिए चेकिंग), या [[वस्तु बंधन]] (परिवर्तनशील और फंक्शन रेफरेंस को उनकी परिभाषाओं के साथ जोड़ना), या निश्चित [[निश्चित असाइनमेंट विश्लेषण]] उपयोग से पहले सभी स्थानीय परिवर्तनशील को इनिशियलाइज़ करने की आवश्यकता होती है), गलत प्रोग्राम को अस्वीकार करना या चेतावनी जारी करना। सिमेंटिक विश्लेषण के लिए सामान्यतः एक पूर्ण पार्स ट्री की आवश्यकता होती है, जिसका अर्थ है कि यह चरण तार्किक रूप से पार्सिंग चरण का अनुसरण करता है, और तार्किक रूप से कोड जनरेशन (संकलक) चरण से पहले होता है, हालांकि एक संकलक कार्यान्वयन में कोड के ऊपर एक पास में कई चरणों को मोड़ना प्रायः संभव होता है।
Line 121: Line 121:
संकलक विश्लेषण किसी भी संकलक अनुकूलन के लिए पूर्वापेक्षा है, और वे एक साथ कसकर काम करते हैं। उदाहरण के लिए, लूप परिवर्तन के लिए निर्भरता विश्लेषण महत्वपूर्ण है।
संकलक विश्लेषण किसी भी संकलक अनुकूलन के लिए पूर्वापेक्षा है, और वे एक साथ कसकर काम करते हैं। उदाहरण के लिए, लूप परिवर्तन के लिए निर्भरता विश्लेषण महत्वपूर्ण है।


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


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


बैक एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं:
बैक एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं:
* मशीन पर निर्भर अनुकूलन: अनुकूलन जो कि सीपीयू संरचना के विवरण पर निर्भर करता है जिसे संकलक लक्षित करता है।<ref>Cooper and Toczon (2012), p. 540</ref> एक प्रमुख उदाहरण पीपहोल ऑप्टिमाइज़ेशन है, जो असेंबलर निर्देशों के छोटे अनुक्रमों को अधिक कुशल निर्देशों में पुनः से लिखता है।
* मशीन पर निर्भर अनुकूलन: अनुकूलन जो कि सीपीयू संरचना के विवरण पर निर्भर करता है जिसे संकलक लक्षित करता है।<ref>Cooper and Toczon (2012), p. 540</ref> एक प्रमुख उदाहरण पीपहोल अनुकूलन है, जो असेंबलर निर्देशों के छोटे अनुक्रमों को अधिक कुशल निर्देशों में पुनः से लिखता है।
* कोड जनरेशन (संकलक): रूपांतरित मध्यवर्ती भाषा का अनुवाद आउटपुट भाषा में किया जाता है, सामान्यतः सिस्टम की मूल [[मशीन भाषा]]। इसमें संसाधन और भंडारण निर्णय सम्मिलित हैं, जैसे कि यह तय करना कि कौन से चर रजिस्टर आवंटन और मेमोरी में फ़िट होंगे और उपयुक्त मशीन निर्देशों का [[निर्देश चयन]] और निर्देश शेड्यूलिंग उनके संबंधित [[एड्रेसिंग मोड]] के साथ (सेठी-उलमैन एल्गोरिथम भी देखें)। [[डिबगिंग]] की सुविधा के लिए डीबग डेटा भी उत्पन्न करने की आवश्यकता हो सकती है।
* कोड जनरेशन (संकलक): रूपांतरित मध्यवर्ती भाषा का अनुवाद आउटपुट भाषा में किया जाता है, सामान्यतः सिस्टम की मूल [[मशीन भाषा]]। इसमें संसाधन और भंडारण निर्णय सम्मिलित हैं, जैसे कि यह तय करना कि कौन से चर रजिस्टर आवंटन और मेमोरी में फ़िट होंगे और उपयुक्त मशीन निर्देशों का [[निर्देश चयन]] और निर्देश शेड्यूलिंग उनके संबंधित [[एड्रेसिंग मोड]] के साथ (सेठी-उलमैन एल्गोरिथम भी देखें)। [[डिबगिंग]] की सुविधा के लिए डीबग डेटा भी उत्पन्न करने की आवश्यकता हो सकती है।



Revision as of 15:24, 1 January 2023

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

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

कंप्यूटिंग, संकलक (कंपाइलर) एक कंप्यूटर प्रोग्राम है जो प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा (लक्ष्य भाषा) में अनुवादित करता है। ''संकलक'' नाम मुख्य रूप से उन प्रोग्र