संकलक: Difference between revisions
From Vigyanwiki
No edit summary |
No edit summary |
||
| Line 4: | Line 4: | ||
{{Use dmy dates|date=October 2020}} | {{Use dmy dates|date=October 2020}} | ||
{{Program execution}} | {{Program execution}} | ||
कंप्यूटिंग, '''''संकलक (कंपाइलर)''''' एक कंप्यूटर प्रोग्राम है जो प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा ( | कंप्यूटिंग, '''''संकलक (कंपाइलर)''''' एक कंप्यूटर प्रोग्राम है जो प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा '''टारगेट-भाषा (target language)''' में अनुवादित करता है। <nowiki>''</nowiki>संकलक<nowiki>''</nowiki> नाम मुख्य रूप से उन प्रोग्रामों के लिए उपयोग किया जाता है जो एक एक्जीक्यूटेबल प्रोग्राम बनाने के लिए एक उच्च-स्तरीय प्रोग्रामिंग भाषा से एक निम्न-स्तरीय प्रोग्रामिंग भाषा (जैसे असेंबली भाषा, ऑब्जेक्ट कोड, या मशीन कोड) में स्रोत कोड का अनुवाद करता है।<ref>{{cite web |author= |date= |title=एनसाइक्लोपीडिया: कंपाइलर की परिभाषा|url=https://www.pcmag.com/encyclopedia/term/compiler |url-status=live |access-date=2 July 2022 |work=PCMag.com}}</ref><ref name=dragon>[[Compilers: Principles, Techniques, and Tools]] by Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman - Second Edition, 2007</ref>{{rp|p1}}<रेफरी नाम = सुदर्शनम मलिक फुजिता 2002 पीपी। 506–515 >{{cite book | last1=SUDARSANAM | first1=ASHOK | last2=MALIK | first2=SHARAD | last3=FUJITA | first3=MASAHIRO | title=हार्डवेयर/सॉफ्टवेयर सह-डिजाइन में रीडिंग| chapter=A Retargetable Compilation Methodology for Embedded Digital Signal Processors Using a Machine-Dependent Code Optimization Library | publisher=Elsevier | year=2002 | doi=10.1016/b978-155860702-6/50045-4 | pages=506–515 | isbn=9781558607026 | quote=एक कंपाइलर एक कंप्यूटर प्रोग्राम है जो एक उच्च-स्तरीय भाषा (HLL) में लिखे गए प्रोग्राम का अनुवाद करता है, जैसे C, एक समतुल्य असेंबली लैंग्वेज प्रोग्राम [2] में। }}</रेफरी> | ||
कई अलग-अलग प्रकार के संकलक हैं जो विभिन्न उपयोगी रूपों में आउटपुट उत्पन्न करते हैं। एक [[पार संकलक]] एक अलग [[सेंट्रल प्रोसेसिंग यूनिट|सेंट्रल प्रोसेसिंग यूनिट (सीपीयू)]] या [[ऑपरेटिंग सिस्टम]] के लिए कोड तैयार करता है, जिस पर क्रॉस-कंपाइलर स्वयं चलता है। एक [[बूटस्ट्रैप संकलक]] प्रायः एक अस्थायी संकलक होता है, जिसका उपयोग किसी भाषा के लिए अधिक स्थायी या अपेक्षाकृत अधिक अनुकूलित संकलक के संकलन के लिए किया जाता है। | कई अलग-अलग प्रकार के संकलक हैं जो विभिन्न उपयोगी रूपों में आउटपुट उत्पन्न करते हैं। एक [[पार संकलक]] एक अलग [[सेंट्रल प्रोसेसिंग यूनिट|सेंट्रल प्रोसेसिंग यूनिट (सीपीयू)]] या [[ऑपरेटिंग सिस्टम]] के लिए कोड तैयार करता है, जिस पर क्रॉस-कंपाइलर स्वयं चलता है। एक [[बूटस्ट्रैप संकलक]] प्रायः एक अस्थायी संकलक होता है, जिसका उपयोग किसी भाषा के लिए अधिक स्थायी या अपेक्षाकृत अधिक अनुकूलित संकलक के संकलन के लिए किया जाता है। | ||
| Line 10: | Line 10: | ||
एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह एक [[decompiler|''डिकंपाइलर'']] है जो संबंधित सॉफ़्टवेयर में सम्मिलित हैं, एक प्रोग्राम जो उच्च-स्तरीय भाषाओं के बीच अनुवाद करता है, जिसे सामान्यतः सोर्स-टू-सोर्स कंपाइलर (एस2एस) या ''ट्रांसपिलर'' कहा जाता है। एक भाषा [[पुनर्लेखन]] सामान्यतः एक ऐसा प्रोग्राम है जो भाषा में परिवर्तन के बिना [[अभिव्यक्ति (कंप्यूटर विज्ञान)]] के रूप का अनुवाद करता है। एक [[संकलक-संकलक]] एक संकलक है जो एक संकलक (या एक का भाग) बनाता है, प्रायः एक सामान्य और पुन: प्रयोज्य तरीके से ताकि कई अलग-अलग कंपाइलरों का उत्पादन करने में सक्षम हो सके। | एक प्रोग्राम जो निम्न-स्तरीय भाषा से उच्च स्तर की भाषा में अनुवाद करता है, वह एक [[decompiler|''डिकंपाइलर'']] है जो संबंधित सॉफ़्टवेयर में सम्मिलित हैं, एक प्रोग्राम जो उच्च-स्तरीय भाषाओं के बीच अनुवाद करता है, जिसे सामान्यतः सोर्स-टू-सोर्स कंपाइलर (एस2एस) या ''ट्रांसपिलर'' कहा जाता है। एक भाषा [[पुनर्लेखन]] सामान्यतः एक ऐसा प्रोग्राम है जो भाषा में परिवर्तन के बिना [[अभिव्यक्ति (कंप्यूटर विज्ञान)]] के रूप का अनुवाद करता है। एक [[संकलक-संकलक]] एक संकलक है जो एक संकलक (या एक का भाग) बनाता है, प्रायः एक सामान्य और पुन: प्रयोज्य तरीके से ताकि कई अलग-अलग कंपाइलरों का उत्पादन करने में सक्षम हो सके। | ||
कंपाइलर निम्नलिखित में से कुछ या सभी कार्यों को करने की संभावना रखता है: प्रीप्रोसेसिंग, लेक्सिकल विश्लेषण, पार्सिंग, सिमेंटिक एनालिसिस (सिंटेक्स-निर्देशित अनुवाद (एसडीटी)), कोड ऑप्टिमाइज़ेशन और कोड जनरेशन इनपुट प्रोग्राम्स को मध्यवर्ती प्रतिनिधित्व में बदलना जिन्हें प्रायः चरण कहा जाता है। संकलक सामान्यतः इन चरणों को मॉड्यूलर घटकों के रूप में लागू करते हैं, कुशल डिजाइन को बढ़ावा देते हैं और | कंपाइलर निम्नलिखित में से कुछ या सभी कार्यों को करने की संभावना रखता है: प्रीप्रोसेसिंग, लेक्सिकल विश्लेषण, पार्सिंग, सिमेंटिक एनालिसिस (सिंटेक्स-निर्देशित अनुवाद (एसडीटी)), कोड ऑप्टिमाइज़ेशन और कोड जनरेशन इनपुट प्रोग्राम्स को मध्यवर्ती प्रतिनिधित्व में बदलना जिन्हें प्रायः चरण कहा जाता है। संकलक सामान्यतः इन चरणों को मॉड्यूलर घटकों के रूप में लागू करते हैं, कुशल डिजाइन को बढ़ावा देते हैं और टारगेट आउटपुट के लिए स्रोत इनपुट के [[कार्यक्रम परिवर्तन|प्रोग्राम परिवर्तन]] की शुद्धता को बढ़ावा देते हैं। प्रोग्राम मे गलत संकलक गतिविधि के कारण होने वाले दोषों को पता लगाना और उनके आसपास काम करना अधिक कठिन हो सकता है; इसलिए, [[संकलक शुद्धता]] सुनिश्चित करने के लिए संकलक कार्यान्वयनकर्ता महत्वपूर्ण प्रयास करते हैं। | ||
रेफ नाम = सूर्य2016>{{cite journal |last1=Sun|first1=Chengnian|last2=Le|first2=Vu|last3=Zhang|first3=Qirun|last4=Su|first4=Zhendong|date=2016|title=GCC और LLVM में कंपाइलर बग्स को समझने की ओर|url=http://dl.acm.org/citation.cfm?doid=2931037.2931074|journal=ACM|series=Issta 2016|pages=294–305|doi=10.1145/2931037.2931074|isbn=9781450343909|s2cid=8339241}}</रेफरी> | रेफ नाम = सूर्य2016>{{cite journal |last1=Sun|first1=Chengnian|last2=Le|first2=Vu|last3=Zhang|first3=Qirun|last4=Su|first4=Zhendong|date=2016|title=GCC और LLVM में कंपाइलर बग्स को समझने की ओर|url=http://dl.acm.org/citation.cfm?doid=2931037.2931074|journal=ACM|series=Issta 2016|pages=294–305|doi=10.1145/2931037.2931074|isbn=9781450343909|s2cid=8339241}}</रेफरी> | ||
स्रोत प्रोग्राम को बदलने के लिए उपयोग किए जाने वाले संकलक एकमात्र भाषा प्रोसेसर नहीं हैं। एक [[दुभाषिया (कंप्यूटिंग)|अनुवादक (कंप्यूटिंग)]] कंप्यूटर सॉफ्टवेयर है जो संकेतित कार्यों को रूपांतरित करता है और फिर निष्पादित करता है।<ref name=dragon/>{{rp|p2}} अनुवाद प्रक्रिया कंप्यूटर भाषाओं के डिजाइन को प्रभावित करती है, जिससे संकलन या व्याख्या की प्राथमिकता होती है। सिद्धांत रूप में, एक प्रोग्रामिंग भाषा में एक संकलक और अनुवादक दोनों हो सकते हैं। | स्रोत प्रोग्राम को बदलने के लिए उपयोग किए जाने वाले संकलक एकमात्र भाषा प्रोसेसर नहीं हैं। एक [[दुभाषिया (कंप्यूटिंग)|अनुवादक (कंप्यूटिंग)]] कंप्यूटर सॉफ्टवेयर है जो संकेतित कार्यों को रूपांतरित करता है और फिर निष्पादित करता है।<ref name=dragon/>{{rp|p2}} अनुवाद प्रक्रिया कंप्यूटर भाषाओं के डिजाइन को प्रभावित करती है, जिससे संकलन या व्याख्या की प्राथमिकता होती है। सिद्धांत रूप में, एक प्रोग्रामिंग भाषा में एक संकलक और अनुवादक दोनों हो सकते हैं। गतिविधि में, प्रोग्रामिंग भाषाएँ केवल एक (एक संकलक या एक अनुवादक) से जुड़ी होती हैं। | ||
== इतिहास == | == इतिहास == | ||
{{Main| | {{Main|संकलक निर्माण का इतिहास}} | ||
[[File:Compiler.svg |upright=1.5|thumb |एक विशिष्ट बहु-भाषा, बहु- | [[File:Compiler.svg |upright=1.5|thumb |एक विशिष्ट बहु-भाषा, बहु-टारगेट संकलक के संचालन का आरेख]]वैज्ञानिकों, गणितज्ञों और इंजीनियरों द्वारा विकसित सैद्धांतिक कंप्यूटिंग अवधारणाओं ने द्वितीय विश्व युद्ध के समय डिजिटल आधुनिक कंप्यूटिंग विकास का आधार बनाया। प्राथमिक बाइनरी भाषाएं विकसित हुईं क्योंकि डिजिटल डिवाइस केवल एक और शून्य और अंतर्निहित मशीन संरचना में परिपथ स्वरूप को स्वीकार करना हैं। 1940 के दशक के अंत में, कंप्यूटर संरचना के अधिक व्यावहारिक सार की पेशकश करने के लिए असेंबली भाषा बनाई गई थीं। प्रारम्भिक कंप्यूटरों की सीमित मुख्य मेमोरी क्षमता के कारण जब पहला संकलक डिजाइन किया गया था तो काफी तकनीकी चुनौतियों का सामना करना पड़ा था। इसलिए, संकलन प्रक्रिया को कई छोटे कार्यक्रमों में विभाजित करने की आवश्यकता थी। फ्रंट एंड प्रोग्राम टारगेट कोड उत्पन्न करने के लिए बैक एंड प्रोग्राम द्वारा उपयोग किए जाने वाले विश्लेषण उत्पादों का उत्पादन करते हैं। जैसा कि कंप्यूटर प्रौद्योगिकी ने अधिक संसाधन प्रदान किए, संकलक डिजाइन संकलन प्रक्रिया के साथ अपेक्षाकृत अधिक संरेखित हो सकते हैं। | ||
सामान्यतः एक प्रोग्रामर के लिए उच्च-स्तरीय भाषा का उपयोग करना अधिक उत्पादक होता है, इसलिए उच्च-स्तरीय भाषाओं का विकास स्वाभाविक रूप से डिजिटल कंप्यूटर द्वारा प्रदान की जाने वाली क्षमताओं से होता है। उच्च-स्तरीय भाषाएँ [[औपचारिक भाषा]]एँ हैं जिन्हें उनके वाक्य-विन्यास और [[शब्दार्थ (कंप्यूटर विज्ञान)]] द्वारा सख्ती से परिभाषित किया जाता है जो उच्च-स्तरीय भाषा वास्तुकला का निर्माण करते हैं। इन औपचारिक भाषाओं के तत्वों में सम्मिलित हैं: | सामान्यतः एक प्रोग्रामर के लिए उच्च-स्तरीय भाषा का उपयोग करना अधिक उत्पादक होता है, इसलिए उच्च-स्तरीय भाषाओं का विकास स्वाभाविक रूप से डिजिटल कंप्यूटर द्वारा प्रदान की जाने वाली क्षमताओं से होता है। उच्च-स्तरीय भाषाएँ [[औपचारिक भाषा]]एँ हैं जिन्हें उनके वाक्य-विन्यास और [[शब्दार्थ (कंप्यूटर विज्ञान)]] द्वारा सख्ती से परिभाषित किया जाता है जो उच्च-स्तरीय भाषा वास्तुकला का निर्माण करते हैं। इन औपचारिक भाषाओं के तत्वों में सम्मिलित हैं: | ||
| Line 37: | Line 37: | ||
* [[COBOL|कोबोल]] (सामान्य व्यवसाय उन्मुखी भाषा) [[ए-0 प्रणाली]] | A-0 और [[फ्लो-Matic]] से विकसित होकर व्यावसायिक अनुप्रयोगों के लिए प्रमुख उच्च-स्तरीय भाषा बन गई।<ref>Porter Adams, Vicki (5 October 1981). "Captain Grace M. Hopper: the Mother of COBOL". InfoWorld. 3 (20): 33. ISSN 0199-6649.</ref> | * [[COBOL|कोबोल]] (सामान्य व्यवसाय उन्मुखी भाषा) [[ए-0 प्रणाली]] | A-0 और [[फ्लो-Matic]] से विकसित होकर व्यावसायिक अनुप्रयोगों के लिए प्रमुख उच्च-स्तरीय भाषा बन गई।<ref>Porter Adams, Vicki (5 October 1981). "Captain Grace M. Hopper: the Mother of COBOL". InfoWorld. 3 (20): 33. ISSN 0199-6649.</ref> | ||
* [[लिस्प (प्रोग्रामिंग भाषा)|एलआईएसपी (प्रोग्रामिंग भाषा)]] (सूची प्रोसेसर) प्रतीकात्मक संगणना के लिए।<ref>McCarthy, J.; Brayton, R.; Edwards, D.; Fox, P.; Hodes, L.; Luckham, D.; Maling, K.; Park, D.; Russell, S. (March 1960). "LISP I Programmers Manual" (PDF). Boston, Massachusetts: Artificial Intelligence Group, M.I.T. Computation Center and Research Laboratory.</ref> | * [[लिस्प (प्रोग्रामिंग भाषा)|एलआईएसपी (प्रोग्रामिंग भाषा)]] (सूची प्रोसेसर) प्रतीकात्मक संगणना के लिए।<ref>McCarthy, J.; Brayton, R.; Edwards, D.; Fox, P.; Hodes, L.; Luckham, D.; Maling, K.; Park, D.; Russell, S. (March 1960). "LISP I Programmers Manual" (PDF). Boston, Massachusetts: Artificial Intelligence Group, M.I.T. Computation Center and Research Laboratory.</ref> | ||
डिजिटल कंप्यूटर के लिए निम्न-स्तरीय | डिजिटल कंप्यूटर के लिए निम्न-स्तरीय टारगेट प्रोग्राम में उच्च-स्तरीय स्रोत प्रोग्राम के कड़ाई से परिभाषित परिवर्तन की आवश्यकता से संकलक तकनीक विकसित हुई। स्रोत कोड के विश्लेषण से निपटने के लिए संकलक को फ्रंट एंड के रूप में देखा जा सकता है और टारगेट कोड में विश्लेषण को संश्लेषित करने के लिए बैक एंड। फ्रंट एंड और बैक एंड के बीच अनुकूलन अधिक कुशल टारगेट कोड उत्पन्न कर सकता है।<ref>Compilers Principles, Techniques, & Tools 2nd edition by Aho, Lam, Sethi, Ullman {{ISBN |0-321-48681-1}}</ref> | ||
संकलक प्रौद्योगिकी के विकास में कुछ प्रारंभिक मील के पत्थर: | संकलक प्रौद्योगिकी के विकास में कुछ प्रारंभिक मील के पत्थर: | ||
* 1952: मैनचेस्टर विश्वविद्यालय में [[मैनचेस्टर मार्क I]] कंप्यूटर के लिए [[एलिक ग्लेनी]] द्वारा विकसित एक [[ऑटोकोड]] संकलक को कुछ लोगों द्वारा पहली संकलित प्रोग्रामिंग भाषा माना जाता है। | * 1952: मैनचेस्टर विश्वविद्यालय में [[मैनचेस्टर मार्क I]] कंप्यूटर के लिए [[एलिक ग्लेनी]] द्वारा विकसित एक [[ऑटोकोड]] संकलक को कुछ लोगों द्वारा पहली संकलित प्रोग्रामिंग भाषा माना जाता है। | ||
| Line 54: | Line 54: | ||
BLISS (बेसिक भाषा फॉर इंप्लीमेंटेशन ऑफ सिस्टम सॉफ्टवेयर) को डिजिटल इक्विपमेंट कॉरपोरेशन (डीईसी) PDP-10 कंप्यूटर के लिए WA Wulf's Carnegie Mellon University (सीएमयू) रिसर्च टीम द्वारा विकसित किया गया था। सीएमयू टीम ने एक साल बाद 1970 में BLISS-11 संकलक विकसित किया। | BLISS (बेसिक भाषा फॉर इंप्लीमेंटेशन ऑफ सिस्टम सॉफ्टवेयर) को डिजिटल इक्विपमेंट कॉरपोरेशन (डीईसी) PDP-10 कंप्यूटर के लिए WA Wulf's Carnegie Mellon University (सीएमयू) रिसर्च टीम द्वारा विकसित किया गया था। सीएमयू टीम ने एक साल बाद 1970 में BLISS-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>{{cite web |first1=F. J. |last1=Corbató |last2=Vyssotsky |first2=V. A. |title=मल्टिक्स सिस्टम का परिचय और अवलोकन|work=1965 Fall Joint Computer Conference |publisher=Multicians.org |url=https://multicians.org/fjcc1.html}}</ref> मल्टिक्स आईबीएम और आईबीएम उपयोगकर्ता समूह द्वारा विकसित पीएल/आई भाषा में लिखा गया था।<ref>Report II of the SHARE Advanced Language Development Committee, 25 June 1964</ref> आईबीएम का टारगेट व्यापार, वैज्ञानिक और सिस्टम प्रोग्रामिंग आवश्यकताओं को पूरा करना था। ऐसी अन्य भाषाएँ थीं जिन पर विचार किया जा सकता था लेकिन PL/I ने सबसे पूर्ण समाधान की पेशकश की, तथापि इसे लागू नहीं किया गया था।<ref>Multicians.org "The Choice of PL/I" article, Editor /tom Van Vleck</ref> मल्टिक्स प्रोजेक्ट के पहले कुछ वर्षों के लिए, बेल लैब्स से डॉग मैक्लोरी और बॉब मॉरिस द्वारा अर्ली पीएल/आई (ईपीएल) संकलक के साथ भाषा के एक सबसेट को असेंबली भाषा में संकलित किया जा सकता है।<ref>"PL/I As a Tool for System Programming", F.J. Corbato, Datamation 6 May 1969 issue</ref> ईपीएल ने परियोजना का तब तक समर्थन किया जब तक कि पूर्ण पीएल/आई के लिए बूट-स्ट्रैपिंग संकलक विकसित नहीं किया जा सका।<ref>"[https://www.computer.org/csdl/proceedings/afips/1969/5074/00/50740187.pdf The Multics PL/1 Compiler]", R. A. Freiburghouse, GE, Fall Joint Computer Conference 1969</ref> | ||
बेल लैब्स ने 1969 में मल्टिक्स प्रोजेक्ट को छोड़ दिया, और [[डेनिस रिची]] और [[केन थॉम्पसन]] द्वारा लिखित बीसीपीएल अवधारणाओं पर आधारित एक सिस्टम प्रोग्रामिंग भाषा B (प्रोग्रामिंग भाषा) विकसित की। रिची ने बी के लिए बूट-स्ट्रैपिंग संकलक बनाया और बी में पीडीपी-7 के लिए [[यूनिक्स]] (यूनिप्लेक्स्ड इंफॉर्मेशन एंड कंप्यूटिंग सर्विस) ऑपरेटिंग सिस्टम लिखा। यूनिक्स अंततः वर्तनी यूनिक्स बन गया। | बेल लैब्स ने 1969 में मल्टिक्स प्रोजेक्ट को छोड़ दिया, और [[डेनिस रिची]] और [[केन थॉम्पसन]] द्वारा लिखित बीसीपीएल अवधारणाओं पर आधारित एक सिस्टम प्रोग्रामिंग भाषा B (प्रोग्रामिंग भाषा) विकसित की। रिची ने बी के लिए बूट-स्ट्रैपिंग संकलक बनाया और बी में पीडीपी-7 के लिए [[यूनिक्स]] (यूनिप्लेक्स्ड इंफॉर्मेशन एंड कंप्यूटिंग सर्विस) ऑपरेटिंग सिस्टम लिखा। यूनिक्स अंततः वर्तनी यूनिक्स बन गया। | ||
| Line 62: | Line 62: | ||
कई एप्लिकेशन डोमेन में, उच्च-स्तरीय भाषा का उपयोग करने का विचार शीघ्र से पकड़ में आ गया। नई प्रोग्रामिंग भाषाओं द्वारा समर्थित विस्तारित कार्यक्षमता और कंप्यूटर संरचना की बढ़ती जटिलता के कारण, संकलक अधिक जटिल हो गए। | कई एप्लिकेशन डोमेन में, उच्च-स्तरीय भाषा का उपयोग करने का विचार शीघ्र से पकड़ में आ गया। नई प्रोग्रामिंग भाषाओं द्वारा समर्थित विस्तारित कार्यक्षमता और कंप्यूटर संरचना की बढ़ती जटिलता के कारण, संकलक अधिक जटिल हो गए। | ||
[[DARPA|डीएआरपीए]] (रक्षा अग्रिम अनुसंधान परियोजना एजेंसी) ने 1970 में Wulf की सीएमयू रिसर्च टीम के साथ एक संकलक प्रोजेक्ट प्रायोजित किया। प्रोडक्शन क्वालिटी संकलक-संकलक [[PQCC|पीक्यूसीसी]] डिज़ाइन स्रोत भाषा और | [[DARPA|डीएआरपीए]] (रक्षा अग्रिम अनुसंधान परियोजना एजेंसी) ने 1970 में Wulf की सीएमयू रिसर्च टीम के साथ एक संकलक प्रोजेक्ट प्रायोजित किया। प्रोडक्शन क्वालिटी संकलक-संकलक [[PQCC|पीक्यूसीसी]] डिज़ाइन स्रोत भाषा और टारगेट की औपचारिक परिभाषाओं से प्रोडक्शन क्वालिटी संकलक (PQC) तैयार करेगा।<ref>Leverett, Cattell, Hobbs, Newcomer, Reiner, Schatz, Wulf: "An Overview of the Production Quality Compiler-Compiler Project", CMU-CS-89-105, 1979</ref> पीक्यूसीसी ने अधिक सफलता के बिना पार्सर जनरेटर (जैसे, [[Yacc]]) के रूप में पारंपरिक अर्थ से परे संकलक-संकलक शब्द का विस्तार करने की कोशिश की। पीक्यूसीसी को अधिक उचित रूप से एक संकलक जनरेटर के रूप में संदर्भित किया जा सकता है। | ||
कोड जनरेशन प्रक्रिया में पीक्यूसीसी अनुसंधान वास्तव में स्वचालित संकलक-लेखन प्रणाली बनाने की मांग करता है। प्रयास ने PQC की चरण संरचना की खोज की और डिजाइन किया। ब्लिस-11 संकलक ने प्रारंभिक संरचना प्रदान की।<ref>W. Wulf, K. Nori, "[https://apps.dtic.mil/sti/pdfs/ADA125935.pdf Delayed binding in PQCC generated compilers]", CMU Research Showcase Report, CMU-CS-82-138, 1982 | कोड जनरेशन प्रक्रिया में पीक्यूसीसी अनुसंधान वास्तव में स्वचालित संकलक-लेखन प्रणाली बनाने की मांग करता है। प्रयास ने PQC की चरण संरचना की खोज की और डिजाइन किया। ब्लिस-11 संकलक ने प्रारंभिक संरचना प्रदान की।<ref>W. Wulf, K. Nori, "[https://apps.dtic.mil/sti/pdfs/ADA125935.pdf Delayed binding in PQCC generated compilers]", CMU Research Showcase Report, CMU-CS-82-138, 1982 | ||
</ref> चरणों में विश्लेषण (फ्रंट एंड), आभासी मशीन (मध्य अंत) में मध्यवर्ती अनुवाद और | </ref> चरणों में विश्लेषण (फ्रंट एंड), आभासी मशीन (मध्य अंत) में मध्यवर्ती अनुवाद और टारगेट (बैक एंड) में अनुवाद सम्मिलित हैं। मध्यवर्ती प्रतिनिधित्व में भाषा विशिष्ट निर्माणों को संभालने के लिए पीक्यूसीसी अनुसंधान के लिए टीसीओएल विकसित किया गया था।<ref>Joseph M. Newcomer, David Alex Lamb, Bruce W. Leverett, Michael Tighe, William A. Wulf - Carnegie-Mellon University and David Levine, Andrew H. Reinerit - Intermetrics: "TCOL Ada: Revised Report on An Intermediate Representation for the DOD Standard Programming Language", 1979 | ||
</ref> TCOL के विभिन्न रूपों ने विभिन्न भाषाओं का समर्थन किया। पीक्यूसीसी परियोजना ने स्वचालित संकलक निर्माण की तकनीकों की जांच की। डिजाइन अवधारणाएं (1995 से, ऑब्जेक्ट-ओरिएंटेड[[एडा (प्रोग्रामिंग भाषा)]] एडा (प्रोग्रामिंग भाषा) के लिए कंपाइलर्स और कंपाइलर्स के अनुकूलन में उपयोगी प्रमाणित हुईं। | </ref> TCOL के विभिन्न रूपों ने विभिन्न भाषाओं का समर्थन किया। पीक्यूसीसी परियोजना ने स्वचालित संकलक निर्माण की तकनीकों की जांच की। डिजाइन अवधारणाएं (1995 से, ऑब्जेक्ट-ओरिएंटेड[[एडा (प्रोग्रामिंग भाषा)]] एडा (प्रोग्रामिंग भाषा) के लिए कंपाइलर्स और कंपाइलर्स के अनुकूलन में उपयोगी प्रमाणित हुईं। | ||
| Line 76: | Line 76: | ||
== संकलक निर्माण == | == संकलक निर्माण == | ||
{{more footnotes needed|date=December 2019}} | {{more footnotes needed|date=December 2019}} | ||
एक संकलक उच्च-स्तरीय स्रोत प्रोग्राम से निम्न-स्तरीय | एक संकलक उच्च-स्तरीय स्रोत प्रोग्राम से निम्न-स्तरीय टारगेट प्रोग्राम में एक औपचारिक परिवर्तन लागू करता है। संकलक डिज़ाइन एंड-टू-एंड समाधान को परिभाषित कर सकता है या एक परिभाषित उपसमुच्चय से निपट सकता है जो अन्य संकलन उपकरणों के साथ इंटरफेस करता है उदा। प्रीप्रोसेसर, असेंबलर, लिंकर्स। डिज़ाइन आवश्यकताओं में आंतरिक रूप से संकलक घटकों के बीच और बाह्य रूप से सहायक टूलसेट के बीच कठोर रूप से परिभाषित इंटरफेस सम्मिलित हैं। | ||
प्रारम्भिक दिनों में, संकलक डिजाइन के लिए लिया गया दृष्टिकोण संसाधित होने वाली कंप्यूटर भाषा की जटिलता, इसे डिजाइन करने वाले व्यक्ति (व्यक्तियों) के अनुभव और उपलब्ध संसाधनों से प्रत्यक्ष रूप से प्रभावित होता था। संसाधन सीमाओं के कारण एक से अधिक बार स्रोत कोड से गुजरना पड़ा। | प्रारम्भिक दिनों में, संकलक डिजाइन के लिए लिया गया दृष्टिकोण संसाधित होने वाली कंप्यूटर भाषा की जटिलता, इसे डिजाइन करने वाले व्यक्ति (व्यक्तियों) के अनुभव और उपलब्ध संसाधनों से प्रत्यक्ष रूप से प्रभावित होता था। संसाधन सीमाओं के कारण एक से अधिक बार स्रोत कोड से गुजरना पड़ा। | ||
| Line 96: | Line 96: | ||
[[File:Compiler design.svg|thumb|center|upright=2.5|संकलक डिजाइन]]संकलक डिजाइन में चरणों की शुद्धता से संख्या के होने पर भी, चरणों को तीन चरणों में से एक को सौंपा जा सकता है। चरणों में एक फ्रंट एंड, एक मिडिल एंड और एक बैक एंड सम्मिलित है। | [[File:Compiler design.svg|thumb|center|upright=2.5|संकलक डिजाइन]]संकलक डिजाइन में चरणों की शुद्धता से संख्या के होने पर भी, चरणों को तीन चरणों में से एक को सौंपा जा सकता है। चरणों में एक फ्रंट एंड, एक मिडिल एंड और एक बैक एंड सम्मिलित है। | ||
* फ्रंट एंड इनपुट को स्कैन करता है और एक विशिष्ट स्रोत भाषा के अनुसार सिंटैक्स और सिमेंटिक्स की पुष्टि करता है। [[टाइप सिस्टम]] के लिए यह टाइप की जानकारी एकत्र करके [[प्रकार की जाँच]] करता है। यदि इनपुट प्रोग्राम वाक्यात्मक रूप से गलत है या इसमें टाइप त्रुटि है, तो यह त्रुटि और/या चेतावनी संदेश उत्पन्न करता है, सामान्यतः स्रोत कोड में उस स्थान की पहचान करता है जहां समस्या का पता चला था; कुछ स्थितियों में वास्तविक त्रुटि प्रोग्राम में पहले (बहुत) हो सकती है। फ्रंट एंड के पहलुओं में लेक्सिकल विश्लेषण, सिंटैक्स एनालिसिस और सिमेंटिक एनालिसिस सम्मिलित हैं। मध्य छोर द्वारा आगे की प्रक्रिया के लिए फ्रंट एंड इनपुट प्रोग्राम को एक मध्यवर्ती प्रतिनिधित्व (आईआर) में बदल देता है। यह मध्यवर्ती प्रतिनिधित्व सामान्यतः स्रोत कोड के संबंध में प्रोग्राम का निम्न स्तर का प्रतिनिधित्व है। | * फ्रंट एंड इनपुट को स्कैन करता है और एक विशिष्ट स्रोत भाषा के अनुसार सिंटैक्स और सिमेंटिक्स की पुष्टि करता है। [[टाइप सिस्टम]] के लिए यह टाइप की जानकारी एकत्र करके [[प्रकार की जाँच]] करता है। यदि इनपुट प्रोग्राम वाक्यात्मक रूप से गलत है या इसमें टाइप त्रुटि है, तो यह त्रुटि और/या चेतावनी संदेश उत्पन्न करता है, सामान्यतः स्रोत कोड में उस स्थान की पहचान करता है जहां समस्या का पता चला था; कुछ स्थितियों में वास्तविक त्रुटि प्रोग्राम में पहले (बहुत) हो सकती है। फ्रंट एंड के पहलुओं में लेक्सिकल विश्लेषण, सिंटैक्स एनालिसिस और सिमेंटिक एनालिसिस सम्मिलित हैं। मध्य छोर द्वारा आगे की प्रक्रिया के लिए फ्रंट एंड इनपुट प्रोग्राम को एक मध्यवर्ती प्रतिनिधित्व (आईआर) में बदल देता है। यह मध्यवर्ती प्रतिनिधित्व सामान्यतः स्रोत कोड के संबंध में प्रोग्राम का निम्न स्तर का प्रतिनिधित्व है। | ||
* मध्य अंत मध्यवर्ती प्रतिनिधित्व पर अनुकूलन करता है जो लक्षित सीपीयू संरचना से स्वतंत्र होते हैं। इस स्रोत कोड/मशीन कोड स्वतंत्रता का उद्देश्य विभिन्न भाषाओं और | * मध्य अंत मध्यवर्ती प्रतिनिधित्व पर अनुकूलन करता है जो लक्षित सीपीयू संरचना से स्वतंत्र होते हैं। इस स्रोत कोड/मशीन कोड स्वतंत्रता का उद्देश्य विभिन्न भाषाओं और टारगेट प्रोसेसर का समर्थन करने वाले संकलक के संस्करणों के बीच साझा किए जाने वाले सामान्य अनुकूलन को सक्षम करना है। मिडिल एंड अनुकूलन के उदाहरण बेकार ([[डेड-कोड उन्मूलन]]) या अगम्य कोड ([[पहुंच क्षमता विश्लेषण]]) को हटाना, निरंतर मूल्यों की खोज और प्रसार (निरंतर प्रचार), कम बार-बार निष्पादित स्थान पर गणना का स्थानांतरण (जैसे, लूप से बाहर) ), या संदर्भ के आधार पर गणना की विशेषज्ञता, अंततः अनुकूलित मध्यवर्ती प्रतिनिधित्व का उत्पादन करती है जिसका उपयोग बैक एंड द्वारा किया जाता है। | ||
* पिछला अंत मध्य छोर से अनुकूलित मध्यवर्ती प्रतिनिधित्व लेता है। यह अधिक विश्लेषण, परिवर्तन और अनुकूलन कर सकता है जो | * पिछला अंत मध्य छोर से अनुकूलित मध्यवर्ती प्रतिनिधित्व लेता है। यह अधिक विश्लेषण, परिवर्तन और अनुकूलन कर सकता है जो टारगेट सीपीयू संरचना के लिए विशिष्ट हैं। बैक एंड टारगेट-निर्भर असेंबली कोड उत्पन्न करता है, प्रक्रिया में रजिस्टर आवंटन करता है। बैक एंड [[निर्देश समयबद्धन]] करता है, जो [[देरी स्लॉट]] को भरकर समानांतर एक्जीक्यूटेबल इकाइयों को व्यस्त रखने के निर्देशों को फिर से आदेश देता है। हालांकि अधिकांश अनुकूलन समस्याएं [[एनपी-कठोरता]] | एनपी-हार्ड हैं, उन्हें हल करने के लिए ह्यूरिस्टिक (कंप्यूटर विज्ञान) तकनीकें अच्छी तरह से विकसित हैं और वर्तमान में उत्पादन-गुणवत्ता वाले कंपाइलरों में लागू हैं। सामान्यतः बैक एंड का आउटपुट एक विशेष प्रोसेसर और ऑपरेटिंग सिस्टम के लिए विशिष्ट मशीन कोड होता है। | ||
यह फ्रंट/मध्य/बैक-एंड दृष्टिकोण मध्य अंत के अनुकूलन को साझा करते हुए विभिन्न सेंट्रल प्रोसेसिंग यूनिट के लिए बैक एंड के साथ विभिन्न भाषाओं के लिए फ्रंट एंड को जोड़ना संभव बनाता है।<ref>Cooper and Torczon 2012, p. 8</ref> इस दृष्टिकोण के व्यावहारिक उदाहरण जीएनयू संकलक संग्रह, [[बजना]] ([[एलएलवीएम]]-आधारित सी/सी++ संकलक) हैं।<ref name=LattnerBook1st>{{cite book | author = Lattner, Chris |editor = Brown, Amy |editor2=Wilson, Greg | date = 2017 | chapter = LLVM | title = ओपन सोर्स एप्लिकेशन का आर्किटेक्चर| chapter-url = http://www.aosabook.org/en/llvm.html | access-date = 28 February 2017 | url-status = live | archive-url = https://web.archive.org/web/20161202070941/http://aosabook.org/en/llvm.html | archive-date = 2 December 2016}}</ref> और [[एम्स्टर्डम संकलक किट]], जिसमें कई फ्रंट-एंड, साझा अनुकूलन और कई बैक-एंड हैं। | यह फ्रंट/मध्य/बैक-एंड दृष्टिकोण मध्य अंत के अनुकूलन को साझा करते हुए विभिन्न सेंट्रल प्रोसेसिंग यूनिट के लिए बैक एंड के साथ विभिन्न भाषाओं के लिए फ्रंट एंड को जोड़ना संभव बनाता है।<ref>Cooper and Torczon 2012, p. 8</ref> इस दृष्टिकोण के व्यावहारिक उदाहरण जीएनयू संकलक संग्रह, [[बजना]] ([[एलएलवीएम]]-आधारित सी/सी++ संकलक) हैं।<ref name=LattnerBook1st>{{cite book | author = Lattner, Chris |editor = Brown, Amy |editor2=Wilson, Greg | date = 2017 | chapter = LLVM | title = ओपन सोर्स एप्लिकेशन का आर्किटेक्चर| chapter-url = http://www.aosabook.org/en/llvm.html | access-date = 28 February 2017 | url-status = live | archive-url = https://web.archive.org/web/20161202070941/http://aosabook.org/en/llvm.html | archive-date = 2 December 2016}}</ref> और [[एम्स्टर्डम संकलक किट]], जिसमें कई फ्रंट-एंड, साझा अनुकूलन और कई बैक-एंड हैं। | ||
| Line 121: | Line 121: | ||
संकलक विश्लेषण किसी भी संकलक अनुकूलन के लिए पूर्वापेक्षा है, और वे एक साथ कसकर काम करते हैं। उदाहरण के लिए, लूप परिवर्तन के लिए निर्भरता विश्लेषण महत्वपूर्ण है। | संकलक विश्लेषण किसी भी संकलक अनुकूलन के लिए पूर्वापेक्षा है, और वे एक साथ कसकर काम करते हैं। उदाहरण के लिए, लूप परिवर्तन के लिए निर्भरता विश्लेषण महत्वपूर्ण है। | ||
संकलक विश्लेषण और अनुकूलन का दायरा बहुत भिन्न होता है; उनका दायरा एक [[बुनियादी ब्लॉक]] के अंदर संचालन से लेकर पूरी प्रक्रिया या यहां तक कि पूरे प्रोग्राम तक हो सकता है। अनुकूलन की ग्रैन्युलैरिटी और संकलन की लागत के बीच एक ट्रेड-ऑफ है। उदाहरण के लिए, [[पीपहोल अनुकूलन]] संकलन के समय प्रदर्शन करने के लिए तेज़ होते हैं लेकिन केवल कोड के एक छोटे से स्थानीय टुकड़े को प्रभावित करते हैं, और उस संदर्भ से स्वतंत्र रूप से निष्पादित किया जा सकता है जिसमें कोड खंड दिखाई देता है। इसके विपरीत, [[अंतरप्रक्रियात्मक अनुकूलन]] के लिए अधिक संकलन समय और मेमोरी स्पेस की आवश्यकता होती है, लेकिन अनुकूलन को सक्षम करता है जो एक साथ कई कार्यों के | संकलक विश्लेषण और अनुकूलन का दायरा बहुत भिन्न होता है; उनका दायरा एक [[बुनियादी ब्लॉक]] के अंदर संचालन से लेकर पूरी प्रक्रिया या यहां तक कि पूरे प्रोग्राम तक हो सकता है। अनुकूलन की ग्रैन्युलैरिटी और संकलन की लागत के बीच एक ट्रेड-ऑफ है। उदाहरण के लिए, [[पीपहोल अनुकूलन]] संकलन के समय प्रदर्शन करने के लिए तेज़ होते हैं लेकिन केवल कोड के एक छोटे से स्थानीय टुकड़े को प्रभावित करते हैं, और उस संदर्भ से स्वतंत्र रूप से निष्पादित किया जा सकता है जिसमें कोड खंड दिखाई देता है। इसके विपरीत, [[अंतरप्रक्रियात्मक अनुकूलन]] के लिए अधिक संकलन समय और मेमोरी स्पेस की आवश्यकता होती है, लेकिन अनुकूलन को सक्षम करता है जो एक साथ कई कार्यों के गतिविधि पर विचार करके ही संभव है। | ||
[[हेवलेट पैकर्ड]], आईबीएम, [[सिलिकॉन ग्राफिक्स]], [[इंटेल]], [[माइक्रोसॉफ्ट]] और [[सन माइक्रोसिस्टम्स]] से आधुनिक वाणिज्यिक कंपाइलर्स में इंटरप्रोसेडुरल विश्लेषण और अनुकूलन सामान्य हैं। शक्तिशाली इंटरप्रोसेडुरल अनुकूलन की कमी के लिए [[मुफ्त सॉफ्टवेयर]] जीएनयू संकलक संग्रह की लंबे समय से आलोचना की गई थी, लेकिन यह इस संबंध में बदल रहा है। पूर्ण विश्लेषण और अनुकूलन अवसंरचना के साथ एक अन्य खुला स्रोत संकलक [[Open64]] है, जिसका उपयोग कई संगठनों द्वारा अनुसंधान और वाणिज्यिक उद्देश्यों के लिए किया जाता है। | [[हेवलेट पैकर्ड]], आईबीएम, [[सिलिकॉन ग्राफिक्स]], [[इंटेल]], [[माइक्रोसॉफ्ट]] और [[सन माइक्रोसिस्टम्स]] से आधुनिक वाणिज्यिक कंपाइलर्स में इंटरप्रोसेडुरल विश्लेषण और अनुकूलन सामान्य हैं। शक्तिशाली इंटरप्रोसेडुरल अनुकूलन की कमी के लिए [[मुफ्त सॉफ्टवेयर]] जीएनयू संकलक संग्रह की लंबे समय से आलोचना की गई थी, लेकिन यह इस संबंध में बदल रहा है। पूर्ण विश्लेषण और अनुकूलन अवसंरचना के साथ एक अन्य खुला स्रोत संकलक [[Open64]] है, जिसका उपयोग कई संगठनों द्वारा अनुसंधान और वाणिज्यिक उद्देश्यों के लिए किया जाता है। | ||
| Line 136: | Line 136: | ||
=== संकलक शुद्धता === | === संकलक शुद्धता === | ||
{{Main|Compiler correctness}} | {{Main|Compiler correctness}} | ||
संकलक शुद्धता सॉफ्टवेयर इंजीनियरिंग की शाखा है जो यह दिखाने की कोशिश करती है कि एक संकलक अपनी प्रोग्रामिंग भाषा के अनुसार | संकलक शुद्धता सॉफ्टवेयर इंजीनियरिंग की शाखा है जो यह दिखाने की कोशिश करती है कि एक संकलक अपनी प्रोग्रामिंग भाषा के अनुसार गतिविधि करता है।{{citation needed|date=February 2020}} तकनीकों में औपचारिक तरीकों का उपयोग करके संकलक विकसित करना और सम्मिलित संकलक पर कठोर परीक्षण (जिसे प्रायः संकलक सत्यापन कहा जाता है) का उपयोग करना सम्मिलित है। | ||
== संकलित बनाम व्याख्या की गई भाषाएँ == | == संकलित बनाम व्याख्या की गई भाषाएँ == | ||
{{unreferenced section|date=October 2018}} | {{unreferenced section|date=October 2018}} | ||
उच्च-स्तरीय प्रोग्रामिंग भाषाएं सामान्यतः एक प्रकार के अनुवादक (कंप्यूटिंग) को ध्यान में रखते हुए दिखाई देती हैं: या तो [[संकलित भाषा]] या [[व्याख्या की गई भाषा]] के रूप में डिज़ाइन की गई। हालाँकि, | उच्च-स्तरीय प्रोग्रामिंग भाषाएं सामान्यतः एक प्रकार के अनुवादक (कंप्यूटिंग) को ध्यान में रखते हुए दिखाई देती हैं: या तो [[संकलित भाषा]] या [[व्याख्या की गई भाषा]] के रूप में डिज़ाइन की गई। हालाँकि, गतिविधि में किसी भाषा के बारे में संभवतया ही कुछ ऐसा होता है जिसके लिए इसे विशेष रूप से संकलित या विशेष रूप से व्याख्या करने की आवश्यकता होती है, हालाँकि ऐसी भाषाओं को डिज़ाइन करना संभव है जो रन टाइम पर पुन: व्याख्या पर निर्भर हों। वर्गीकरण सामान्यतः एक भाषा के सबसे लोकप्रिय या व्यापक कार्यान्वयन को दर्शाता है - उदाहरण के लिए, [[BASIC]] को कभी-कभी व्याख्या की गई भाषा कहा जाता है, और सी को एक संकलित भाषा कहा जाता है, BASIC संकलक और सी दुभाषियों के अस्तित्व के होने पर भी। | ||
व्याख्या संकलन को पूरी तरह से प्रतिस्थापित नहीं करती है। यह केवल इसे उपयोगकर्ता से छुपाता है और इसे धीरे-धीरे बनाता है। यद्यपि एक अनुवादक की व्याख्या की जा सकती है,एक्जीक्यूटेबल स्टैक के नीचे कहीं प्रत्यक्ष रूप से निष्पादित प्रोग्राम की आवश्यकता होती है (मशीन भाषा देखें)। | व्याख्या संकलन को पूरी तरह से प्रतिस् | ||