GCC — компилятор GNU¶
GCC (GNU Compiler Collection, ранее GNU C Compiler) — свободный компилятор, разрабатываемый в рамках проекта GNU и способный транслировать исходный код с языков программирования C, C++, Fortran, Ada, Go, D, Objective-C, Objective-C++ и ряда других в исполняемые файлы или объектные модули. GCC является одним из наиболее широко используемых инструментов компиляции в Unix-подобных операционных системах и стандартным компилятором во многих дистрибутивах Linux.
¶История
Разработка GCC началась в 1984 году Ричардом Столлманом как компилятор GNU C Compiler, призванный стать свободной альтернативой проприетарным компиляторам. Первый выпуск состоялся в 1987 году, и уже тогда компилятор поддерживал C и работал на нескольких архитектурах, включая Motorola 68000, VAX и SPARC.
В 1990-е годы проект развивался при поддержке Free Software Foundation. В 1997 году Лоуренс Митчелл начал работу над расширением GCC для поддержки C++, что привело к переименованию проекта в GNU Compiler Collection. К 2001 году GCC 3.0 включал фронтенды для C, C++, Fortran 77, Java (компилятор gcj) и Ada.
В 2005 году Иэн Лэнс Тейлор создал форк GCC под названием TinyCC (TCC) для быстрой компиляции, а в 2008 году группа разработчиков, недовольных процессом принятия решений в проекте, запустила форк LLVM/Clang. Несмотря на конкуренцию, GCC сохраняет позицию одного из базовых инструментов в свободной экосистеме.
¶Устройство и структура
GCC построен по модульной схеме, разделяющей фронтенды (отвечающие за разбор исходного кода конкретного языка) и общую оптимизирующую среду, генерирующую машинный код для целевой архитектуры.
¶Фронтенды
Фронтенды GCC реализованы на основе генератора парсеров Bison и генератора лексеров Flex. Каждый фронтенд преобразует исходный код в промежуточное представление GIMPLE — упрощённую, типизированную трёхадресную форму, удобную для дальнейших оптимизаций.
¶Оптимизация и генерация кода
После фронтенда выполняется серия оптимизационных проходов: удаление мёртвого кода, свёртка констант, разворачивание циклов, встраивание функций, векторизация и другие. Затем код преобразуется в RTL (Register Transfer Language) и, наконец, в машинный код целевой архитектуры. GCC поддерживает более 60 архитектур, включая x86, x86-64, ARM, AArch64, MIPS, RISC-V, PowerPC, s390, SPARC и AVR.
¶Стадии компиляции
Типичный конвейер GCC включает четыре основные стадии:
- Предварительная обработка (cpp) — раскрытие макросов, подключение заголовочных файлов;
- Компиляция — генерация ассемблерного кода;
- Ассемблирование (as) — получение объектного файла;
- Связывание (ld) — объединение объектных модулей в исполняемый файл.
¶Использование
Компиляция простейшей программы на C выполняется командой:
`` gcc hello.c -o hello ``
Ключевые опции командной строки включают -O0…-O3 (уровень оптимизации), -g (генерация отладочной информации), -Wall (предупреждения), -std=c11 (выбор стандарта языка), -shared (создание разделяемой библиотеки), -I, -L, -l (пути к заголовкам и библиотекам).
GCC тесно интегрирован с системой сборки GNU Make и пакетом binutils (ассемблировщик GNU as, линковщик GNU ld, утилиты nm, objdump, ar). В большинстве дистрибутивов Linux компилятор устанавливается пакетами gcc и gcc-c++.
¶Релизы
| Версия | Год | Основные изменения |
|---|---|---|
| 1.0 | 1987 | Первый выпуск, поддержка C |
| 2.0 | 1992 | Поддержка C++ |
| 3.0 | 2001 | Новая архитектура C++-фронтенда |
| 4.0 | 2005 | Улучшенные оптимизации, поддержка Ada |
| 5.0 | 2015 | Улучшенная поддержка C++11/14 |
| 12.0 | 2022 | Поддержка C++23, улучшения для RISC-V |
| 14.0 | 2024 | Дальнейшее развитие C++23 и оптимизаций |
¶Лицензия
GCC распространяется под лицензией GNU GPL v3 (с исключением Runtime Library Exception), что позволяет использовать скомпилированный им код без обязательства раскрывать исходники программ, с которыми он связан. Это исключение было введено в 2008 году для повышения привлекательности GCC для промышленной разработки.
¶Значение
GCC является ключевым инструментом свободного программного обеспечения: на нём собирается ядро Linux, компоненты GNU, FreeBSD, Chromium, Firefox и множество других проектов. Компилятор входит в стандарт POSIX как рекомендуемый инструмент трансляции C-программ.
Источники:
- Руководство GCC (GCC Manual), Free Software Foundation
- Сайт проекта GNU — gnu.org/software/gcc
- Stallman R. Using and Porting the GNU Compiler Collection
- Love R. Linux System Programming. O'Reilly Media, 2013
