संकलक: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 65: Line 65:


कोड जनरेशन प्रक्रिया में पीक्यूसीसी अनुसंधान वास्तव में स्वचालित संकलक-लेखन प्रणाली बनाने की मांग करता है। प्रयास ने 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>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> चरणों में विश्लेषण (फ्रंट एंड), आभासी मशीन (मध्य अंत) में मध्यवर्ती अनुवाद और लक्ष्य (बैक एंड) में अनुवाद सम्मिलित हैं। मध्यवर्ती प्रतिनिधित्व में भाषा विशिष्ट निर्माणों को संभालने के लिए पीक्यूसीसी अनुसंधान के लिए टीसीओएल विकसित किया गया था।<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 95: Line 95:
=== तीन चरण संकलक संरचना ===
=== तीन चरण संकलक संरचना ===
[[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> और [[एम्स्टर्डम संकलक किट]], जिसमें कई फ्रंट-एंड, साझा अनुकूलन और कई बैक-एंड हैं।


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


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

Revision as of 15:28, 1 January 2023

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

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

कंप्यूटिंग, संकलक (कंपाइलर) एक कंप्यूटर प्रोग्राम है जो प्रोग्रामिंग भाषा (स्रोत भाषा) में लिखे गए कंप्यूटर कोड को अन्य भाषा (लक्ष्य भाषा) में अनुवादित करता है। ''संकलक'' नाम मुख्य रूप से उन प्रोग्रामों के लिए उपयोग किया जाता है जो एक एक्जीक्यूटेबल प्रोग्राम बनाने के लिए एक उच्च-स्तरीय प्रोग्रामिंग भाषा से एक निम्न-स्तरीय प्रोग्रामिंग भाषा (जैसे असेंबली भाषा, ऑब्जेक्ट कोड, या मशीन कोड) में स्रोत कोड का अनुवाद करता है।[1][2]: p1 <रेफरी नाम = सुदर्शनम मलिक फुजिता 2002 पीपी। 506–515 >SUDARSANAM, ASHOK; MALIK, SHARAD; FUJITA, MASAHIRO (2002). "A Retargetable Compilation Methodology for Embedded Digital Signal Processors Using a Machine-Dependent Code Optimization Library". हार्डवेयर/सॉफ्टवेयर सह-डिजाइन में रीडिंग. Elsevier. pp. 506–515. doi:10.1016/b978-155860702-6/50045-4. ISBN 9781558607026. एक कंपाइलर एक कंप्यूटर प्रोग्राम है जो एक उच्च-स्तरीय भाषा (HLL) में लिखे गए प्रोग्राम का अनुवाद करता है, जैसे C, एक समतुल्य असेंबली लैंग्वेज प्रोग्राम [2] में।</रेफरी>

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

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

कंपाइलर निम्नलिखित में से कुछ या सभी कार्यों को करने की संभावना रखता है: प्रीप्रोसेसिंग, लेक्सिकल विश्लेषण, पार्सिंग, सिमेंटिक एनालिसिस (सिंटेक्स-निर्देशित अनुवाद (एसडीटी)), कोड ऑप्टिमाइज़ेशन और कोड जनरेशन इनपुट प्रोग्राम्स को मध्यवर्ती प्रतिनिधित्व में बदलना जिन्हें प्रायः चरण कहा जाता है। संकलक सामान्यतः इन चरणों को मॉड्यूलर घटकों के रूप में लागू करते हैं, कुशल डिजाइन को बढ़ावा देते हैं और लक्ष्य आउटपुट के लिए स्रोत इनपुट के प्रोग्राम परिवर्तनों की शुद्धता को बढ़ावा देते हैं। गलत संकलक व्यवहार के कारण होने वाले प्रोग्राम दोषों को ट्रैक करना और उनके आसपास काम करना अधिक कठिन हो सकता है; इसलिए, संकलक शुद्धता सुनिश्चित करने के लिए संकलक कार्यान्वयनकर्ता महत्वपूर्ण प्रयास करते हैं। रेफ नाम = सूर्य2016>Sun, Chengnian; Le, Vu; Zhang, Qirun; Su, Zhendong (2016). "GCC और LLVM में कंपाइलर बग्स को समझने की ओर". ACM. Issta 2016: 294–305. doi:10.1145/2931037.2931074. ISBN 9781450343909. S2CID 8339241.</रेफरी>

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

इतिहास

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

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

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

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

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

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

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

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

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

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

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

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

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

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