संकलक

From Vigyanwiki

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

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

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

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

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

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

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

इतिहास

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

संकलक डिजाइन

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

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

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

फ्रंट एंड

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

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

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

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

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

मिडिल एंड

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

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

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

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

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

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

बैक एंड

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

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

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

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

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

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

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

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

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

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

प्रकार

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

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

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

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

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

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

यह भी देखें


संदर्भ

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


आगे की पढाई


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

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