जीएनयू कंपाइलर कलेक्शन

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

जब इसे पहली बार 1987 में रिचर्ड स्टालमैन द्वारा रिलीज़ किया गया था, तो GCC 1.0 को GNU C कंपाइलर नाम दिया गया था क्योंकि यह केवल C (प्रोग्रामिंग लैंग्वेज) को हैंडल करता था। उसी वर्ष दिसंबर में इसे C++ संकलित करने के लिए विस्तारित किया गया था। कंपाइलर # फ्रंट एंड को बाद में उद्देश्य सी, ऑब्जेक्टिव-सी ++, फोरट्रान, एडा (प्रोग्रामिंग लैंग्वेज), डी (प्रोग्रामिंग भाषा) और जाओ (प्रोग्रामिंग भाषा) के लिए विकसित किया गया था। ओपनएमपी और ओपनएसीसी विनिर्देश सी और सी++ कंपाइलर्स में भी समर्थित हैं। जीसीसी किसी भी अन्य कंपाइलर की तुलना में अधिक प्लेटफॉर्म और निर्देश सेट वास्तुकला को में porting कर रहा है, और व्यापक रूप से मुफ्त और मालिकाना सॉफ्टवेयर दोनों के विकास में एक उपकरण के रूप में तैनात किया गया है। GCC कई अंतः स्थापित प्रणाली के लिए भी उपलब्ध है, जिसमें ARM आर्किटेक्चर परिवार-आधारित और Power ISA-आधारित चिप्स शामिल हैं।

जीएनयू ऑपरेटिंग सिस्टम का आधिकारिक कंपाइलर होने के साथ-साथ, GCC को अधिकांश लिनक्स वितरण सहित कई अन्य आधुनिक यूनिक्स जैसे कंप्यूटर ऑपरेटिंग सिस्टम द्वारा मानक कंपाइलर के रूप में अपनाया गया है। अधिकांश बर्कले सॉफ्टवेयर वितरण फैमिली ऑपरेटिंग सिस्टम भी रिलीज होने के कुछ ही समय बाद GCC में बदल गए, हालाँकि तब से, FreeBSD, OpenBSD और MacOS बजना कंपाइलर में चले गए हैं, बड़े पैमाने पर लाइसेंसिंग कारणों से।  GCC Microsoft Windows, Android (ऑपरेटिंग सिस्टम), iOS, Solaris (ऑपरेटिंग सिस्टम), HP-UX, IBM AIX और DOS के लिए भी कोड संकलित कर सकता है।

इतिहास
1983 के अंत में, GNU ऑपरेटिंग सिस्टम को बूटस्ट्रैपिंग (संकलक)कंपाइलर) करने के प्रयास में, रिचर्ड स्टॉलमैन ने एम्स्टर्डम संकलक किट (जिसे व्रीजे यूनिवर्सिटीइट एम्स्टर्डम कंपाइलर किट के रूप में भी जाना जाता है) के लेखक एंड्रयू एस. टैनेनबाम से उस सॉफ़्टवेयर का उपयोग करने की अनुमति मांगी। जीएनयू। जब तनेनबौम ने उन्हें सलाह दी कि संकलक मुक्त नहीं है, और केवल विश्वविद्यालय मुक्त है, तो स्टालमैन ने एक अलग संकलक पर काम करने का फैसला किया। उनकी प्रारंभिक योजना लॉरेंस लिवरमोर राष्ट्रीय प्रयोगशाला के एक मौजूदा कंपाइलर को पेस्टल (प्रोग्रामिंग भाषा) से लियोनार्ड एच. टॉवर जूनियर और अन्य लोगों की मदद से सी में फिर से लिखने की थी। स्टॉलमैन ने लिवरमोर कंपाइलर के लिए एक नया सी फ्रंट एंड लिखा, लेकिन फिर महसूस किया कि इसके लिए स्टैक स्पेस के मेगाबाइट्स की आवश्यकता है, मोटोरोला 68000 यूनिक्स सिस्टम पर केवल 64 केबी के साथ असंभव है, और निष्कर्ष निकाला कि उन्हें स्क्रैच से एक नया कंपाइलर लिखना होगा। पेस्टल कंपाइलर कोड में से कोई भी जीसीसी में समाप्त नहीं हुआ, हालांकि स्टॉलमैन ने अपने द्वारा लिखे गए सी फ्रंट एंड का उपयोग किया था। जीसीसी को पहली बार 22 मार्च 1987 को जारी किया गया था, जो मैसाचुसेट्स की तकनीकी संस्था से फाइल ट्रांसफर प्रोटोकॉल द्वारा उपलब्ध है। स्टालमैन को लेखक के रूप में सूचीबद्ध किया गया था, लेकिन उनके योगदान के लिए दूसरों का हवाला दिया, जिसमें पार्सर के कुछ हिस्सों के लिए टॉवर, आरटीएल जनरेटर, आरटीएल परिभाषाएं, और वैक्स मशीन विवरण, जैक डेविडसन और क्रिस्टोफर डब्ल्यू फ्रेजर शामिल हैं, जो रजिस्टर ट्रांसफर भाषा का उपयोग करने के विचार के लिए हैं। एक मध्यवर्ती भाषा, और अधिकांश प्रीप्रोसेसर लिखने के लिए पॉल रूबिन। पीटर एच. सैलस द्वारा हिट किए गए पहले मुफ्त सॉफ्टवेयर के रूप में वर्णित, जीएनयू कंपाइलर उस समय आया जब सन माइक्रोसिस्टम्स अपने विकास उपकरणों को सुनो से अलग कर रहा था, उन्हें पिछले बंडल की तुलना में उच्च संयुक्त मूल्य पर अलग से बेच रहा था, जिससे सन के कई उपयोगकर्ता विक्रेता के उपकरणों के बजाय जीसीसी को खरीदने या डाउनलोड करने के लिए। जबकि स्टॉलमैन ने GNU Emacs को अपनी मुख्य परियोजना के रूप में माना, 1990 तक, GCC ने तेरह कंप्यूटर आर्किटेक्चर का समर्थन किया, कई विक्रेता कंपाइलरों से बेहतर प्रदर्शन कर रहा था, और कई कंपनियों द्वारा व्यावसायिक रूप से उपयोग किया गया था।

ईजीसीएस कांटा
जैसा कि GCC को GPL के तहत लाइसेंस दिया गया था, अन्य दिशाओं में काम करने के इच्छुक प्रोग्रामर - विशेष रूप से C के अलावा अन्य भाषाओं के लिए इंटरफेस लिखने वाले - कंपाइलर के अपने कांटा (सॉफ्टवेयर विकास) को विकसित करने के लिए स्वतंत्र थे, बशर्ते वे GPL की शर्तों को पूरा करते हों, जिसमें इसकी स्रोत कोड वितरित करने के लिए आवश्यकताएँ। हालाँकि, कई कांटे अक्षम और बोझिल साबित हुए, और आधिकारिक जीसीसी परियोजना द्वारा स्वीकार किए गए कार्य को प्राप्त करने में कठिनाई कई लोगों के लिए बहुत निराशाजनक थी, क्योंकि परियोजना ने नई सुविधाओं पर स्थिरता का पक्ष लिया। FSF ने GCC 2.x (1992 से विकसित) के आधिकारिक संस्करण में जो जोड़ा गया था, उस पर इतना करीबी नियंत्रण रखा कि एरिक एस. रेमंड के निबंध कैथेड्रल और बाजार में कैथेड्रल विकास मॉडल के एक उदाहरण के रूप में GCC का उपयोग किया गया।

