संकलक: Difference between revisions
No edit summary |
No edit summary |
||
(24 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=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|''डिकंपाइलर'']] है जो संबंधित सॉफ़्टवेयर में सम्मिलित हैं, एक प्रोग्राम जो उच्च-स्तरीय भाषाओं के बीच अनुवाद करता है, जिसे सामान्यतः सोर्स-टू-सोर्स कंपाइलर (एस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> | |||
स्रोत प्रोग्राम को बदलने के लिए उपयोग किए जाने वाले | स्रोत प्रोग्राम को बदलने के लिए उपयोग किए जाने वाले संकलक एकमात्र भाषा प्रोसेसर नहीं हैं। एक [[दुभाषिया (कंप्यूटिंग)|अनुवादक (कंप्यूटिंग)]] कंप्यूटर सॉफ्टवेयर है जो संकेतिक कार्यों को रूपांतरित करता है और पुनः निष्पादित करता है।<ref name=dragon/>{{rp|p2}} अनुवाद प्रक्रिया कंप्यूटर भाषाओं के डिजाइन को प्रभावित करती है, जिससे संकलन या व्याख्या की प्राथमिकता होती है। सिद्धांत रूप में, एक प्रोग्रामिंग भाषा में एक संकलक और अनुवादक दोनों हो सकते हैं। गतिविधि में, प्रोग्रामिंग भाषाएँ केवल (संकलक या एक अनुवादक) से जुड़ी होती हैं। | ||
== इतिहास == | == इतिहास == | ||
{{Main| | {{Main|संकलक निर्माण का इतिहास}} | ||
[[File:Compiler.svg |upright=1.5|thumb |एक विशिष्ट बहु-भाषा, बहु- | [[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> | ||
* | |||
* [[COBOL]] ( | 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>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>{{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> | ||
* 1952: मैनचेस्टर विश्वविद्यालय में [[मैनचेस्टर मार्क I]] कंप्यूटर के लिए [[एलिक ग्लेनी]] द्वारा विकसित एक [[ऑटोकोड]] | * [[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> | ||
* 1952: [[रेमिंगटन रैंड]] में [[ग्रेस हूपर]] की टीम ने | * [[लिस्प (प्रोग्रामिंग भाषा)|एलआईएसपी (प्रोग्रामिंग भाषा)]] (सूची प्रोसेसर) प्रतीकात्मक संगणना के लिए।<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> | |||
संकलक प्रौद्योगिकी के विकास में कुछ प्रारंभिक उपलब्धियां: | |||
* 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: डेटा | * 1959: डेटा प्रणाली भाषा (कोडासिल) पर सम्मेलन ने के विकास की प्रारंभ की। कोबोल डिज़ाइन A-0 और फ्लो-मैटिक पर प्राप्त हुआ। 1960 के दशक के प्रारंभ तक कोबोल को कई संरचना पर संकलित किया गया था। | ||
* 1958-1960: [[Algol 58]], [[ALGOL 60]] का | * 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: एमआईटी में जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) ने | * 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|ब्लिस]], बी (प्रोग्रामिंग भाषा), और सी (प्रोग्रामिंग भाषा)। | |||
कैम्ब्रिज विश्वविद्यालय में [[मार्टिन रिचर्ड्स (कंप्यूटर वैज्ञानिक)]] द्वारा 1966 में डिज़ाइन किया गया | कैम्ब्रिज विश्वविद्यालय में [[मार्टिन रिचर्ड्स (कंप्यूटर वैज्ञानिक)]] द्वारा 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> | ||
बेल लैब्स ने | बेल लैब्स ने 1969 में मल्टिक्स परियोजना को छोड़ दिया, और [[डेनिस रिची]] और [[केन थॉम्पसन]] द्वारा लिखित बीसीपीएल अवधारणाओं पर आधारित एक प्रणाली प्रोग्रामिंग भाषा बी (प्रोग्रामिंग भाषा) विकसित की। रिची ने बी के लिए बूट-स्ट्रैपिंग संकलक बनाया और बी में पीडीपी-7 के लिए [[यूनिक्स]] (यूनिप्लेक्स सूचना और कंप्यूटिंग सेवा) [[ऑपरेटिंग सिस्टम]] लिखा। अंततः यूनिक्स वर्तनी यूनिक्स बन गया। | ||
[ | |||
बेल लैब्स ने बी और बीसीपीएल के आधार पर सी (प्रोग्रामिंग भाषा) का विकास और विस्तार प्रारंभ किया। बीसीपीएल संकलक को बेल लैब्स द्वारा मल्टिक्स में ले जाया गया था और बेल लैब्स में बीसीपीएल एक मुख्य भाषा थी।<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> | |||
[[ | [[वस्तु उन्मुख कार्यकर्म|वस्तु उन्मुख प्रोग्रामिंग]] (ओओपी) ने अनुप्रयोग विकास और संरक्षण के लिए कुछ रोचक संभावनाएं प्रस्तुत कीं। [[वस्तु उन्मुख कार्यकर्म|वस्तु उन्मुख प्रोग्रामिंग]] अवधारणाएँ अधिक समर्थन करती हैं लेकिन [[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 भाषा संकलक के लिए सी++ फ्रंट-एंड क्रियान्वित किया और बाद के वर्षों में सी++ की लोकप्रियता बढ़ने के साथ कई सी++ संकलक विकसित किए गए। | ||
कई एप्लिकेशन डोमेन में, उच्च-स्तरीय भाषा का उपयोग करने का विचार शीघ्रता से अनुकूल हो गया। नई प्रोग्रामिंग भाषाओं द्वारा समर्थित विस्तारित कार्यक्षमता और कंप्यूटर संरचना की बढ़ती जटिलता के कारण, संकलक अधिक जटिल हो गए। | |||
[[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|वाईएसीसी]] ) के रूप में पारंपरिक अर्थ से अधिक संकलक-संकलक शब्द का विस्तार करने की कोशिश की। पीक्यूसीसी को अधिक उपयुक्त रूप से एक संकलक उत्पादक के रूप में संदर्भित किया जा सकता है। | |||
उच्च-स्तरीय भाषाओं ने संकलक अनुसंधान और विकास को | कोड जनरेशन प्रक्रिया में पीक्यूसीसी अनुसंधान वास्तव में स्वचालित संकलक-लेखन प्रणाली बनाने का प्रयास करता है। पीक्यूसी के प्रयास ने चरण संरचना की खोज की और परिकल्पित किया। ब्लिस-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 | ||
जब 50 के दशक के उत्तरार्ध में संकलन का क्षेत्र प्रारंभ हुआ, तो इसका ध्यान उच्च-स्तरीय भाषा | </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 से, वस्तु-उन्मुख [[एडा (प्रोग्रामिंग भाषा)|(प्रोग्रामिंग भाषा)]] एडीए (प्रोग्रामिंग भाषा) के लिए संकलक और संकलक के अनुकूलन में उपयोगी प्रमाणित हुईं। | |||
एडीए स्टोनमैन दस्तावेज़{{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 में एडीए के लिए व्यावसायिक सॉफ़्टवेयर समाधान प्रदान करने के लिए की गई थी। जीएनएटी प्रो में जीएनयू जीसीसी आधारित जीएनएटी सम्मिलित है जिसमें एक एकीकृत विकास वातावरण प्रदान करने के लिए एक उपकरण समूह है। | |||
उच्च-स्तरीय भाषाओं ने संकलक अनुसंधान और विकास को निरंतर सक्रिय रखा। केंद्र क्षेत्रों में अनुकूलन और स्वचालित कोड जनरेशन सम्मिलित हैं। प्रोग्रामिंग भाषाओं और विकास के वातावरण में प्रचलन ने संकलक तकनीक को प्रभावित किया। अधिक संकलक भाषा वितरण (पीईआरएल, जावा विकास किट) और एक आईडीई (वीएडीएस, एक्लिप्स, एडीए प्रो) के एक घटक के रूप में सम्मिलित हो गए। प्रौद्योगिकियों के अंतर्संबंध और अन्योन्याश्रय में वृद्धि हुई। वेब सेवाओं के आगमन ने वेब भाषाओं और स्क्रिप्टिंग भाषाओं के विकास को बढ़ावा दिया। स्क्रिप्ट्स कमांड लाइन इंटरफेस (सीएलआई) के प्रारम्भिक दिनों में वापस आती हैं जहां उपयोगकर्ता प्रणाली द्वारा निष्पादित किए जाने वाले आदेशों को प्रविष्ट कर सकता है। शेल प्रोग्राम लिखने के लिए भाषाओं के साथ उपयोगकर्ता शैल अवधारणाएँ विकसित हुईं। प्रारम्भिक विंडोज डिजाइनों ने एक साधारण बैच प्रोग्रामिंग क्षमता की प्रस्तुत की। इन भाषाओं के पारंपरिक परिवर्तन में एक अनुवादक का उपयोग किया गया था। जबकि व्यापक रूप से उपयोग नहीं किया जाता है, बैश और बैच संकलक लिखे गए हैं। हाल ही में परिष्कृत व्याख्या की गई भाषाएं विकासक टूल-किट का भाग बन गईं। आधुनिक स्क्रिप्टिंग भाषाओं में पीएचपी, पायथन, रूबी और लुआ सम्मिलित हैं। (लुआ व्यापक रूप से खेल के विकास में उपयोग किया जाता है) इन सभी में अनुवादक और संकलक समर्थन है।<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> <nowiki>''</nowiki>संकलक अनुसंधान: द नेक्स्ट 50 इयर्स<nowiki>''</nowiki> लेख ने वस्तु-उन्मुख भाषा और जावा के महत्व पर ध्यान दिया। भविष्य के अनुसंधान लक्ष्यों में सुरक्षा और समानांतर कंप्यूटिंग का उल्लेख किया गया। | |||
== संकलक निर्माण == | == संकलक निर्माण == | ||
एक संकलक उच्च-स्तरीय स्रोत प्रोग्राम से निम्न-स्तरीय टारगेट प्रोग्राम में एक औपचारिक परिवर्तन क्रियान्वित करता है। संकलक डिज़ाइन एंड-टू-एंड समाधान को परिभाषित कर सकता है या एक परिभाषित उपसमुच्चय से स्पष्टीकरण कर सकता है जो अन्य संकलन उपकरणों के साथ इंटरफेस करता है उदा. प्रीप्रोसेसर, असेंबलर, लिंकर्स। योजना आवश्यकताओं में आंतरिक रूप से संकलक घटकों के बीच और बाह्य रूप से सहायक टूलसेट के बीच कठोर रूप से परिभाषित इंटरफेस सम्मिलित हैं। | |||
एक | |||
प्रारम्भिक दिनों में, संकलक डिजाइन के लिए लिया गया दृष्टिकोण संसाधित होने वाली कंप्यूटर भाषा की जटिलता, इसे डिजाइन करने वाले व्यक्ति (व्यक्तियों) के अनुभव और उपलब्ध संसाधनों से प्रत्यक्ष रूप से प्रभावित होता था। संसाधन सीमाओं के कारण एक से अधिक बार स्रोत कोड से निकलना पड़ा। | |||
एक व्यक्ति द्वारा लिखी गई अपेक्षाकृत सरल भाषा के लिए एक संकलक सॉफ्टवेयर का एक एकल, अखंड | एक व्यक्ति द्वारा लिखी गई अपेक्षाकृत सरल भाषा के लिए एक संकलक सॉफ्टवेयर का एक एकल, अखंड भाग हो सकता है। हालाँकि, जैसे-जैसे स्रोत भाषा जटिलता में बढ़ती है, डिज़ाइन को कई अन्योन्याश्रित चरणों में विभाजित किया जा सकता है। अलग-अलग चरण डिजाइन सुधार प्रदान करते हैं जो संकलन प्रक्रिया में कार्यों के विकास पर ध्यान केंद्रित करते हैं। | ||
=== एक-पास बनाम मल्टी-पास | === एक-पास बनाम मल्टी-पास संकलक === | ||
पास की संख्या के आधार पर कंपाइलरों को वर्गीकृत करने की इसकी | पास की संख्या के आधार पर कंपाइलरों को वर्गीकृत करने की इसकी भूमिका कंप्यूटर की हार्डवेयर संसाधन सीमाओं में है। संकलन में बहुत अधिक कार्य करना सम्मिलित है और प्रारम्भिक कंप्यूटरों में इतनी मेमोरी नहीं थी कि एक प्रोग्राम को समाहित कर सके जो यह सब कार्य करता था। इसलिए संकलक छोटे प्रोग्रामों में विभाजित हो गए, जिनमें से प्रत्येक ने कुछ आवश्यक विश्लेषण और अनुवाद करते हुए स्रोत (या इसके कुछ प्रतिनिधित्व) पर एक पास बनाया। | ||
[[वन-पास कंपाइलर]] में संकलन करने की क्षमता को | [[वन-पास कंपाइलर|एकल पास संकलक]] में संकलन करने की क्षमता को उत्कृष्ट रूप से एक लाभ के रूप में देखा गया है क्योंकि यह एक संकलक लिखने के कार्य को सरल करता है और एक-पास संकलक सामान्यतः [[बहु-पास संकलक]] की तुलना में तीव्रता से संकलन करता है। इस प्रकार, प्रारंभिक प्रणालियों की संसाधन सीमाओं द्वारा आंशिक रूप से संचालित, कई प्रारंभिक भाषाओं को विशेष रूप से डिजाइन किया गया था ताकि उन्हें एक ही पास (जैसे [[पास्कल]]) में संकलित किया जा सके। | ||
कुछ | कुछ स्थितियों में, एक भाषा सुविधा के डिजाइन के लिए स्रोत पर एक से अधिक पास करने के लिए एक संकलक की आवश्यकता हो सकती है। उदाहरण के लिए, स्रोत की 20 पंक्ति पर प्रकट होने वाली एक घोषणा पर विचार करें जो पंक्ति 10 पर प्रदर्शित होने वाले कथन के अनुवाद को प्रभावित करती है। इस स्थिति में, पहले पास को उन घोषणाओं के बारे में जानकारी एकत्र करने की आवश्यकता होती है जो बाद के समय होने वाले वास्तविक अनुवाद के साथ प्रभावित होती हैं। | ||
एकल पास में संकलन का | एकल पास में संकलन का दोष यह है कि उच्च गुणवत्ता वाले कोड उत्पन्न करने के लिए आवश्यक कई परिष्कृत [[संकलक अनुकूलन]] करना संभव नहीं है। यह गणना करना पूर्ण रूप से कठिन हो सकता है कि एक अधिकतम संकलक कितने पास करता है। उदाहरण के लिए, अनुकूलन के विभिन्न चरण एक अभिव्यक्ति का कई बार विश्लेषण कर सकते हैं लेकिन केवल एक बार अन्य अभिव्यक्ति का विश्लेषण कर सकते हैं। | ||
एक संकलक को छोटे | एक संकलक को छोटे प्रोग्रामों में विभाजित करना एक ऐसी तकनीक है जिसका उपयोग शोधकर्ताओं द्वारा उपयुक्त रूप से सही संकलक बनाने में रुचि रखने वाले द्वारा किया जाता है। प्रायः छोटे प्रोग्रामों के एक समूह की शुद्धता को प्रमाणित करने के लिए एक बड़े, एकल, समकक्ष प्रोग्राम की शुद्धता को प्रमाणित करने से कम प्रयास की आवश्यकता होती है। | ||
=== तीन चरण संकलक संरचना === | === तीन चरण संकलक संरचना === | ||
[[File:Compiler design.svg|thumb|center|upright=2.5|संकलक डिजाइन]]संकलक डिजाइन में चरणों की | [[File:Compiler design.svg|thumb|center|upright=2.5|संकलक डिजाइन]]संकलक डिजाइन में चरणों की शुद्धता से संख्या के होने पर भी, चरणों को तीन चरणों में से एक को नियुक्त किया जा सकता है। चरणों में एक फ्रंट एंड, एक मिडिल एंड और एक बैक एंड सम्मिलित है। | ||
* फ्रंट एंड इनपुट को स्कैन करता है और एक विशिष्ट स्रोत भाषा के अनुसार सिंटैक्स और सिमेंटिक्स की पुष्टि करता है। [[टाइप सिस्टम]] के लिए यह टाइप की जानकारी एकत्र करके [[प्रकार की जाँच]] करता है। यदि इनपुट प्रोग्राम वाक्यात्मक रूप से गलत है या इसमें टाइप त्रुटि है, तो यह त्रुटि और/या चेतावनी संदेश उत्पन्न करता है, सामान्यतः स्रोत कोड में उस स्थान की पहचान करता है जहां समस्या का पता चला था; कुछ | * फ्रंट एंड इनपुट को स्कैन करता है और एक विशिष्ट स्रोत भाषा के अनुसार सिंटैक्स और सिमेंटिक्स की पुष्टि करता है। [[टाइप सिस्टम|टाइप प्रणाली]] के लिए यह टाइप की जानकारी एकत्र करके [[टाइप]] [[प्रकार की जाँच|की जाँच]] करता है। यदि इनपुट प्रोग्राम वाक्यात्मक रूप से गलत है या इसमें टाइप त्रुटि है, तो यह त्रुटि और/या चेतावनी संदेश उत्पन्न करता है, सामान्यतः स्रोत कोड में उस स्थान की पहचान करता है जहां समस्या का पता चला था; कुछ स्थितियों में वास्तविक त्रुटि प्रोग्राम में पहले (अधिक) हो सकती है। फ्रंट एंड के स्वरूपों में लेक्सिकल विश्लेषण, सिंटैक्स एनालिसिस और सिमेंटिक एनालिसिस सम्मिलित हैं। मिडिल एंड द्वारा आगे की प्रक्रिया के लिए फ्रंट एंड इनपुट प्रोग्राम को एक मध्यवर्ती प्रतिनिधित्व (आईआर) में परिवर्तित कर देता है। यह मध्यवर्ती प्रतिनिधित्व सामान्यतः स्रोत कोड के संबंध में प्रोग्राम का निम्न स्तर का प्रतिनिधित्व है। | ||
* | * मिडिल एंड मध्यवर्ती प्रतिनिधित्व पर अनुकूलन करता है जो योजनाबद्ध सीपीयू संरचना से स्वतंत्र होते हैं। इस स्रोत कोड/मशीन कोड स्वतंत्रता का उद्देश्य विभिन्न भाषाओं और टारगेट प्रोसेसर का समर्थन करने वाले संकलक के संस्करणों के बीच साझा किए जाने वाले सामान्य अनुकूलन को सक्षम करना है। मिडिल एंड अनुकूलन के उदाहरण अनुपयोगी ([[निष्क्रिय]][[डेड-कोड उन्मूलन|-कोड उन्मूलन]]) या अगम्य कोड ([[पहुंच क्षमता विश्लेषण|अभिगम्यता विश्लेषण]]) को हटाना, निरंतर मूल्यों की खोज और प्रसार (निरंतर प्रचार), बार-बार कम निष्पादित स्थान पर गणना का स्थानांतरण (जैसे, लूप से बाहर) ), या संदर्भ के आधार पर गणना की विशेषज्ञता, अंततः अनुकूलित मध्यवर्ती प्रतिनिधित्व का उत्पादन करती है जिसका उपयोग बैक एंड द्वारा किया जाता है। | ||
* | * बैक एंड मिडिल एंड से अनुकूलित मध्यवर्ती प्रतिनिधित्व लेता है। यह अधिक विश्लेषण, परिवर्तन और अनुकूलन कर सकता है जो टारगेट सीपीयू संरचना के लिए विशिष्ट हैं। बैक एंड टारगेट-निर्भर असेंबली कोड उत्पन्न करता है, प्रक्रिया में लिपिबद्ध आवंटन करता है। बैक एंड [[निर्देश समयबद्धन|अनुदेश अनुसूचन]] करता है, जो [[देरी स्लॉट|विलंब स्लॉट]] को पूर्ण कर समानांतर कार्यान्वयन इकाइयों को कार्यरत रखने के निर्देशों को पुनः आदेश देता है। हालांकि अधिकांश अनुकूलन समस्याएं [[एनपी-कठोरता|एनपी-हार्ड]] हैं, उन्हें समाधान करने के लिए ह्यूरिस्टिक (कंप्यूटर विज्ञान) तकनीकें अच्छी तरह से विकसित हैं और वर्तमान में उत्पादन-गुणवत्ता वाले कंपाइलरों में क्रियान्वित हैं। सामान्यतः बैक एंड का आउटपुट एक विशेष प्रोसेसर और ऑपरेटिंग सिस्टम के लिए विशिष्ट मशीन कोड होता है। | ||
ययह फ्रंट/मिडल/बैक-एंड दृष्टिकोण मिडिल एंड के अनुकूलन को साझा करते हुए विभिन्न सेंट्रल प्रोसेसिंग यूनिट के लिए बैक एंड के साथ विभिन्न भाषाओं के लिए फ्रंट एंड को जोड़ना संभव बनाता है।<ref>Cooper and Torczon 2012, p. 8</ref> इस दृष्टिकोण के व्यवहार्य उदाहरण जीएनयू संकलक संग्रह,क्लैंग (एलएलवीएम-आधारित सी/सी++ कंपाइलर),<ref name=LattnerBook1st>{{cite book | author = Lattner, Chris |editor = Brown, Amy |editor2=Wilson, Greg | date = 2017 | chapter = LLVM | title = ओपन सोर्स एप्लिकेशन का आर्किटेक्चर| chapter-url = http://www.aosabook.org/en/llvm.html | access-date = 28 February 2017 | url-status = live | archive-url = https://web.archive.org/web/20161202070941/http://aosabook.org/en/llvm.html | archive-date = 2 December 2016}}</ref> और [[एम्स्टर्डम संकलक किट]], जिसमें कई फ्रंट-एंड, साझा अनुकूलन और कई बैक-एंड हैं। | |||
==== फ्रंट एंड ==== | ==== फ्रंट एंड ==== | ||
[[File:Xxx Scanner and parser example for C.gif|thumb|right|400px | [[File:Xxx Scanner and parser example for C.gif|thumb|right|400px| संदर्भ-मुक्त भागों को ग्रहण करते हैं।]]फ्रंट एंड प्रोग्राम का आंतरिक प्रतिनिधित्व बनाने के लिए स्रोत कोड का विश्लेषण करता है, जिसे मध्यवर्ती प्रतिनिधित्व (आईआर) कहा जाता है। यह [[प्रतीक तालिका|प्रतीक सारणी]] का प्रबंधन भी करता है, एक डेटा संरचना जो स्रोत कोड में प्रत्येक प्रतीक को संबंधित जानकारी जैसे स्थान, प्रकार और विस्तार से पता लगाती है। | ||
जबकि फ्रंटएंड एक एकल मोनोलिथिक फ़ंक्शन या प्रोग्राम हो सकता है, जैसा कि एक [[स्कैनर रहित पार्सर]] में होता है, इसे पारंपरिक रूप से | जबकि फ्रंटएंड एक एकल मोनोलिथिक फ़ंक्शन या प्रोग्राम हो सकता है, जैसा कि एक [[स्कैनर रहित पार्सर]] में होता है, इसे पारंपरिक रूप से क्रियान्वित किया गया था और कई चरणों के रूप में विश्लेषण किया गया था, जो क्रमिक रूप से या समवर्ती रूप से निष्पादित हो सकता है। यह विधि इसकी प्रतिरूपकता और वियोजन को अलग करने के कारण अनुगृहीत की जाती है। सामान्यतः आज, फ्रंटएंड को तीन चरणों में विभाजित किया गया है: लेक्सिकल विश्लेषण (जिसे लेक्सिंग या स्कैनिंग के रूप में भी जाना जाता है), सिंटैक्स विश्लेषण (स्कैनिंग या पार्सिंग के रूप में भी जाना जाता है), और सिमेंटिक विश्लेषण। लेक्सिंग और पार्सिंग में सिंटैक्टिक विश्लेषण (क्रमशः शब्द सिंटैक्स और वाक्यांश सिंटैक्स) सम्मिलित हैं, और साधारण स्थितियों में, ये भाग (लेक्सर और पार्सर) स्वचालित रूप से भाषा के व्याकरण से उत्पन्न हो सकते हैं, हालांकि अधिक जटिल स्थितियों में इन्हें मैन्युअल संशोधन की आवश्यकता होती है। लेक्सिकल व्याकरण और वाक्यांश व्याकरण सामान्यतः संदर्भ-मुक्त व्याकरण होते हैं, जो सिमेंटिक विश्लेषण चरण में संदर्भ-संवेदनशीलता के साथ विश्लेषण को सरल बनाते हैं। सिमेंटिक विश्लेषण चरण सामान्यतः अधिक जटिल और हाथ से लिखा जाता है, लेकिन [[विशेषता व्याकरण]] का उपयोग करके आंशिक रूप से या पूरी तरह से स्वचालित हो सकता है। इन चरणों को स्वयं आगे नष्ट किया जा सकता है: स्कैनिंग और मूल्यांकन के रूप में लेक्सिंग, और एक [[पार्स पेड़|पार्स ट्री]] (सीएसटी, पार्स ट्री) के निर्माण के रूप में पार्सिंग और पुनः इसे एक अमूर्त सिंटैक्स ट्री (एएसटी, सिंटैक्स ट्री) में परिवर्तित किया जा सकता है। कुछ स्थितियों में अतिरिक्त चरणों का उपयोग किया जाता है, विशेष रूप से लाइन पुनर्निर्माण और प्रीप्रोसेसिंग, लेकिन ये असामान्य हैं। | ||
फ्रंट एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं: | फ्रंट एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं: | ||
*{{visible anchor| | *{{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. 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> मिडिल एंड में वे अनुकूलन सम्मिलित हैं जो योजनाबद्ध किए जा रहे सीपीयू संरचना से स्वतंत्र हैं। | |||
मिडिल एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं: | |||
* [[संकलक विश्लेषण]]: यह इनपुट से प्राप्त मध्यवर्ती प्रतिनिधित्व से | * [[संकलक विश्लेषण]]: यह इनपुट से प्राप्त मध्यवर्ती प्रतिनिधित्व से प्रोग्राम की जानकारी का संग्रह है; डेटा-प्रवाह [[विश्लेषण का]] उपयोग [[निर्भरता विश्लेषण]], उपनाम विश्लेषण, [[सूचक विश्लेषण]], [[पलायन विश्लेषण|एस्केप विश्लेषण]] आदि के साथ [[उपयोग-परिभाषित श्रृंखला]] बनाने के लिए किया जाता है। शुद्धता से विश्लेषण किसी भी संकलक अनुकूलन का आधार है। प्रत्येक संकलित फ़ंक्शन का [[नियंत्रण-प्रवाह ग्राफ]] और प्रोग्राम का [[कॉल ग्राफ]] सामान्यतः विश्लेषण चरण के समय भी बनाया जाता है। | ||
* संकलक अनुकूलन: मध्यवर्ती भाषा का प्रतिनिधित्व कार्यात्मक रूप से समकक्ष लेकिन तेज़ (या छोटे) रूपों में परिवर्तित हो जाता है। लोकप्रिय अनुकूलन [[इनलाइन विस्तार]], | * संकलक अनुकूलन: मध्यवर्ती भाषा का प्रतिनिधित्व कार्यात्मक रूप से समकक्ष लेकिन तेज़ (या छोटे) रूपों में परिवर्तित हो जाता है। लोकप्रिय अनुकूलन [[इनलाइन विस्तार]], निष्क्रिय-कोड उन्मूलन, निरंतर प्रसार, लूप परिवर्तन और यहां तक कि स्वत: समानांतरकरण हैं। | ||
संकलक विश्लेषण किसी भी संकलक अनुकूलन के लिए | संकलक विश्लेषण किसी भी संकलक अनुकूलन के लिए पूर्व प्रयोजनीय है, और वे एक साथ दृढ़ता से कार्य करते हैं। उदाहरण के लिए, लूप परिवर्तन के लिए निर्भरता विश्लेषण महत्वपूर्ण है। | ||
संकलक विश्लेषण और अनुकूलन का | संकलक विश्लेषण और अनुकूलन का क्षेत्र अधिक भिन्न होता है; उनका क्षेत्र एक [[बुनियादी ब्लॉक|मूल ब्लॉक]] के अंदर संचालन से लेकर पूरी प्रक्रिया या यहां तक कि पूरे प्रोग्राम तक हो सकता है। अनुकूलन की ग्रैन्युलैरिटी और संकलन की कीमत के बीच एक ट्रेड-ऑफ है। उदाहरण के लिए, [[पीपहोल अनुकूलन]] संकलन के समय प्रदर्शन करने के लिए तेज़ होते हैं लेकिन केवल कोड के एक छोटे से स्थानीय भाग को प्रभावित करते हैं, और उस संदर्भ से स्वतंत्र रूप से निष्पादित किया जा सकता है जिसमें कोड भाग दिखाई देता है। इसके विपरीत, [[अंतरप्रक्रियात्मक अनुकूलन]] के लिए अधिक संकलन समय और मेमोरी स्पेस की आवश्यकता होती है, लेकिन अनुकूलन को सक्षम करता है जो एक साथ कई कार्यों के गतिविधि पर विचार करके ही संभव है। | ||
[[हेवलेट पैकर्ड]], आईबीएम, [[सिलिकॉन ग्राफिक्स]], [[इंटेल]], [[माइक्रोसॉफ्ट]] और [[सन माइक्रोसिस्टम्स]] से आधुनिक | [[हेवलेट पैकर्ड]], आईबीएम, [[सिलिकॉन ग्राफिक्स]], [[इंटेल]], [[माइक्रोसॉफ्ट]] और [[सन माइक्रोसिस्टम्स]] से आधुनिक व्यावसायिक संकलक में अंतर प्रक्रियात्मक विश्लेषण और अनुकूलन सामान्य हैं। शक्तिशाली अंतर प्रक्रियात्मक अनुकूलन की कमी के लिए [[मुफ्त सॉफ्टवेयर]] जीएनयू संकलक संग्रह की लंबे समय से आलोचना की गई थी, लेकिन यह इस संबंध में परिवर्तित कर रहा है। पूर्ण विश्लेषण और अनुकूलन अवसंरचना के साथ एक अन्य खुला स्रोत संकलक [[Open64|ओपन64]] है, जिसका उपयोग कई संगठनों द्वारा अनुसंधान और व्यावसायिक उद्देश्यों के लिए किया जाता है। | ||
संकलक विश्लेषण और अनुकूलन के लिए आवश्यक अतिरिक्त समय और स्थान के कारण, कुछ संकलक उन्हें डिफ़ॉल्ट रूप से छोड़ देते हैं। उपयोगकर्ताओं को संकलक को स्पष्ट रूप से यह बताने के लिए संकलन विकल्पों का उपयोग करना होगा कि कौन से अनुकूलन सक्षम होने चाहिए। | संकलक विश्लेषण और अनुकूलन के लिए आवश्यक अतिरिक्त समय और स्थान के कारण, कुछ संकलक उन्हें डिफ़ॉल्ट रूप से छोड़ देते हैं। उपयोगकर्ताओं को संकलक को स्पष्ट रूप से यह बताने के लिए संकलन विकल्पों का उपयोग करना होगा कि कौन से अनुकूलन सक्षम होने चाहिए। | ||
==== बैक एंड ==== | ==== बैक एंड ==== | ||
बैक एंड सीपीयू संरचना विशिष्ट अनुकूलन और कोड जनरेशन ( | बैक एंड सीपीयू संरचना विशिष्ट अनुकूलन और कोड जनरेशन (संकलक) के लिए अधीन है।<ref name="Hjort Blindell, Gabriel"/> | ||
बैक एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं: | बैक एंड के मुख्य चरणों में निम्नलिखित सम्मिलित हैं: | ||
* मशीन पर निर्भर अनुकूलन: अनुकूलन जो कि सीपीयू संरचना के विवरण पर निर्भर करता है जिसे संकलक | * ''मशीन पर निर्भर अनुकूलन'': अनुकूलन जो कि सीपीयू संरचना के विवरण पर निर्भर करता है जिसे संकलक योजनाबद्ध करता है।<ref>Cooper and Toczon (2012), p. 540</ref> एक प्रमुख उदाहरण पीपहोल अनुकूलन है, जो असेंबलर निर्देशों के छोटे अनुक्रमों को अधिक प्रभावशाली निर्देशों में पुनः लिखता है। | ||
* कोड जनरेशन (संकलक): रूपांतरित मध्यवर्ती भाषा का अनुवाद | * ''कोड जनरेशन (संकलक)'': रूपांतरित मध्यवर्ती भाषा का अनुवाद सामान्यतः प्रणाली की मूल [[मशीन भाषा]] का आउटपुट भाषा में किया जाता है। इसमें संसाधन और भंडारण विचार सम्मिलित हैं, जैसे कि यह विचार करना कि कौन से चर लिपिबद्ध आवंटन और मेमोरी में उपयुक्त होंगे और उपयुक्त मशीन निर्देशों का [[निर्देश चयन]] और निर्देश निर्धारित उनके संबंधित [[एड्रेसिंग मोड]] के साथ (सेठी-उलमैन एल्गोरिथम भी देखें)। [[डिबगिंग]] (दोषमार्जन) की सुविधा के लिए डीबग डेटा भी उत्पन्न करने की आवश्यकता हो सकती है। | ||
=== संकलक शुद्धता === | === संकलक शुद्धता === | ||
{{Main| | {{Main|संकलक शुद्धता}} | ||
संकलक शुद्धता सॉफ्टवेयर इंजीनियरिंग की शाखा है जो यह दिखाने की कोशिश करती है कि एक संकलक अपनी प्रोग्रामिंग भाषा के अनुसार गतिविधि करता है।{{citation needed|date=February 2020}} तकनीकों में औपचारिक तरीकों का उपयोग करके संकलक विकसित करना और सम्मिलित संकलक पर कठोर परीक्षण (जिसे प्रायः संकलक सत्यापन कहा जाता है) का उपयोग करना सम्मिलित है। | |||
== संकलित बनाम व्याख्या की गई भाषाएँ == | == संकलित बनाम व्याख्या की गई भाषाएँ == | ||
उच्च-स्तरीय प्रोग्रामिंग भाषाएं सामान्यतः एक प्रकार के अनुवादक (कंप्यूटिंग) को ध्यान में रखते हुए दिखाई देती हैं: या तो [[संकलित भाषा]] या [[व्याख्या की गई भाषा]] के रूप में डिज़ाइन की गई। हालाँकि, गतिविधि में किसी भाषा के बारे में संभवतया ही कुछ ऐसा होता है जिसके लिए इसे विशेष रूप से संकलित या विशेष रूप से व्याख्या करने की आवश्यकता होती है, हालाँकि ऐसी भाषाओं को डिज़ाइन करना संभव है जो रन टाइम पर पुन: व्याख्या पर निर्भर हों। वर्गीकरण सामान्यतः एक भाषा के सबसे लोकप्रिय या व्यापक कार्यान्वयन को दर्शाता है-उदाहरण के लिए, [[बेसिक|बेसिक (प्रारंभ करने वालों के लिए बहूद्देशीय प्रतीकात्मक अनुदेश कोड]]) संकलक और सी अनुवादक के अस्तित्व के होने पर भी, बेसिक को कभी-कभी व्याख्या की गई भाषा कहा जाता है और सी को एक संकलित भाषा कहा जाता है। | |||
उच्च-स्तरीय प्रोग्रामिंग भाषाएं सामान्यतः एक प्रकार के अनुवादक (कंप्यूटिंग) को ध्यान में रखते हुए दिखाई देती हैं: या तो [[संकलित भाषा]] या [[व्याख्या की गई भाषा]] के रूप में डिज़ाइन की गई। हालाँकि, | |||
व्याख्या संकलन को पूरी तरह से प्रतिस्थापित नहीं करती है। यह केवल इसे उपयोगकर्ता से | व्याख्या संकलन को पूरी तरह से प्रतिस्थापित नहीं करती है। यह केवल इसे उपयोगकर्ता से गुप्त रखता है और इसे धीरे-धीरे बनाता है। यद्यपि एक अनुवादक की व्याख्या की जा सकती है, अतः कार्यान्वयन स्टैक के नीचे कहीं प्रत्यक्ष रूप से निष्पादित प्रोग्राम की आवश्यकता होती है (मशीन भाषा देखें)। | ||
इसके | इसके अतिरिक्त, अनुकूलन के लिए संकलक में अनुवादक कार्यक्षमता हो सकती है, और अनुवादक में समय संकलन तकनीकों से पहले सम्मिलित हो सकते हैं। उदाहरण के लिए, जहां संकलन के समय एक अभिव्यक्ति को निष्पादित किया जा सकता है और परिणाम आउटपुट प्रोग्राम में डाला जा सकता है, तो यह प्रोग्राम चलने पर प्रत्येक समय पुनर्गणना करने से रोकता है, जो अंतिम प्रोग्राम को अधिक तीव्र कर सकता है। [[समय-समय पर संकलन]] और [[बाईटकोड]] की ओर आधुनिक प्रचलन कई बार संकलक और अनुवादक के पारंपरिक वर्गीकरण को और भी अस्पष्ट कर देते हैं। | ||
कुछ भाषा विनिर्देश बताते हैं कि कार्यान्वयन में एक संकलन सुविधा सम्मिलित होनी चाहिए; उदाहरण के लिए, [[सामान्य लिस्प]]। हालाँकि, | कुछ भाषा विनिर्देश बताते हैं कि कार्यान्वयन में एक संकलन सुविधा सम्मिलित होनी चाहिए; उदाहरण के लिए, [[सामान्य लिस्प|सामान्य एलआईएसपी]]। हालाँकि, सामान्य एलआईएसपी की परिभाषा में ऐसा कुछ भी निहित नहीं है जो इसे व्याख्या करने से रोकता हो। अन्य भाषाओं में ऐसी विशेषताएं हैं जो एक अनुवादक में क्रियान्वित करना अधिक आसान है, लेकिन एक संकलक को लिखना अधिक कठिन बना देता है; उदाहरण के लिए, एपीएल (प्रोग्रामिंग भाषा), [[SNOBOL4|एसएनओबीओएल4]], और कई स्क्रिप्टिंग भाषा प्रोग्राम को नियमित स्ट्रिंग संचालन के साथ रनटाइम पर एकपक्षीय स्रोत कोड बनाने की स्वीकृति देते हैं, और पुनः उस कोड को एक विशेष [[eval|मूल्यांकन फ़ंक्शन]] पास करके निष्पादित करते हैं। संकलित भाषा में इन सुविधाओं को क्रियान्वित करने के लिए, प्रोग्राम को सामान्यतः एक [[रनटाइम]] [[क्रम पुस्तकालय|पुस्तकालय]] के साथ भेजा जाना चाहिए जिसमें संकलक का एक संस्करण सम्मिलित हो। | ||
== प्रकार == | == प्रकार == | ||
कम्पाइलरों का एक वर्गीकरण [[कम्प्यूटिंग मंच]] द्वारा होता है, जिस पर उनका उत्पन्न कोड निष्पादित होता है। इसे | कम्पाइलरों का एक वर्गीकरण [[कम्प्यूटिंग मंच|कम्प्यूटिंग प्लेटफ़ॉर्म]] द्वारा होता है, जिस पर उनका उत्पन्न कोड निष्पादित होता है। इसे योजनाबद्ध प्लेटफ़ॉर्म के रूप में जाना जाता है। | ||
एक | एक मूल या होस्टेड संकलक वह है जिसका आउटपुट प्रत्यक्ष रूप से उसी प्रकार के कंप्यूटर और ऑपरेटिंग सिस्टम पर सक्रिय प्रयोजन है जिस पर संकलक स्वयं चलता है। एक [[क्रॉस कंपाइलर|क्रॉस संकलक]] का आउटपुट एक अलग प्लेटफॉर्म पर चलने के लिए डिज़ाइन किया गया है। क्रॉस संकलक का उपयोग प्रायः [[अंतःस्थापित प्रणाली]] के लिए सॉफ़्टवेयर विकसित करते समय किया जाता है जो [[सॉफ़्टवेयर]] विकास वातावरण का समर्थन करने का प्रयोजन नहीं रखते हैं। | ||
एक | एक संकलक का आउटपुट जो एक [[आभासी मशीन]] (वीएम) के लिए कोड का उत्पादन करता है, हो सकता है कि इसे उसी प्लेटफॉर्म पर निष्पादित न किया जा सके, जिसने इसे बनाया था। इस कारण से, ऐसे संकलक को सामान्यतः मूल या क्रॉस संकलक के रूप में वर्गीकृत नहीं किया जाता है। | ||
निम्न स्तर की भाषा जो एक संकलक का लक्ष्य है, वह स्वयं एक उच्च स्तरीय प्रोग्रामिंग भाषा हो सकती है। सी, जिसे कुछ लोगों द्वारा पोर्टेबल असेंबली भाषा के रूप में देखा जाता है, प्रायः ऐसे कंपाइलरों की | निम्न स्तर की भाषा जो एक संकलक का लक्ष्य है, वह स्वयं एक उच्च स्तरीय प्रोग्रामिंग भाषा हो सकती है। सी, जिसे कुछ लोगों द्वारा पोर्टेबल असेंबली भाषा के रूप में देखा जाता है, प्रायः ऐसे कंपाइलरों की टारगेट भाषा होती है। उदाहरण के लिए, सी++ के लिए मूल संकलक, [[सीफ्रंट]] ने सी को अपनी टारगेट भाषा के रूप में उपयोग किया। इस तरह के एक संकलक द्वारा उत्पन्न सी कोड सामान्यतः मनुष्यों द्वारा पठनीय और बनाए रखने का प्रयोजन नहीं होता है, इसलिए [[इंडेंट शैली]] और उत्कृष्ट सी मध्यवर्ती कोड बनाने पर ध्यान नहीं दिया जाता है। सी की कुछ विशेषताएं जो इसे एक अच्छी योजनाबद्ध भाषा बनाती हैं उनमें पंक्ति निर्देश सम्मिलित हैं, जो संकलक द्वारा मूल स्रोत के डिबगिंग का समर्थन करने के लिए और सी संकलक के साथ उपलब्ध व्यापक प्लेटफ़ॉर्म समर्थन उत्पन्न किया जा सकता है। | ||
जबकि एक सामान्य संकलक प्रकार मशीन कोड को आउटपुट करता है, कई अन्य प्रकार हैं: | जबकि एक सामान्य संकलक प्रकार मशीन कोड को आउटपुट करता है, कई अन्य प्रकार हैं: | ||
*सोर्स-टू-सोर्स | *सोर्स-टू-सोर्स संकलक एक प्रकार का संकलक है जो एक उच्च-स्तरीय भाषा को अपने इनपुट के रूप में लेता है और एक उच्च-स्तरीय भाषा को आउटपुट करता है। उदाहरण के लिए, एक स्वचालित समानांतरकरण संकलक प्रायः एक उच्च-स्तरीय भाषा प्रोग्राम को एक इनपुट के रूप में लेता है और पुनः कोड को रूपांतरित करता है और इसे समानांतर कोड व्याख्या (जैसे [[ओपनएमपी]]) या भाषा निर्माण (जैसे फोरट्रान) के साथ व्याख्या करता है। <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> | ||
* बायटेकोड | * बायटेकोड संकलक एक सैद्धांतिक मशीन की असेंबली भाषा को संकलित करते हैं, जैसे कुछ [[प्रोलॉग]] कार्यान्वयन | ||
** इस प्रोलॉग मशीन को [[वॉरेन सार मशीन]] (या | ** इस प्रोलॉग मशीन को [[वॉरेन सार मशीन]] (या डब्लूएएम) के नाम से भी जाना जाता है। | ||
** [[जावा (प्रोग्रामिंग भाषा)]], पायथन (प्रोग्रामिंग | ** [[जावा (प्रोग्रामिंग भाषा)]], [[पायथन]] (प्रोग्रामिंग भाषा) के लिए बाइटकोड संकलक भी इस श्रेणी के उदाहरण हैं। | ||
*जस्ट-इन-टाइम | *जस्ट-इन-टाइम संकलक (जेआईटी संकलक) रनटाइम तक संकलन को स्थगित करते हैं। जिनमे पायथन (प्रोग्रामिंग भाषा), [[जावास्क्रिप्ट]], स्मॉलटॉक, [[जावा]] (प्रोग्रामिंग भाषा), माइक्रोसॉफ्ट एनईटी की [[सामान्य मध्यवर्ती भाषा]] (सीआईएल) और अन्य कई आधुनिक भाषाओं के लिए जेआईटी संकलक सम्मिलित हैं। एक [[जेआईटी]] संकलक सामान्यतः अनुवादक के अंदर सक्रिय है। जब अनुवादक पता लगाता है कि एक कोड पथ "हॉट" है, जिसका अर्थ है कि इसे प्रायः निष्पादित किया जाता है, जेआईटी संकलक को क्रियान्वित किया जाएगा और बढ़ते प्रदर्शन के लिए "[[हॉट]]" कोड संकलित किया जाएगा। | ||
** कुछ भाषाओं के लिए, जैसे कि जावा, एप्लिकेशन को पहले बायटेकोड | ** कुछ भाषाओं के लिए, जैसे कि जावा, एप्लिकेशन को पहले बायटेकोड संकलक का उपयोग करके संकलित किया जाता है और मशीन-स्वतंत्र मध्यवर्ती प्रतिनिधित्व में वितरित किया जाता है। एक बाइटकोड अनुवादक बाइटकोड निष्पादित करता है, लेकिन जेआईटी संकलक बाइटकोड को मशीन कोड में अनुवादित करेगा जब प्रदर्शन बढ़ाना आवश्यक होगा।<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|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}} ऐसे संकलक को हार्डवेयर संकलक कहा जाता है, क्योंकि वे जिस स्रोत कोड को संकलित करते हैं, वह प्रभावी रूप से हार्डवेयर के अंतिम कॉन्फ़िगरेशन को नियंत्रित करता है और यह कैसे संचालित होता है। संकलन का आउटपुट केवल [[ट्रांजिस्टर|संक्रामक]] या [[खोज तालिका|खोज सारणी]] का एक अंतः संयोजन है। | ||
** हार्डवेयर | ** हार्डवेयर संकलक का एक उदाहरण एक्सएसटी है, जो [[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|असेंबलर]] कहा जाता है। | ||
* एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह डीकंपलर है।<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}} | ||
* एक प्रोग्राम जो | * एक प्रोग्राम जो अनुकूलन और रूपांतरण क्रियान्वित करते समय वस्तु कोड को उसी प्रकार के वस्तु कोड में वापस लिखता है, वह [[बाइनरी रीकंपाइलर|बाइनरी पुनःसंयोजक]] है। | ||
== यह भी देखें == | == यह भी देखें == | ||
{{Portal|Computer programming}} | {{Portal|Computer programming}} | ||
{{div col|colwidth=22em}} | {{div col|colwidth=22em}} | ||
* [[ | * [[अमूर्त व्याख्य]] | ||
* [[ | * [[बाटम-अप पार्सिंग]] | ||
* [[कंपाइल एंड गो सिस्टम]] | * [[कंपाइल एंड गो सिस्टम]] | ||
* संकलन | * संकलन फार्म | ||
* कंपाइलर्स की सूची | * कंपाइलर्स की सूची | ||
* {{Section link| | * {{Section link|कंप्यूटर विज्ञान में महत्वपूर्ण प्रकाशनों की सूची § संकलक|संकलक}} | ||
* [[मेटाकंपिलेशन]] | * [[मेटाकंपिलेशन]] | ||
{{div col end}} | {{div col end}} | ||
Line 213: | Line 217: | ||
== बाहरी कड़ियाँ == | == बाहरी कड़ियाँ == | ||
{{Wiktionary|compiler}} | {{Wiktionary|compiler}} | ||
Line 266: | Line 237: | ||
[[श्रेणी: उपयोगिता सॉफ्टवेयर प्रकार]] | [[श्रेणी: उपयोगिता सॉफ्टवेयर प्रकार]] | ||
[[Category:All articles with unsourced statements]] | |||
[[Category: | [[Category:Articles with Curlie links]] | ||
[[Category: | [[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]
- एक प्रोग्राम जो अनुकूलन और रूपांतरण क्रियान्वित करते समय वस्तु कोड को उसी प्रकार के वस्तु कोड में वापस लिखता है, वह बाइनरी पुनःसंयोजक है।
यह भी देखें
- अमूर्त व्याख्य
- बाटम-अप पार्सिंग
- कंपाइल एंड गो सिस्टम
- संकलन फार्म
- कंपाइलर्स की सूची
- कंप्यूटर विज्ञान में महत्वपूर्ण प्रकाशनों की सूची § संकलक § संकलक
- मेटाकंपिलेशन
संदर्भ
- ↑ "Encyclopedia: Definition of Compiler". PCMag.com. Retrieved 2 July 2022.
{{cite web}}
: CS1 maint: url-status (link) - ↑ 2.0 2.1 Compilers: Principles, Techniques, and Tools by Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman - Second Edition, 2007
- ↑ 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].
- ↑ 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.
- ↑ lecture notes Compilers: Principles, Techniques, and Tools Jing-Shin Chang Department of Computer Science & Information Engineering National Chi-Nan University
- ↑ Naur, P. et al. "Report on ALGOL 60". Communications of the ACM 3 (May 1960), 299–314.
- ↑ Chomsky, Noam; Lightfoot, David W. (2002). सिंटैक्टिक संरचनाएं. Walter de Gruyter. ISBN 978-3-11-017279-9.
- ↑ Gries, David (2012). "Appendix 1: Backus-Naur Form". प्रोग्रामिंग का विज्ञान. Springer Science & Business Media. p. 304. ISBN 978-1461259831.
- ↑ Iverson, Kenneth E. (1962). एक प्रोग्रामिंग भाषा. John Wiley & Sons. ISBN 978-0-471430-14-8.
- ↑ Backus, John. "The history of FORTRAN I, II and III" (PDF). प्रोग्रामिंग भाषाओं का इतिहास. Archived (PDF) from the original on 10 October 2022.
{{cite book}}
:|website=
ignored (help) - ↑ Porter Adams, Vicki (5 October 1981). "Captain Grace M. Hopper: the Mother of COBOL". InfoWorld. 3 (20): 33. ISSN 0199-6649.
- ↑ 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.
- ↑ Compilers Principles, Techniques, & Tools 2nd edition by Aho, Lam, Sethi, Ullman ISBN 0-321-48681-1
- ↑ Hopper, Grace Murray (1952). "कंप्यूटर की शिक्षा". Proceedings of the 1952 ACM National Meeting (Pittsburgh): 243–249. doi:10.1145/609784.609818. S2CID 10081016.
- ↑ Ridgway, Richard K. (1952). "संकलन दिनचर्या". Proceedings of the 1952 ACM National Meeting (Toronto): 1–5. doi:10.1145/800259.808980. S2CID 14878552.
- ↑ 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.)
- ↑ Abelson, Hal; Dybvig, R. K.; et al. Rees, Jonathan; Clinger, William (eds.). "एल्गोरिदमिक भाषा योजना पर संशोधित (3) रिपोर्ट, (ALGOL 60 की स्मृति को समर्पित)". Retrieved 20 October 2009.
- ↑ "Recursive Functions of Symbolic Expressions and Their Computation by Machine", Communications of the ACM, April 1960
- ↑ McCarthy, John; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I. (1965). लिस्प 1.5 प्रोग्रामर मैनुअल. The MIT Press. ISBN 9780262130110.
- ↑ "BCPL: A tool for compiler writing and system programming" M. Richards, University Mathematical Laboratory Cambridge, England 1969
- ↑ BCPL: The Language and Its Compiler, M Richards, Cambridge University Press (first published 31 December 1981)
- ↑ The BCPL Cintsys and Cintpos User Guide, M. Richards, 2017
- ↑ Corbató, F. J.; Vyssotsky, V. A. "मल्टिक्स सिस्टम का परिचय और अवलोकन". 1965 Fall Joint Computer Conference. Multicians.org.
- ↑ Report II of the SHARE Advanced Language Development Committee, 25 June 1964
- ↑ Multicians.org "The Choice of PL/I" article, Editor /tom Van Vleck
- ↑ "PL/I As a Tool for System Programming", F.J. Corbato, Datamation 6 May 1969 issue
- ↑ "The Multics PL/1 Compiler", R. A. Freiburghouse, GE, Fall Joint Computer Conference 1969
- ↑ Dennis M. Ritchie, "The Development of the C Language", ACM Second History of Programming Languages Conference, April 1993
- ↑ S.C. Johnson, "a Portable C Compiler: Theory and Practice", 5th ACM POPL Symposium, January 1978
- ↑ A. Snyder, A Portable Compiler for the Language C, MIT, 1974.
- ↑ K. Nygaard, University of Oslo, Norway, "Basic Concepts in Object Oriented Programming", SIGPLAN Notices V21, 1986
- ↑ B. Stroustrup: "What is Object-Oriented Programming?" Proceedings 14th ASU Conference, 1986.
- ↑ Bjarne Stroustrup, "An Overview of the C++ Programming Language", Handbook of Object Technology (Editor: Saba Zamir, ISBN 0-8493-3135-8)
- ↑ Leverett, Cattell, Hobbs, Newcomer, Reiner, Schatz, Wulf: "An Overview of the Production Quality Compiler-Compiler Project", CMU-CS-89-105, 1979
- ↑ W. Wulf, K. Nori, "Delayed binding in PQCC generated compilers", CMU Research Showcase Report, CMU-CS-82-138, 1982
- ↑ 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
- ↑ William A. Whitaker, "Ada - the project: the DoD High Order Working Group", ACM SIGPLAN Notices (Volume 28, No. 3, March 1991)
- ↑ CECOM Center for Software Engineering Advanced Software Technology, "Final Report - Evaluation of the ACEC Benchmark Suite for Real-Time Applications", AD-A231 968, 1990
- ↑ P.Biggar, E. de Vries, D. Gregg, "A Practical Solution for Scripting Language Compilers", submission to Science of Computer Programming, 2009
- ↑ M.Hall, D. Padua, K. Pingali, "Compiler Research: The Next 50 Years", ACM Communications 2009 Vol 54 #2
- ↑ Cooper and Torczon 2012, p. 8
- ↑ Lattner, Chris (2017). "LLVM". In Brown, Amy; Wilson, Greg (eds.). ओपन सोर्स एप्लिकेशन का आर्किटेक्चर. Archived from the original on 2 December 2016. Retrieved 28 February 2017.
- ↑ Aho, Lam, Sethi, Ullman 2007, p. 5-6, 109-189
- ↑ Aho, Lam, Sethi, Ullman 2007, p. 111
- ↑ Aho, Lam, Sethi, Ullman 2007, p. 8, 191-300
- ↑ 46.0 46.1 Blindell, Gabriel Hjort (3 June 2016). निर्देश चयन: सिद्धांत, तरीके और अनुप्रयोग. Switzerland. ISBN 9783319340197. OCLC 951745657.
{{cite book}}
: CS1 maint: location missing publisher (link) - ↑ Cooper and Toczon (2012), p. 540
- ↑ 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) - ↑ Aycock, John (2003). "जस्ट-इन-टाइम का एक संक्षिप्त इतिहास". ACM Comput. Surv. 35 (2, June): 93–113. doi:10.1145/857076.857077. S2CID 15345671.
- ↑ 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.
- ↑ Xilinx Staff (2009). "एक्सएसटी संश्लेषण अवलोकन". Xilinx, Inc. Archived from the original on 2 November 2016. Retrieved 28 February 2017.
- ↑ Altera Staff (2017). "स्पेक्ट्रा-क्यू™ इंजन". Altera.com. Archived from the original on 10 October 2016. Retrieved 28 February 2017.
- ↑ "डीकंपलर - एक सिंहावलोकन | ScienceDirect विषय". www.sciencedirect.com. Retrieved 12 June 2022.
आगे की पढाई
- Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D. (1986). Compilers: Principles, Techniques, and Tools (1st ed.). Addison-Wesley. ISBN 9780201100884.
- Allen, Frances E. (September 1981). "A History of Language Processor Technology in IBM". IBM Journal of Research and Development. IBM. 25 (5): 535–548. doi:10.1147/rd.255.0535.
- Allen, Randy; Kennedy, Ken (2001). Optimizing Compilers for Modern Architectures. Morgan Kaufmann Publishers. ISBN 978-1-55860-286-1.
- Appel, Andrew Wilson (2002). Modern Compiler Implementation in Java (2nd ed.). Cambridge University Press. ISBN 978-0-521-82060-8.
- Appel, Andrew Wilson (1998). Modern Compiler Implementation in ML. Cambridge University Press. ISBN 978-0-521-58274-2.
- Bornat, Richard (1979). Understanding and Writing Compilers: A Do It Yourself Guide (PDF). Macmillan Publishing. ISBN 978-0-333-21732-0. Archived from the original (PDF) on 15 June 2007. Retrieved 11 April 2007.
- Calingaert, Peter (1979). Horowitz, Ellis (ed.). Assemblers, Compilers, and Program Translation. Computer software engineering series (1st printing, 1st ed.). Potomac, Maryland: Computer Science Press, Inc. ISBN 0-914894-23-4. ISSN 0888-2088. LCCN 78-21905. Retrieved 20 March 2020. (2+xiv+270+6 pages)
- Cooper, Keith Daniel; Torczon, Linda (2012). Engineering a compiler (2nd ed.). Amsterdam: Elsevier/Morgan Kaufmann. p. 8. ISBN 9780120884780. OCLC 714113472.
- Gries, David (1971). Compiler Construction for Digital Computers (in English, Spanish, Japanese, Chinese, Italian, and Russian). New York: John Wiley and Sons. ISBN 0-471-32776-X.
The first text on compiler construction.
{{cite book}}
: CS1 maint: unrecognized language (link) - McKeeman, William Marshall; Horning, James J.; Wortman, David B. (1970). A Compiler Generator. Englewood Cliffs, NJ: Prentice-Hall. ISBN 978-0-13-155077-3.
- Muchnick, Steven (1997). Advanced Compiler Design and Implementation. Morgan Kaufmann Publishers. ISBN 978-1-55860-320-2.
- Scott, Michael Lee (2005). Programming Language Pragmatics (2nd ed.). Morgan Kaufmann. ISBN 978-0-12-633951-2.
- Srikant, Y. N.; Shankar, Priti (2003). The Compiler Design Handbook: Optimizations and Machine Code Generation. CRC Press. ISBN 978-0-8493-1240-3.
- Terry, Patrick D. (1997). Compilers and Compiler Generators: An Introduction with C++. International Thomson Computer Press. ISBN 978-1-85032-298-6.
- Wirth, Niklaus (1996). Compiler Construction (PDF). Addison-Wesley. ISBN 978-0-201-40353-4. Archived from the original (PDF) on 17 February 2017. Retrieved 24 April 2012.
- LLVM community. "The LLVM Target-Independent Code Generator". LLVM Documentation. Retrieved 17 June 2016.
- Compiler textbook references A collection of references to mainstream Compiler Construction Textbooks
बाहरी कड़ियाँ
- Compilers at Curlie
- Incremental Approach to Compiler Construction – a PDF tutorial
- Basics of Compiler Design at the Wayback Machine (archived 15 May 2018)
- Short animation on YouTube explaining the key conceptual difference between compilers and interpreters
- Syntax Analysis & LL1 Parsing on YouTube
- Let's Build a Compiler, by Jack Crenshaw
- Forum about compiler development at the Wayback Machine (archived 10 October 2014)
श्रेणी:अमेरिकी आविष्कार श्रेणी:संकलक निर्माण श्रेणी:कंप्यूटर पुस्तकालय श्रेणी: प्रोग्रामिंग भाषा कार्यान्वयन श्रेणी: उपयोगिता सॉफ्टवेयर प्रकार