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

GCC

GCC (GNU Compiler Collection) — это набор компиляторов для различных языков программирования, разрабатываемый в рамках проекта GNU. GCC является одним из ключевых компонентов свободного программного обеспечения и широко используется для компиляции кода на C, C++, Objective-C, Fortran, Ada, Go и других языках. Система распространяется под лицензией GNU General Public License (GPL) и поддерживается на множестве операционных систем, включая Linux, Windows (через MinGW или Cygwin) и macOS.

История

Предыстория и создание

Проект GCC был основан в 1985 году Ричардом Столлманом, основателем Фонда свободного программного обеспечения (FSF). Первоначально аббревиатура расшифровывалась как «GNU C Compiler», поскольку изначально компилятор поддерживал только язык C. Первая версия была выпущена в 1987 году. Целью создания было предоставление свободного, открытого и переносимого компилятора для операционной системы GNU, которая разрабатывалась как свободная альтернатива Unix.

Развитие и расширение

В 1990-х годах GCC постепенно расширял поддержку других языков. В 1991 году была добавлена поддержка C++, в 1992 году — Objective-C, а в 1997 году — Fortran 77. В 1999 году вышла версия 2.95, которая стала первой стабильной версией с поддержкой нескольких языков. С этого момента аббревиатура GCC была переименована в «GNU Compiler Collection». В 2000-х годах были добавлены поддержка Ada (2001), Java (2003, позже удалена), Go (2010) и других языков.

Современное состояние

Начиная с версии 4.0 (2005 год), GCC перешёл на новую инфраструктуру оптимизации, основанную на промежуточном представлении GIMPLE и SSA-форме. Это позволило значительно улучшить качество генерируемого кода. В 2010-х годах GCC стал основным компилятором для ядра Linux и многих встраиваемых систем. В 2020-х годах продолжается активное развитие: версия 10 (2020) добавила поддержку C++20, версия 11 (2021) — улучшения для C++20 и OpenMP, версия 12 (2022) — поддержку C23 и улучшенную оптимизацию. Последняя стабильная версия на момент написания — GCC 14 (2024).

Архитектура и принципы работы

Трёхзвенная структура

GCC использует классическую трёхзвенную архитектуру компилятора:

  1. Фронтенд (front-end): разбирает исходный код на конкретном языке программирования, строит абстрактное синтаксическое дерево (AST) и генерирует промежуточное представление GENERIC.
  2. Оптимизатор (middle-end): преобразует GENERIC в GIMPLE (упрощённое трёхадресное представление), выполняет оптимизации, не зависящие от архитектуры (например, свёртка констант, удаление мёртвого кода, инлайнинг). Затем GIMPLE преобразуется в SSA-форму для более сложных оптимизаций.
  3. Бэкенд (back-end): генерирует машинный код для конкретной целевой архитектуры (x86, ARM, RISC-V, MIPS и др.). На этом этапе выполняются оптимизации, зависящие от процессора (распределение регистров, планирование инструкций).

Поддержка языков

GCC поддерживает следующие основные языки программирования:

  • C (стандарты C89, C99, C11, C17, C23)
  • C++ (стандарты C++98, C++11, C++14, C++17, C++20, C++23)
  • Fortran (стандарты F77, F90, F95, F2003, F2008, F2018)
  • Ada (стандарты Ada 83, Ada 95, Ada 2005, Ada 2012)
  • Go (поддержка Go 1.x)
  • Objective-C и Objective-C++
  • D (экспериментальная поддержка)
  • Modula-2 (экспериментальная поддержка)

Ключевые компоненты

  • gcc — драйвер компилятора, вызывающий все этапы компиляции.
  • cc1 — компилятор C/C++/Objective-C.
  • cc1plus — компилятор C++.
  • gfortran — компилятор Fortran.
  • gnat — компилятор Ada.
  • gcov — инструмент для анализа покрытия кода.
  • gprof — профилировщик производительности.

Классификация и разновидности

