Открыть сервисСервис

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 включает четыре основные стадии:

  1. Предварительная обработка (cpp) — раскрытие макросов, подключение заголовочных файлов;
  2. Компиляция — генерация ассемблерного кода;
  3. Ассемблирование (as) — получение объектного файла;
  4. Связывание (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.01987Первый выпуск, поддержка C
2.01992Поддержка C++
3.02001Новая архитектура C++-фронтенда
4.02005Улучшенные оптимизации, поддержка Ada
5.02015Улучшенная поддержка C++11/14
12.02022Поддержка C++23, улучшения для RISC-V
14.02024Дальнейшее развитие 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
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru