संकलक: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
यह लेख कंप्यूटर भाषाओं का अनुवाद करने वाले सॉफ्टवेयर के बारे में है। मंगा के लिए, [[कंपाइलर (मंगा)]] देखें।
यह लेख कंप्यूटर भाषाओं का अनुवाद करने वाले सॉफ्टवेयर के बारे में है। मंगा के लिए, [[कंपाइलर (मंगा)]] देखें।


"[[कंपाइल (कंपनी)|कंपाइल]]" और "[[संकलित|कंपाइलिंग]]" यहां पुनर्निर्देशित करें। सॉफ्टवेयर कंपनी के लिए, [[कंपाइल (कंपनी)]] देखें। अन्य उपयोगों के लिए, [[संकलन]] देखें।{{Short description|Computer program which translates code from one programming language to another}}
"[[कंपाइल (कंपनी)|कंपाइल]]" और "[[संकलन]]" यहां पुनर्निर्देशित करें। सॉफ्टवेयर कंपनी के लिए, [[कंपाइल (कंपनी)]] देखें। अन्य उपयोगों के लिए, [[संकलन]] देखें।{{Short description|Computer program which translates code from one programming language to another}}
{{Use dmy dates|date=October 2020}}
{{Use dmy dates|date=October 2020}}
{{Program execution}}
{{Program execution}}
[[कम्प्यूटिंग]] में, एक कंपाइलर एक [[कंप्यूटर प्रोग्राम]] है जो अनुवादक (कंप्यूटिंग) कंप्यूटर कोड को एक [[प्रोग्रामिंग भाषा]] (''स्रोत'' भाषा) में दूसरी भाषा ('''लक्ष्य'' भाषा) में लिखा जाता है। नाम संकलक मुख्य रूप से उन प्रोग्रामों के लिए उपयोग किया जाता है जो एक [[निष्पादन]] योग्य प्रोग्राम बनाने के लिए उच्च-स्तरीय प्रोग्रामिंग भाषा से [[निचले स्तर की भाषा]] | निम्न-स्तरीय भाषा (जैसे असेंबली भाषा, [[वस्तु कोड]] या [[मशीन कोड]]) में स्रोत कोड का अनुवाद करते हैं।<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] में। }}</रेफरी>


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


संबंधित सॉफ़्टवेयर में सम्मिलित हैं, एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह एक [[decompiler]] है; एक प्रोग्राम जो उच्च-स्तरीय भाषाओं के बीच अनुवाद करता है, जिसे सामान्यतः [[स्रोत से स्रोत संकलक]] या ट्रांसपिलर कहा जाता है। एक भाषा [[पुनर्लेखन]] सामान्यतः एक ऐसा प्रोग्राम है जो भाषा में बदलाव के बिना [[अभिव्यक्ति (कंप्यूटर विज्ञान)]] के रूप का अनुवाद करता है। एक [[संकलक-संकलक]] एक कंपाइलर है जो एक कंपाइलर (या एक का भाग) बनाता है, प्रायः एक सामान्य और पुन: प्रयोज्य तरीके से ताकि कई अलग-अलग कंपाइलरों का उत्पादन करने में सक्षम हो सके।
संबंधित सॉफ़्टवेयर में सम्मिलित हैं, एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह एक [[decompiler]] है; एक प्रोग्राम जो उच्च-स्तरीय भाषाओं के बीच अनुवाद करता है, जिसे सामान्यतः [[स्रोत से स्रोत संकलक]] या ट्रांसपिलर कहा जाता है। एक भाषा [[पुनर्लेखन]] सामान्यतः एक ऐसा प्रोग्राम है जो भाषा में बदलाव के बिना [[अभिव्यक्ति (कंप्यूटर विज्ञान)]] के रूप का अनुवाद करता है। एक [[संकलक-संकलक]] एक कंपाइलर है जो एक कंपाइलर (या एक का भाग) बनाता है, प्रायः एक सामान्य और पुन: प्रयोज्य तरीके से ताकि कई अलग-अलग कंपाइलरों का उत्पादन करने में सक्षम हो सके।
Line 17: Line 17:
== इतिहास ==
== इतिहास ==
{{Main|History of compiler construction}}
{{Main|History of compiler construction}}
[[File:Compiler.svg |upright=1.5|thumb |एक विशिष्ट बहु-भाषा, बहु-लक्ष्य संकलक के संचालन का आरेख]]वैज्ञानिकों, गणितज्ञों और इंजीनियरों द्वारा विकसित सैद्धांतिक कंप्यूटिंग अवधारणाओं ने द्वितीय विश्व युद्ध के दौरान डिजिटल आधुनिक कंप्यूटिंग विकास का आधार बनाया। आदिम बाइनरी भाषाएं विकसित हुईं क्योंकि डिजिटल डिवाइस केवल एक और शून्य और अंतर्निहित मशीन संरचना में सर्किट पैटर्न को समझते हैं। 1940 के दशक के अंत में, कंप्यूटर संरचना के अधिक व्यावहारिक सार की पेशकश करने के लिए असेंबली लैंग्वेज बनाई गई थीं। प्रारम्भिक कंप्यूटरों की सीमित मुख्य मेमोरी क्षमता के कारण जब पहला कंपाइलर डिजाइन किया गया था तो काफी तकनीकी चुनौतियों का सामना करना पड़ा था। इसलिए, संकलन प्रक्रिया को कई छोटे कार्यक्रमों में विभाजित करने की आवश्यकता थी। फ्रंट एंड प्रोग्राम लक्ष्य कोड उत्पन्न करने के लिए बैक एंड प्रोग्राम द्वारा उपयोग किए जाने वाले विश्लेषण उत्पादों का उत्पादन करते हैं। जैसा कि कंप्यूटर प्रौद्योगिकी ने अधिक संसाधन प्रदान किए, संकलक डिजाइन संकलन प्रक्रिया के साथ अपेक्षाकृत अधिक ढंग से संरेखित हो सकते हैं।
[[File:Compiler.svg |upright=1.5|thumb |एक विशिष्ट बहु-भाषा, बहु-लक्ष्य संकलक के संचालन का आरेख]]वैज्ञानिकों, गणितज्ञों और इंजीनियरों द्वारा विकसित सैद्धांतिक कंप्यूटिंग अवधारणाओं ने द्वितीय विश्व युद्ध के समय डिजिटल आधुनिक कंप्यूटिंग विकास का आधार बनाया। आदिम बाइनरी भाषाएं विकसित हुईं क्योंकि डिजिटल डिवाइस केवल एक और शून्य और अंतर्निहित मशीन संरचना में सर्किट पैटर्न को समझते हैं। 1940 के दशक के अंत में, कंप्यूटर संरचना के अधिक व्यावहारिक सार की पेशकश करने के लिए असेंबली लैंग्वेज बनाई गई थीं। प्रारम्भिक कंप्यूटरों की सीमित मुख्य मेमोरी क्षमता के कारण जब पहला कंपाइलर डिजाइन किया गया था तो काफी तकनीकी चुनौतियों का सामना करना पड़ा था। इसलिए, संकलन प्रक्रिया को कई छोटे कार्यक्रमों में विभाजित करने की आवश्यकता थी। फ्रंट एंड प्रोग्राम लक्ष्य कोड उत्पन्न करने के लिए बैक एंड प्रोग्राम द्वारा उपयोग किए जाने वाले विश्लेषण उत्पादों का उत्पादन करते हैं। जैसा कि कंप्यूटर प्रौद्योगिकी ने अधिक संसाधन प्रदान किए, संकलक डिजाइन संकलन प्रक्रिया के साथ अपेक्षाकृत अधिक ढंग से संरेखित हो सकते हैं।


सामान्यतः एक प्रोग्रामर के लिए उच्च-स्तरीय भाषा का उपयोग करना अधिक उत्पादक होता है, इसलिए उच्च-स्तरीय भाषाओं का विकास स्वाभाविक रूप से डिजिटल कंप्यूटर द्वारा प्रदान की जाने वाली क्षमताओं से होता है। उच्च-स्तरीय भाषाएँ [[औपचारिक भाषा]]एँ हैं जिन्हें उनके वाक्य-विन्यास और [[शब्दार्थ (कंप्यूटर विज्ञान)]] द्वारा सख्ती से परिभाषित किया जाता है जो उच्च-स्तरीय भाषा वास्तुकला का निर्माण करते हैं। इन औपचारिक भाषाओं के तत्वों में सम्मिलित हैं:
सामान्यतः एक प्रोग्रामर के लिए उच्च-स्तरीय भाषा का उपयोग करना अधिक उत्पादक होता है, इसलिए उच्च-स्तरीय भाषाओं का विकास स्वाभाविक रूप से डिजिटल कंप्यूटर द्वारा प्रदान की जाने वाली क्षमताओं से होता है। उच्च-स्तरीय भाषाएँ [[औपचारिक भाषा]]एँ हैं जिन्हें उनके वाक्य-विन्यास और [[शब्दार्थ (कंप्यूटर विज्ञान)]] द्वारा सख्ती से परिभाषित किया जाता है जो उच्च-स्तरीय भाषा वास्तुकला का निर्माण करते हैं। इन औपचारिक भाषाओं के तत्वों में सम्मिलित हैं:
Line 32: Line 32:
1940 के दशक में, [[कोनराड ज़्यूस]] ने प्लैंकलकुल (प्लान कैलकुलस) नामक एक एल्गोरिथम प्रोग्रामिंग भाषा तैयार की। जबकि 1970 के दशक तक कोई वास्तविक कार्यान्वयन नहीं हुआ था, इसने बाद में 1950 के दशक के अंत में केन इवरसन द्वारा डिज़ाइन की गई APL (प्रोग्रामिंग भाषा) में देखी गई अवधारणाओं को प्रस्तुत किया।<ref>{{cite book |title=एक प्रोग्रामिंग भाषा|url=https://archive.org/details/programminglangu00iver_0 |url-access=registration |first=Kenneth E. |last=Iverson |isbn=978-0-471430-14-8 |publisher=John Wiley & Sons |date=1962}}</ref> एपीएल गणितीय संगणनाओं के लिए एक भाषा है।
1940 के दशक में, [[कोनराड ज़्यूस]] ने प्लैंकलकुल (प्लान कैलकुलस) नामक एक एल्गोरिथम प्रोग्रामिंग भाषा तैयार की। जबकि 1970 के दशक तक कोई वास्तविक कार्यान्वयन नहीं हुआ था, इसने बाद में 1950 के दशक के अंत में केन इवरसन द्वारा डिज़ाइन की गई APL (प्रोग्रामिंग भाषा) में देखी गई अवधारणाओं को प्रस्तुत किया।<ref>{{cite book |title=एक प्रोग्रामिंग भाषा|url=https://archive.org/details/programminglangu00iver_0 |url-access=registration |first=Kenneth E. |last=Iverson |isbn=978-0-471430-14-8 |publisher=John Wiley & Sons |date=1962}}</ref> एपीएल गणितीय संगणनाओं के लिए एक भाषा है।


डिजिटल कंप्यूटिंग के प्रारंभिक वर्षों के दौरान उच्च स्तरीय भाषा डिजाइन ने विभिन्न प्रकार के अनुप्रयोगों के लिए उपयोगी प्रोग्रामिंग उपकरण प्रदान किए:
डिजिटल कंप्यूटिंग के प्रारंभिक वर्षों के समय उच्च स्तरीय भाषा डिजाइन ने विभिन्न प्रकार के अनुप्रयोगों के लिए उपयोगी प्रोग्रामिंग उपकरण प्रदान किए:
* इंजीनियरिंग और विज्ञान अनुप्रयोगों के लिए [[फोरट्रान]] (फॉर्मूला ट्रांसलेशन) को पहली उच्च स्तरीय भाषा माना जाता है।<ref>{{cite book |first=John |last=Backus |chapter=The history of FORTRAN I, II and III |website=Softwarepreservation.org |title=प्रोग्रामिंग भाषाओं का इतिहास|chapter-url=http://www.softwarepreservation.org/projects/FORTRAN/paper/p25-backus.pdf |archive-url=https://ghostarchive.org/archive/20221010/http://www.softwarepreservation.org/projects/FORTRAN/paper/p25-backus.pdf |archive-date=2022-10-10 |url-status=live}}</ref>
* इंजीनियरिंग और विज्ञान अनुप्रयोगों के लिए [[फोरट्रान]] (फॉर्मूला ट्रांसलेशन) को पहली उच्च स्तरीय भाषा माना जाता है।<ref>{{cite book |first=John |last=Backus |chapter=The history of FORTRAN I, II and III |website=Softwarepreservation.org |title=प्रोग्रामिंग भाषाओं का इतिहास|chapter-url=http://www.softwarepreservation.org/projects/FORTRAN/paper/p25-backus.pdf |archive-url=https://ghostarchive.org/archive/20221010/http://www.softwarepreservation.org/projects/FORTRAN/paper/p25-backus.pdf |archive-date=2022-10-10 |url-status=live}}</ref>
* [[COBOL]] (कॉमन बिजनेस-ओरिएंटेड लैंग्वेज) [[ए-0 प्रणाली]] | A-0 और [[फ्लो-Matic]] से विकसित होकर व्यावसायिक अनुप्रयोगों के लिए प्रमुख उच्च-स्तरीय भाषा बन गई।<ref>Porter Adams, Vicki (5 October 1981). "Captain Grace M. Hopper: the Mother of COBOL". InfoWorld. 3 (20): 33. ISSN 0199-6649.</ref>
* [[COBOL]] (कॉमन बिजनेस-ओरिएंटेड लैंग्वेज) [[ए-0 प्रणाली]] | A-0 और [[फ्लो-Matic]] से विकसित होकर व्यावसायिक अनुप्रयोगों के लिए प्रमुख उच्च-स्तरीय भाषा बन गई।<ref>Porter Adams, Vicki (5 October 1981). "Captain Grace M. Hopper: the Mother of COBOL". InfoWorld. 3 (20): 33. ISSN 0199-6649.</ref>
Line 86: Line 86:
[[वन-पास कंपाइलर]] में संकलन करने की क्षमता को शास्त्रीय रूप से एक लाभ के रूप में देखा गया है क्योंकि यह एक कंपाइलर लिखने के काम को सरल करता है और एक-पास कंपाइलर सामान्यतः [[बहु-पास संकलक]] की तुलना में तेजी से संकलन करता है। इस प्रकार, प्रारंभिक प्रणालियों की संसाधन सीमाओं द्वारा आंशिक रूप से संचालित, कई प्रारंभिक भाषाओं को विशेष रूप से डिज़ाइन किया गया था ताकि उन्हें एक पास में संकलित किया जा सके (जैसे, [[पास्कल (प्रोग्रामिंग भाषा)]])।
[[वन-पास कंपाइलर]] में संकलन करने की क्षमता को शास्त्रीय रूप से एक लाभ के रूप में देखा गया है क्योंकि यह एक कंपाइलर लिखने के काम को सरल करता है और एक-पास कंपाइलर सामान्यतः [[बहु-पास संकलक]] की तुलना में तेजी से संकलन करता है। इस प्रकार, प्रारंभिक प्रणालियों की संसाधन सीमाओं द्वारा आंशिक रूप से संचालित, कई प्रारंभिक भाषाओं को विशेष रूप से डिज़ाइन किया गया था ताकि उन्हें एक पास में संकलित किया जा सके (जैसे, [[पास्कल (प्रोग्रामिंग भाषा)]])।


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


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


यह फ्रंट/मध्य/बैक-एंड दृष्टिकोण मध्य अंत के अनुकूलन को साझा करते हुए विभिन्न सेंट्रल प्रोसेसिंग यूनिट के लिए बैक एंड के साथ विभिन्न भाषाओं के लिए फ्रंट एंड को जोड़ना संभव बनाता है।<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 116: Line 116:


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


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


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


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


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


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

Revision as of 16:15, 31 December 2022

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

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

कंप्यूटिंग, एक संकलक (कंपाइलर) एक कंप्यूटर प्रोग्राम है जो एक प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा (लक्ष्य भाषा) में अनुवादित करता है। ''संकलक'' नाम मुख्य रूप से उन प्रोग्रामों के लिए उपयोग किया जाता है जो एक एक्जीक्यूटेबल प्रोग्राम बनाने के लिए एक उच्च-स्तरीय प्रोग्रामिंग भाषा से एक निम्न-स्तरीय प्रोग्रामिंग भाषा (जैसे असेंबली भाषा, ऑब्जेक्ट कोड, या मशीन कोड) में स्रोत कोड का अनुवाद करता है।[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] में।</रेफरी>

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

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

एक कंपाइलर निम्न में से कुछ या सभी ऑपरेशन करने की संभावना रखता है, जिन्हें प्रायः चरण कहा जाता है: पूर्वप्रक्रमक, शाब्दिक विश्लेषण, पदच्छेद, सिमेंटिक एनालिसिस (कंपाइलर्स) (सिंटैक्स-निर्देशित अनुवाद), इनपुट प्रोग्राम्स को मध्यवर्ती प्रतिनिधित्व, कोड अनुकूलन और कोड में बदलना। पीढ़ी (संकलक)। संकलक सामान्यतः इन चरणों को मॉड्यूलर घटकों के रूप में लागू करते हैं, कुशल डिजाइन को बढ़ावा देते हैं और लक्ष्य आउटपुट के लिए स्रोत इनपुट के कार्यक्रम परिवर्तनों की शुद्धता को बढ़ावा देते हैं। गलत संकलक व्यवहार के कारण होने वाले प्रोग्राम दोषों को ट्रैक करना और उनके आसपास काम करना अधिक कठिन हो सकता है; इसलिए, संकलक शुद्धता सुनिश्चित करने के लिए संकलक कार्यान्वयनकर्ता महत्वपूर्ण प्रयास करते हैं। रेफ नाम = सूर्य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  अनुवाद प्रक्रिया कंप्यूटर भाषाओं के डिजाइन को प्रभावित करती है, जिससे संकलन या व्याख्या की प्राथमिकता होती है। सिद्धांत रूप में, एक प्रोग्रामिंग भाषा में एक संकलक और दुभाषिया दोनों हो सकते हैं। व्यवहार में, प्रोग्रामिंग भाषाएँ केवल एक (एक संकलक या एक दुभाषिया) से जुड़ी होती हैं।

इतिहास

एक विशिष्ट बहु-भाषा, बहु-लक्ष्य संकलक के संचालन का आरेख

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

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

  • वर्णमाला, प्रतीकों का कोई परिमित सेट;
  • स्ट्रिंग, प्रतीकों का एक परिमित अनुक्रम;
  • भाषा, वर्णमाला पर तारों का कोई सेट।

किसी भाषा में वाक्यों को नियमों के एक समूह द्वारा परिभाषित किया जा सकता है जिसे व्याकरण कहा जाता है।[3] बैकस-नौर फॉर्म (बीएनएफ) एक भाषा के वाक्यों के सिंटैक्स का वर्णन करता है और जॉन बैकस द्वारा एल्गोल 60 के सिंटैक्स के लिए इस्तेमाल किया गया था।[4] ये विचार एक भाषाविद् नोम चौमस्की द्वारा संदर्भ-मुक्त व्याकरण अवधारणाओं से प्राप्त हुए हैं।[5] प्रोग्रामिंग नोटेशन के सिंटैक्स का वर्णन करने के लिए बीएनएफ और इसके एक्सटेंशन मानक उपकरण बन गए हैं, और कई मामलों में बीएनएफ विवरण से कंपाइलर्स के हिस्से स्वचालित रूप से उत्पन्न होते हैं।[6] 1940 के दशक में, कोनराड ज़्यूस ने प्लैंकलकुल (प्लान कैलकुलस) नामक एक एल्गोरिथम प्रोग्रामिंग भाषा तैयार की। जबकि 1970 के दशक तक कोई वास्तविक कार्यान्वयन नहीं हुआ था, इसने बाद में 1950 के दशक के अंत में केन इवरसन द्वारा डिज़ाइन की गई APL (प्रोग्रामिंग भाषा) में देखी गई अवधारणाओं को प्रस्तुत किया।[7] एपीएल गणितीय संगणनाओं के लिए एक भाषा है।

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

  • इंजीनियरिंग और विज्ञान अनुप्रयोगों के लिए फोरट्रान (फॉर्मूला ट्रांसलेशन) को पहली उच्च स्तरीय भाषा माना जाता है।[8]
  • COBOL (कॉमन बिजनेस-ओरिएंटेड लैंग्वेज) ए-0 प्रणाली | A-0 और फ्लो-Matic से विकसित होकर व्यावसायिक अनुप्रयोगों के लिए प्रमुख उच्च-स्तरीय भाषा बन गई।[9]
  • लिस्प (प्रोग्रामिंग भाषा) (सूची प्रोसेसर) प्रतीकात्मक संगणना के लिए।[10]

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

  • 1952: मैनचेस्टर विश्वविद्यालय में मैनचेस्टर मार्क I कंप्यूटर के लिए एलिक ग्लेनी द्वारा विकसित एक ऑटोकोड कंपाइलर को कुछ लोगों द्वारा पहली संकलित प्रोग्रामिंग भाषा माना जाता है।
  • 1952: रेमिंगटन रैंड में ग्रेस हूपर की टीम ने A-0 सिस्टम|A-0 प्रोग्रामिंग लैंग्वेज के लिए कंपाइलर लिखा (और इसका वर्णन करने के लिए कंपाइलर शब्द गढ़ा),[12][13] हालांकि A-0 संकलक एक पूर्ण संकलक की आधुनिक धारणा की तुलना में एक लोडर या लिंकर के रूप में अधिक कार्य करता है।
  • 1954-1957: आईबीएम में जॉन बैकस के नेतृत्व में एक टीम ने फोरट्रान विकसित किया जिसे सामान्यतः पहली उच्च-स्तरीय भाषा माना जाता है। 1957 में, उन्होंने एक फोरट्रान संकलक पूरा किया जिसे सामान्यतः पहले स्पष्ट रूप से पूर्ण संकलक के रूप में पेश करने का श्रेय दिया जाता है।
  • 1959: डेटा सिस्टम लैंग्वेज (CODASYL) पर सम्मेलन ने COBOL के विकास की प्रारंभ की। COBOL डिज़ाइन A-0 और FLOW-MATIC पर आकर्षित हुआ। 1960 के दशक के प्रारंभ तक COBOL को कई संरचना पर संकलित किया गया था।
  • 1958-1960: Algol 58, ALGOL 60 का अग्रदूत था। Algol 58 ने ब्लॉक (प्रोग्रामिंग) की प्रारंभ की, जो संरचित प्रोग्रामिंग के उदय में एक महत्वपूर्ण प्रगति थी। ALGOL 60 नेस्टेड समारोह परिभाषाओं को शाब्दिक गुंजाइश के साथ लागू करने वाली पहली भाषा थी। इसमें प्रत्यावर्तन सम्मिलित था। इसका सिंटैक्स बैकस-नौर फॉर्म का उपयोग करके परिभाषित किया गया था। ALGOL 60 ने इसके बाद आने वाली कई भाषाओं को प्रेरित किया। टोनी होरे ने टिप्पणी की: ... यह न केवल अपने पूर्ववर्तियों पर बल्कि इसके लगभग सभी उत्तराधिकारियों में भी सुधार था।[14][15]
  • 1958-1962: एमआईटी में जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) ने लिस्प (प्रोग्रामिंग लैंग्वेज) डिजाइन किया।[16] प्रतीक प्रसंस्करण क्षमताओं ने कृत्रिम बुद्धिमत्ता अनुसंधान के लिए उपयोगी सुविधाएँ प्रदान कीं। 1962 में, LISP 1.5 रिलीज़ ने कुछ उपकरणों का उल्लेख किया: स्टीफन रसेल और डैनियल जे। एडवर्ड्स द्वारा लिखित एक दुभाषिया, टिम हार्ट और माइक लेविन द्वारा लिखित एक संकलक और असेंबलर।[17]

प्रारम्भिक ऑपरेटिंग सिस्टम और सॉफ्टवेयर असेंबली लैंग्वेज में लिखे गए थे। 1960 और 1970 के दशक के प्रारंभ में, सिस्टम प्रोग्रामिंग के लिए उच्च-स्तरीय भाषाओं का उपयोग संसाधन सीमाओं के कारण अभी भी विवादास्पद था। हालांकि, कई शोध और उद्योग प्रयासों ने उच्च-स्तरीय सिस्टम बी (प्रोग्रामिंग भाषा) ओर बदलाव प्रारंभ किया, उदाहरण के लिए, BCPL, BLISS, B (प्रोग्रामिंग लैंग्वेज), और C (प्रोग्रामिंग लैंग्वेज)।

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

BLISS (बेसिक लैंग्वेज फॉर इंप्लीमेंटेशन ऑफ सिस्टम सॉफ्टवेयर) को डिजिटल इक्विपमेंट कॉरपोरेशन (DEC) PDP-10 कंप्यूटर के लिए WA Wulf's Carnegie Mellon University (CMU) रिसर्च टीम द्वारा विकसित किया गया था। CMU टीम ने एक साल बाद 1970 में BLISS-11 कंपाइलर विकसित किया।

मॉलटिक्स (मल्टीप्लेक्स सूचना और कंप्यूटिंग सेवा), एक टाइम-शेयरिंग ऑपरेटिंग सिस्टम प्रोजेक्ट, जिसमें एमआईटी, बेल लैब्स, जनरल इलेक्ट्रिक (बाद में हनीवेल) सम्मिलित थे और इसका नेतृत्व एमआईटी के फर्नांडो जे कॉर्बेटो | फर्नांडो कॉर्बेटो ने किया था।[21] मल्टिक्स आईबीएम और आईबीएम उपयोगकर्ता समूह द्वारा विकसित पीएल/आई भाषा में लिखा गया था।[22] आईबीएम का लक्ष्य व्यापार, वैज्ञानिक और सिस्टम प्रोग्रामिंग आवश्यकताओं को पूरा करना था। ऐसी अन्य भाषाएँ थीं जिन पर विचार किया जा सकता था लेकिन PL/I ने सबसे पूर्ण समाधान की पेशकश की, भले ही इसे लागू नहीं किया गया था।[23] मल्टिक्स प्रोजेक्ट के पहले कुछ वर्षों के लिए, बेल लैब्स से डॉग मैक्लोरी और बॉब मॉरिस द्वारा अर्ली पीएल/आई (ईपीएल) कंपाइलर के साथ भाषा के एक सबसेट को असेंबली भाषा में संकलित किया जा सकता है।[24] ईपीएल ने परियोजना का तब तक समर्थन किया जब तक कि पूर्ण पीएल/आई के लिए बूट-स्ट्रैपिंग कंपाइलर विकसित नहीं किया जा सका।[25] बेल लैब्स ने 1969 में मल्टिक्स प्रोजेक्ट को छोड़ दिया, और डेनिस रिची और केन थॉम्पसन द्वारा लिखित BCPL अवधारणाओं पर आधारित एक सिस्टम प्रोग्रामिंग लैंग्वेज B (प्रोग्रामिंग लैंग्वेज) विकसित की। रिची ने बी के लिए बूट-स्ट्रैपिंग कंपाइलर बनाया और बी में पीडीपी-7 के लिए यूनिक्स (यूनिप्लेक्स्ड इंफॉर्मेशन एंड कंप्यूटिंग सर्विस) ऑपरेटिंग सिस्टम लिखा। यूनिक्स अंततः वर्तनी यूनिक्स बन गया।

बेल लैब्स ने B और BCPL के आधार पर C (प्रोग्रामिंग लैंग्वेज) का विकास और विस्तार प्रारंभ किया। बीसीपीएल संकलक को बेल लैब्स द्वारा मल्टिक्स में ले जाया गया था और बेल लैब्स में बीसीपीएल एक पसंदीदा भाषा थी।[26] प्रारंभ में, बेल लैब्स के बी कंपाइलर के लिए एक फ्रंट-एंड प्रोग्राम का उपयोग किया गया था, जबकि एक सी कंपाइलर विकसित किया गया था। 1971 में, एक नए PDP-11 ने B को एक्सटेंशन परिभाषित करने और कंपाइलर को फिर से लिखने के लिए संसाधन प्रदान किया। 1973 तक सी भाषा का डिजाइन अनिवार्य रूप से पूरा हो गया था और पीडीपी-11 के लिए यूनिक्स कर्नेल को सी में फिर से लिखा गया था। स्टीव जॉनसन ने पोर्टेबल सी कंपाइलर (पीसीसी) का विकास प्रारंभ किया ताकि नई मशीनों के लिए सी कंपाइलर्स के रिटारगेटिंग का समर्थन किया जा सके।[27][28] वस्तु उन्मुख कार्यकर्म (ओओपी) ने अनुप्रयोग विकास और रखरखाव के लिए कुछ दिलचस्प संभावनाएं पेश कीं। OOP अवधारणाएँ और पीछे जाती हैं लेकिन LISP और प्रारम्भिक भाषा विज्ञान का भाग थीं।[29] बेल लैब्स में, C++ का विकास OOP में रुचि लेने लगा।[30] C++ का पहली बार उपयोग 1980 में सिस्टम प्रोग्रामिंग के लिए किया गया था। प्रारंभिक डिजाइन ने सिमुला अवधारणाओं के साथ सी भाषा प्रणाली प्रोग्रामिंग क्षमताओं का लाभ उठाया। ऑब्जेक्ट-ओरिएंटेड सुविधाओं को 1983 में जोड़ा गया था।[31] Cfront प्रोग्राम ने C84 लैंग्वेज कंपाइलर के लिए C++ फ्रंट-एंड लागू किया। बाद के वर्षों में C++ की लोकप्रियता बढ़ने के साथ कई C++ कंपाइलर विकसित किए गए।

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

DARPA (डिफेंस एडवांस्ड रिसर्च प्रोजेक्ट्स एजेंसी) ने 1970 में Wulf की CMU रिसर्च टीम के साथ एक कंपाइलर प्रोजेक्ट प्रायोजित किया। प्रोडक्शन क्वालिटी कंपाइलर-कंपाइलर PQCC डिज़ाइन स्रोत भाषा और लक्ष्य की औपचारिक परिभाषाओं से प्रोडक्शन क्वालिटी कंपाइलर (PQC) तैयार करेगा।[32] PQCC ने अधिक सफलता के बिना पार्सर जनरेटर (जैसे, Yacc) के रूप में पारंपरिक अर्थ से परे कंपाइलर-कंपाइलर शब्द का विस्तार करने की कोशिश की। PQCC को अधिक उचित रूप से एक कंपाइलर जनरेटर के रूप में संदर्भित किया जा सकता है।

कोड जनरेशन प्रक्रिया में PQCC अनुसंधान वास्तव में स्वचालित संकलक-लेखन प्रणाली बनाने की मांग करता है। प्रयास ने PQC की चरण संरचना की खोज की और डिजाइन किया। ब्लिस-11 संकलक ने प्रारंभिक संरचना प्रदान की।[33] चरणों में विश्लेषण (फ्रंट एंड), वर्चुअल मशीन (मध्य अंत) में मध्यवर्ती अनुवाद और लक्ष्य (बैक एंड) में अनुवाद सम्मिलित हैं। मध्यवर्ती प्रतिनिधित्व में भाषा विशिष्ट निर्माणों को संभालने के लिए पीक्यूसीसी अनुसंधान के लिए टीसीओएल विकसित किया गया था।[34] TCOL के विभिन्न रूपों ने विभिन्न भाषाओं का समर्थन किया। PQCC परियोजना ने स्वचालित संकलक निर्माण की तकनीकों की जांच की। डिजाइन अवधारणाएं (1995 से, ऑब्जेक्ट-ओरिएंटेडएडा (प्रोग्रामिंग भाषा) एडा (प्रोग्रामिंग लैंग्वेज) के लिए कंपाइलर्स और कंपाइलर्स के अनुकूलन में उपयोगी साबित हुईं।

एडा स्टोनमैन दस्तावेज़[citation needed] कर्नेल (केएपीएसई) और न्यूनतम (एमएपीएसई) के साथ कार्यक्रम समर्थन पर्यावरण (एपीएसई) को औपचारिक रूप दिया। एक एडीए दुभाषिया एनवाईयू/ईडी ने अमेरिकी राष्ट्रीय मानक संस्थान (एएनएसआई) और अंतर्राष्ट्रीय मानक संगठन (आईएसओ) के साथ विकास और मानकीकरण प्रयासों का समर्थन किया। अमेरिकी सैन्य सेवाओं द्वारा आरंभिक एडीए संकलक विकास में स्टोनमैन दस्तावेज़ की तर्ज पर एक पूर्ण एकीकृत डिजाइन वातावरण में संकलक सम्मिलित थे। सेना और नौसेना ने एडीए लैंग्वेज सिस्टम (एएलएस) परियोजना पर काम किया, जो डीईसी/वैक्स संरचना को लक्षित था, जबकि वायु सेना ने एडीए इंटीग्रेटेड एनवायरनमेंट (एआईई) पर आईबीएम 370 श्रृंखला को लक्षित किया। जबकि परियोजनाओं ने वांछित परिणाम प्रदान नहीं किए, उन्होंने एडीए विकास पर समग्र प्रयास में योगदान दिया।[35] अन्य Ada संकलक प्रयास ब्रिटेन में यॉर्क विश्वविद्यालय में और जर्मनी में कार्लज़ूए विश्वविद्यालय में चल रहे थे। अमेरिका में, वर्डिक्स (बाद में तर्कसंगत द्वारा अधिग्रहित) ने वर्डिक्स एडीए डेवलपमेंट सिस्टम (वीएडीएस) को सेना को दिया। वीएडीएस ने एक कंपाइलर सहित विकास उपकरण का एक सेट प्रदान किया। यूनिक्स/वीएडीएस को विभिन्न प्रकार के यूनिक्स प्लेटफार्मों पर होस्ट किया जा सकता है जैसे डीईसी अल्ट्रिक्स और सन 3/60 सोलारिस को आर्मी सीईसीओएम मूल्यांकन में मोटोरोला 68020 पर लक्षित किया गया है।[36] जल्द ही कई Ada कंपाइलर उपलब्ध थे जो Ada Validation टेस्ट पास कर चुके थे। फ्री सॉफ्टवेयर फाउंडेशन जीएनयू प्रोजेक्ट ने जीएनयू संकलक संग्रह (जीसीसी) विकसित किया है जो कई भाषाओं और लक्ष्यों का समर्थन करने के लिए एक प्रमुख क्षमता प्रदान करता है। Ada संस्करण GNAT सबसे व्यापक रूप से उपयोग किए जाने वाले Ada संकलकों में से एक है। GNAT मुफ़्त है लेकिन व्यावसायिक समर्थन भी है, उदाहरण के लिए, AdaCore की स्थापना 1994 में Ada के लिए व्यावसायिक सॉफ़्टवेयर समाधान प्रदान करने के लिए की गई थी। जीएनएटी प्रो में जीएनयू जीसीसी आधारित जीएनएटी सम्मिलित है जिसमें एक एकीकृत विकास वातावरण प्रदान करने के लिए एक टूल सूट है।

उच्च-स्तरीय भाषाओं ने संकलक अनुसंधान और विकास को चलाना जारी रखा। फोकस क्षेत्रों में अनुकूलन और स्वचालित कोड जनरेशन सम्मिलित हैं। प्रोग्रामिंग भाषाओं और विकास के वातावरण में रुझान ने कंपाइलर तकनीक को प्रभावित किया। अधिक संकलक भाषा वितरण (PERL, जावा डेवलपमेंट किट) और एक IDE (VADS, ग्रहण, Ada Pro) के एक घटक के रूप में सम्मिलित हो गए। प्रौद्योगिकियों के अंतर्संबंध और अन्योन्याश्रय में वृद्धि हुई। वेब सेवाओं के आगमन ने वेब भाषाओं और स्क्रिप्टिंग भाषाओं के विकास को बढ़ावा दिया। स्क्रिप्ट्स कमांड लाइन इंटरफेस (सीएलआई) के प्रारम्भिक दिनों में वापस आती हैं जहां उपयोगकर्ता सिस्टम द्वारा निष्पादित किए जाने वाले आदेशों को दर्ज कर सकता है। शेल प्रोग्राम लिखने के लिए भाषाओं के साथ उपयोगकर्ता शैल अवधारणाएँ विकसित हुईं। प्रारम्भिक विंडोज डिजाइनों ने एक साधारण बैच प्रोग्रामिंग क्षमता की पेशकश की। इन भाषाओं के पारंपरिक परिवर्तन में एक दुभाषिया का इस्तेमाल किया गया था। जबकि व्यापक रूप से उपयोग नहीं किया जाता है, बैश और बैच कंपाइलर लिखे गए हैं। हाल ही में परिष्कृत व्याख्या की गई भाषाएं डेवलपर टूल किट का भाग बन गईं। आधुनिक स्क्रिप्टिंग भाषाओं में PHP, Python, Ruby और Lua सम्मिलित हैं। (लुआ व्यापक रूप से खेल के विकास में उपयोग किया जाता है।) इन सभी में दुभाषिया और संकलक समर्थन है।[37] जब 50 के दशक के उत्तरार्ध में संकलन का क्षेत्र प्रारंभ हुआ, तो इसका ध्यान उच्च-स्तरीय भाषा कार्यक्रमों के मशीन कोड में अनुवाद तक सीमित था ... संकलक क्षेत्र कंप्यूटर वास्तुकला, प्रोग्रामिंग भाषाओं, औपचारिक तरीकों, सॉफ्टवेयर सहित अन्य विषयों के साथ तेजी से जुड़ा हुआ है। इंजीनियरिंग, और कंप्यूटर सुरक्षा।[38] द कंपाइलर रिसर्च: द नेक्स्ट 50 इयर्स आर्टिकल ने ऑब्जेक्ट-ओरिएंटेड लैंग्वेज और जावा के महत्व पर ध्यान दिया। भविष्य के अनुसंधान लक्ष्यों में सुरक्षा और समानांतर कंप्यूटिंग का हवाला दिया गया।

संकलक निर्माण

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

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

एक व्यक्ति द्वारा लिखी गई अपेक्षाकृत सरल भाषा के लिए एक संकलक सॉफ्टवेयर का एक एकल, अखंड टुकड़ा हो सकता है। हालाँकि, जैसे-जैसे स्रोत भाषा जटिलता में बढ़ती है, डिज़ाइन को कई अन्योन्याश्रित चरणों में विभाजित किया जा सकता है। अलग-अलग चरण डिजाइन सुधार प्रदान करते हैं जो संकलन प्रक्रिया में कार्यों पर विकास पर ध्यान केंद्रित करते हैं।

एक-पास बनाम मल्टी-पास कंपाइलर

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

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

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

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

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

तीन चरण संकलक संरचना

संकलक डिजाइन

संकलक डिजाइन में चरणों की सटीक संख्या के बावजूद, चरणों को तीन चरणों में से एक को सौंपा जा सकता है। चरणों में एक फ्रंट एंड, एक मिडिल एंड और एक बैक एंड सम्मिलित है।

  • फ्रंट एंड इनपुट को स्कैन करता है और एक विशिष्ट स्रोत भाषा के अनुसार सिंटैक्स और सिमेंटिक्स की पुष्टि करता है। टाइप सिस्टम के लिए यह टाइप की जानकारी एकत्र करके प्रकार की जाँच करता है। यदि इनपुट प्रोग्राम वाक्यात्मक रूप से गलत है या इसमें टाइप त्रुटि है, तो यह त्रुटि और/या चेतावनी संदेश उत्पन्न करता है, सामान्यतः स्रोत कोड में उस स्थान की पहचान करता है जहां समस्या का पता चला था; कुछ मामलों में वास्तविक त्रुटि कार्यक्रम में पहले (बहुत) हो सकती है। फ्रंट एंड के पहलुओं में लेक्सिकल एनालिसिस, सिंटैक्स एनालिसिस और सिमेंटिक एनालिसिस सम्मिलित हैं। मध्य छोर द्वारा आगे की प्रक्रिया के लिए फ्रंट एंड इनपुट प्रोग्राम को एक मध्यवर्ती प्रतिनिधित्व (IR) में बदल देता है। यह आईआर सामान्यतः स्रोत कोड के संबंध में कार्यक्रम का निम्न स्तर का प्रतिनिधित्व है।
  • मध्य अंत आईआर पर अनुकूलन करता है जो लक्षित सीपीयू संरचना से स्वतंत्र होते हैं। इस स्रोत कोड/मशीन कोड स्वतंत्रता का उद्देश्य विभिन्न भाषाओं और लक्ष्य प्रोसेसर का समर्थन करने वाले संकलक के संस्करणों के बीच साझा किए जाने वाले सामान्य अनुकूलन को सक्षम करना है। मिडिल एंड ऑप्टिमाइज़ेशन के उदाहरण बेकार (डेड-कोड उन्मूलन) या अगम्य कोड (पहुंच क्षमता विश्लेषण) को हटाना, निरंतर मूल्यों की खोज और प्रसार (निरंतर प्रचार), कम बार-बार निष्पादित स्थान पर गणना का स्थानांतरण (जैसे, लूप से बाहर) ), या संदर्भ के आधार पर गणना की विशेषज्ञता, अंततः अनुकूलित आईआर का उत्पादन करती है जिसका उपयोग बैक एंड द्वारा किया जाता है।
  • पिछला अंत मध्य छोर से अनुकूलित IR लेता है। यह अधिक विश्लेषण, परिवर्तन और अनुकूलन कर सकता है जो लक्ष्य सीपीयू संरचना के लिए विशिष्ट हैं। बैक एंड लक्ष्य-निर्भर असेंबली कोड उत्पन्न करता है, प्रक्रिया में रजिस्टर आवंटन करता है। बैक एंड निर्देश समयबद्धन करता है, जो देरी स्लॉट को भरकर समानांतर एक्जीक्यूटेबल इकाइयों को व्यस्त रखने के निर्देशों को फिर से आदेश देता है। हालांकि अधिकांश अनुकूलन समस्याएं एनपी-कठोरता | एनपी-हार्ड हैं, उन्हें हल करने के लिए ह्यूरिस्टिक (कंप्यूटर विज्ञान) तकनीकें अच्छी तरह से विकसित हैं और वर्तमान में उत्पादन-गुणवत्ता वाले कंपाइलरों में लागू हैं। सामान्यतः बैक एंड का आउटपुट एक विशेष प्रोसेसर और ऑपरेटिंग सिस्टम के लिए विशिष्ट मशीन कोड होता है।

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

फ्रंट एंड

संदर्भ-मुक्त भागों को संभालते हैं।

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

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

फ्रंट एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं:

  • Line reconstructionपार्सर के लिए तैयार इनपुट वर्ण अनुक्रम को एक विहित रूप में परिवर्तित करता है। भाषाएं जो अपने खोजशब्दों को स्ट्रॉपिंग (वाक्यविन्यास) करती हैं या पहचानकर्ताओं के भीतर मनमाने ढंग से रिक्त स्थान की स्वीकृति देती हैं, उन्हें इस चरण की आवश्यकता होती है। 1960 के दशक में उपयोग किए जाने वाले टॉप-डाउन पार्सिंग|टॉप-डाउन, पुनरावर्ती वंश पार्सर|रिकर्सिव-डिसेंट, टेबल-ड्रिवन पार्सर्स सामान्यतः स्रोत को एक समय में एक वर्ण पढ़ते हैं और इसके लिए एक अल्गोल टोकनिंग चरण की आवश्यकता नहीं होती है। एटलस ऑटोकोड और एडिनबर्ग आईएमपी (और एएलजीओएल और मूंगा 66 के कुछ कार्यान्वयन) सीमित भाषाओं के उदाहरण हैं जिनके संकलक के पास लाइन पुनर्निर्माण चरण होगा।
  • प्रीप्रोसेसर मैक्रो (कंप्यूटर विज्ञान) प्रतिस्थापन और सशर्त संकलन का समर्थन करता है। सामान्यतः प्रीप्रोसेसिंग चरण सिंटैक्टिक या सिमेंटिक विश्लेषण से पहले होता है; उदा. सी के मामले में, प्रीप्रोसेसर वाक्यात्मक रूपों के बजाय शाब्दिक टोकन में हेरफेर करता है। हालाँकि, कुछ भाषाएँ जैसे कि स्कीम (प्रोग्रामिंग लैंग्वेज) सिंटैक्टिक रूपों के आधार पर मैक्रो प्रतिस्थापन का समर्थन करती हैं।
  • लेक्सिकल एनालिसिस (जिसे लेक्सिंग या टोकेनाइजेशन के रूप में भी जाना जाता है) सोर्स कोड टेक्स्ट को लेक्सिकल टोकन कहे जाने वाले छोटे टुकड़ों के अनुक्रम में तोड़ देता है।[41] इस चरण को दो चरणों में विभाजित किया जा सकता है: स्कैनिंग, जो इनपुट टेक्स्ट को लेक्सेम नामक सिंटैक्टिक इकाइयों में विभाजित करती है और उन्हें एक श्रेणी प्रदान करती है; और मूल्यांकन, जो लेक्सेम को संसाधित मूल्य में परिवर्तित करता है। एक टोकन एक जोड़ी है जिसमें एक टोकन नाम और एक वैकल्पिक टोकन मान होता है।[42] सामान्य टोकन श्रेणियों में पहचानकर्ता, कीवर्ड, विभाजक, ऑपरेटर, शाब्दिक और टिप्पणियां सम्मिलित हो सकती हैं, हालांकि टोकन श्रेणियों का सेट विभिन्न प्रोग्रामिंग भाषाओं में भिन्न होता है। लेक्सेम सिंटैक्स सामान्यतः एक नियमित भाषा है, इसलिए इसे पहचानने के लिए एक नियमित अभिव्यक्ति से निर्मित एक परिमित अवस्था ऑटोमेटन का उपयोग किया जा सकता है। लेक्सिकल एनालिसिस करने वाले सॉफ्टवेयर को शाब्दिक विश्लेषक कहा जाता है। यह एक अलग कदम नहीं हो सकता है - इसे स्कैनर रहित पार्सिंग में पार्सिंग चरण के साथ जोड़ा जा सकता है, इस मामले में पार्सिंग चरित्र स्तर पर की जाती है, टोकन स्तर पर नहीं।
  • सिंटैक्स विश्लेषण (पार्सिंग के रूप में भी जाना जाता है) में प्रोग्राम की सिंटैक्टिक संरचना की पहचान करने के लिए टोकन अनुक्रम को पार्स करना सम्मिलित है। यह चरण सामान्यतः एक पार्स पेड़ बनाता है, जो एक औपचारिक व्याकरण के नियमों के अनुसार निर्मित वृक्ष संरचना के साथ टोकन के रैखिक अनुक्रम को बदलता है जो भाषा के वाक्य-विन्यास को परिभाषित करता है। पार्स ट्री का प्रायः विश्लेषण, संवर्द्धन और कंपाइलर में बाद के चरणों द्वारा रूपांतरित किया जाता है।[43]
  • सिमेंटिक एनालिसिस (कंपाइलर) पार्स ट्री में सिमेंटिक जानकारी जोड़ता है और सिंबल टेबल बनाता है। यह चरण सिमेंटिक चेक करता है जैसे कि टाइप चेकिंग (टाइप एरर के लिए चेकिंग), या वस्तु बंधन (वैरिएबल और फंक्शन रेफरेंस को उनकी परिभाषाओं के साथ जोड़ना), या निश्चित निश्चित असाइनमेंट विश्लेषणउपयोग से पहले सभी स्थानीय वैरिएबल को इनिशियलाइज़ करने की आवश्यकता होती है), गलत प्रोग्राम को अस्वीकार करना या चेतावनी जारी करना। सिमेंटिक विश्लेषण के लिए सामान्यतः एक पूर्ण पार्स ट्री की आवश्यकता होती है, जिसका अर्थ है कि यह चरण तार्किक रूप से पार्सिंग चरण का अनुसरण करता है, और तार्किक रूप से कोड जनरेशन (कंपाइलर) चरण से पहले होता है, हालांकि एक कंपाइलर कार्यान्वयन में कोड के ऊपर एक पास में कई चरणों को मोड़ना प्रायः संभव होता है।

मध्य भाग

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

मध्य अंत के मुख्य चरणों में निम्नलिखित सम्मिलित हैं:

संकलक विश्लेषण किसी भी संकलक अनुकूलन के लिए पूर्वापेक्षा है, और वे एक साथ कसकर काम करते हैं। उदाहरण के लिए, लूप परिवर्तन के लिए निर्भरता विश्लेषण महत्वपूर्ण है।

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

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

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

बैक एंड

बैक एंड सीपीयू संरचना विशिष्ट अनुकूलन और कोड जनरेशन (कंपाइलर) के लिए जिम्मेदार है[44].

बैक एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं:

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

संकलक शुद्धता

कंपाइलर शुद्धता सॉफ्टवेयर इंजीनियरिंग की शाखा है जो यह दिखाने की कोशिश करती है कि एक कंपाइलर अपनी प्रोग्रामिंग भाषा के अनुसार व्यवहार करता है।[citation needed] तकनीकों में औपचारिक तरीकों का उपयोग करके कंपाइलर विकसित करना और सम्मिलित कंपाइलर पर कठोर परीक्षण (जिसे प्रायः कंपाइलर सत्यापन कहा जाता है) का उपयोग करना सम्मिलित है।

संकलित बनाम व्याख्या की गई भाषाएँ

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

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

इसके अलावा, अनुकूलन के लिए संकलक में दुभाषिया कार्यक्षमता हो सकती है, और दुभाषियों में समय संकलन तकनीकों से पहले सम्मिलित हो सकते हैं। उदाहरण के लिए, जहां संकलन के समय एक अभिव्यक्ति को निष्पादित किया जा सकता है और परिणाम आउटपुट प्रोग्राम में डाला जा सकता है, तो यह प्रोग्राम चलने पर हर बार पुनर्गणना करने से रोकता है, जो अंतिम कार्यक्रम को बहुत तेज कर सकता है। समय-समय पर संकलन और बाईटकोड की ओर आधुनिक रुझान कई बार संकलक और दुभाषियों के पारंपरिक वर्गीकरण को और भी धुंधला कर देते हैं।

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

प्रकार

कम्पाइलरों का एक वर्गीकरण कम्प्यूटिंग मंच द्वारा होता है, जिस पर उनका उत्पन्न कोड निष्पादित होता है। इसे लक्ष्य मंच के रूप में जाना जाता है।

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

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

निम्न स्तर की भाषा जो एक संकलक का लक्ष्य है, वह स्वयं एक उच्च स्तरीय प्रोग्रामिंग भाषा हो सकती है। सी, जिसे कुछ लोगों द्वारा पोर्टेबल असेंबली भाषा के रूप में देखा जाता है, प्रायः ऐसे कंपाइलरों की लक्ष्य भाषा होती है। उदाहरण के लिए, C++ के लिए मूल संकलक, Cfront ने C को अपनी लक्ष्य भाषा के रूप में उपयोग किया। इस तरह के एक कंपाइलर द्वारा उत्पन्न सी कोड सामान्यतः मनुष्यों द्वारा पठनीय और बनाए रखने का इरादा नहीं होता है, इसलिए इंडेंट शैली और सुंदर सी इंटरमीडिएट कोड बनाने पर ध्यान नहीं दिया जाता है। सी की कुछ विशेषताएं जो इसे एक अच्छी लक्षित भाषा बनाती हैं उनमें सी प्रीप्रोसेसर # विशेष मैक्रोज़ और निर्देश सम्मिलित हैं|#lineनिर्देश, जो संकलक द्वारा मूल स्रोत के डिबगिंग का समर्थन करने के लिए उत्पन्न किया जा सकता है, और सी कंपाइलर्स के साथ उपलब्ध व्यापक मंच समर्थन।

जबकि एक सामान्य संकलक प्रकार मशीन कोड को आउटपुट करता है, कई अन्य प्रकार हैं:

  • सोर्स-टू-सोर्स कंपाइलर एक प्रकार का कंपाइलर है जो एक उच्च-स्तरीय भाषा को अपने इनपुट के रूप में लेता है और एक उच्च-स्तरीय भाषा को आउटपुट करता है। उदाहरण के लिए, एक स्वचालित समानांतरकरण संकलक प्रायः एक उच्च-स्तरीय भाषा कार्यक्रम को एक इनपुट के रूप में लेता है और फिर कोड को रूपांतरित करता है और इसे समानांतर कोड एनोटेशन (जैसे ओपनएमपी) या भाषा निर्माण (जैसे फोरट्रान) के साथ एनोटेट करता है। DOALL कथन)। सोर्स-टू-सोर्स कंपाइलर के लिए अन्य शब्द ट्रांसकंपलर या ट्रांसपिलर हैं।[46]
  • बायटेकोड कंपाइलर एक सैद्धांतिक मशीन की असेंबली भाषा को संकलित करते हैं, जैसे कुछ प्रोलॉग कार्यान्वयन
  • जस्ट-इन-टाइम कंपाइलेशन|जस्ट-इन-टाइम कंपाइलर्स (जेआईटी कंपाइलर) रनटाइम तक कंपाइलेशन को टालते हैं। पायथन (प्रोग्रामिंग लैंग्वेज), जावास्क्रिप्ट, स्मॉलटॉक, जावा (प्रोग्रामिंग लैंग्वेज), माइक्रोसॉफ्ट .NET फ्रेमवर्क| .NET की सामान्य मध्यवर्ती भाषा (CIL) और अन्य सहित कई आधुनिक भाषाओं के लिए JIT कंपाइलर सम्मिलित हैं। एक जेआईटी कंपाइलर सामान्यतः दुभाषिया के अंदर चलता है। जब दुभाषिया पता लगाता है कि एक कोड पथ गर्म है, जिसका अर्थ है कि इसे प्रायः निष्पादित किया जाता है, जेआईटी कंपाइलर को लागू किया जाएगा और बढ़ते प्रदर्शन के लिए गर्म कोड संकलित किया जाएगा।
    • कुछ भाषाओं के लिए, जैसे कि जावा, एप्लिकेशन को पहले बायटेकोड कंपाइलर का उपयोग करके संकलित किया जाता है और मशीन-स्वतंत्र मध्यवर्ती प्रतिनिधित्व में वितरित किया जाता है। एक बाइटकोड दुभाषिया बाइटकोड निष्पादित करता है, लेकिन जेआईटी कंपाइलर बाइटकोड को मशीन कोड में अनुवादित करेगा जब प्रदर्शन बढ़ाना आवश्यक होगा।[47][non-primary source needed]
  • सिलिकॉन संकलक (संश्लेषण उपकरण के रूप में भी जाना जाता है) ऐसे कंपाइलर हैं जिनका इनपुट एक हार्डवेयर विवरण भाषा है और जिसका आउटपुट एक विवरण है, एक netlist के रूप में या अन्यथा, हार्डवेयर कॉन्फ़िगरेशन का।
  • असेंबलर एक प्रोग्राम है जो मानव पठनीय असेंबली भाषा को मशीन कोड, हार्डवेयर द्वारा निष्पादित वास्तविक निर्देशों को संकलित करता है। उलटा प्रोग्राम जो मशीन कोड को असेंबली लैंग्वेज में ट्रांसलेट करता है, उसे disassembler कहा जाता है।
  • एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह डीकंपलर है।[51][citation needed]
  • एक प्रोग्राम जो एक ऑब्जेक्ट कोड प्रारूप में अनुवाद करता है जो संकलन मशीन पर समर्थित नहीं है, उसे क्रॉस कंपाइलर कहा जाता है और सामान्यतः एम्बेडेड अनुप्रयोगों के लिए कोड तैयार करने के लिए उपयोग किया जाता है।[citation needed][clarification needed]
  • एक प्रोग्राम जो ऑप्टिमाइजेशन और ट्रांसफॉर्मेशन लागू करते समय ऑब्जेक्ट कोड को उसी प्रकार के ऑब्जेक्ट कोड में वापस लिखता है, वह बाइनरी रीकंपाइलर है।

यह भी देखें


संदर्भ

  1. "एनसाइक्लोपीडिया: कंपाइलर की परिभाषा". PCMag.com. Retrieved 2 July 2022.{{cite web}}: CS1 maint: url-status (link)
  2. 2.0 2.1 Compilers: Principles, Techniques, and Tools by Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman - Second Edition, 2007
  3. lecture notes Compilers: Principles, Techniques, and Tools Jing-Shin Chang Department of Computer Science & Information Engineering National Chi-Nan University
  4. Naur, P. et al. "Report on ALGOL 60". Communications of the ACM 3 (May 1960), 299–314.
  5. Chomsky, Noam; Lightfoot, David W. (2002). सिंटैक्टिक संरचनाएं. Walter de Gruyter. ISBN 978-3-11-017279-9.
  6. Gries, David (2012). "Appendix 1: Backus-Naur Form". प्रोग्रामिंग का विज्ञान. Springer Science & Business Media. p. 304. ISBN 978-1461259831.
  7. Iverson, Kenneth E. (1962). एक प्रोग्रामिंग भाषा. John Wiley & Sons. ISBN 978-0-471430-14-8.
  8. Backus, John. "The history of FORTRAN I, II and III" (PDF). प्रोग्रामिंग भाषाओं का इतिहास. Archived (PDF) from the original on 10 October 2022. {{cite book}}: |website= ignored (help)
  9. Porter Adams, Vicki (5 October 1981). "Captain Grace M. Hopper: the Mother of COBOL". InfoWorld. 3 (20): 33. ISSN 0199-6649.
  10. McCarthy, J.; Brayton, R.; Edwards, D.; Fox, P.; Hodes, L.; Luckham, D.; Maling, K.; Park, D.; Russell, S. (March 1960). "LISP I Programmers Manual" (PDF). Boston, Massachusetts: Artificial Intelligence Group, M.I.T. Computation Center and Research Laboratory.
  11. Compilers Principles, Techniques, & Tools 2nd edition by Aho, Lam, Sethi, Ullman ISBN 0-321-48681-1
  12. Hopper, Grace Murray (1952). "कंप्यूटर की शिक्षा". Proceedings of the 1952 ACM National Meeting (Pittsburgh): 243–249. doi:10.1145/609784.609818. S2CID 10081016.
  13. Ridgway, Richard K. (1952). "संकलन दिनचर्या". Proceedings of the 1952 ACM National Meeting (Toronto): 1–5. doi:10.1145/800259.808980. S2CID 14878552.
  14. Hoare, C.A.R. (December 1973). "प्रोग्रामिंग लैंग्वेज डिजाइन पर संकेत" (PDF). p. 27. Archived (PDF) from the original on 10 October 2022. (This statement is sometimes erroneously attributed to Edsger W. Dijkstra, also involved in implementing the first ALGOL 60 compiler.)
  15. Abelson, Hal; Dybvig, R. K.; et al. Rees, Jonathan; Clinger, William (eds.). "एल्गोरिदमिक भाषा योजना पर संशोधित (3) रिपोर्ट, (ALGOL 60 की स्मृति को समर्पित)". Retrieved 20 October 2009.
  16. "Recursive Functions of Symbolic Expressions and Their Computation by Machine", Communications of the ACM, April 1960
  17. McCarthy, John; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I. (1965). लिस्प 1.5 प्रोग्रामर मैनुअल. The MIT Press. ISBN 9780262130110.
  18. "BCPL: A tool for compiler writing and system programming" M. Richards, University Mathematical Laboratory Cambridge, England 1969
  19. BCPL: The Language and Its Compiler, M Richards, Cambridge University Press (first published 31 December 1981)
  20. The BCPL Cintsys and Cintpos User Guide, M. Richards, 2017
  21. Corbató, F. J.; Vyssotsky, V. A. "मल्टिक्स सिस्टम का परिचय और अवलोकन". 1965 Fall Joint Computer Conference. Multicians.org.
  22. Report II of the SHARE Advanced Language Development Committee, 25 June 1964
  23. Multicians.org "The Choice of PL/I" article, Editor /tom Van Vleck
  24. "PL/I As a Tool for System Programming", F.J. Corbato, Datamation 6 May 1969 issue
  25. "The Multics PL/1 Compiler", R. A. Freiburghouse, GE, Fall Joint Computer Conference 1969
  26. Dennis M. Ritchie, "The Development of the C Language", ACM Second History of Programming Languages Conference, April 1993
  27. S.C. Johnson, "a Portable C Compiler: Theory and Practice", 5th ACM POPL Symposium, January 1978
  28. A. Snyder, A Portable Compiler for the Language C, MIT, 1974.
  29. K. Nygaard, University of Oslo, Norway, "Basic Concepts in Object Oriented Programming", SIGPLAN Notices V21, 1986
  30. B. Stroustrup: "What is Object-Oriented Programming?" Proceedings 14th ASU Conference, 1986.
  31. Bjarne Stroustrup, "An Overview of the C++ Programming Language", Handbook of Object Technology (Editor: Saba Zamir, ISBN 0-8493-3135-8)
  32. Leverett, Cattell, Hobbs, Newcomer, Reiner, Schatz, Wulf: "An Overview of the Production Quality Compiler-Compiler Project", CMU-CS-89-105, 1979
  33. W. Wulf, K. Nori, "Delayed binding in PQCC generated compilers", CMU Research Showcase Report, CMU-CS-82-138, 1982
  34. 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
  35. William A. Whitaker, "Ada - the project: the DoD High Order Working Group", ACM SIGPLAN Notices (Volume 28, No. 3, March 1991)
  36. CECOM Center for Software Engineering Advanced Software Technology, "Final Report - Evaluation of the ACEC Benchmark Suite for Real-Time Applications", AD-A231 968, 1990
  37. P.Biggar, E. de Vries, D. Gregg, "A Practical Solution for Scripting Language Compilers", submission to Science of Computer Programming, 2009
  38. M.Hall, D. Padua, K. Pingali, "Compiler Research: The Next 50 Years", ACM Communications 2009 Vol 54 #2
  39. Cooper and Torczon 2012, p. 8
  40. Lattner, Chris (2017). "LLVM". In Brown, Amy; Wilson, Greg (eds.). ओपन सोर्स एप्लिकेशन का आर्किटेक्चर. Archived from the original on 2 December 2016. Retrieved 28 February 2017.
  41. Aho, Lam, Sethi, Ullman 2007, p. 5-6, 109-189
  42. Aho, Lam, Sethi, Ullman 2007, p. 111
  43. Aho, Lam, Sethi, Ullman 2007, p. 8, 191-300
  44. 44.0 44.1 Blindell, Gabriel Hjort (3 June 2016). निर्देश चयन: सिद्धांत, तरीके और अनुप्रयोग. Switzerland. ISBN 9783319340197. OCLC 951745657.{{cite book}}: CS1 maint: location missing publisher (link)
  45. Cooper and Toczon (2012), p. 540
  46. Ilyushin, Evgeniy; Namiot, Dmitry (2016). "सोर्स-टू-सोर्स कंपाइलर्स पर". International Journal of Open Information Technologies. 4 (5): 48–51. Archived from the original on 14 September 2022. Retrieved 14 September 2022. {{cite journal}}: |archive-date= / |archive-url= timestamp mismatch (help)
  47. Aycock, John (2003). "जस्ट-इन-टाइम का एक संक्षिप्त इतिहास". ACM Comput. Surv. 35 (2, June): 93–113. doi:10.1145/857076.857077. S2CID 15345671.
  48. Swartz, Jordan S.; Betz, Vaugh; Rose, Jonathan (22–25 February 1998). "FPGAs के लिए एक तेज़ रूटेबिलिटी-संचालित राउटर" (PDF). FPGA '98 Proceedings of the 1998 ACM/SIGDA Sixth International Symposium on Field Programmable Gate Arrays. Monterey, CA: ACM: 140–149. doi:10.1145/275107.275134. ISBN 978-0897919784. S2CID 7128364. Archived (PDF) from the original on 9 August 2017.
  49. Xilinx Staff (2009). "एक्सएसटी संश्लेषण अवलोकन". Xilinx, Inc. Archived from the original on 2 November 2016. Retrieved 28 February 2017.
  50. Altera Staff (2017). "स्पेक्ट्रा-क्यू™ इंजन". Altera.com. Archived from the original on 10 October 2016. Retrieved 28 February 2017.
  51. "डीकंपलर - एक सिंहावलोकन | ScienceDirect विषय". www.sciencedirect.com. Retrieved 12 June 2022.


आगे की पढाई


इस पेज में लापता आंतरिक लिंक की सूची

  • सभा की भाषा
  • सोर्स कोड
  • अनुवादक (कम्प्यूटिंग)
  • उच्च स्तरीय प्रोग्रामिंग भाषा
  • शब्दार्थ विश्लेषण (संकलक)
  • कोड जनरेशन (संकलक)
  • मुख्य स्मृति
  • संदर्भ मुक्त व्याकरण
  • एपीएल (प्रोग्रामिंग भाषा)
  • जॉन मैकार्थी (कंप्यूटर वैज्ञानिक)
  • साथ
  • सी (प्रोग्रामिंग भाषा)
  • एकीकृत विकास पर्यावरण
  • निष्पादन इकाई
  • निरंतर प्रसार
  • आवंटन रजिस्टर करें
  • अनुमानी (कंप्यूटर विज्ञान)
  • चिंताओ का विभाजन
  • स्ट्रैपिंग (वाक्यविन्यास)
  • योजना (प्रोग्रामिंग भाषा)
  • परिमित राज्य automaton
  • डेटा प्रवाह विश्लेषण
  • पाश परिवर्तन
  • स्वचालित समानांतरकरण
  • औपचारिक तरीके
  • छोटी बात
  • पायथन (प्रोग्रामिंग भाषा)
  • विशिष्ट एकीकृत परिपथ आवेदन
  • संकलक की सूची
  • संकलन फार्म

बाहरी कड़ियाँ

श्रेणी:अमेरिकी आविष्कार श्रेणी:संकलक निर्माण श्रेणी:कंप्यूटर पुस्तकालय श्रेणी: प्रोग्रामिंग भाषा कार्यान्वयन श्रेणी: उपयोगिता सॉफ्टवेयर प्रकार