По целевому назначению

  • Нативные компиляторы: генерируют код для той же архитектуры, на которой запущен компилятор (например, GCC на x86 Linux компилирует для x86 Linux).
  • Кросс-компиляторы: генерируют код для другой архитектуры (например, GCC на x86 Linux компилирует для ARM). Широко используются в разработке встраиваемых систем и микроконтроллеров.

По версиям и веткам

  • Стабильные версии (например, 14.1.0) — рекомендованы для production-использования.
  • Разработочная ветка (trunk) — содержит новейшие изменения, может быть нестабильной.
  • Специализированные сборки (например, для конкретных встраиваемых платформ, таких как AVR или MSP430).

Применение

Операционные системы

GCC является стандартным компилятором для большинства дистрибутивов Linux (Debian, Ubuntu, Fedora, Arch Linux и др.). Им компилируется ядро Linux, системные утилиты, библиотеки и приложения. В BSD-системах (FreeBSD, OpenBSD) GCC также используется, хотя в некоторых из них предпочтение отдаётся Clang.

Встраиваемые системы

GCC широко применяется для разработки прошивок микроконтроллеров (ARM Cortex-M, AVR, MSP430, RISC-V). Кросс-компиляторы на основе GCC используются в таких средах, как Arduino (на базе avr-gcc), ESP-IDF для ESP32 (на базе xtensa-gcc), STM32CubeIDE.

Образование и исследования

GCC используется в университетах для обучения компиляторостроению и оптимизации кода. Его открытый исходный код позволяет изучать внутренние механизмы компиляции.

Промышленная разработка

Многие крупные компании (Google, Intel, AMD, Red Hat) вносят вклад в развитие GCC и используют его для компиляции своих продуктов. Например, GCC применяется для сборки Android (через Android NDK), многих игровых движков (Unreal Engine, Godot) и серверного ПО.

Преимущества и недостатки

Преимущества

  • Свободное программное обеспечение: распространяется под GPL, что позволяет использовать, изучать и модифицировать код.
  • Кроссплатформенность: поддерживает десятки архитектур (x86, ARM, RISC-V, MIPS, PowerPC, SPARC, S/390 и др.) и операционных систем.
  • Широкая поддержка языков: покрывает большинство популярных компилируемых языков.
  • Богатый набор оптимизаций: включает более 200 оптимизационных проходов, включая автовекторизацию, интерпроцедурный анализ, оптимизацию по профилю (PGO).
  • Активное сообщество: регулярные релизы, патчи безопасности, поддержка новых стандартов.
  • Совместимость: GCC может компилировать код, написанный для других компиляторов (например, GNU C extensions).

Недостатки

  • Скорость компиляции: GCC медленнее, чем некоторые современные компиляторы (например, Clang), особенно при больших проектах.
  • Диагностика ошибок: сообщения об ошибках иногда менее понятны, чем у Clang.
  • Сложность настройки: для кросс-компиляции требуется сборка отдельного тулчейна, что может быть трудоёмким.
  • Лицензионные ограничения: GPL может быть проблемой для проприетарного ПО, хотя GCC имеет исключение для библиотек (GCC Runtime Library Exception).

Интересные факты

  • GCC — один из старейших активно развивающихся компиляторов (с 1987 года).
  • Исходный код GCC содержит более 15 миллионов строк кода на C и C++.
  • GCC используется для компиляции самого себя (это называется «самокомпиляция»).
  • В 2000-х годах GCC был основным компилятором для проекта GNU Hurd — свободной операционной системы на микроядре.
  • GCC поддерживает расширения GNU C, такие как встроенные функции (__builtin_), атрибуты переменных и функций, а также ассемблерные вставки (asm).
  • В 2023 году GCC 13 добавил поддержку языка Modula-2 в экспериментальном режиме.

Источники

  • Официальная документация GCC (gcc.gnu.org)
  • Stallman R. M. «Using the GNU Compiler Collection» (Free Software Foundation, 2024)
  • «GNU Compiler Collection Internals» (FSF, 2024)
  • «The History of GCC» (GNU Project, 2023)
  • Статья «GCC» в энциклопедии Linux (Linux Foundation)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →