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

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

जब इसे सर्वप्रथम 1987 में रिचर्ड स्टालमैन द्वारा प्रस्तावित किया गया था, तो जीसीसी 1.0 को जीएनयू C कंपाइलर नाम दिया गया था क्योंकि यह केवल C (प्रोग्रामिंग लैंग्वेज) को हैंडल करता था। इसे उसी वर्ष दिसंबर में C++ कंपाइल करने के लिए विस्तारित किया गया था। कंपाइलर फ्रंट एंड को पश्चात में ऑब्जेक्टिव C, ऑब्जेक्टिव- C ++, फोरट्रान, एडा (प्रोग्रामिंग लैंग्वेज), डी (प्रोग्रामिंग लैंग्वेज), गो (प्रोग्रामिंग लैंग्वेज) और रस्ट (प्रोग्रामिंग लैंग्वेज) के लिए विकसित किया गया था।  ओपनएमपी और ओपनएसीसी स्पेसिफिकेशन्स C और C++ कंपाइलरों में भी समर्थित हैं।

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

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

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

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

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

जीसीसी 3 (2002) ने रखरखाव की कमी के कारण CHILL के लिए फ्रंट-एंड को हटा दिया।

वर्जन 4.0 से पहले फोरट्रान फ्रंट एंड था, जो केवल फोरट्रान 77 का समर्थन करता था, लेकिन  पश्चात में इसे नए जीएनयू फोरट्रान फ्रंट एंड के पक्ष में छोड़ दिया गया जो फोरट्रान 95 और फोरट्रान 2003 और फोरट्रान 2008 के बड़े हिस्सों का भी समर्थन करता है।

वर्जन 4.8 से, जीसीसी को C++ में लागू किया गया है। रेफरी>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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


 * C++ सॉफ़्टवेयर ट्रांसेक्शनल मेमोरी
 * C++ लैंग्वेज में ट्रांसेक्शनल मेमोरी के लिए एक सक्रिय प्रस्ताव है। कम्पाइल करते समय इसे जीसीसी 6 और नए वर्जन में सक्षम किया जा सकता है.


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


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

आर्किटेक्चर
प्राथमिक समर्थित (और सर्वोत्तम परीक्षणित) प्रोसेसर परिवार 64- और 32-बिट एआरएम हैं, 64- और 32-बिट x86_64 और x86 और 64-बिट पावरपीसी और SPARC।

वर्जन 11.1 के अनुसार जीसीसी लक्ष्य प्रोसेसर परिवारों में सम्मिलित हैं:


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

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


 * 68एचसी11
 * ए29के
 * C6x
 * सीआर16
 * डी30वी
 * डीएसपी16xx
 * ईट्रैक्स संकट
 * बेवफा एफआर|FR-30
 * FR-वी ी
 * आईबीएम रोम्प
 * इंटेल i960
 * आईपी2000
 * एम32आर
 * एमसीओआरई
 * एमआईएल-एसटीडी-1750ए
 * एमएमएक्स
 * एमएन10200
 * एमएन10300
 * मोटोरोला 88000
 * NS320xx
 * आरएल78
 * तूफ़ानी16
 * वी850
 * Xtensa

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


 * कॉर्टस APS3
 * एआरसी (प्रोसेसर)
 * एवीआर32
 * सी166 और सी167
 * डी10वी
 * मछली
 * ईएसआई-आरआईएससी
 * षट्कोण (प्रोसेसर)
 * LatticeMico32
 * LatticeMico8
 * एमईपी
 * MicroBlaze ़
 * मोटोरोला 6809
 * एमएसपी430
 * एनईसी एसएक्स वास्तुकला
 * Nios II और Nios एंबेडेड प्रोसेसर
 * ओपनआरआईएससी
 * पीडीपी-10
 * PIC30#PIC24 और dsPIC 16-बिट माइक्रोकंट्रोलर|PIC24/dsPIC
 * PIC30#PIC32 32-बिट माइक्रोकंट्रोलर
 * लंबन प्रोपेलर
 * एचपी शनि (HP48XGCC)
 * सिस्टम/370
 * TIGCC (m68k वैरिएंट)
 * टीएमएस9900
 * ट्राईकोर
 * Z8000
 * ZPU (माइक्रोप्रोसेसर)

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

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

यह भी देखें

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

अग्रिम पठन

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

आधिकारिक

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

अन्य

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

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