1997 में, विकासकर्ताओं के एक समूह ने प्रायोगिक/उन्नत जीएनयू कम्पाइलर सिस्टम (ईजीसीएस) का गठन किया ताकि एक ही परियोजना में कई प्रयोगात्मक फोर्क्स को मर्ज किया जा सके। विलय का आधार जीसीसी का एक विकास स्नैपशॉट था (2.7.2 के आसपास लिया गया और बाद में 2.8.1 रिलीज तक का पालन किया गया)। विलय में शामिल हैं g77 (फोरट्रान), PGCC (P5 (माइक्रोआर्किटेक्चर) पेंटियम-अनुकूलित GCC), कई सी ++ सुधार, और कई नए आर्किटेक्चर और ऑपरेटिंग सिस्टम वेरिएंट। जबकि दोनों परियोजनाओं ने एक-दूसरे के बदलावों का बारीकी से पालन किया, ईजीसीएस विकास काफी अधिक जोरदार साबित हुआ, इतना अधिक कि एफएसएफ ने आधिकारिक तौर पर अपने जीसीसी 2.x कंपाइलर पर विकास को रोक दिया, ईजीसीएस को जीसीसी के आधिकारिक संस्करण के रूप में आशीर्वाद दिया, और ईजीसीएस परियोजना को जीसीसी के रूप में नियुक्त किया। अप्रैल 1999 में अनुरक्षक। जुलाई 1999 में GCC 2.95 की रिलीज़ के साथ दोनों परियोजनाएँ एक बार फिर एकजुट हो गईं। तब से जीसीसी को एक संचालन समिति के निर्देशन में दुनिया भर के प्रोग्रामरों के एक विविध समूह द्वारा बनाए रखा गया है। रखरखाव की कमी के कारण जीसीसी 3 (2002) ने ठंड के लिए फ्रंट-एंड को हटा दिया। संस्करण 4.0 से पहले फोरट्रान फ्रंट एंड था, जो केवल फोरट्रान 77 का समर्थन करता था, लेकिन बाद में नए जीएनयू फोरट्रान फ्रंट एंड के पक्ष में हटा दिया गया था जो फोरट्रान 95 और फोरट्रान 2003 और फोरट्रान 2008 के बड़े हिस्से का भी समर्थन करता है। कंपाइलर विभिन्न प्रकार के प्लेटफार्मों को लक्षित कर सकता है, जिसमें प्लेस्टेशन 2 जैसे विडियो गेम कंसोल शामिल हैं, प्लेस्टेशन 3 की सेल एसपीई, और कलाकारों का सपना। इसे किसी भी अन्य कंपाइलर की तुलना में अधिक प्रकार की सेंट्रल प्रोसेसिंग यूनिट और ऑपरेटिंग सिस्टम में पोर्ट किया गया है।

समर्थित भाषाएँ
, GCC की हालिया 11.1 रिलीज़ में C (प्रोग्रामिंग भाषा) के लिए फ्रंट एंड शामिल हैं, सी++ , ऑब्जेक्टिव-सी, फोरट्रान , एडा (प्रोग्रामिंग भाषा) (जीएनएटी), गो (प्रोग्रामिंग भाषा) और डी (प्रोग्रामिंग भाषा) ( , 9.1 से) प्रोग्रामिंग भाषा, जीसीसी 5.1 के बाद से ओपनएमपी और ओपनएसीसी समानांतर भाषा एक्सटेंशन समर्थित हैं। जीसीसी 7 से पहले के संस्करण भी जावा (प्रोग्रामिंग भाषा) का समर्थन करते थे , जावा को मूल मशीन कोड में संकलित करने की अनुमति देता है। मॉड्यूल-2 समर्थन, जो पहले तीसरे पक्ष द्वारा पेश किया गया था, का जीसीसी 13 में विलय कर दिया जाएगा। सी ++ और सी के लिए भाषा संस्करण समर्थन के संबंध में, जीसीसी 11.1 के बाद से डिफ़ॉल्ट लक्ष्य जीएनयू ++ 17 है, सी ++ 17 का सुपरसेट, और सी 11 (सी मानक संशोधन) का सुपरसेट, जीएनयू 11, सख्त मानक समर्थन भी उपलब्ध है। GCC C++20 और आगामी C++23 के लिए प्रयोगात्मक समर्थन भी प्रदान करता है। पास्कल (प्रोग्रामिंग भाषा) जैसी कई भाषाओं के लिए थर्ड-पार्टी फ्रंट एंड मौजूद हैं, मॉड्यूल -3, और वीएचडीएल. अतिरिक्त भाषाओं का समर्थन करने के लिए कुछ प्रायोगिक शाखाएँ मौजूद हैं, जैसे कि एकीकृत समानांतर सी के लिए जीसीसी एकीकृत समानांतर सी संकलक या जंग (प्रोग्रामिंग भाषा)।

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

