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

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

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

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

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

, ओपन बीएसडी और मैक ओएस कंपाइलर में चले गए हैं, बड़े स्तर पर लाइसेंसिंग कारणों से  जीसीसी माइक्रोसॉफ़्ट विंडोज़, एंड्रॉयड (ऑपरेटिंग प्रणाली), iOS (आईओएस), सोलारिस (ऑपरेटिंग प्रणाली), HP-UX, IBM AIX और DOS के लिए भी कोड संकलित कर सकता है।

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

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

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

1997 में, विकासकर्ताओं के समूह ने प्विचारोगिक/उन्नत जीएनयू अल्प्पाइलर प्रणाली (ईजीसीएस) का गठन किया जिससे परियोजना में कई प्रयोगात्मक फोर्क्स को विलय किया जा सके। विलय का आधार जीसीसी का विकास स्नैपशॉट था (2.7.2 के निकट लिया गया और पश्चात में 2.8.1 प्रस्तावित तक का पालन किया गया)। विलय में सम्मलित g77 (फोरट्रान), पीजीसीसी (P5 (माइक्रोआर्किटेक्चर) पेंटियम-अनुकूलित जीसीसी) हैं, कई C ++ सुधार, और कई नए आर्किटेक्चर और ऑपरेटिंग प्रणाली वेरिएंट हैं।

जबकि दोनों परियोजना ने -दूसरे के परिवर्तनों का सूक्ष्म से पालन किया हैं, ईजीसीएस विकास अधिक शक्तिशाली सिद्ध हुआ, इतना अधिक कि एफएसएफ ने आधिकारिक के रूप में अपने जीसीसी 2.x कंपाइलर पर विकास का अवरोध किया, ईजीसीएस को जीसीसी के आधिकारिक संस्करण के रूप में आशीर्वाद दिया, और ईजीसीएस परियोजना को जीसीसी के रूप में नियुक्त किया था। अप्रैल 1999 में अनुरक्षक जुलाई 1999 में जीसीसी 2.95 की प्रस्तावित के साथ दोनों परियोजना पुनः साथ हो गईं। तब से जीसीसी को संचालन समिति के निर्देशन में विश्व भर के प्रोग्रामरों के विविध समूह द्वारा बनाए रखा गया है।

सुरक्षा की अल्पता के कारण जीसीसी 3 (2002) ने ठंड के लिए फ्रंट-एंड को विस्थापित कर दिया है।

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

समर्थित भाषाएँ
, जीसीसी के सामने 11.1 प्रस्तावित में C (प्रोग्रामिंग भाषा) के लिए फ्रंट एंड सम्मलित हैं, C++ , ऑब्जेक्टिव-सी, फोरट्रान , एडा (प्रोग्रामिंग भाषा) (जीएनएटी), गो (प्रोग्रामिंग भाषा) और D (प्रोग्रामिंग भाषा) ( , 9.1 से) प्रोग्रामिंग भाषा, जीसीसी 5.1 के पश्चात से ओपनएमपी और ओपनएसीसी समानांतर भाषा एक्सटेंशन समर्थित हैं। जीसीसी 7 से पूर्व के संस्करण भी जावा (प्रोग्रामिंग भाषा) का समर्थन करते थे , जावा को मूल मशीन कोड में संकलित करने की अनुमति देता है। मॉड्यूल-2 समर्थन, जो पूर्व में तीसरे पक्ष द्वारा प्रस्तुत किया गया था, जिसे जीसीसी 13 में विलय कर दिया जाएगा।

C ++ और C के लिए भाषा संस्करण समर्थन के संबंध में, जीसीसी 11.1 के पश्चात से डिफ़ॉल्ट लक्ष्य जीएनयू ++ 17 है, C ++ 17 का उत्तम समुच्चय, और C 11 (C मानक संशोधन) का उत्तम समुच्चय, जीएनयू 11, कठिन मानक समर्थन भी उपलब्ध है। जीसीसी C++20 और भविष्य में C++23 के लिए प्रयोगात्मक समर्थन भी प्रदान करता है।

पास्कल (प्रोग्रामिंग भाषा) जैसी कई भाषाओं के लिए थर्ड-पार्टी फ्रंट एंड उपस्तिथ हैं, मॉड्यूल-3, और वीएचडीएल के अतिरिक्त भाषाओं का समर्थन करने के लिए कुछ प्विचारोगिक शाखाएँ उपस्तिथ हैं, जैसे कि एकीकृत समानांतर सी के लिए जीसीसी एकीकृत समानांतर सी अल्प्पाइलर या रस्ट (प्रोग्रामिंग भाषा) है।

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

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

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

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

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

मई 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++ के पश्चात के संस्करणों को संकलित करता है)।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

वर्तमान संस्करण 11 है।.

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


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


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


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


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


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

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


 * आर्च64
 * डीईसी अल्फा
 * एआरएम वास्तुकला परिवार
 * एटमेल एवीआर
 * ब्लैकफिन
 * ईबीपीएफ
 * एडाप्टेवा उत्पाद (जीसीसी 4.8)
 * हिताची एच8|एच8/300
 * HS12 12
 * आईए-32 (x86)
 * IA-64 (इंटेल इटेनियम)
 * एमआईपीएस आर्किटेक्चर
 * मोटोरोला 68000
 * एमएसपी430
 * एनवीडिया जीपीयू
 * एनवीडिया पीटीएक्स
 * पीए-जोखिम
 * पीडीपी-11
 * पावरपीसी
 * R8C / M16C / M32C
 * RISC-वीी
 * स्पार्क
 * सुपर एच
 * सिस्टम/390 / z सीरीज
 * वैक्स
 * 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 संस्करण से भिन्न बनाए गए जीसीसी संस्करणों द्वारा समर्थित किया गया है:


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

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

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

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