संकलक: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(22 intermediate revisions by 4 users not shown)
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}}
कंप्यूटिंग, एक '''''संकलक (कंपाइलर)''''' एक कंप्यूटर प्रोग्राम है जो एक प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा (लक्ष्य भाषा) में अनुवादित करता है। <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=Encyclopedia: Definition of Compiler |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}}<ref name="SUDARSANAM MALIK FUJITA 2002 pp. 506–515">{{cite book | last1=SUDARSANAM | first1=ASHOK | last2=MALIK | first2=SHARAD | last3=FUJITA | first3=MASAHIRO | title=Readings in Hardware/Software Co-Design | 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=A compiler is a computer program that translates a program written in a high-level language (HLL), such as C, into an equivalent assembly language program [2]. }}</ref>


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


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


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


स्रोत प्रोग्राम को बदलने के लिए उपयोग किए जाने वाले कंपाइलर एकमात्र भाषा प्रोसेसर नहीं हैं। एक [[दुभाषिया (कंप्यूटिंग)]] कंप्यूटर सॉफ्टवेयर है जो संकेतित कार्यों को रूपांतरित करता है और फिर निष्पादित करता है।<ref name=dragon/>{{rp|p2}} अनुवाद प्रक्रिया कंप्यूटर भाषाओं के डिजाइन को प्रभावित करती है, जिससे संकलन या व्याख्या की प्राथमिकता होती है। सिद्धांत रूप में, एक प्रोग्रामिंग भाषा में एक संकलक और दुभाषिया दोनों हो सकते हैं। व्यवहार में, प्रोग्रामिंग भाषाएँ केवल एक (एक संकलक या एक दुभाषिया) से जुड़ी होती हैं।
स्रोत प्रोग्राम को बदलने के लिए उपयोग किए जाने वाले संकलक एकमात्र भाषा प्रोसेसर नहीं हैं। एक [[दुभाषिया (कंप्यूटिंग)|अनुवादक (कंप्यूटिंग)]] कंप्यूटर सॉफ्टवेयर है जो संकेतिक कार्यों को रूपांतरित करता है और पुनः निष्पादित करता है।<ref name=dragon/>{{rp|p2}} अनुवाद प्रक्रिया कंप्यूटर भाषाओं के डिजाइन को प्रभावित करती है, जिससे संकलन या व्याख्या की प्राथमिकता होती है। सिद्धांत रूप में, एक प्रोग्रामिंग भाषा में एक संकलक और अनुवादक दोनों हो सकते हैं। गतिविधि में, प्रोग्रामिंग भाषाएँ केवल (संकलक या एक अनुवादक) से जुड़ी होती हैं।


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


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


किसी भाषा में वाक्यों को नियमों के एक समूह द्वारा परिभाषित किया जा सकता है जिसे व्याकरण कहा जाता है।<ref>lecture notes
किसी भाषा में वाक्यों को नियमों के एक समूह द्वारा परिभाषित किया जा सकता है जिसे व्याकरण कहा जाता है।<ref>lecture notes
Line 29: Line 28:
Department of Computer Science & Information Engineering
Department of Computer Science & Information Engineering
National Chi-Nan University</ref>
National Chi-Nan University</ref>
बैकस-नौर फॉर्म (बीएनएफ) एक भाषा के वाक्यों के सिंटैक्स का वर्णन करता है और [[जॉन बैकस]] द्वारा एल्गोल 60 के सिंटैक्स के लिए इस्तेमाल किया गया था।<ref>Naur, P. et al. "Report on ALGOL 60". ''Communications of the ACM'' 3 (May 1960), 299–314.</ref> ये विचार एक भाषाविद् [[नोम चौमस्की]] द्वारा संदर्भ-मुक्त व्याकरण अवधारणाओं से प्राप्त हुए हैं।<ref>{{cite book |title=सिंटैक्टिक संरचनाएं|isbn=978-3-11-017279-9 |first1=Noam |last1=Chomsky |first2=David W. |last2=Lightfoot |publisher=Walter de Gruyter |date=2002}}</ref> प्रोग्रामिंग नोटेशन के सिंटैक्स का वर्णन करने के लिए बीएनएफ और इसके एक्सटेंशन मानक उपकरण बन गए हैं, और कई मामलों में बीएनएफ विवरण से कंपाइलर्स के हिस्से स्वचालित रूप से उत्पन्न होते हैं।<ref>{{cite book |title=प्रोग्रामिंग का विज्ञान|chapter=Appendix 1: Backus-Naur Form |isbn=978-1461259831 |last=Gries |first=David |chapter-url=https://books.google.com/books?id=QFrlBwAAQBAJ&q=1461259835&pg=PA304 |page=304 |publisher=Springer Science & Business Media |date=2012}}</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> एपीएल गणितीय संगणनाओं के लिए एक भाषा है।
बैकस-नौर फॉर्म (बीएनएफ) एक भाषा के वाक्यों के सिंटैक्स का वर्णन करता है और [[जॉन बैकस]] द्वारा एल्गोल 60 के सिंटैक्स के लिए उपयोग किया गया था।<ref>Naur, P. et al. "Report on ALGOL 60". ''Communications of the ACM'' 3 (May 1960), 299–314.</ref> ये विचार एक भाषाविद् [[नोम चौमस्की]] द्वारा संदर्भ-मुक्त व्याकरण अवधारणाओं से प्राप्त हुए हैं।<ref>{{cite book |title=सिंटैक्टिक संरचनाएं|isbn=978-3-11-017279-9 |first1=Noam |last1=Chomsky |first2=David W. |last2=Lightfoot |publisher=Walter de Gruyter |date=2002}}</ref> बीएनएफ और इसके प्रसारण प्रोग्रामिंग संकेतन के सिंटैक्स का वर्णन करने के लिए मानक उपकरण बन गए हैं, और कई स्थितियों में बीएनएफ विवरण से संकलक के भाग स्वचालित रूप से उत्पन्न होते हैं।<ref>{{cite book |title=प्रोग्रामिंग का विज्ञान|chapter=Appendix 1: Backus-Naur Form |isbn=978-1461259831 |last=Gries |first=David |chapter-url=https://books.google.com/books?id=QFrlBwAAQBAJ&q=1461259835&pg=PA304 |page=304 |publisher=Springer Science & Business Media |date=2012}}</ref>
 
1940 के दशक में, [[कोनराड ज़्यूस]] ने प्लैंकलकुल (प्लान कैलकुलस) नामक एक एल्गोरिथम प्रोग्रामिंग भाषा तैयार की। जबकि 1970 के दशक तक कोई वास्तविक कार्यान्वयन नहीं हुआ था, इसने बाद में 1950 के दशक के अंत में केन इवरसन द्वारा डिज़ाइन की गई एपीएल (प्रोग्रामिंग भाषा) में देखी गई अवधारणाओं को प्रस्तुत किया।<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 प्रणाली|-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>
* [[लिस्प (प्रोग्रामिंग भाषा)]] (सूची प्रोसेसर) प्रतीकात्मक संगणना के लिए।<ref>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.</ref>
* [[लिस्प (प्रोग्रामिंग भाषा)|एलआईएसपी (प्रोग्रामिंग भाषा)]] (सूची प्रोसेसर) प्रतीकात्मक संगणना के लिए।<ref>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.</ref>
डिजिटल कंप्यूटर के लिए निम्न-स्तरीय लक्ष्य कार्यक्रम में उच्च-स्तरीय स्रोत कार्यक्रम के कड़ाई से परिभाषित परिवर्तन की आवश्यकता से संकलक तकनीक विकसित हुई। स्रोत कोड के विश्लेषण से निपटने के लिए कंपाइलर को फ्रंट एंड के रूप में देखा जा सकता है और लक्ष्य कोड में विश्लेषण को संश्लेषित करने के लिए बैक एंड। फ्रंट एंड और बैक एंड के बीच अनुकूलन अधिक कुशल लक्ष्य कोड उत्पन्न कर सकता है।<ref>Compilers Principles, Techniques, & Tools 2nd edition by Aho, Lam, Sethi, Ullman {{ISBN |0-321-48681-1}}</ref>
डिजिटल कंप्यूटर के लिए निम्न-स्तरीय टारगेट प्रोग्राम में उच्च-स्तरीय स्रोत प्रोग्राम के पूरी तरह से परिभाषित परिवर्तन की आवश्यकता से संकलक तकनीक विकसित हुई। स्रोत कोड के विश्लेषण से संबद्ध करने के लिए संकलक को फ्रंट एंड के रूप में और टारगेट कोड में विश्लेषण को संश्लेषित करने के लिए बैक एंड के रूप मे देखा जा सकता है। फ्रंट एंड और बैक एंड के बीच अनुकूलन अधिक प्रभावशाली टारगेट कोड उत्पन्न कर सकता है।<ref>Compilers Principles, Techniques, & Tools 2nd edition by Aho, Lam, Sethi, Ullman {{ISBN |0-321-48681-1}}</ref>
संकलक प्रौद्योगिकी के विकास में कुछ प्रारंभिक मील के पत्थर:
 
* 1952: मैनचेस्टर विश्वविद्यालय में [[मैनचेस्टर मार्क I]] कंप्यूटर के लिए [[एलिक ग्लेनी]] द्वारा विकसित एक [[ऑटोकोड]] कंपाइलर को कुछ लोगों द्वारा पहली संकलित प्रोग्रामिंग भाषा माना जाता है।
संकलक प्रौद्योगिकी के विकास में कुछ प्रारंभिक उपलब्धियां:
* 1952: [[रेमिंगटन रैंड]] में [[ग्रेस हूपर]] की टीम ने A-0 सिस्टम|A-0 प्रोग्रामिंग लैंग्वेज के लिए कंपाइलर लिखा (और इसका वर्णन करने के लिए ''कंपाइलर'' शब्द गढ़ा),<ref>{{cite journal |last1=Hopper |first1=Grace Murray |date=1952 |title=कंप्यूटर की शिक्षा|journal=Proceedings of the 1952 ACM National Meeting (Pittsburgh) |pages=243–249 |doi=10.1145/609784.609818 |s2cid=10081016}}</ref><ref>{{cite journal |last1=Ridgway |first1=Richard K. |date=1952 |title=संकलन दिनचर्या|journal=Proceedings of the 1952 ACM National Meeting (Toronto) |pages=1–5 |doi=10.1145/800259.808980 |s2cid=14878552}}
* 1952: मैनचेस्टर विश्वविद्यालय में [[मैनचेस्टर मार्क I|मैनचेस्टर मार्कI]] कंप्यूटर के लिए [[एलिक ग्लेनी]] द्वारा विकसित एक [[ऑटोकोड]] संकलक को कुछ लोगों द्वारा पहली संकलित प्रोग्रामिंग भाषा माना जाता है।
* 1952: [[रेमिंगटन रैंड]] में [[ग्रेस हूपर]] की टीम ने A-0 प्रोग्रामिंग भाषा के लिए संकलक लिखा (और इसका वर्णन करने के लिए ''संकलक'' शब्द विकसित किया),<ref>{{cite journal |last1=Hopper |first1=Grace Murray |date=1952 |title=कंप्यूटर की शिक्षा|journal=Proceedings of the 1952 ACM National Meeting (Pittsburgh) |pages=243–249 |doi=10.1145/609784.609818 |s2cid=10081016}}</ref><ref>{{cite journal |last1=Ridgway |first1=Richard K. |date=1952 |title=संकलन दिनचर्या|journal=Proceedings of the 1952 ACM National Meeting (Toronto) |pages=1–5 |doi=10.1145/800259.808980 |s2cid=14878552}}
</ref> हालांकि A-0 संकलक एक पूर्ण संकलक की आधुनिक धारणा की तुलना में एक लोडर या लिंकर के रूप में अधिक कार्य करता है।
</ref> हालांकि A-0 संकलक एक पूर्ण संकलक की आधुनिक धारणा की तुलना में एक लोडर या लिंकर के रूप में अधिक कार्य करता है।
* 1954-1957: [[आईबीएम]] में जॉन बैकस के नेतृत्व में एक टीम ने फोरट्रान विकसित किया जिसे सामान्यतः पहली उच्च-स्तरीय भाषा माना जाता है। 1957 में, उन्होंने एक फोरट्रान संकलक पूरा किया जिसे सामान्यतः पहले स्पष्ट रूप से पूर्ण संकलक के रूप में पेश करने का श्रेय दिया जाता है।
* 1954-1957: [[आईबीएम]] में जॉन बैकस के नेतृत्व में एक टीम ने फोरट्रान विकसित किया जिसे सामान्यतः पहली उच्च-स्तरीय भाषा माना जाता है। 1957 में, उन्होंने एक फोरट्रान संकलक पूरा किया जिसे सामान्यतः पहले स्पष्ट रूप से पूर्ण संकलक के रूप में प्रस्तुत करने का श्रेय दिया जाता है।
* 1959: डेटा सिस्टम लैंग्वेज (CODASYL) पर सम्मेलन ने COBOL के विकास की प्रारंभ की। COBOL डिज़ाइन A-0 और FLOW-MATIC पर आकर्षित हुआ। 1960 के दशक के प्रारंभ तक COBOL को कई संरचना पर संकलित किया गया था।
* 1959: डेटा प्रणाली भाषा (कोडासिल) पर सम्मेलन ने के विकास की प्रारंभ की। कोबोल डिज़ाइन A-0 और फ्लो-मैटिक पर प्राप्त हुआ। 1960 के दशक के प्रारंभ तक कोबोल को कई संरचना पर संकलित किया गया था।
* 1958-1960: [[Algol 58]], [[ALGOL 60]] का अग्रदूत था। Algol 58 ने [[ब्लॉक (प्रोग्रामिंग)]] की प्रारंभ की, जो [[संरचित प्रोग्रामिंग]] के उदय में एक महत्वपूर्ण प्रगति थी। ALGOL 60 [[नेस्टेड समारोह]] परिभाषाओं को [[शाब्दिक गुंजाइश]] के साथ लागू करने वाली पहली भाषा थी। इसमें [[प्रत्यावर्तन]] सम्मिलित था। इसका सिंटैक्स बैकस-नौर फॉर्म का उपयोग करके परिभाषित किया गया था। ALGOL 60 ने इसके बाद आने वाली कई भाषाओं को प्रेरित किया। [[टोनी होरे]] ने टिप्पणी की: ... यह न केवल अपने पूर्ववर्तियों पर बल्कि इसके लगभग सभी उत्तराधिकारियों में भी सुधार था।<ref>{{cite web |first=C.A.R. |last=Hoare |title=प्रोग्रामिंग लैंग्वेज डिजाइन पर संकेत|date=December 1973 |url=http://www.eecs.umich.edu/~bchandra/courses/papers/Hoare_Hints.pdf |archive-url=https://ghostarchive.org/archive/20221010/http://www.eecs.umich.edu/~bchandra/courses/papers/Hoare_Hints.pdf |archive-date=2022-10-10 |url-status=live |page=27}} (This statement is sometimes erroneously attributed to [[Edsger W. Dijkstra]], also involved in implementing the first ALGOL 60 compiler.)</ref><ref name="r3rs">{{cite web |editor1-first=Jonathan |editor1-last=Rees |editor2-first=William |editor2-last=Clinger |author-first1=Hal |author-last1=Abelson |author-first2=R. K. |author-last2=Dybvig |title=एल्गोरिदमिक भाषा योजना पर संशोधित (3) रिपोर्ट, (ALGOL 60 की स्मृति को समर्पित)| url=http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r3rs-html/r3rs_toc.html
* 1958-1960: [[Algol 58|एल्गोल 58]], [[ALGOL 60|एल्गोल 60]] का अग्रगामी था। एल्गोल 58 ने [[ब्लॉक (प्रोग्रामिंग)]] को प्रारंभ किया, जो [[संरचित प्रोग्रामिंग]] के उदय में एक महत्वपूर्ण प्रगति थी। एल्गोल 60 [[नेस्टेड समारोह|नेस्टेड फ़ंक्शन]] परिभाषाओं को [[शाब्दिक गुंजाइश|लेक्सिकल स्कोप]] के साथ क्रियान्वित करने वाली पहली भाषा थी। इसमें [[प्रत्यावर्तन|पुनरावर्तन]] सम्मिलित था। इसका सिंटैक्स बैकस-नौर फॉर्म का उपयोग करके परिभाषित किया गया था। एल्गोल 60 ने इसके बाद आने वाली कई भाषाओं को प्रेरित किया। [[टोनी होरे]] ने टिप्पणी की: यह न केवल अपने पूर्ववर्तियों पर बल्कि इसके लगभग सभी पूर्ववर्ती में भी सुधार था।<ref>{{cite web |first=C.A.R. |last=Hoare |title=प्रोग्रामिंग लैंग्वेज डिजाइन पर संकेत|date=December 1973 |url=http://www.eecs.umich.edu/~bchandra/courses/papers/Hoare_Hints.pdf |archive-url=https://ghostarchive.org/archive/20221010/http://www.eecs.umich.edu/~bchandra/courses/papers/Hoare_Hints.pdf |archive-date=2022-10-10 |url-status=live |page=27}} (This statement is sometimes erroneously attributed to [[Edsger W. Dijkstra]], also involved in implementing the first ALGOL 60 compiler.)</ref><ref name="r3rs">{{cite web |editor1-first=Jonathan |editor1-last=Rees |editor2-first=William |editor2-last=Clinger |author-first1=Hal |author-last1=Abelson |author-first2=R. K. |author-last2=Dybvig |title=एल्गोरिदमिक भाषा योजना पर संशोधित (3) रिपोर्ट, (ALGOL 60 की स्मृति को समर्पित)| url=http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r3rs-html/r3rs_toc.html
|access-date=2009-10-20
|access-date=2009-10-20
|display-authors=etal}}</ref>
|display-authors=etal}}</ref>
* 1958-1962: एमआईटी में जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) ने लिस्प (प्रोग्रामिंग लैंग्वेज) डिजाइन किया।<ref>"[https://dspace.mit.edu/bitstream/handle/1721.1/6096/AIM-008.pdf?sequence=2 Recursive Functions of Symbolic Expressions and Their Computation by Machine]", Communications of the ACM, April 1960</ref> प्रतीक प्रसंस्करण क्षमताओं ने कृत्रिम बुद्धिमत्ता अनुसंधान के लिए उपयोगी सुविधाएँ प्रदान कीं। 1962 में, LISP 1.5 रिलीज़ ने कुछ उपकरणों का उल्लेख किया: स्टीफन रसेल और डैनियल जे। एडवर्ड्स द्वारा लिखित एक दुभाषिया, टिम हार्ट और माइक लेविन द्वारा लिखित एक संकलक और असेंबलर।<ref>{{cite book |title=लिस्प 1.5 प्रोग्रामर मैनुअल|publisher=The MIT Press |last1=McCarthy |first1=John |last2=Abrahams |first2=Paul W. |last3=Edwards |first3=Daniel J. |last4=Hart |first4=Timothy P. |last5=Levin |first5=Michael I. |url=https://books.google.com/books?id=68j6lEJjMQwC&pg=PR1 |isbn=9780262130110 |year=1965}}</ref>
* 1958-1962: एमआईटी में जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) ने एलआईएसपी (प्रोग्रामिंग भाषा) डिजाइन किया।<ref>"[https://dspace.mit.edu/bitstream/handle/1721.1/6096/AIM-008.pdf?sequence=2 Recursive Functions of Symbolic Expressions and Their Computation by Machine]", Communications of the ACM, April 1960</ref> प्रतीक प्रसंस्करण क्षमताओं ने कृत्रिम बुद्धिमत्ता अनुसंधान के लिए उपयोगी सुविधाएँ प्रदान कीं। 1962 में, एलआईएसपी 1.5 प्रकाशन ने कुछ उपकरणों का उल्लेख किया: स्टीफन रसेल और डैनियल जे एडवर्ड्स द्वारा लिखित एक अनुवादक, टिम हार्ट और माइक लेविन द्वारा लिखित एक संकलक और असेंबलर।<ref>{{cite book |title=लिस्प 1.5 प्रोग्रामर मैनुअल|publisher=The MIT Press |last1=McCarthy |first1=John |last2=Abrahams |first2=Paul W. |last3=Edwards |first3=Daniel J. |last4=Hart |first4=Timothy P. |last5=Levin |first5=Michael I. |url=https://books.google.com/books?id=68j6lEJjMQwC&pg=PR1 |isbn=9780262130110 |year=1965}}</ref>
प्रारम्भिक ऑपरेटिंग सिस्टम और सॉफ्टवेयर असेंबली लैंग्वेज में लिखे गए थे। 1960 और 1970 के दशक के प्रारंभ में, सिस्टम प्रोग्रामिंग के लिए उच्च-स्तरीय भाषाओं का उपयोग संसाधन सीमाओं के कारण अभी भी विवादास्पद था। हालांकि, कई शोध और उद्योग प्रयासों ने उच्च-स्तरीय सिस्टम [[बी (प्रोग्रामिंग भाषा)]] ओर बदलाव प्रारंभ किया, उदाहरण के लिए, [[BCPL]], [[BLISS]], B (प्रोग्रामिंग लैंग्वेज), और C (प्रोग्रामिंग लैंग्वेज)।
प्रारम्भिक ऑपरेटिंग सिस्टम और सॉफ्टवेयर असेंबली भाषा में लिखे गए थे। 1960 और 1970 के दशक के प्रारंभ में, प्रणाली प्रोग्रामिंग के लिए उच्च-स्तरीय भाषाओं का उपयोग संसाधन सीमाओं के कारण अभी भी विवादास्पद था। हालांकि, कई शोध और उद्योग प्रयासों ने उच्च-स्तरीय प्रणाली [[बी (प्रोग्रामिंग भाषा)|प्रोग्रामिंग भाषाओ]] की ओर परिवर्तन प्रारंभ किया, उदाहरण के लिए, [[BCPL|बीसीपीएल]], [[BLISS|ब्लिस]], बी (प्रोग्रामिंग भाषा), और सी (प्रोग्रामिंग भाषा)।
 
कैम्ब्रिज विश्वविद्यालय में [[मार्टिन रिचर्ड्स (कंप्यूटर वैज्ञानिक)]] द्वारा 1966 में डिज़ाइन किया गया बीसीपीएल (सामान्य संयुक्त प्रोग्रामिंग भाषा) मूल रूप से एक संकलक लेखन उपकरण के रूप में विकसित किया गया था।<ref>"[http://prog.vub.ac.be/~tjdhondt/ESL/BCPL_to_Cfront_files/p557-richards.pdf BCPL: A tool for compiler writing and system programming]" M. Richards, University Mathematical Laboratory Cambridge, England 1969</ref> कई संकलक क्रियान्वित किए गए हैं, रिचर्ड्स की पुस्तक भाषा और उसके संकलक को अंतर्दृष्टि प्रदान करती है।<ref>BCPL: The Language and Its Compiler, M Richards, Cambridge University Press (first published 31 December 1981)</ref> बीसीपीएल न केवल एक प्रभावशाली प्रणाली प्रोग्रामिंग भाषा थी जो अभी भी शोध में प्रयोग की जाती है<ref>The BCPL Cintsys and Cintpos User Guide, M. Richards, 2017</ref> बल्कि बी और सी भाषाओं के डिजाइन के लिए एक आधार भी प्रदान किया।
 
ब्लिस (प्रणाली सॉफ्टवेयर के कार्यान्वयन के लिए मूल भाषा) को डिजिटल उपकरण संस्था (डीईसी) पीडीपी-10 कंप्यूटर के लिए डब्ल्यूए वुल्फ कार्नेगी मेलन विश्वविद्यालय (सीएमयू) शोध समूह द्वारा विकसित किया गया था। सीएमयू समूह ने एक साल बाद 1970 में ब्लिस-11 संकलक विकसित किया।
 
[[मॉलटिक्स]] (मल्टीप्लेक्स सूचना और कंप्यूटिंग सेवा), एक टाइम-शेयरिंग ऑपरेटिंग सिस्टम परियोजना, जिसमें एमआईटी, [[बेल लैब्स]], [[जनरल इलेक्ट्रिक]] (बाद में [[हनीवेल]]) सम्मिलित थे और इसका नेतृत्व एमआईटी के फर्नांडो कॉर्बेटो ने किया था।।<ref>{{cite web |first1=F. J. |last1=Corbató |last2=Vyssotsky |first2=V. A. |title=मल्टिक्स सिस्टम का परिचय और अवलोकन|work=1965 Fall Joint Computer Conference |publisher=Multicians.org |url=https://multicians.org/fjcc1.html}}</ref> मल्टिक्स आईबीएम और आईबीएम उपयोगकर्ता समूह द्वारा विकसित पीएल/आई भाषा में लिखा गया था।<ref>Report II of the SHARE Advanced Language Development Committee, 25 June 1964</ref> बीएम का लक्ष्य व्यवसाय, वैज्ञानिक और प्रणाली प्रोग्रामिंग आवश्यकताओं को पूरा करना था ऐसी अन्य भाषाएँ थीं जिन पर विचार किया जा सकता था लेकिन पीएल/आई ने सबसे पूर्ण समाधान की प्रस्तुत की, तथापि इसे क्रियान्वित नहीं किया गया था।<ref>Multicians.org "The Choice of PL/I" article, Editor /tom Van Vleck</ref> मल्टिक्स परियोजना के पहले कुछ वर्षों के लिए, बेल लैब्स से डॉग मैक्लोरी और बॉब मॉरिस द्वारा अर्ली पीएल/आई (ईपीएल) संकलक के साथ भाषा के एक उपसमुच्चय को असेंबली भाषा में संकलित किया जा सकता है।<ref>"PL/I As a Tool for System Programming", F.J. Corbato, Datamation 6 May 1969 issue</ref> ईपीएल ने परियोजना का तब तक समर्थन किया जब तक कि पूर्ण पीएल/आई के लिए बूट-स्ट्रैपिंग संकलक विकसित नहीं किया जा सका।<ref>"[https://www.computer.org/csdl/proceedings/afips/1969/5074/00/50740187.pdf The Multics PL/1 Compiler]", R. A. Freiburghouse, GE, Fall Joint Computer Conference 1969</ref>


कैम्ब्रिज विश्वविद्यालय में [[मार्टिन रिचर्ड्स (कंप्यूटर वैज्ञानिक)]] द्वारा 1966 में डिज़ाइन किया गया BCPL (बेसिक कंबाइंड प्रोग्रामिंग लैंग्वेज) मूल रूप से एक कंपाइलर राइटिंग टूल के रूप में विकसित किया गया था।<ref>"[http://prog.vub.ac.be/~tjdhondt/ESL/BCPL_to_Cfront_files/p557-richards.pdf BCPL: A tool for compiler writing and system programming]" M. Richards, University Mathematical Laboratory Cambridge, England 1969</ref> कई संकलक लागू किए गए हैं, रिचर्ड्स की पुस्तक भाषा और उसके संकलक को अंतर्दृष्टि प्रदान करती है।<ref>BCPL: The Language and Its Compiler, M Richards, Cambridge University Press (first published 31 December 1981)</ref> बीसीपीएल न केवल एक प्रभावशाली सिस्टम प्रोग्रामिंग भाषा थी जो अभी भी शोध में प्रयोग की जाती है<ref>The BCPL Cintsys and Cintpos User Guide, M. Richards, 2017</ref> बल्कि बी और सी भाषाओं के डिजाइन के लिए एक आधार भी प्रदान किया।
बेल लैब्स ने 1969 में मल्टिक्स परियोजना को छोड़ दिया, और [[डेनिस रिची]] और [[केन थॉम्पसन]] द्वारा लिखित बीसीपीएल अवधारणाओं पर आधारित एक प्रणाली प्रोग्रामिंग भाषा बी (प्रोग्रामिंग भाषा) विकसित की। रिची ने बी के लिए बूट-स्ट्रैपिंग संकलक बनाया और बी में पीडीपी-7 के लिए [[यूनिक्स]] (यूनिप्लेक्स सूचना और कंप्यूटिंग सेवा) [[ऑपरेटिंग सिस्टम]] लिखा। अंततः यूनिक्स वर्तनी यूनिक्स बन गया।


BLISS (बेसिक लैंग्वेज फॉर इंप्लीमेंटेशन ऑफ सिस्टम सॉफ्टवेयर) को डिजिटल इक्विपमेंट कॉरपोरेशन (DEC) PDP-10 कंप्यूटर के लिए WA Wulf's Carnegie Mellon University (CMU) रिसर्च टीम द्वारा विकसित किया गया था। CMU टीम ने एक साल बाद 1970 में BLISS-11 कंपाइलर विकसित किया।
बेल लैब्स ने बी और बीसीपीएल के आधार पर सी (प्रोग्रामिंग भाषा) का विकास और विस्तार प्रारंभ किया। बीसीपीएल संकलक को बेल लैब्स द्वारा मल्टिक्स में ले जाया गया था और बेल लैब्स में बीसीपीएल एक मुख्य भाषा थी।<ref>Dennis M. Ritchie, "[https://www.bell-labs.com/usr/dmr/www/chist.pdf The Development of the C Language]", ACM Second History of Programming Languages Conference, April 1993</ref> प्रारंभ में, बेल लैब्स के बी संकलक के लिए एक फ्रंट-एंड प्रोग्राम का उपयोग किया गया था, जब सी संकलक विकसित किया गया था। 1971 में, एक नए पीडीपी-11 ने बी को विस्तार परिभाषित करने और संकलक को पुनः लिखने के लिए संसाधन प्रदान किया। 1973 तक सी भाषा का डिजाइन अनिवार्य रूप से पूरा हो गया था और पीडीपी-11 के लिए यूनिक्स कर्नेल को सी में पुनः लिखा गया था। स्टीव जॉनसन ने पोर्टेबल सी संकलक (पीसीसी) का विकास प्रारंभ किया ताकि नई मशीनों के लिए सी संकलक के पुनः प्राप्ति का समर्थन किया जा सके।<ref>S.C. Johnson, "a Portable C Compiler: Theory and Practice", 5th ACM POPL Symposium, January 1978</ref><ref>A. Snyder, [https://apps.dtic.mil/sti/pdfs/ADA010218.pdf A Portable Compiler for the Language C], MIT, 1974.</ref>


[[मॉलटिक्स]] (मल्टीप्लेक्स सूचना और कंप्यूटिंग सेवा), एक टाइम-शेयरिंग ऑपरेटिंग सिस्टम प्रोजेक्ट, जिसमें एमआईटी, [[बेल लैब्स]], [[जनरल इलेक्ट्रिक]] (बाद में [[हनीवेल]]) सम्मिलित थे और इसका नेतृत्व एमआईटी के फर्नांडो जे कॉर्बेटो | फर्नांडो कॉर्बेटो ने किया था।<ref>{{cite web |first1=F. J. |last1=Corbató |last2=Vyssotsky |first2=V. A. |title=मल्टिक्स सिस्टम का परिचय और अवलोकन|work=1965 Fall Joint Computer Conference |publisher=Multicians.org |url=https://multicians.org/fjcc1.html}}</ref> मल्टिक्स आईबीएम और आईबीएम उपयोगकर्ता समूह द्वारा विकसित पीएल/आई भाषा में लिखा गया था।<ref>Report II of the SHARE Advanced Language Development Committee, 25 June 1964</ref> आईबीएम का लक्ष्य व्यापार, वैज्ञानिक और सिस्टम प्रोग्रामिंग आवश्यकताओं को पूरा करना था। ऐसी अन्य भाषाएँ थीं जिन पर विचार किया जा सकता था लेकिन PL/I ने सबसे पूर्ण समाधान की पेशकश की, भले ही इसे लागू नहीं किया गया था।<ref>Multicians.org "The Choice of PL/I" article, Editor /tom Van Vleck</ref> मल्टिक्स प्रोजेक्ट के पहले कुछ वर्षों के लिए, बेल लैब्स से डॉग मैक्लोरी और बॉब मॉरिस द्वारा अर्ली पीएल/आई (ईपीएल) कंपाइलर के साथ भाषा के एक सबसेट को असेंबली भाषा में संकलित किया जा सकता है।<ref>"PL/I As a Tool for System Programming", F.J. Corbato, Datamation 6 May 1969 issue</ref> ईपीएल ने परियोजना का तब तक समर्थन किया जब तक कि पूर्ण पीएल/आई के लिए बूट-स्ट्रैपिंग कंपाइलर विकसित नहीं किया जा सका।<ref>"[https://www.computer.org/csdl/proceedings/afips/1969/5074/00/50740187.pdf The Multics PL/1 Compiler]", R. A. Freiburghouse, GE, Fall Joint Computer Conference 1969</ref>
[[वस्तु उन्मुख कार्यकर्म|वस्तु उन्मुख प्रोग्रामिंग]] (ओओपी) ने अनुप्रयोग विकास और संरक्षण के लिए कुछ रोचक संभावनाएं प्रस्तुत कीं। [[वस्तु उन्मुख कार्यकर्म|वस्तु उन्मुख प्रोग्रामिंग]] अवधारणाएँ अधिक समर्थन करती हैं लेकिन [[LISP|एलआईएसपी]] और [[सिमुला]] भाषा विज्ञान का भाग थीं।<ref>K. Nygaard, University of Oslo, Norway, "[http://www.cs.kent.edu/~durand/CS43101Fall2004/resources/BasicConceptsOOP-Nygaard1986.pdf Basic Concepts in Object Oriented Programming]", SIGPLAN Notices V21, 1986</ref> बेल लैब्स में, [[C++|सी++]] का विकास ओओपी में रुचि लेने लगा।<ref>B. Stroustrup: "What is Object-Oriented Programming?" Proceedings 14th ASU Conference, 1986.</ref> सी++ का पहली बार उपयोग 1980 में प्रणाली प्रोग्रामिंग के लिए किया गया था। प्रारंभिक डिजाइन ने सिमुला अवधारणाओं के साथ सी भाषा प्रणाली प्रोग्रामिंग क्षमताओं का लाभ उठाया। वस्तु-उन्मुख सुविधाओं को 1983 में जोड़ा गया था।<ref>Bjarne Stroustrup, "An Overview of the C++ Programming Language", Handbook of Object Technology (Editor: Saba Zamir, {{ISBN |0-8493-3135-8}})</ref> सीफ्रंट प्रोग्राम ने सी84 भाषा संकलक के लिए सी++ फ्रंट-एंड क्रियान्वित किया और बाद के वर्षों में सी++ की लोकप्रियता बढ़ने के साथ कई सी++ संकलक विकसित किए गए।
बेल लैब्स ने 1969 में मल्टिक्स प्रोजेक्ट को छोड़ दिया, और [[डेनिस रिची]] और [[केन थॉम्पसन]] द्वारा लिखित BCPL अवधारणाओं पर आधारित एक सिस्टम प्रोग्रामिंग लैंग्वेज B (प्रोग्रामिंग लैंग्वेज) विकसित की। रिची ने बी के लिए बूट-स्ट्रैपिंग कंपाइलर बनाया और बी में पीडीपी-7 के लिए [[यूनिक्स]] (यूनिप्लेक्स्ड इंफॉर्मेशन एंड कंप्यूटिंग सर्विस) ऑपरेटिंग सिस्टम लिखा। यूनिक्स अंततः वर्तनी यूनिक्स बन गया।


बेल लैब्स ने B और BCPL के आधार पर C (प्रोग्रामिंग लैंग्वेज) का विकास और विस्तार प्रारंभ किया। बीसीपीएल संकलक को बेल लैब्स द्वारा मल्टिक्स में ले जाया गया था और बेल लैब्स में बीसीपीएल एक पसंदीदा भाषा थी।<ref>Dennis M. Ritchie, "[https://www.bell-labs.com/usr/dmr/www/chist.pdf The Development of the C Language]", ACM Second History of Programming Languages Conference, April 1993</ref> प्रारंभ में, बेल लैब्स के बी कंपाइलर के लिए एक फ्रंट-एंड प्रोग्राम का उपयोग किया गया था, जबकि एक सी कंपाइलर विकसित किया गया था। 1971 में, एक नए PDP-11 ने B को एक्सटेंशन परिभाषित करने और कंपाइलर को फिर से लिखने के लिए संसाधन प्रदान किया। 1973 तक सी भाषा का डिजाइन अनिवार्य रूप से पूरा हो गया था और पीडीपी-11 के लिए यूनिक्स कर्नेल को सी में फिर से लिखा गया था। स्टीव जॉनसन ने पोर्टेबल सी कंपाइलर (पीसीसी) का विकास प्रारंभ किया ताकि नई मशीनों के लिए सी कंपाइलर्स के रिटारगेटिंग का समर्थन किया जा सके।<ref>S.C. Johnson, "a Portable C Compiler: Theory and Practice", 5th ACM POPL Symposium, January 1978</ref><ref>A. Snyder, [https://apps.dtic.mil/sti/pdfs/ADA010218.pdf A Portable Compiler for the Language C], MIT, 1974.</ref>
कई एप्लिकेशन डोमेन में, उच्च-स्तरीय भाषा का उपयोग करने का विचार शीघ्रता से अनुकूल हो गया। नई प्रोग्रामिंग भाषाओं द्वारा समर्थित विस्तारित कार्यक्षमता और कंप्यूटर संरचना की बढ़ती जटिलता के कारण, संकलक अधिक जटिल हो गए।
[[वस्तु उन्मुख कार्यकर्म]] (ओओपी) ने अनुप्रयोग विकास और रखरखाव के लिए कुछ दिलचस्प संभावनाएं पेश कीं। OOP अवधारणाएँ और पीछे जाती हैं लेकिन [[LISP]] और [[शुरुआत|प्रारम्भिक]] भाषा विज्ञान का भाग थीं।<ref>K. Nygaard, University of Oslo, Norway, "[http://www.cs.kent.edu/~durand/CS43101Fall2004/resources/BasicConceptsOOP-Nygaard1986.pdf Basic Concepts in Object Oriented Programming]", SIGPLAN Notices V21, 1986</ref> बेल लैब्स में, [[C++]] का विकास OOP में रुचि लेने लगा।<ref>B. Stroustrup: "What is Object-Oriented Programming?" Proceedings 14th ASU Conference, 1986.</ref> C++ का पहली बार उपयोग 1980 में सिस्टम प्रोग्रामिंग के लिए किया गया था। प्रारंभिक डिजाइन ने सिमुला अवधारणाओं के साथ सी भाषा प्रणाली प्रोग्रामिंग क्षमताओं का लाभ उठाया। ऑब्जेक्ट-ओरिएंटेड सुविधाओं को 1983 में जोड़ा गया था।<ref>Bjarne Stroustrup, "An Overview of the C++ Programming Language", Handbook of Object Technology (Editor: Saba Zamir, {{ISBN |0-8493-3135-8}})</ref> Cfront प्रोग्राम ने C84 लैंग्वेज कंपाइलर के लिए C++ फ्रंट-एंड लागू किया। बाद के वर्षों में C++ की लोकप्रियता बढ़ने के साथ कई C++ कंपाइलर विकसित किए गए।


कई एप्लिकेशन डोमेन में, उच्च-स्तरीय भाषा का उपयोग करने का विचार जल्दी से पकड़ में आ गया। नई प्रोग्रामिंग भाषाओं द्वारा समर्थित विस्तारित कार्यक्षमता और कंप्यूटर संरचना की बढ़ती जटिलता के कारण, कंपाइलर अधिक जटिल हो गए।
[[DARPA|डीएआरपीए]] (रक्षा अग्रिम अनुसंधान परियोजना संस्था) ने 1970 में वुल्फ की सीएमयू अनुसंधान समूह के साथ एक संकलक परियोजना प्रायोजित किया। उत्पादन गुणवत्ता संकलक-संकलक [[PQCC|पीक्यूसीसी]] डिज़ाइन स्रोत भाषा और लक्ष्य की औपचारिक परिभाषाओं से उत्पादन गुणवत्ता संकलक (पीक्यूसी) तैयार करेगा।<ref>Leverett, Cattell, Hobbs, Newcomer, Reiner, Schatz, Wulf: "An Overview of the Production Quality Compiler-Compiler Project", CMU-CS-89-105, 1979</ref> पीक्यूसीसी ने अधिक सफलता के बिना पार्सर उत्पादक (जैसे, [[Yacc|वाईएसीसी]] ) के रूप में पारंपरिक अर्थ से अधिक संकलक-संकलक शब्द का विस्तार करने की कोशिश की। पीक्यूसीसी को अधिक उपयुक्त रूप से एक संकलक उत्पादक के रूप में संदर्भित किया जा सकता है।


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


कोड जनरेशन प्रक्रिया में PQCC अनुसंधान वास्तव में स्वचालित संकलक-लेखन प्रणाली बनाने की मांग करता है। प्रयास ने PQC की चरण संरचना की खोज की और डिजाइन किया। ब्लिस-11 संकलक ने प्रारंभिक संरचना प्रदान की।<ref>W. Wulf, K. Nori, "[https://apps.dtic.mil/sti/pdfs/ADA125935.pdf Delayed binding in PQCC generated compilers]", CMU Research Showcase Report, CMU-CS-82-138, 1982
एडीए स्टोनमैन दस्तावेज़{{citation needed|date=December 2021}} कर्नेल (केएपीएसई) और न्यूनतम (एमएपीएसई) के साथ प्रोग्राम समर्थन पर्यावरण (एपीएसई) को औपचारिक रूप दिया। एक एडीए अनुवादक एनवाईयू/ईडी ने अमेरिकी राष्ट्रीय मानक संस्थान (एएनएसआई) और अंतर्राष्ट्रीय मानक संगठन (आईएसओ) के साथ विकास और मानकीकरण प्रयासों का समर्थन किया। अमेरिकी सैन्य सेवाओं द्वारा आरंभिक एडीए संकलक विकास में स्टोनमैन दस्तावेज़ की तर्ज पर एक पूर्ण एकीकृत डिजाइन वातावरण में संकलक सम्मिलित थे। सेना और नौसेना ने एडीए भाषा प्रणाली (एएलएस) परियोजना पर कार्य किया, जो डीईसी/वैक्स संरचना को योजनाबद्ध था, जबकि वायु सेना ने एडीए एकीकृत वातावरण (एआईई) पर आईबीएम 370 श्रृंखला को योजनाबद्ध किया। जबकि परियोजनाओं ने वांछित परिणाम प्रदान नहीं किए, उन्होंने एडीए विकास पर समग्र प्रयास में योगदान दिया।<ref>William A. Whitaker, "Ada - the project: the DoD High Order Working Group", ACM SIGPLAN Notices (Volume 28, No. 3, March 1991)</ref>
</ref> चरणों में विश्लेषण (फ्रंट एंड), वर्चुअल मशीन (मध्य अंत) में मध्यवर्ती अनुवाद और लक्ष्य (बैक एंड) में अनुवाद सम्मिलित हैं। मध्यवर्ती प्रतिनिधित्व में भाषा विशिष्ट निर्माणों को संभालने के लिए पीक्यूसीसी अनुसंधान के लिए टीसीओएल विकसित किया गया था।<ref>Joseph M. Newcomer, David Alex Lamb, Bruce W. Leverett, Michael Tighe, William A. Wulf - Carnegie-Mellon University and David Levine, Andrew H. Reinerit - Intermetrics: "TCOL Ada: Revised Report on An Intermediate Representation for the DOD Standard Programming Language", 1979
</ref> TCOL के विभिन्न रूपों ने विभिन्न भाषाओं का समर्थन किया। PQCC परियोजना ने स्वचालित संकलक निर्माण की तकनीकों की जांच की। डिजाइन अवधारणाएं (1995 से, ऑब्जेक्ट-ओरिएंटेड[[एडा (प्रोग्रामिंग भाषा)]] एडा (प्रोग्रामिंग लैंग्वेज) के लिए कंपाइलर्स और कंपाइलर्स के अनुकूलन में उपयोगी साबित हुईं।


एडा स्टोनमैन दस्तावेज़{{citation needed|date=December 2021}} कर्नेल (केएपीएसई) और न्यूनतम (एमएपीएसई) के साथ कार्यक्रम समर्थन पर्यावरण (एपीएसई) को औपचारिक रूप दिया। एक एडीए दुभाषिया एनवाईयू/ईडी ने अमेरिकी राष्ट्रीय मानक संस्थान (एएनएसआई) और अंतर्राष्ट्रीय मानक संगठन (आईएसओ) के साथ विकास और मानकीकरण प्रयासों का समर्थन किया। अमेरिकी सैन्य सेवाओं द्वारा आरंभिक एडीए संकलक विकास में स्टोनमैन दस्तावेज़ की तर्ज पर एक पूर्ण एकीकृत डिजाइन वातावरण में संकलक सम्मिलित थे। सेना और नौसेना ने एडीए लैंग्वेज सिस्टम (एएलएस) परियोजना पर काम किया, जो डीईसी/वैक्स संरचना को लक्षित था, जबकि वायु सेना ने एडीए इंटीग्रेटेड एनवायरनमेंट (एआईई) पर आईबीएम 370 श्रृंखला को लक्षित किया। जबकि परियोजनाओं ने वांछित परिणाम प्रदान नहीं किए, उन्होंने एडीए विकास पर समग्र प्रयास में योगदान दिया।<ref>William A. Whitaker, "Ada - the project: the DoD High Order Working Group", ACM SIGPLAN Notices (Volume 28, No. 3, March 1991)</ref>
अन्य एडीए संकलक प्रयास ब्रिटेन में यॉर्क विश्वविद्यालय में और जर्मनी में कार्लज़ूए विश्वविद्यालय में प्राप्त थे। अमेरिका में, वर्डिक्स (बाद में तर्कसंगत द्वारा अधिग्रहित) ने वर्डिक्स एडीए विकास प्रणाली (वीएडीएस) को सेना को दिया। वीएडीएस ने एक संकलक सहित विकास उपकरण का एक समूह प्रदान किया। यूनिक्स/वीएडीएस को विभिन्न प्रकार के यूनिक्स प्लेटफार्मों पर आयोजित किया जा सकता है जैसे डीईसी अल्ट्रिक्स और सन 3/60 सोलारिस को सेना सीईसीओएम मूल्यांकन में मोटोरोला 68020 पर योजनाबद्ध किया गया है।<ref>CECOM Center for Software Engineering Advanced Software Technology, "Final Report - Evaluation of the ACEC Benchmark Suite for Real-Time Applications", AD-A231 968, 1990</ref> शीघ्र ही कई एडीए संकलक उपलब्ध थे जो एडीए सत्यापन परीक्षण पास कर चुके थे। मुफ़्त सॉफ्टवेयर संस्थान जीएनयू परियोजना ने [[जीएनयू संकलक संग्रह]] (जीसीसी) विकसित किया है जो कई भाषाओं और लक्ष्यों का समर्थन करने के लिए एक प्रमुख क्षमता प्रदान करता है। एडीए संस्करण [[GNAT|जीएनएटी]] सबसे व्यापक रूप से उपयोग किए जाने वाले एडीए संकलकों में से एक है। जीएनएटी मुफ़्त है लेकिन व्यावसायिक समर्थन भी है, उदाहरण के लिए, एडीएकोर की स्थापना 1994 में एडीए के लिए व्यावसायिक सॉफ़्टवेयर समाधान प्रदान करने के लिए की गई थी। जीएनएटी प्रो में जीएनयू जीसीसी आधारित जीएनएटी सम्मिलित है जिसमें एक एकीकृत विकास वातावरण प्रदान करने के लिए एक उपकरण समूह है।
अन्य Ada संकलक प्रयास ब्रिटेन में यॉर्क विश्वविद्यालय में और जर्मनी में कार्लज़ूए विश्वविद्यालय में चल रहे थे। अमेरिका में, वर्डिक्स (बाद में तर्कसंगत द्वारा अधिग्रहित) ने वर्डिक्स एडीए डेवलपमेंट सिस्टम (वीएडीएस) को सेना को दिया। वीएडीएस ने एक कंपाइलर सहित विकास उपकरण का एक सेट प्रदान किया। यूनिक्स/वीएडीएस को विभिन्न प्रकार के यूनिक्स प्लेटफार्मों पर होस्ट किया जा सकता है जैसे डीईसी अल्ट्रिक्स और सन 3/60 सोलारिस को आर्मी सीईसीओएम मूल्यांकन में मोटोरोला 68020 पर लक्षित किया गया है।<ref>CECOM Center for Software Engineering Advanced Software Technology, "Final Report - Evaluation of the ACEC Benchmark Suite for Real-Time Applications", AD-A231 968, 1990</ref> जल्द ही कई Ada कंपाइलर उपलब्ध थे जो Ada Validation टेस्ट पास कर चुके थे। फ्री सॉफ्टवेयर फाउंडेशन जीएनयू प्रोजेक्ट ने [[जीएनयू संकलक संग्रह]] (जीसीसी) विकसित किया है जो कई भाषाओं और लक्ष्यों का समर्थन करने के लिए एक प्रमुख क्षमता प्रदान करता है। Ada संस्करण [[GNAT]] सबसे व्यापक रूप से उपयोग किए जाने वाले Ada संकलकों में से एक है। GNAT मुफ़्त है लेकिन व्यावसायिक समर्थन भी है, उदाहरण के लिए, AdaCore की स्थापना 1994 में Ada के लिए व्यावसायिक सॉफ़्टवेयर समाधान प्रदान करने के लिए की गई थी। जीएनएटी प्रो में जीएनयू जीसीसी आधारित जीएनएटी सम्मिलित है जिसमें एक एकीकृत विकास वातावरण प्रदान करने के लिए एक टूल सूट है।


उच्च-स्तरीय भाषाओं ने संकलक अनुसंधान और विकास को चलाना जारी रखा। फोकस क्षेत्रों में अनुकूलन और स्वचालित कोड जनरेशन सम्मिलित हैं। प्रोग्रामिंग भाषाओं और विकास के वातावरण में रुझान ने कंपाइलर तकनीक को प्रभावित किया। अधिक संकलक भाषा वितरण (PERL, जावा डेवलपमेंट किट) और एक IDE (VADS, ग्रहण, Ada Pro) के एक घटक के रूप में सम्मिलित हो गए। प्रौद्योगिकियों के अंतर्संबंध और अन्योन्याश्रय में वृद्धि हुई। वेब सेवाओं के आगमन ने वेब भाषाओं और स्क्रिप्टिंग भाषाओं के विकास को बढ़ावा दिया। स्क्रिप्ट्स कमांड लाइन इंटरफेस (सीएलआई) के प्रारम्भिक दिनों में वापस आती हैं जहां उपयोगकर्ता सिस्टम द्वारा निष्पादित किए जाने वाले आदेशों को दर्ज कर सकता है। शेल प्रोग्राम लिखने के लिए भाषाओं के साथ उपयोगकर्ता शैल अवधारणाएँ विकसित हुईं। प्रारम्भिक विंडोज डिजाइनों ने एक साधारण बैच प्रोग्रामिंग क्षमता की पेशकश की। इन भाषाओं के पारंपरिक परिवर्तन में एक दुभाषिया का इस्तेमाल किया गया था। जबकि व्यापक रूप से उपयोग नहीं किया जाता है, बैश और बैच कंपाइलर लिखे गए हैं। हाल ही में परिष्कृत व्याख्या की गई भाषाएं डेवलपर टूल किट का भाग बन गईं। आधुनिक स्क्रिप्टिंग भाषाओं में PHP, Python, Ruby और Lua सम्मिलित हैं। (लुआ व्यापक रूप से खेल के विकास में उपयोग किया जाता है।) इन सभी में दुभाषिया और संकलक समर्थन है।<ref>P.Biggar, E. de Vries, D. Gregg, "A Practical Solution for Scripting Language Compilers", submission to Science of Computer Programming, 2009</ref>
उच्च-स्तरीय भाषाओं ने संकलक अनुसंधान और विकास को निरंतर सक्रिय रखा। केंद्र क्षेत्रों में अनुकूलन और स्वचालित कोड जनरेशन सम्मिलित हैं। प्रोग्रामिंग भाषाओं और विकास के वातावरण में प्रचलन ने संकलक तकनीक को प्रभावित किया। अधिक संकलक भाषा वितरण (पीईआरएल, जावा विकास किट) और एक आईडीई (वीएडीएस, एक्लिप्स, एडीए प्रो) के एक घटक के रूप में सम्मिलित हो गए। प्रौद्योगिकियों के अंतर्संबंध और अन्योन्याश्रय में वृद्धि हुई। वेब सेवाओं के आगमन ने वेब भाषाओं और स्क्रिप्टिंग भाषाओं के विकास को बढ़ावा दिया। स्क्रिप्ट्स कमांड लाइन इंटरफेस (सीएलआई) के प्रारम्भिक दिनों में वापस आती हैं जहां उपयोगकर्ता प्रणाली द्वारा निष्पादित किए जाने वाले आदेशों को प्रविष्ट कर सकता है। शेल प्रोग्राम लिखने के लिए भाषाओं के साथ उपयोगकर्ता शैल अवधारणाएँ विकसित हुईं। प्रारम्भिक विंडोज डिजाइनों ने एक साधारण बैच प्रोग्रामिंग क्षमता की प्रस्तुत की। इन भाषाओं के पारंपरिक परिवर्तन में एक अनुवादक का उपयोग किया गया था। जबकि व्यापक रूप से उपयोग नहीं किया जाता है, बैश और बैच संकलक लिखे गए हैं। हाल ही में परिष्कृत व्याख्या की गई भाषाएं विकासक टूल-किट का भाग बन गईं। आधुनिक स्क्रिप्टिंग भाषाओं में पीएचपी, पायथन, रूबी और लुआ सम्मिलित हैं। (लुआ व्यापक रूप से खेल के विकास में उपयोग किया जाता है) इन सभी में अनुवादक और संकलक समर्थन है।<ref>P.Biggar, E. de Vries, D. Gregg, "A Practical Solution for Scripting Language Compilers", submission to Science of Computer Programming, 2009</ref>
जब 50 के दशक के उत्तरार्ध में संकलन का क्षेत्र प्रारंभ हुआ, तो इसका ध्यान उच्च-स्तरीय भाषा कार्यक्रमों के मशीन कोड में अनुवाद तक सीमित था ... संकलक क्षेत्र कंप्यूटर वास्तुकला, प्रोग्रामिंग भाषाओं, औपचारिक तरीकों, सॉफ्टवेयर सहित अन्य विषयों के साथ तेजी से जुड़ा हुआ है। इंजीनियरिंग, और कंप्यूटर सुरक्षा।<ref>M.Hall, D. Padua, K. Pingali, "Compiler Research: The Next 50 Years", ACM Communications 2009 Vol 54 #2</ref> द कंपाइलर रिसर्च: द नेक्स्ट 50 इयर्स आर्टिकल ने ऑब्जेक्ट-ओरिएंटेड लैंग्वेज और जावा के महत्व पर ध्यान दिया। भविष्य के अनुसंधान लक्ष्यों में सुरक्षा और समानांतर कंप्यूटिंग का हवाला दिया गया।
 
जब 50 के दशक के उत्तरार्ध में संकलन का क्षेत्र प्रारंभ हुआ, तो इसका ध्यान उच्च-स्तरीय भाषा प्रोग्रामों के मशीन कोड में अनुवाद तक सीमित था संकलक क्षेत्र कंप्यूटर संरचना, प्रोग्रामिंग भाषाओं, औपचारिक तरीकों, इंजीनियरिंग, और कंप्यूटर सुरक्षा सॉफ्टवेयर सहित अन्य विषयों के साथ तीव्रता से जुड़ा हुआ है। <ref>M.Hall, D. Padua, K. Pingali, "Compiler Research: The Next 50 Years", ACM Communications 2009 Vol 54 #2</ref> <nowiki>''</nowiki>संकलक अनुसंधान: द नेक्स्ट 50 इयर्स<nowiki>''</nowiki> लेख ने वस्तु-उन्मुख भाषा और जावा के महत्व पर ध्यान दिया। भविष्य के अनुसंधान लक्ष्यों में सुरक्षा और समानांतर कंप्यूटिंग का उल्लेख किया गया।


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


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


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


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


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


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


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


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


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


==== फ्रंट एंड ====
==== फ्रंट एंड ====
[[File:Xxx Scanner and parser example for C.gif|thumb|right|400px|सी (प्रोग्रामिंग भाषा) के लिए लेक्सिकल विश्लेषण और पार्सिंग उदाहरण। पात्रों के क्रम से शुरू<code>if(net>0.0)total+=net*(1.0+tax/100.0);</code>, स्कैनर लेक्सिकल विश्लेषण#टोकन के अनुक्रम की रचना करता है, और उनमें से प्रत्येक को वर्गीकृत करता है, उदाहरण के लिए {{color|#600000|identifier}}, {{color|#606000|reserved word}}, {{color|#006000|number literal}}, या {{color|#000060|operator}}. बाद के अनुक्रम को पार्सर द्वारा एक [[सार वाक्य रचना का पेड़]] में बदल दिया जाता है, जिसे बाद में शेष संकलक चरणों द्वारा व्यवहार किया जाता है। स्कैनर और पार्सर क्रमशः [[सी सिंटैक्स]] के [[नियमित व्याकरण]] और ठीक से संदर्भ-मुक्त व्याकरण | संदर्भ-मुक्त भागों को संभालते हैं।]]फ्रंट एंड प्रोग्राम का आंतरिक प्रतिनिधित्व बनाने के लिए स्रोत कोड का विश्लेषण करता है, जिसे इंटरमीडिएट प्रतिनिधित्व (आईआर) कहा जाता है। यह [[प्रतीक तालिका]] का प्रबंधन भी करता है, एक डेटा संरचना जो स्रोत कोड में प्रत्येक प्रतीक को संबंधित जानकारी जैसे स्थान, प्रकार और दायरे से मैप करती है।
[[File:Xxx Scanner and parser example for C.gif|thumb|right|400px| संदर्भ-मुक्त भागों को ग्रहण करते हैं।]]फ्रंट एंड प्रोग्राम का आंतरिक प्रतिनिधित्व बनाने के लिए स्रोत कोड का विश्लेषण करता है, जिसे मध्यवर्ती प्रतिनिधित्व (आईआर) कहा जाता है। यह [[प्रतीक तालिका|प्रतीक सारणी]] का प्रबंधन भी करता है, एक डेटा संरचना जो स्रोत कोड में प्रत्येक प्रतीक को संबंधित जानकारी जैसे स्थान, प्रकार और विस्तार से पता लगाती है।


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


फ्रंट एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं:
फ्रंट एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं:
*{{visible anchor|Line reconstruction}}पार्सर के लिए तैयार इनपुट वर्ण अनुक्रम को एक विहित रूप में परिवर्तित करता है। भाषाएं जो अपने खोजशब्दों को स्ट्रॉपिंग (वाक्यविन्यास) करती हैं या पहचानकर्ताओं के भीतर मनमाने ढंग से रिक्त स्थान की स्वीकृति देती हैं, उन्हें इस चरण की आवश्यकता होती है। 1960 के दशक में उपयोग किए जाने वाले [[टॉप-डाउन पार्सिंग]]|टॉप-डाउन, [[पुनरावर्ती वंश पार्सर]]|रिकर्सिव-डिसेंट, टेबल-ड्रिवन पार्सर्स सामान्यतः स्रोत को एक समय में एक वर्ण पढ़ते हैं और इसके लिए एक [[अल्गोल]] टोकनिंग चरण की आवश्यकता नहीं होती है। [[एटलस ऑटोकोड]] और [[एडिनबर्ग आईएमपी]] (और एएलजीओएल और [[मूंगा 66]] के कुछ कार्यान्वयन) सीमित भाषाओं के उदाहरण हैं जिनके संकलक के पास लाइन पुनर्निर्माण चरण होगा।
*{{visible anchor|रेखा पुनर्निर्माण}} पार्सर के लिए तैयार इनपुट वर्ण अनुक्रम को एक विहित रूप में परिवर्तित करता है। वे भाषाएँ जो अपने कीवर्ड्स को कम कर देती हैं या पहचानकर्ताओं के अंदर एकपक्षीय रूप से से रिक्त स्थान की स्वीकृति देती हैं, उन्हें इस चरण की आवश्यकता होती है। 1960 के दशक में उपयोग किए जाने वाले [[टॉप-डाउन पार्सिंग|टॉप-डाउन]], [[रिकर्सिव-डिसेंट]], [[टेबल-ड्रिवन]] पार्सर्स सामान्यतः स्रोत को एक समय में एक वर्ण पढ़ते हैं और इसके लिए एक [[अल्गोल]] टोकनिंग चरण की आवश्यकता नहीं होती है। [[एटलस ऑटोकोड]] और [[एडिनबर्ग आईएमपी]] (और एएलजीओएल और [[मूंगा 66|कोरल 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>
* सिमेंटिक एनालिसिस (कंपाइलर) पार्स ट्री में सिमेंटिक जानकारी जोड़ता है और सिंबल टेबल बनाता है। यह चरण सिमेंटिक चेक करता है जैसे कि टाइप चेकिंग (टाइप एरर के लिए चेकिंग), या [[वस्तु बंधन]] (वैरिएबल और फंक्शन रेफरेंस को उनकी परिभाषाओं के साथ जोड़ना), या निश्चित [[निश्चित असाइनमेंट विश्लेषण]]उपयोग से पहले सभी स्थानीय वैरिएबल को इनिशियलाइज़ करने की आवश्यकता होती है), गलत प्रोग्राम को अस्वीकार करना या चेतावनी जारी करना। सिमेंटिक विश्लेषण के लिए सामान्यतः एक पूर्ण पार्स ट्री की आवश्यकता होती है, जिसका अर्थ है कि यह चरण तार्किक रूप से पार्सिंग चरण का अनुसरण करता है, और तार्किक रूप से कोड जनरेशन (कंपाइलर) चरण से पहले होता है, हालांकि एक कंपाइलर कार्यान्वयन में कोड के ऊपर एक पास में कई चरणों को मोड़ना प्रायः संभव होता है।
* सिमेंटिक एनालिसिस (संकलक) पार्स ट्री में सिमेंटिक जानकारी एकत्र करता है और प्रतीक सारणी बनाता है। यह चरण सेमेटिक जाँच करता है जैसे कि टाइप जांच (टाइप त्रुटि के लिए जांच ), या [[वस्तु बंधन|वस्तु अनुबंधन]] (परिवर्तनशील और फंक्शन संदर्भ को उनकी परिभाषाओं के साथ जोड़ना), या [[निश्चित असाइनमेंट विश्लेषण|नियत कार्य]] (उपयोग से पहले सभी स्थानीय परिवर्तनशील को प्रारंभिक स्थापन करने की आवश्यकता होती है), गलत प्रोग्राम को अस्वीकार करना या चेतावनी प्रकाशित करना। सिमेंटिक विश्लेषण के लिए सामान्यतः एक पूर्ण पार्स ट्री की आवश्यकता होती है, जिसका अर्थ है कि यह चरण तार्किक रूप से पार्सिंग चरण का अनुसरण करता है, और तार्किक रूप से कोड जनरेशन (संकलक) चरण से पहले होता है, हालांकि एक संकलक कार्यान्वयन में कोड के ऊपर एक पास में कई चरणों को आवृत करना प्रायः संभव होता है।


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


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


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


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


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


==== बैक एंड ====
==== बैक एंड ====
बैक एंड सीपीयू संरचना विशिष्ट अनुकूलन और कोड जनरेशन (कंपाइलर) के लिए जिम्मेदार है<ref name="Hjort Blindell, Gabriel"/>.
बैक एंड सीपीयू संरचना विशिष्ट अनुकूलन और कोड जनरेशन (संकलक) के लिए अधीन है।<ref name="Hjort Blindell, Gabriel"/>


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


=== संकलक शुद्धता ===
=== संकलक शुद्धता ===
{{Main|Compiler correctness}}
{{Main|संकलक शुद्धता}}
कंपाइलर शुद्धता सॉफ्टवेयर इंजीनियरिंग की शाखा है जो यह दिखाने की कोशिश करती है कि एक कंपाइलर अपनी प्रोग्रामिंग भाषा के अनुसार व्यवहार करता है।{{citation needed|date=February 2020}} तकनीकों में औपचारिक तरीकों का उपयोग करके कंपाइलर विकसित करना और सम्मिलित कंपाइलर पर कठोर परीक्षण (जिसे प्रायः कंपाइलर सत्यापन कहा जाता है) का उपयोग करना सम्मिलित है।
संकलक शुद्धता सॉफ्टवेयर इंजीनियरिंग की शाखा है जो यह दिखाने की कोशिश करती है कि एक संकलक अपनी प्रोग्रामिंग भाषा के अनुसार गतिविधि करता है।{{citation needed|date=February 2020}} तकनीकों में औपचारिक तरीकों का उपयोग करके संकलक विकसित करना और सम्मिलित संकलक पर कठोर परीक्षण (जिसे प्रायः संकलक सत्यापन कहा जाता है) का उपयोग करना सम्मिलित है।


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


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


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


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


== प्रकार ==
== प्रकार ==
कम्पाइलरों का एक वर्गीकरण [[कम्प्यूटिंग मंच]] द्वारा होता है, जिस पर उनका उत्पन्न कोड निष्पादित होता है। इसे लक्ष्य मंच के रूप में जाना जाता है।
कम्पाइलरों का एक वर्गीकरण [[कम्प्यूटिंग मंच|कम्प्यूटिंग प्लेटफ़ॉर्म]] द्वारा होता है, जिस पर उनका उत्पन्न कोड निष्पादित होता है। इसे योजनाबद्ध प्लेटफ़ॉर्म के रूप में जाना जाता है।


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


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


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


जबकि एक सामान्य संकलक प्रकार मशीन कोड को आउटपुट करता है, कई अन्य प्रकार हैं:
जबकि एक सामान्य संकलक प्रकार मशीन कोड को आउटपुट करता है, कई अन्य प्रकार हैं:
*सोर्स-टू-सोर्स कंपाइलर एक प्रकार का कंपाइलर है जो एक उच्च-स्तरीय भाषा को अपने इनपुट के रूप में लेता है और एक उच्च-स्तरीय भाषा को आउटपुट करता है। उदाहरण के लिए, एक स्वचालित समानांतरकरण संकलक प्रायः एक उच्च-स्तरीय भाषा कार्यक्रम को एक इनपुट के रूप में लेता है और फिर कोड को रूपांतरित करता है और इसे समानांतर कोड एनोटेशन (जैसे [[ओपनएमपी]]) या भाषा निर्माण (जैसे फोरट्रान) के साथ एनोटेट करता है। <code>DOALL</code> कथन)। सोर्स-टू-सोर्स कंपाइलर के लिए अन्य शब्द ट्रांसकंपलर या ट्रांसपिलर हैं।<ref>{{cite journal |last1=Ilyushin |first1=Evgeniy |last2=Namiot |first2=Dmitry |date=2016 |title=सोर्स-टू-सोर्स कंपाइलर्स पर|url=https://cyberleninka.ru/article/n/on-source-to-source-compilers/pdf |journal=International Journal of Open Information Technologies |volume=4 |issue=5 |pages=48–51 |archive-url=https://web.archive.org/web/20220913223759/https://cyberleninka.ru/article/n/on-source-to-source-compilers/pdf |archive-date=September 14, 2022 |access-date=September 14, 2022}}</ref>
*सोर्स-टू-सोर्स संकलक एक प्रकार का संकलक है जो एक उच्च-स्तरीय भाषा को अपने इनपुट के रूप में लेता है और एक उच्च-स्तरीय भाषा को आउटपुट करता है। उदाहरण के लिए, एक स्वचालित समानांतरकरण संकलक प्रायः एक उच्च-स्तरीय भाषा प्रोग्राम को एक इनपुट के रूप में लेता है और पुनः कोड को रूपांतरित करता है और इसे समानांतर कोड व्याख्या (जैसे [[ओपनएमपी]]) या भाषा निर्माण (जैसे फोरट्रान) के साथ व्याख्या करता है। <code>DOALL</code> कथन)। सोर्स-टू-सोर्स संकलक के लिए अन्य शब्द ट्रांसकंपलर या ट्रांसपिलर हैं।<ref>{{cite journal |last1=Ilyushin |first1=Evgeniy |last2=Namiot |first2=Dmitry |date=2016 |title=सोर्स-टू-सोर्स कंपाइलर्स पर|url=https://cyberleninka.ru/article/n/on-source-to-source-compilers/pdf |journal=International Journal of Open Information Technologies |volume=4 |issue=5 |pages=48–51 |archive-url=https://web.archive.org/web/20220913223759/https://cyberleninka.ru/article/n/on-source-to-source-compilers/pdf |archive-date=September 14, 2022 |access-date=September 14, 2022}}</ref>
* बायटेकोड कंपाइलर एक सैद्धांतिक मशीन की असेंबली भाषा को संकलित करते हैं, जैसे कुछ [[प्रोलॉग]] कार्यान्वयन
* बायटेकोड संकलक एक सैद्धांतिक मशीन की असेंबली भाषा को संकलित करते हैं, जैसे कुछ [[प्रोलॉग]] कार्यान्वयन
** इस प्रोलॉग मशीन को [[वॉरेन सार मशीन]] (या WAM) के नाम से भी जाना जाता है।
** इस प्रोलॉग मशीन को [[वॉरेन सार मशीन]] (या डब्लूएएम) के नाम से भी जाना जाता है।
** [[जावा (प्रोग्रामिंग भाषा)]], पायथन (प्रोग्रामिंग लैंग्वेज) के लिए बाइटकोड कंपाइलर भी इस श्रेणी के उदाहरण हैं।
** [[जावा (प्रोग्रामिंग भाषा)]], [[पायथन]] (प्रोग्रामिंग भाषा) के लिए बाइटकोड संकलक भी इस श्रेणी के उदाहरण हैं।
*जस्ट-इन-टाइम कंपाइलेशन|जस्ट-इन-टाइम कंपाइलर्स (जेआईटी कंपाइलर) रनटाइम तक कंपाइलेशन को टालते हैं। पायथन (प्रोग्रामिंग लैंग्वेज), [[जावास्क्रिप्ट]], स्मॉलटॉक, जावा (प्रोग्रामिंग लैंग्वेज), माइक्रोसॉफ्ट .NET फ्रेमवर्क| .NET की [[सामान्य मध्यवर्ती भाषा]] (CIL) और अन्य सहित कई आधुनिक भाषाओं के लिए JIT कंपाइलर सम्मिलित हैं। एक जेआईटी कंपाइलर सामान्यतः दुभाषिया के अंदर चलता है। जब दुभाषिया पता लगाता है कि एक कोड पथ गर्म है, जिसका अर्थ है कि इसे प्रायः निष्पादित किया जाता है, जेआईटी कंपाइलर को लागू किया जाएगा और बढ़ते प्रदर्शन के लिए गर्म कोड संकलित किया जाएगा।
*जस्ट-इन-टाइम संकलक (जेआईटी संकलक) रनटाइम तक संकलन को स्थगित करते हैं। जिनमे पायथन (प्रोग्रामिंग भाषा), [[जावास्क्रिप्ट]], स्मॉलटॉक, [[जावा]] (प्रोग्रामिंग भाषा), माइक्रोसॉफ्ट एनईटी की [[सामान्य मध्यवर्ती भाषा]] (सीआईएल) और अन्य कई आधुनिक भाषाओं के लिए जेआईटी संकलक सम्मिलित हैं। एक [[जेआईटी]] संकलक सामान्यतः अनुवादक के अंदर सक्रिय है। जब अनुवादक पता लगाता है कि एक कोड पथ "हॉट" है, जिसका अर्थ है कि इसे प्रायः निष्पादित किया जाता है, जेआईटी संकलक को क्रियान्वित किया जाएगा और बढ़ते प्रदर्शन के लिए "[[हॉट]]" कोड संकलित किया जाएगा।
** कुछ भाषाओं के लिए, जैसे कि जावा, एप्लिकेशन को पहले बायटेकोड कंपाइलर का उपयोग करके संकलित किया जाता है और मशीन-स्वतंत्र मध्यवर्ती प्रतिनिधित्व में वितरित किया जाता है। एक बाइटकोड दुभाषिया बाइटकोड निष्पादित करता है, लेकिन जेआईटी कंपाइलर बाइटकोड को मशीन कोड में अनुवादित करेगा जब प्रदर्शन बढ़ाना आवश्यक होगा।<ref>{{cite journal|author = Aycock, John | year = 2003 | title=जस्ट-इन-टाइम का एक संक्षिप्त इतिहास|journal=ACM Comput. Surv.|volume=35|issue=2; June | pages = 93–113 | doi = 10.1145/857076.857077 | s2cid = 15345671 }}</ref>{{primary source inline|date=March 2017}}
** कुछ भाषाओं के लिए, जैसे कि जावा, एप्लिकेशन को पहले बायटेकोड संकलक का उपयोग करके संकलित किया जाता है और मशीन-स्वतंत्र मध्यवर्ती प्रतिनिधित्व में वितरित किया जाता है। एक बाइटकोड अनुवादक बाइटकोड निष्पादित करता है, लेकिन जेआईटी संकलक बाइटकोड को मशीन कोड में अनुवादित करेगा जब प्रदर्शन बढ़ाना आवश्यक होगा।<ref>{{cite journal|author = Aycock, John | year = 2003 | title=जस्ट-इन-टाइम का एक संक्षिप्त इतिहास|journal=ACM Comput. Surv.|volume=35|issue=2; June | pages = 93–113 | doi = 10.1145/857076.857077 | s2cid = 15345671 }}</ref>{{primary source inline|date=March 2017}}
* [[सिलिकॉन संकलक]] (संश्लेषण उपकरण के रूप में भी जाना जाता है) ऐसे कंपाइलर हैं जिनका इनपुट एक [[हार्डवेयर विवरण भाषा]] है और जिसका आउटपुट एक विवरण है, एक [[netlist]] के रूप में या अन्यथा, हार्डवेयर कॉन्फ़िगरेशन का।
* हार्डवेयर संकलक (संश्लेषण उपकरण के रूप में भी जाना जाता है) संकलक होते हैं जिनका इनपुट एक हार्डवेयर विवरण भाषा है एक [[नेटलिस्ट]] के रूप में या अन्यथा, हार्डवेयर कॉन्फ़िगरेशन का आउटपुट एक विवरण है, ।
** इन कंपाइलरों का आउटपुट [[कम्पुटर के वो भाग जिसे छूकर मेहसूस किया जा सके]] को बहुत निम्न स्तर पर लक्षित करता है, उदाहरण के लिए एक [[क्षेत्र में प्रोग्राम की जा सकने वाली द्वार श्रंखला]] (FPGA) या संरचित अनुप्रयोग-विशिष्ट एकीकृत सर्किट (ASIC)।<ref>{{cite journal|last1=Swartz|first1=Jordan S.|last2=Betz |first2=Vaugh |last3 =Rose|first3=Jonathan|title=FPGAs के लिए एक तेज़ रूटेबिलिटी-संचालित राउटर|location=Monterey, CA|publisher=[[Association for Computing Machinery|ACM]]|url= http://www.eecg.toronto.edu/~vaughn/papers/fpga98.pdf |url-status=live|archive-url=https://web.archive.org/web/20170809012611/http://www.eecg.toronto.edu/~vaughn/papers/fpga98.pdf|archive-date=9 August 2017|journal = FPGA '98 Proceedings of the 1998 ACM/SIGDA Sixth International Symposium on Field Programmable Gate Arrays |date =22-25 February 1998|doi = 10.1145/275107.275134 |pages=140–149|isbn=978-0897919784|s2cid=7128364}}</ref>{{primary source inline|date=March 2017}} ऐसे कंपाइलर्स को हार्डवेयर कंपाइलर्स कहा जाता है, क्योंकि वे जिस सोर्स कोड को संकलित करते हैं, वह प्रभावी रूप से हार्डवेयर के अंतिम कॉन्फ़िगरेशन को नियंत्रित करता है और यह कैसे संचालित होता है। संकलन का आउटपुट केवल [[ट्रांजिस्टर]] या [[खोज तालिका]] का एक इंटरकनेक्शन है।
** इन कंपाइलरों का आउटपुट कंप्यूटर हार्डवेयर को अधिक निम्न स्तर पर योजनाबद्ध करता है, उदाहरण के लिए क्षेत्र प्रोग्रामयोग्य गेट सरणी (एफपीजीए) या संरचित अनुप्रयोग-विशिष्ट एकीकृत परिपथ (एएसआईसी)।<ref>{{cite journal|last1=Swartz|first1=Jordan S.|last2=Betz |first2=Vaugh |last3 =Rose|first3=Jonathan|title=FPGAs के लिए एक तेज़ रूटेबिलिटी-संचालित राउटर|location=Monterey, CA|publisher=[[Association for Computing Machinery|ACM]]|url= http://www.eecg.toronto.edu/~vaughn/papers/fpga98.pdf |url-status=live|archive-url=https://web.archive.org/web/20170809012611/http://www.eecg.toronto.edu/~vaughn/papers/fpga98.pdf|archive-date=9 August 2017|journal = FPGA '98 Proceedings of the 1998 ACM/SIGDA Sixth International Symposium on Field Programmable Gate Arrays |date =22-25 February 1998|doi = 10.1145/275107.275134 |pages=140–149|isbn=978-0897919784|s2cid=7128364}}</ref>{{primary source inline|date=March 2017}} ऐसे संकलक को हार्डवेयर संकलक कहा जाता है, क्योंकि वे जिस स्रोत कोड को संकलित करते हैं, वह प्रभावी रूप से हार्डवेयर के अंतिम कॉन्फ़िगरेशन को नियंत्रित करता है और यह कैसे संचालित होता है। संकलन का आउटपुट केवल [[ट्रांजिस्टर|संक्रामक]] या [[खोज तालिका|खोज सारणी]] का एक अंतः संयोजन है।
** हार्डवेयर कंपाइलर का एक उदाहरण XST है, FPGAs को कॉन्फ़िगर करने के लिए उपयोग किया जाने वाला Xilinx सिंथेसिस टूल।<ref>{{cite web|author=Xilinx Staff|date=2009|title=एक्सएसटी संश्लेषण अवलोकन|publisher=Xilinx, Inc.|url=http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/ise_c_using_xst_for_synthesis.htm|access-date=28 February 2017|url-status=live|archive-url=https://web.archive.org/web/20161102004019/http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/ise_c_using_xst_for_synthesis.htm|archive-date=2 November 2016}}</ref>{{primary source inline|date=March 2017}} इसी तरह के उपकरण Altera से उपलब्ध हैं,<ref>{{cite web|author=Altera Staff|date=2017|title=स्पेक्ट्रा-क्यू™ इंजन|publisher=Altera.com|url=https://www.altera.com/products/design-software/fpga-design/quartus-prime/features/spectra-q.html|access-date=28 February 2017|url-status=dead|archive-url=https://web.archive.org/web/20161010221724/https://www.altera.com/products/design-software/fpga-design/quartus-prime/features/spectra-q.html|archive-date=10 October 2016}}</ref>{{primary source inline|date=March 2017}} Synplicity, Synopsys और अन्य हार्डवेयर विक्रेता।{{citation needed|date=March 2017}}
** हार्डवेयर संकलक का एक उदाहरण एक्सएसटी है, जो [[Xilinx]] कृत्रिम उपकरण है जिसका उपयोग एफपीजीए को विन्यस्त करने के लिए किया जाता है।<ref>{{cite web|author=Xilinx Staff|date=2009|title=एक्सएसटी संश्लेषण अवलोकन|publisher=Xilinx, Inc.|url=http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/ise_c_using_xst_for_synthesis.htm|access-date=28 February 2017|url-status=live|archive-url=https://web.archive.org/web/20161102004019/http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/ise_c_using_xst_for_synthesis.htm|archive-date=2 November 2016}}</ref>{{primary source inline|date=March 2017}} इसी तरह के उपकरण परिवर्तन,<ref>{{cite web|author=Altera Staff|date=2017|title=स्पेक्ट्रा-क्यू™ इंजन|publisher=Altera.com|url=https://www.altera.com/products/design-software/fpga-design/quartus-prime/features/spectra-q.html|access-date=28 February 2017|url-status=dead|archive-url=https://web.archive.org/web/20161010221724/https://www.altera.com/products/design-software/fpga-design/quartus-prime/features/spectra-q.html|archive-date=10 October 2016}}</ref>{{primary source inline|date=March 2017}} सिनप्लिसिटी, सिनॉप्सिस और अन्य हार्डवेयर विक्रेता से उपलब्ध हैं।{{citation needed|date=March 2017}}
* असेंबलर एक प्रोग्राम है जो मानव पठनीय असेंबली भाषा को मशीन कोड, हार्डवेयर द्वारा निष्पादित वास्तविक निर्देशों को संकलित करता है। उलटा प्रोग्राम जो मशीन कोड को असेंबली लैंग्वेज में ट्रांसलेट करता है, उसे [[disassembler]] कहा जाता है।
* असेंबलर एक प्रोग्राम है जो मानव पठनीय असेंबली भाषा को मशीन कोड, हार्डवेयर द्वारा निष्पादित वास्तविक निर्देशों को संकलित करता है। व्युत्क्रम प्रोग्राम जो मशीन कोड को असेंबली भाषा में अनुवाद करता है, उसे [[disassembler|असेंबलर]] कहा जाता है।
* एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह डीकंपलर है।<ref>{{Cite web |title=डीकंपलर - एक सिंहावलोकन {{!}} ScienceDirect विषय|url=https://www.sciencedirect.com/topics/computer-science/decompilers |access-date=2022-06-12 |website=www.sciencedirect.com}}</ref>{{citation needed|date=March 2017}}
* एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह डीकंपलर है।<ref>{{Cite web |title=डीकंपलर - एक सिंहावलोकन {{!}} ScienceDirect विषय|url=https://www.sciencedirect.com/topics/computer-science/decompilers |access-date=2022-06-12 |website=www.sciencedirect.com}}</ref>{{citation needed|date=March 2017}}
* एक प्रोग्राम जो एक ऑब्जेक्ट कोड प्रारूप में अनुवाद करता है जो संकलन मशीन पर समर्थित नहीं है, उसे क्रॉस कंपाइलर कहा जाता है और सामान्यतः एम्बेडेड अनुप्रयोगों के लिए कोड तैयार करने के लिए उपयोग किया जाता है।{{citation needed|date=March 2017}}{{clarify|date=February 2017}}
* एक प्रोग्राम जो एक वस्तु कोड प्रारूप में अनुवाद करता है जो संकलन मशीन पर समर्थित नहीं है, उसे क्रॉस संकलक कहा जाता है और सामान्यतः [[अंतःस्थापित एप्लिकेशन]] के लिए कोड तैयार करने के लिए उपयोग किया जाता है।{{citation needed|date=March 2017}}{{clarify|date=February 2017}}
* एक प्रोग्राम जो ऑप्टिमाइजेशन और ट्रांसफॉर्मेशन लागू करते समय ऑब्जेक्ट कोड को उसी प्रकार के ऑब्जेक्ट कोड में वापस लिखता है, वह [[बाइनरी रीकंपाइलर]] है।
* एक प्रोग्राम जो अनुकूलन और रूपांतरण क्रियान्वित करते समय वस्तु कोड को उसी प्रकार के वस्तु कोड में वापस लिखता है, वह [[बाइनरी रीकंपाइलर|बाइनरी पुनःसंयोजक]] है।


== यह भी देखें ==
== यह भी देखें ==
{{Portal|Computer programming}}
{{Portal|Computer programming}}
{{div col|colwidth=22em}}
{{div col|colwidth=22em}}
* [[सार व्याख्या]]
* [[अमूर्त व्याख्य]]
* [[नीचे-ऊपर पार्सिंग]]
* [[बाटम-अप पार्सिंग]]
* [[कंपाइल एंड गो सिस्टम]]
* [[कंपाइल एंड गो सिस्टम]]
* संकलन खेत
* संकलन फार्म
* कंपाइलर्स की सूची
* कंपाइलर्स की सूची
* {{Section link|List of important publications in computer science|Compilers}}
* {{Section link|कंप्यूटर विज्ञान में महत्वपूर्ण प्रकाशनों की सूची § संकलक|संकलक}}
* [[मेटाकंपिलेशन]]
* [[मेटाकंपिलेशन]]
{{div col end}}
{{div col end}}
Line 213: Line 217:




==इस पेज में लापता आंतरिक लिंक की सूची==
*सभा की भाषा
*सोर्स कोड
*अनुवादक (कम्प्यूटिंग)
*उच्च स्तरीय प्रोग्रामिंग भाषा
*शब्दार्थ विश्लेषण (संकलक)
*कोड जनरेशन (संकलक)
*मुख्य स्मृति
*संदर्भ मुक्त व्याकरण
*एपीएल (प्रोग्रामिंग भाषा)
*जॉन मैकार्थी (कंप्यूटर वैज्ञानिक)
*साथ
*सी (प्रोग्रामिंग भाषा)
*एकीकृत विकास पर्यावरण
*निष्पादन इकाई
*निरंतर प्रसार
*आवंटन रजिस्टर करें
*अनुमानी (कंप्यूटर विज्ञान)
*चिंताओ का विभाजन
*स्ट्रैपिंग (वाक्यविन्यास)
*योजना (प्रोग्रामिंग भाषा)
*परिमित राज्य automaton
*डेटा प्रवाह विश्लेषण
*पाश परिवर्तन
*स्वचालित समानांतरकरण
*औपचारिक तरीके
*छोटी बात
*पायथन (प्रोग्रामिंग भाषा)
*विशिष्ट एकीकृत परिपथ आवेदन
*संकलक की सूची
*संकलन फार्म
== बाहरी कड़ियाँ ==
== बाहरी कड़ियाँ ==
{{Wiktionary|compiler}}
{{Wiktionary|compiler}}
Line 266: Line 237:
[[श्रेणी: उपयोगिता सॉफ्टवेयर प्रकार]]
[[श्रेणी: उपयोगिता सॉफ्टवेयर प्रकार]]


 
[[Category:All articles with unsourced statements]]
[[Category: Machine Translated Page]]
[[Category:Articles with Curlie links]]
[[Category:Created On 19/12/2022]]
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category:Articles with invalid date parameter in template]]
[[Category:Articles with short description]]
[[Category:Articles with unsourced statements from December 2021]]
[[Category:Articles with unsourced statements from February 2020]]
[[Category:Articles with unsourced statements from March 2017]]
[[Category:CS1 English-language sources (en)]]
[[Category:CS1 français-language sources (fr)]]
[[Category:CS1 maint]]
[[Category:CS1 Ελληνικά-language sources (el)]]
[[Category:Citation Style 1 templates|W]]
[[Category:Collapse templates]]
[[Category:Exclude in print]]
[[Category:Interwiki category linking templates]]
[[Category:Interwiki link templates]]
[[Category:Lua-based templates]]
[[Category:Multi-column templates]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages using div col with small parameter]]
[[Category:Pages with empty portal template]]
[[Category:Pages with script errors]]
[[Category:Portal templates with redlinked portals]]
[[Category:Short description with empty Wikidata description]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates based on the Citation/CS1 Lua module]]
[[Category:Templates generating COinS|Cite web]]
[[Category:Templates generating microformats]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that are not mobile friendly]]
[[Category:Templates used by AutoWikiBrowser|Cite web]]
[[Category:Templates using TemplateData]]
[[Category:Templates using under-protected Lua modules]]
[[Category:Use dmy dates from October 2020]]
[[Category:Webarchive template wayback links]]
[[Category:Wikimedia Commons templates]]
[[Category:Wikipedia articles needing clarification from February 2017]]
[[Category:Wikipedia fully protected templates|Cite web]]
[[Category:Wikipedia metatemplates]]

Latest revision as of 17:47, 6 January 2023

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

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

कंप्यूटिंग, संकलक (कंपाइलर) एक कंप्यूटर प्रोग्राम है जो प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा टारगेट-भाषा में अनुवादित करता है। ''संकलक'' नाम मुख्य रूप से उन प्रोग्रामों के लिए उपयोग किया जाता है जो एक कार्यान्वयन प्रोग्राम बनाने के लिए एक उच्च-स्तरीय प्रोग्रामिंग भाषा से एक निम्न-स्तरीय प्रोग्रामिंग भाषा (जैसे असेंबली भाषा, वस्तु कोड, या मशीन कोड) में स्रोत कोड का अनुवाद करता है।[1][2]: p1 [3]

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

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

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

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

इतिहास

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

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

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

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

किसी भाषा में वाक्यों को नियमों के एक समूह द्वारा परिभाषित किया जा सकता है जिसे व्याकरण कहा जाता है।[5]

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

1940 के दशक में, कोनराड ज़्यूस ने प्लैंकलकुल (प्लान कैलकुलस) नामक एक एल्गोरिथम प्रोग्रामिंग भाषा तैयार की। जबकि 1970 के दशक तक कोई वास्तविक कार्यान्वयन नहीं हुआ था, इसने बाद में 1950 के दशक के अंत में केन इवरसन द्वारा डिज़ाइन की गई एपीएल (प्रोग्रामिंग भाषा) में देखी गई अवधारणाओं को प्रस्तुत किया।[9] एपीएल गणितीय संगणनाओं के लिए एक भाषा है।

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

  • फोरट्रान (फॉर्मूला अनुवाद) को इंजीनियरिंग और विज्ञान अनुप्रयोगों के लिए पहली उच्च स्तरीय भाषा माना जाता है।[10]
  • कोबोल (सामान्य व्यवसाय उन्मुखी भाषा) ए-0 और फ्लो-मैटिक से विकसित होकर व्यावसायिक अनुप्रयोगों के लिए प्रमुख उच्च-स्तरीय भाषा बन गई।[11]
  • एलआईएसपी (प्रोग्रामिंग भाषा) (सूची प्रोसेसर) प्रतीकात्मक संगणना के लिए।[12]

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

संकलक प्रौद्योगिकी के विकास में कुछ प्रारंभिक उपलब्धियां:

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

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

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

ब्लिस (प्रणाली सॉफ्टवेयर के कार्यान्वयन के लिए मूल भाषा) को डिजिटल उपकरण संस्था (डीईसी) पीडीपी-10 कंप्यूटर के लिए डब्ल्यूए वुल्फ कार्नेगी मेलन विश्वविद्यालय (सीएमयू) शोध समूह द्वारा विकसित किया गया था। सीएमयू समूह ने एक साल बाद 1970 में ब्लिस-11 संकलक विकसित किया।

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

बेल लैब्स ने 1969 में मल्टिक्स परियोजना को छोड़ दिया, और डेनिस रिची और केन थॉम्पसन द्वारा लिखित बीसीपीएल अवधारणाओं पर आधारित एक प्रणाली प्रोग्रामिंग भाषा बी (प्रोग्रामिंग भाषा) विकसित की। रिची ने बी के लिए बूट-स्ट्रैपिंग संकलक बनाया और बी में पीडीपी-7 के लिए यूनिक्स (यूनिप्लेक्स सूचना और कंप्यूटिंग सेवा) ऑपरेटिंग सिस्टम लिखा। अंततः यूनिक्स वर्तनी यूनिक्स बन गया।

बेल लैब्स ने बी और बीसीपीएल के आधार पर सी (प्रोग्रामिंग भाषा) का विकास और विस्तार प्रारंभ किया। बीसीपीएल संकलक को बेल लैब्स द्वारा मल्टिक्स में ले जाया गया था और बेल लैब्स में बीसीपीएल एक मुख्य भाषा थी।[28] प्रारंभ में, बेल लैब्स के बी संकलक के लिए एक फ्रंट-एंड प्रोग्राम का उपयोग किया गया था, जब सी संकलक विकसित किया गया था। 1971 में, एक नए पीडीपी-11 ने बी को विस्तार परिभाषित करने और संकलक को पुनः लिखने के लिए संसाधन प्रदान किया। 1973 तक सी भाषा का डिजाइन अनिवार्य रूप से पूरा हो गया था और पीडीपी-11 के लिए यूनिक्स कर्नेल को सी में पुनः लिखा गया था। स्टीव जॉनसन ने पोर्टेबल सी संकलक (पीसीसी) का विकास प्रारंभ किया ताकि नई मशीनों के लिए सी संकलक के पुनः प्राप्ति का समर्थन किया जा सके।[29][30]

वस्तु उन्मुख प्रोग्रामिंग (ओओपी) ने अनुप्रयोग विकास और संरक्षण के लिए कुछ रोचक संभावनाएं प्रस्तुत कीं। वस्तु उन्मुख प्रोग्रामिंग अवधारणाएँ अधिक समर्थन करती हैं लेकिन एलआईएसपी और सिमुला भाषा विज्ञान का भाग थीं।[31] बेल लैब्स में, सी++ का विकास ओओपी में रुचि लेने लगा।[32] सी++ का पहली बार उपयोग 1980 में प्रणाली प्रोग्रामिंग के लिए किया गया था। प्रारंभिक डिजाइन ने सिमुला अवधारणाओं के साथ सी भाषा प्रणाली प्रोग्रामिंग क्षमताओं का लाभ उठाया। वस्तु-उन्मुख सुविधाओं को 1983 में जोड़ा गया था।[33] सीफ्रंट प्रोग्राम ने सी84 भाषा संकलक के लिए सी++ फ्रंट-एंड क्रियान्वित किया और बाद के वर्षों में सी++ की लोकप्रियता बढ़ने के साथ कई सी++ संकलक विकसित किए गए।

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

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

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

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

अन्य एडीए संकलक प्रयास ब्रिटेन में यॉर्क विश्वविद्यालय में और जर्मनी में कार्लज़ूए विश्वविद्यालय में प्राप्त थे। अमेरिका में, वर्डिक्स (बाद में तर्कसंगत द्वारा अधिग्रहित) ने वर्डिक्स एडीए विकास प्रणाली (वीएडीएस) को सेना को दिया। वीएडीएस ने एक संकलक सहित विकास उपकरण का एक समूह प्रदान किया। यूनिक्स/वीएडीएस को विभिन्न प्रकार के यूनिक्स प्लेटफार्मों पर आयोजित किया जा सकता है जैसे डीईसी अल्ट्रिक्स और सन 3/60 सोलारिस को सेना सीईसीओएम मूल्यांकन में मोटोरोला 68020 पर योजनाबद्ध किया गया है।[38] शीघ्र ही कई एडीए संकलक उपलब्ध थे जो एडीए सत्यापन परीक्षण पास कर चुके थे। मुफ़्त सॉफ्टवेयर संस्थान जीएनयू परियोजना ने जीएनयू संकलक संग्रह (जीसीसी) विकसित किया है जो कई भाषाओं और लक्ष्यों का समर्थन करने के लिए एक प्रमुख क्षमता प्रदान करता है। एडीए संस्करण जीएनएटी सबसे व्यापक रूप से उपयोग किए जाने वाले एडीए संकलकों में से एक है। जीएनएटी मुफ़्त है लेकिन व्यावसायिक समर्थन भी है, उदाहरण के लिए, एडीएकोर की स्थापना 1994 में एडीए के लिए व्यावसायिक सॉफ़्टवेयर समाधान प्रदान करने के लिए की गई थी। जीएनएटी प्रो में जीएनयू जीसीसी आधारित जीएनएटी सम्मिलित है जिसमें एक एकीकृत विकास वातावरण प्रदान करने के लिए एक उपकरण समूह है।

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

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

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

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

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

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

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

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

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

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

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

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

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

संकलक डिजाइन

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

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

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

फ्रंट एंड

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

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

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

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

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

मिडिल एंड

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

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

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

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

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

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

बैक एंड

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

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

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

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

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

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

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

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

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

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

प्रकार

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

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

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

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

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

  • सोर्स-टू-सोर्स संकलक एक प्रकार का संकलक है जो एक उच्च-स्तरीय भाषा को अपने इनपुट के रूप में लेता है और एक उच्च-स्तरीय भाषा को आउटपुट करता है। उदाहरण के लिए, एक स्वचालित समानांतरकरण संकलक प्रायः एक उच्च-स्तरीय भाषा प्रोग्राम को एक इनपुट के रूप में लेता है और पुनः कोड को रूपांतरित करता है और इसे समानांतर कोड व्याख्या (जैसे ओपनएमपी) या भाषा निर्माण (जैसे फोरट्रान) के साथ व्याख्या करता है। DOALL कथन)। सोर्स-टू-सोर्स संकलक के लिए अन्य शब्द ट्रांसकंपलर या ट्रांसपिलर हैं।[48]
  • बायटेकोड संकलक एक सैद्धांतिक मशीन की असेंबली भाषा को संकलित करते हैं, जैसे कुछ प्रोलॉग कार्यान्वयन
  • जस्ट-इन-टाइम संकलक (जेआईटी संकलक) रनटाइम तक संकलन को स्थगित करते हैं। जिनमे पायथन (प्रोग्रामिंग भाषा), जावास्क्रिप्ट, स्मॉलटॉक, जावा (प्रोग्रामिंग भाषा), माइक्रोसॉफ्ट एनईटी की सामान्य मध्यवर्ती भाषा (सीआईएल) और अन्य कई आधुनिक भाषाओं के लिए जेआईटी संकलक सम्मिलित हैं। एक जेआईटी संकलक सामान्यतः अनुवादक के अंदर सक्रिय है। जब अनुवादक पता लगाता है कि एक कोड पथ "हॉट" है, जिसका अर्थ है कि इसे प्रायः निष्पादित किया जाता है, जेआईटी संकलक को क्रियान्वित किया जाएगा और बढ़ते प्रदर्शन के लिए "हॉट" कोड संकलित किया जाएगा।
    • कुछ भाषाओं के लिए, जैसे कि जावा, एप्लिकेशन को पहले बायटेकोड संकलक का उपयोग करके संकलित किया जाता है और मशीन-स्वतंत्र मध्यवर्ती प्रतिनिधित्व में वितरित किया जाता है। एक बाइटकोड अनुवादक बाइटकोड निष्पादित करता है, लेकिन जेआईटी संकलक बाइटकोड को मशीन कोड में अनुवादित करेगा जब प्रदर्शन बढ़ाना आवश्यक होगा।[49][non-primary source needed]
  • हार्डवेयर संकलक (संश्लेषण उपकरण के रूप में भी जाना जाता है) संकलक होते हैं जिनका इनपुट एक हार्डवेयर विवरण भाषा है एक नेटलिस्ट के रूप में या अन्यथा, हार्डवेयर कॉन्फ़िगरेशन का आउटपुट एक विवरण है, ।
    • इन कंपाइलरों का आउटपुट कंप्यूटर हार्डवेयर को अधिक निम्न स्तर पर योजनाबद्ध करता है, उदाहरण के लिए क्षेत्र प्रोग्रामयोग्य गेट सरणी (एफपीजीए) या संरचित अनुप्रयोग-विशिष्ट एकीकृत परिपथ (एएसआईसी)।[50][non-primary source needed] ऐसे संकलक को हार्डवेयर संकलक कहा जाता है, क्योंकि वे जिस स्रोत कोड को संकलित करते हैं, वह प्रभावी रूप से हार्डवेयर के अंतिम कॉन्फ़िगरेशन को नियंत्रित करता है और यह कैसे संचालित होता है। संकलन का आउटपुट केवल संक्रामक या खोज सारणी का एक अंतः संयोजन है।
    • हार्डवेयर संकलक का एक उदाहरण एक्सएसटी है, जो Xilinx कृत्रिम उपकरण है जिसका उपयोग एफपीजीए को विन्यस्त करने के लिए किया जाता है।[51][non-primary source needed] इसी तरह के उपकरण परिवर्तन,[52][non-primary source needed] सिनप्लिसिटी, सिनॉप्सिस और अन्य हार्डवेयर विक्रेता से उपलब्ध हैं।[citation needed]
  • असेंबलर एक प्रोग्राम है जो मानव पठनीय असेंबली भाषा को मशीन कोड, हार्डवेयर द्वारा निष्पादित वास्तविक निर्देशों को संकलित करता है। व्युत्क्रम प्रोग्राम जो मशीन कोड को असेंबली भाषा में अनुवाद करता है, उसे असेंबलर कहा जाता है।
  • एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह डीकंपलर है।[53][citation needed]
  • एक प्रोग्राम जो एक वस्तु कोड प्रारूप में अनुवाद करता है जो संकलन मशीन पर समर्थित नहीं है, उसे क्रॉस संकलक कहा जाता है और सामान्यतः अंतःस्थापित एप्लिकेशन के लिए कोड तैयार करने के लिए उपयोग किया जाता है।[citation needed][clarification needed]
  • एक प्रोग्राम जो अनुकूलन और रूपांतरण क्रियान्वित करते समय वस्तु कोड को उसी प्रकार के वस्तु कोड में वापस लिखता है, वह बाइनरी पुनःसंयोजक है।

यह भी देखें


संदर्भ

  1. "Encyclopedia: Definition of Compiler". 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. SUDARSANAM, ASHOK; MALIK, SHARAD; FUJITA, MASAHIRO (2002). "A Retargetable Compilation Methodology for Embedded Digital Signal Processors Using a Machine-Dependent Code Optimization Library". Readings in Hardware/Software Co-Design. Elsevier. pp. 506–515. doi:10.1016/b978-155860702-6/50045-4. ISBN 9781558607026. A compiler is a computer program that translates a program written in a high-level language (HLL), such as C, into an equivalent assembly language program [2].
  4. 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.
  5. lecture notes Compilers: Principles, Techniques, and Tools Jing-Shin Chang Department of Computer Science & Information Engineering National Chi-Nan University
  6. Naur, P. et al. "Report on ALGOL 60". Communications of the ACM 3 (May 1960), 299–314.
  7. Chomsky, Noam; Lightfoot, David W. (2002). सिंटैक्टिक संरचनाएं. Walter de Gruyter. ISBN 978-3-11-017279-9.
  8. Gries, David (2012). "Appendix 1: Backus-Naur Form". प्रोग्रामिंग का विज्ञान. Springer Science & Business Media. p. 304. ISBN 978-1461259831.
  9. Iverson, Kenneth E. (1962). एक प्रोग्रामिंग भाषा. John Wiley & Sons. ISBN 978-0-471430-14-8.
  10. 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)
  11. Porter Adams, Vicki (5 October 1981). "Captain Grace M. Hopper: the Mother of COBOL". InfoWorld. 3 (20): 33. ISSN 0199-6649.
  12. 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.
  13. Compilers Principles, Techniques, & Tools 2nd edition by Aho, Lam, Sethi, Ullman ISBN 0-321-48681-1
  14. Hopper, Grace Murray (1952). "कंप्यूटर की शिक्षा". Proceedings of the 1952 ACM National Meeting (Pittsburgh): 243–249. doi:10.1145/609784.609818. S2CID 10081016.
  15. Ridgway, Richard K. (1952). "संकलन दिनचर्या". Proceedings of the 1952 ACM National Meeting (Toronto): 1–5. doi:10.1145/800259.808980. S2CID 14878552.
  16. 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.)
  17. Abelson, Hal; Dybvig, R. K.; et al. Rees, Jonathan; Clinger, William (eds.). "एल्गोरिदमिक भाषा योजना पर संशोधित (3) रिपोर्ट, (ALGOL 60 की स्मृति को समर्पित)". Retrieved 20 October 2009.
  18. "Recursive Functions of Symbolic Expressions and Their Computation by Machine", Communications of the ACM, April 1960
  19. McCarthy, John; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I. (1965). लिस्प 1.5 प्रोग्रामर मैनुअल. The MIT Press. ISBN 9780262130110.
  20. "BCPL: A tool for compiler writing and system programming" M. Richards, University Mathematical Laboratory Cambridge, England 1969
  21. BCPL: The Language and Its Compiler, M Richards, Cambridge University Press (first published 31 December 1981)
  22. The BCPL Cintsys and Cintpos User Guide, M. Richards, 2017
  23. Corbató, F. J.; Vyssotsky, V. A. "मल्टिक्स सिस्टम का परिचय और अवलोकन". 1965 Fall Joint Computer Conference. Multicians.org.
  24. Report II of the SHARE Advanced Language Development Committee, 25 June 1964
  25. Multicians.org "The Choice of PL/I" article, Editor /tom Van Vleck
  26. "PL/I As a Tool for System Programming", F.J. Corbato, Datamation 6 May 1969 issue
  27. "The Multics PL/1 Compiler", R. A. Freiburghouse, GE, Fall Joint Computer Conference 1969
  28. Dennis M. Ritchie, "The Development of the C Language", ACM Second History of Programming Languages Conference, April 1993
  29. S.C. Johnson, "a Portable C Compiler: Theory and Practice", 5th ACM POPL Symposium, January 1978
  30. A. Snyder, A Portable Compiler for the Language C, MIT, 1974.
  31. K. Nygaard, University of Oslo, Norway, "Basic Concepts in Object Oriented Programming", SIGPLAN Notices V21, 1986
  32. B. Stroustrup: "What is Object-Oriented Programming?" Proceedings 14th ASU Conference, 1986.
  33. Bjarne Stroustrup, "An Overview of the C++ Programming Language", Handbook of Object Technology (Editor: Saba Zamir, ISBN 0-8493-3135-8)
  34. Leverett, Cattell, Hobbs, Newcomer, Reiner, Schatz, Wulf: "An Overview of the Production Quality Compiler-Compiler Project", CMU-CS-89-105, 1979
  35. W. Wulf, K. Nori, "Delayed binding in PQCC generated compilers", CMU Research Showcase Report, CMU-CS-82-138, 1982
  36. 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
  37. William A. Whitaker, "Ada - the project: the DoD High Order Working Group", ACM SIGPLAN Notices (Volume 28, No. 3, March 1991)
  38. CECOM Center for Software Engineering Advanced Software Technology, "Final Report - Evaluation of the ACEC Benchmark Suite for Real-Time Applications", AD-A231 968, 1990
  39. P.Biggar, E. de Vries, D. Gregg, "A Practical Solution for Scripting Language Compilers", submission to Science of Computer Programming, 2009
  40. M.Hall, D. Padua, K. Pingali, "Compiler Research: The Next 50 Years", ACM Communications 2009 Vol 54 #2
  41. Cooper and Torczon 2012, p. 8
  42. Lattner, Chris (2017). "LLVM". In Brown, Amy; Wilson, Greg (eds.). ओपन सोर्स एप्लिकेशन का आर्किटेक्चर. Archived from the original on 2 December 2016. Retrieved 28 February 2017.
  43. Aho, Lam, Sethi, Ullman 2007, p. 5-6, 109-189
  44. Aho, Lam, Sethi, Ullman 2007, p. 111
  45. Aho, Lam, Sethi, Ullman 2007, p. 8, 191-300
  46. 46.0 46.1 Blindell, Gabriel Hjort (3 June 2016). निर्देश चयन: सिद्धांत, तरीके और अनुप्रयोग. Switzerland. ISBN 9783319340197. OCLC 951745657.{{cite book}}: CS1 maint: location missing publisher (link)
  47. Cooper and Toczon (2012), p. 540
  48. 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)
  49. Aycock, John (2003). "जस्ट-इन-टाइम का एक संक्षिप्त इतिहास". ACM Comput. Surv. 35 (2, June): 93–113. doi:10.1145/857076.857077. S2CID 15345671.
  50. 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.
  51. Xilinx Staff (2009). "एक्सएसटी संश्लेषण अवलोकन". Xilinx, Inc. Archived from the original on 2 November 2016. Retrieved 28 February 2017.
  52. Altera Staff (2017). "स्पेक्ट्रा-क्यू™ इंजन". Altera.com. Archived from the original on 10 October 2016. Retrieved 28 February 2017.
  53. "डीकंपलर - एक सिंहावलोकन | ScienceDirect विषय". www.sciencedirect.com. Retrieved 12 June 2022.


आगे की पढाई


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

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