प्रत्येक भाषा संकलक एक अलग प्रोग्राम है जो स्रोत कोड को पढ़ता है और मशीन कोड को आउटपुट करता है। सभी की एक सामान्य आंतरिक संरचना है। एक प्रति-भाषा फ्रंट एंड उस भाषा में स्रोत कोड को पदच्छेद करता है और एक सार सिंटैक्स ट्री (लघु के लिए पेड़) बनाता है।

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

Ada (प्रोग्रामिंग लैंग्वेज) फ्रंट एंड के कुछ हिस्सों को छोड़कर GCC मुख्य रूप से C (प्रोग्रामिंग लैंग्वेज) में लिखा गया था। वितरण में एडा और सी ++ के लिए मानक पुस्तकालय शामिल हैं जिनके कोड अधिकतर उन भाषाओं में लिखे गए हैं। कुछ प्लेटफॉर्म पर, वितरण में मशीन-स्वतंत्र सी और प्रोसेसर-विशिष्ट मशीन कोड के संयोजन में लिखी गई एक निम्न-स्तरीय रनटाइम लाइब्रेरी, लिबगसीसी भी शामिल है, जो मुख्य रूप से अंकगणितीय संचालन को संभालने के लिए डिज़ाइन किया गया है जो लक्ष्य प्रोसेसर सीधे प्रदर्शन नहीं कर सकता। जीसीसी अपने निर्माण में कई अतिरिक्त उपकरणों का उपयोग करता है, जिनमें से कई कई यूनिक्स और लिनक्स वितरणों द्वारा डिफ़ॉल्ट रूप से स्थापित किए जाते हैं (लेकिन जो सामान्य रूप से विंडोज इंस्टॉलेशन में मौजूद नहीं होते हैं), पर्ल सहित, फ्लेक्स लेक्सिकल एनालाइजर, जीएनयू बाइसन और अन्य सामान्य उपकरण। इसके अलावा, इसे बनाने के लिए वर्तमान में तीन अतिरिक्त पुस्तकालयों की आवश्यकता है: जीएनयू मल्टी-प्रेसिजन लाइब्रेरी, एकाधिक परिशुद्धता परिसर, और एमपीएफआर। मई 2010 में, GCC संचालन समिति ने GCC को संकलित करने के लिए C++ कंपाइलर के उपयोग की अनुमति देने का निर्णय लिया। कंपाइलर का उद्देश्य अधिकतर सी प्लस में सी ++ से सुविधाओं का एक सबसेट लिखा जाना था। विशेष रूप से, यह निर्णय इसलिए लिया गया था ताकि GCC के विकासकर्ता C++ के विनाशक (कंप्यूटर विज्ञान) और सामान्य प्रोग्रामिंग सुविधाओं का उपयोग कर सकें। अगस्त 2012 में, GCC संचालन समिति ने घोषणा की कि GCC अब अपनी कार्यान्वयन भाषा के रूप में C++ का उपयोग करती है। इसका अर्थ है कि स्रोतों से GCC बनाने के लिए, एक C++ कंपाइलर की आवश्यकता होती है जो C++03|ISO/IEC C++03 मानक को समझता हो।

18 मई, 2020 को, GCC C++03|ISO/IEC C++03 मानक से C++11|ISO/IEC C++11 मानक (यानी संकलन, बूटस्ट्रैप, स्वयं संकलक के लिए आवश्यक) से दूर चला गया; डिफ़ॉल्ट हालांकि यह सी ++ के बाद के संस्करणों को संकलित करता है)।

फ्रंट एंड
प्रत्येक फ्रंट एंड (संकलक) किसी दिए गए स्रोत फ़ाइल के सार सिंटैक्स पेड़ का उत्पादन करने के लिए एक पार्सर का उपयोग करता है। सिंटैक्स ट्री अबास्ट्रक्शन के कारण, विभिन्न समर्थित भाषाओं में से किसी की स्रोत फ़ाइलों को एक ही बैक एंड (कंपाइलर) द्वारा संसाधित किया जा सकता है। GCC ने GNU बाइसन के साथ उत्पन्न LALR पार्सर्स का उपयोग करना शुरू किया, लेकिन धीरे-धीरे हाथ से लिखे गए पुनरावर्ती वंश पार्सर पर स्विच किया गया। 2004 में C++ के लिए रिकर्सिव-डिसेंट पार्सर्स, और 2006 में सी और ऑब्जेक्टिव-सी के लिए। 2021 तक सभी फ्रंट एंड हाथ से लिखे गए रिकर्सिव-डिसेंट पार्सर का उपयोग करते हैं।

