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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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


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


 * यूनिकोड पहचानकर्ता
 * चूँकि C++ भाषा को पहचानकर्ता (कंप्यूटर भाषाओं) में गैर-ASCII यूनिकोड वर्णों के लिए समर्थन की आवश्यकता होती है, यह सुविधा केवल जीसीसी 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 संस्करण से अलग बनाए गए जीसीसी संस्करणों द्वारा समर्थित किया गया है:


 * कोर्टस 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 (माइक्रोप्रोसेसर)

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

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