GCC започаткованийРічардом Столменом у1985 році як компілятор для проєктуGNU Project, аби мати компілятор який є вільним програмним забезпеченням. Його розробкою тісно опікувавсяФонд Вільних Програм. Перша версія випущена навесні1987, на кінець1987 року з'явилася підтримкаC++. GCC був першим незалежно створеним (не базувався на препроцесорі CFrontБ'ярна Страуструпа) та першим власне компілятором (а не препроцесором у C) мови C++.
У1997 група розробників, незадоволена повільним темпом і закритістю офіційної розробки GCC, створила проєкт EGCS (Experimental/Enhanced GNU Compiler System — Експериментальна/Покращена Збірка Компіляторів GNU), який об'єднав декілька експериментальних відгалужень GCC. Розробка EGCS з часом виявилась більш життєвою ніж GCC, і у квітні 1999 року EGCS оголошена офіційною версією GCC.
GCC тепер розробляється широкою групою розробників зі всього світу. Вона перенесена на більшу кількість типівпроцесорів таопераційних систем ніж будь-який інший компілятор.
GCC є офіційним компілятором GNU, включно із GNU/Linux, прийнятий як основний компілятор і для інших операційних систем, таких як варіанти*BSD,Mac OS X,NeXTSTEP, іBeOS. Версія GCC підMicrosoft Windows забезпечується проєктамиMinGW таCygwin, підDOS — проєктомDJGPP (лише C/C++).
Зовнішній інтерфейс GCC є стандартом длякомпіляторів на платформіUnix. Користувач викликає управляючу програму, яка називається gcc. Вона інтерпретує аргументи командного рядка, визначає і запускає для кожного вхідного файлу свої компілятори потрібної мови, запускає, якщо необхідно,асемблер ікомпонувальник.
Компілятор кожної мови є окремою програмою, яка отримує початковий текст і породжує вихід на мові асемблера. Всі компілятори мають загальну внутрішню структуру:
front end, який проводить синтаксичний розбір і породжує абстрактне синтаксичне дерево,
і back end, який конвертує дерево в Register Transfer Language (RTL), виконує різні оптимізації, потім породжує програму на мові асемблера, використовуючи архітектурно-залежне зіставлення зі зразком.
GCC майже повністю написаний на Сі, хоча значна частина front-end для Ади написана на Ада.
В травні 2010 Керівний комітет GCC вирішив дозволити використовувати C++ компілятор для компіляції GCC. В серпні 2012 року комітет дозволив також використовувати C++ мову для розробки GCC і деякі складні структури даних (напр хеш-таблиці ітп) були переписані з допомогою C++ з використаннямшаблонів. Для компіляції GCC зараз вимагається компілятор мови C++, що підтримує щонайменше ISO/IEC C++03 стандарт.
Компіляція програми на мові C за допомогою gcc передбачає такі послідовні етапи: препроцесор (prepocessing), компіляція (compilation),збирання (assembly), лінкування(linking). Розглянемо кожен з даних етапів на прикладі програми 'hello.c'.Зверніть увагу, що для компіляції hello.c нема потреби викликати кожну із нижче розглянутих команд окремо. Усі програми автоматично викликає компілятор і їх виклики можна відслідковувати додавши опцію '-v' до команди gcc. Розглянувши кожну команду окремо ми будемо краще розуміти роботу компілятора.Поряд з тим, що 'hello' є досить простою програмою, у ній використано зовнішні бібліотеки, тому під час компіляції даної програми будуть пройдені усі вище вказані етапи.
Першим етапом компіляції є виклик препроцесора. Препроцесор розгортає(підставляє значення у) макроси та додає у 'hello.c' код необхідних header-файлів. Для цього gcc викликає таку команду:cpp hello.c > hello.iРезультатом виконання даної команди є файл 'hello.i', у якому міститься source-код з розгорнутими макросами і вставленими header-файлами. Зверніть увагу, що вихідні файли роботи препроцесора мають розширення '.i' для програм на мові С і '.ii' для програм на мові С++. По замовчуванню hello.i та інші проміжні файли після компіляції не буде збережено на диску, проте, це можливо змінити вказавши опцію '-save-temps=obj' під час виклику gcc, тобто
Наступним етапом є власне компіляція вихідного файлу препроцесора(hello.i). Результатом цього етапу є файл 'hello.s'. У даному файлі міститься код на мові ассемблер.Файл 'hello.s' є проміжним, тому компілятор по замовчуванню його видаляє. Щоб зберегти 'hello.s' і переглянути його вміст необхідно виконати таку команду:gcc -S hello.iРезультатом цієї команди є файл 'hello.s'Ось як виглядає 'hello.s' для процесора з архітектурою x86_64.
Метою даного етапу є перетворення коду мовоюасемблер намашинний код і генерація object-файлу. Якщо у коді є виклики зовнішніх функцій, асемблер залишає адреси початку цих зовнішніх функцій невизначеними. Їх значення будуть заповнені компонувальником на наступному етапі компіляції. Для виклику асемблера:
as hello.s -o hello.o
Як ми бачимо вихідний файл команди вказано за допомогою опції -о. Результатом роботи асемблера є файл hello.o, що містить програму 'hello' у вигляді машинних інструкцій, де також є, поки що невизначена, адреса(undefined reference) початку функції printf().
Останнім етапом компіляції є лінкування(linking) об'єктного файлу для створення executable-файлу, власне програми 'hello'. На практиці, executable-файли потребують багатьох зовнішніх функцій і динамічних (run-time) бібліотек С. Таким чином, справжні команди лінкування, котрі внутрішньо автоматично виконує gcc, є досить складними. Таким чином, повна команда для лінкування 'hello':
Головним інструментом длязневадження програм, скомпільованих за допомогою GCC, єGNU Debugger (gdb). Існують також вузькоспеціалізовані засоби для зневаджування:
Valgrind для пошуку витоків пам'яті
GNU Profiler (gprof) використовується для того, щоб визначити, скільки часу йде на виконання тієї або іншої частини програми, як часто викликаються ті або інші процедури; для використання gprof необхідно компілювати програму із спеціальними опціями для включення «профілізації».
У 2014Асоціація обчислювальної техніки (ACM), найавторитетніша міжнародна організація, в області комп'ютерних систем присудила проєкту GCC премію за внесок у розвиток мов програмування (SIGPLAN Programming Languages Software Award).[3] Премія присуджується за значний вплив на пов'язані з мовами програмування дослідження, реалізації технологій і інструменти.