जीसीसी 4.0 तक कार्यक्रम का वृक्ष प्रतिनिधित्व लक्षित प्रोसेसर से पूरी तरह से स्वतंत्र नहीं था। एक पेड़ का अर्थ अलग-अलग भाषा के सामने के छोरों के लिए कुछ अलग था, और सामने के छोर अपने स्वयं के पेड़ कोड प्रदान कर सकते थे। इसे GENERIC और GIMPLE, भाषा-स्वतंत्र पेड़ों के दो नए रूपों की शुरुआत के साथ सरल बनाया गया था, जिन्हें GCC 4.0 के आगमन के साथ पेश किया गया था। जीसीसी 3.x जावा फ्रंट एंड के इंटरमीडिएट प्रतिनिधित्व के आधार पर जेनेरिक अधिक जटिल है। GIMPLE एक सरलीकृत GENERIC है, जिसमें विभिन्न निर्माण कई GIMPLE निर्देशों को कम (कंप्यूटर विज्ञान) कर रहे हैं। C (प्रोग्रामिंग लैंग्वेज), C++, और Java (प्रोग्रामिंग लैंग्वेज) फ्रंट एंड सीधे फ्रंट एंड में GENERIC का उत्पादन करते हैं। इसके बजाय अन्य सामने के छोरों में पार्सिंग के बाद अलग-अलग मध्यवर्ती प्रतिनिधित्व होते हैं और इन्हें सामान्य में परिवर्तित करते हैं।

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

सामान्य और GIMPLE
जेनेरिक एक मध्यवर्ती प्रतिनिधित्व भाषा है जिसका उपयोग स्रोत कोड को निष्पादन योग्य में संकलित करते समय मध्य अंत के रूप में किया जाता है। GIMPLE नामक एक उपसमुच्चय को GCC के सभी अग्र सिरों द्वारा लक्षित किया जाता है।

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

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

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

GCC ऑप्टिमाइज़ेशन का सटीक सेट रिलीज़ से रिलीज़ होने तक भिन्न होता है, लेकिन इसमें मानक एल्गोरिदम शामिल होते हैं, जैसे कि लूप अनुकूलन, जंप थ्रेडिंग, सामान्य उप-अभिव्यक्ति उन्मूलन, निर्देश समयबद्धन, और आगे। GIMPLE ट्री पर ग्लोबल SSA-आधारित ऑप्टिमाइजेशन को जोड़ने के साथ रजिस्टर ट्रांसफर लैंग्वेज ऑप्टिमाइजेशन का महत्व कम है, क्योंकि RTL ऑप्टिमाइजेशन का दायरा बहुत सीमित होता है, और कम उच्च-स्तरीय जानकारी होती है।

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

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

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

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

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

सी ++ मानक पुस्तकालय (libstdc ++)
GCC प्रोजेक्ट में libstdc++ नामक C++ मानक लाइब्रेरी का कार्यान्वयन शामिल है, बंद स्रोत एप्लिकेशन को लिंक करने के अपवाद के साथ GPLv3 लाइसेंस के तहत लाइसेंस प्राप्त है जब स्रोत GCC के साथ बनाए जाते हैं। वर्तमान संस्करण 11 है.

अन्य विशेषताएं
जीसीसी की कुछ विशेषताओं में शामिल हैं:


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


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


 * सी ++ सॉफ्टवेयर लेनदेन संबंधी स्मृति
 * C++ भाषा में लेन-देन स्मृति के लिए एक सक्रिय प्रस्ताव है। संकलन करते समय इसे जीसीसी 6 और नए में सक्षम किया जा सकता है.


 * यूनिकोड पहचानकर्ता
 * हालांकि C++ भाषा को पहचानकर्ता (कंप्यूटर भाषाओं) में गैर-ASCII यूनिकोड वर्णों के लिए समर्थन की आवश्यकता होती है, यह सुविधा केवल GCC 10 के बाद से समर्थित है। स्ट्रिंग शाब्दिक के मौजूदा संचालन के साथ, स्रोत फ़ाइल को UTF- में एन्कोडेड माना जाता है। 8. सुविधा सी में वैकल्पिक है, लेकिन इस परिवर्तन के बाद से भी उपलब्ध कराया गया है।


 * सी एक्सटेंशन
 * जीएनयू सी नेस्टेड कार्यों सहित कई गैर-मानक सुविधाओं के साथ सी प्रोग्रामिंग भाषा का विस्तार करता है और टाइपऑफ | भाव।

आर्किटेक्चर
प्राथमिक समर्थित (और सर्वोत्तम परीक्षण) प्रोसेसर परिवार 64- और 32-बिट एआरएम हैं, 64- और 32-बिट x86_64 और x86 और 64-बिट पावरपीसी और स्पार्क। संस्करण 11.1 के अनुसार जीसीसी लक्ष्य प्रोसेसर परिवारों में शामिल हैं:


 * आर्च64
 * डीईसी अल्फा
 * एआरएम वास्तुकला परिवार
 * एटमेल एवीआर
 * Blackfin
 * ईबीपीएफ
 * एडाप्टेवा # उत्पाद (जीसीसी 4.8)
 * हिताची एच8|एच8/300
 * HS12 12
 * आईए-32 (x86)
 * IA-64 (इंटेल इटेनियम)
 * एमआईपीएस आर्किटेक्चर
 * मोटोरोला 68000
 * एमएसपी430
 * एनवीडिया जीपीयू
 * एनवीडिया पीटीएक्स
 * पीए-जोखिम
 * पीडीपी-11
 * पावरपीसी
 * R8C / M16C / M32C
 * RISC-वीी
 * स्पार्क
 * सुपर एच
 * सिस्टम/390 / zSeries
 * वैक्स
 * x86-64

मानक रिलीज़ में समर्थित कम-ज्ञात लक्ष्य प्रोसेसर में शामिल हैं:


 * 68HC11
 * ए29के
 * सी 6 एक्स
 * सीआर16
 * डी30वी
 * डीएसपी16xx
 * ईट्रैक्स क्रिस
 * विश्वासघाती एफआर|FR-30
 * FR-वीी
 * आईबीएम ROMP
 * इंटेल i960
 * आईपी2000
 * एम32आर
 * एमकोर
 * एमआईएल-एसटीडी-1750ए
 * MMIX
 * एमएन10200
 * एमएन10300
 * मोटोरोला 88000
 * एनएस320xx
 * आरएल78
 * तूफानी 16
 * वी 850
 * Xtensa

अतिरिक्त प्रोसेसर को FSF संस्करण से अलग बनाए गए GCC संस्करणों द्वारा समर्थित किया गया है:


 * कोर्टस APS3
 * एआरसी (प्रोसेसर)
 * एवीआर32
 * C166 और C167
 * डी10वी
 * मछली
 * ईएसआई-आरआईएससी
 * षट्भुज (प्रोसेसर)
 * जाली Mico32
 * लैटिसमाइको8
 * एमईपी
 * MicroBlaze़
 * मोटोरोला 6809
 * एमएसपी430
 * एनईसी एसएक्स आर्किटेक्चर
 * Nios II और Nios एम्बेडेड प्रोसेसर
 * ओपनआरआईएससी
 * पीडीपी-10
 * PIC30#PIC24 और dsPIC 16-बिट माइक्रोकंट्रोलर्स|PIC24/dsPIC
 * PIC30#PIC32 32-बिट माइक्रोकंट्रोलर
 * लंबन प्रोपेलर
 * एचपी शनि (HP48XGCC)
 * सिस्टम/370
 * टीआईजीसीसी (एम68के वेरिएंट)
 * टीएमएस9900
 * ट्राईकोर
 * Z8000
 * ZPU (माइक्रोप्रोसेसर)

जावा जावा कंपाइलर के लिए जीएनयू कंपाइलर या तो मूल मशीन भाषा आर्किटेक्चर या जावा वर्चुअल मशीन के जावा बाइटकोड को लक्षित कर सकता है। जब पुन: लक्ष्यित करने योग्य कंपाइलर GCC को एक नए प्लेटफॉर्म पर, बूटस्ट्रैपिंग (कंपाइलर) का अक्सर उपयोग किया जाता है। Motorola 68000, Zilog Z80, और अन्य प्रोसेसर भी विभिन्न टेक्सास इंस्ट्रूमेंट्स, Hewlett Packard, Sharp, और Casio प्रोग्रामेबल ग्राफ़िंग कैलकुलेटर के लिए विकसित GCC संस्करणों में लक्षित हैं।

लाइसेंस
GCC को GNU जनरल पब्लिक लाइसेंस वर्जन 3 के तहत लाइसेंस दिया गया है। जीसीसी रनटाइम अपवाद जीसीसी के साथ मालिकाना कार्यक्रमों (मुफ्त सॉफ्टवेयर के अतिरिक्त) के संकलन की अनुमति देता है। यह GCC स्रोत कोड की लाइसेंस शर्तों को प्रभावित नहीं करता है।

यह भी देखें

 * कंपाइलर्स की सूची
 * मिनजीडब्ल्यू
 * एलएलवीएम/क्लैंग

अग्रिम पठन

 * Using the GNU Compiler Collection (GCC), Free Software Foundation, 2008.
 * GNU Compiler Collection (GCC) Internals, Free Software Foundation, 2008.
 * An Introduction to GCC, Network Theory Ltd., 2004 (Revised August 2005). ISBN 0-9541617-9-3.
 * Arthur Griffith, GCC: The Complete Reference. McGraw Hill / Osborne, 2002. ISBN 0-07-222405-3.

आधिकारिक

 * जीसीसी रिलीज टाइमलाइन
 * जीसीसी विकास योजना
 * जीसीसी विकास योजना

अन्य

 * GCC 4.0.2 आर्किटेक्चर और आंतरिक दस्तावेजों का संग्रह IIT में। बंबई
 * From Source to Binary: The Inner Workings of GCC, डिएगो नोविलो द्वारा, रेड हैट#रेड हैट पत्रिका, दिसम्बर 2004
 * जेनरिक और GIMPLE पर 2003 का एक पेपर
 * मार्केटिंग साइग्नस सपोर्ट, 1990 के दशक के जीसीसी विकास को कवर करने वाला निबंध, 30 मासिक के साथ अंत में सिग्नस इंजीनियरिंग अनुभाग के अंदर के लिए रिपोर्ट
 * ईजीसीएस 1.0 घोषणा
 * EGCS 1.0 सुविधाओं की सूची
 * फीयर ऑफ फोर्किंग, रिक मोएन द्वारा एक निबंध जिसमें GCC/EGCS एक सहित सात जाने-माने फोर्क रिकॉर्ड किए गए हैं
 * EGCS 1.0 सुविधाओं की सूची
 * फीयर ऑफ फोर्किंग, रिक मोएन द्वारा एक निबंध जिसमें GCC/EGCS एक सहित सात जाने-माने फोर्क रिकॉर्ड किए गए हैं

श्रेणी:1987 सॉफ्टवेयर श्रेणी:सी (प्रोग्रामिंग भाषा) संकलक श्रेणी:सी++ कंपाइलर्स श्रेणी:संकलक श्रेणी:क्रॉस-प्लेटफ़ॉर्म मुफ़्त सॉफ़्टवेयर श्रेणी:फोरट्रान संकलक श्रेणी:मुफ्त संकलक और दुभाषिए श्रेणी:GNU प्रोजेक्ट सॉफ़्टवेयर श्रेणी:जावा विकास उपकरण श्रेणी:पास्कल (प्रोग्रामिंग भाषा) संकलक श्रेणी:साफ्टवेयर जिसे सी++ में फिर से लिखा गया था श्रेणी:सी++ में मुफ्त सॉफ्टवेयर प्रोग्राम किया गया श्रेणी:जीपीएल लाइसेंस का उपयोग करने वाला सॉफ्टवेयर श्रेणी:यूनिक्स प्रोग्रामिंग टूल्स