GNU Compilers Collection, или просто GCC

GCC это...
  • - свободный пакет компиляторов;
  • - поддержка 14 языков программирования;
  • - поддержка более 40 процессорных архитектур;
  • - единый интерфейс командной строки для всех языков и архитектур;
  • - сердце POSIX-систем.

Кто из программистов не слышал о GCC? Мало кто, наверное. Но вот кто может рассказать, что GCC умеет и насколько хорошо он это умеет? Единицы. Если вы из их числа, вам эта статья вряд ли пригодится. А если нет, почему бы не узнать о возможностях этого программного продукта, ставшего уже легендой?..

Не раз лично приходилось сталкиваться с тем, что многие программисты, особенно из тех, что пишут под Windows, считают, что аббревиатура GCC обозначает GNU C Compiler. Хотя это в определённых случаях так и есть, чаще всё же этой аббревиатурой именуют именно GNU Compilers Collection... Впрочем, лучше сразу уточнить, что именно имеется в виду, если разговор заходит о GCC - почему, мы увидим дальше.

И всё же, что скрывается за тремя первыми словами, стоящими в заголовке статьи? GNU Compilers Collection - это набор компиляторов, распространяемый фондом свободного программного обеспечения (Free Software Foundation, или просто FSF). Соответственно, GCC - это программное обеспечение как раз свободное, то есть, с одной стороны, можно ничего не платить за его использование, а со второй, самому подключиться к его разработке. Распространяются части пакета под лицензиями GNU GPL и GNU LGPL, то есть те части, которые распространяются на условиях второй лицензии, можно использовать даже при разработке коммерческих продуктов.

GCC не является пакетом компиляторов в том смысле этого слова, в каком привыкли к нему пользователи коммерческих программных продуктов. То есть, компиляторы в GCC не являются какими-то совершенно независимыми друг от друга программами. Некоторую аналогию можно провести с Microsoft Visual Studio, части которой с некоторых пор также не являются независимыми средами разработки. Архитектура GCC такова, что для каждого языка, поддерживаемого пакетом, существует front end - синтаксический анализатор, который по входному файлу генерирует абстрактное синтаксическое дерево. Есть также back end, который занимается уже генерированием ассемблерного кода. Оно происходит в два этапа: сначала генерируется код на промежуточном языке, не зависящем от процессорной архитектуры, а после он оптимизируется и преобразуется в код ассемблера соответствующей платформы.

 

Как видите, архитектура GCC такова, что пакет вполне хорошо и сравнительно безболезненно расширим, поскольку для каждого нового языка необходимо написать только front end, который соответствует синтаксису высокоуровневого языка. Вся низкоуровневая часть уже реализована другими разработчиками, так что компиляторы для GCC разрабатывать несколько проще, чем писать их отдельно - если, конечно, компилятор подразумевает непосредственную генерацию ассемблерного кода, а не просто синтаксический разбор.

Запускается компиляция утилитой gcc, вызываемой из командной строки. Эта утилита уже сама определяет, какой из front end'ов нужно вызвать для текста на данном языке программирования, а после компиляции может также сама, в зависимости от параметров командной строки, вызвать сборщик и компоновщик (то есть, значит, ассемблер и линкер).

То есть, как видите, у слова GCC уже нашлось три значения. Первое - это GNU Compilers Collection собственной персоной. Второе - GNU C Compler, часть первого значения GCC, свободный компилятор для языка C. Ну а третье значение - это утилита для запуска файлов с исходными текстами на компиляцию, сборку и компоновку.

Наверное, стоит уже сказать, для каких именно языков программирования доступны компиляторы в рамках GNU Compilers Collection. Вопрос не такой простой, как может показаться. Дело в том, что существуют front end'ы, входящие в стандартную поставку GCC, а есть front end'ы, существующие как бы даже и самостоятельно. В первую группу входят front end'ы для таких языков программирования, как C, C++, Objective-C, Objective-C++, Java, Fortran и Ada. Часть из них больше известны как отдельные программные продукты - тот же GNAT (GNU Ada Translator), являющийся, по сути, front end'ом для GCC. Среди отдельно стоящих front end'ов упоминают оные для Pascal, D, Modula-2,3, CHILL, Mercury и PL/1.

Помимо поддержки множества языков программирования, GCC имеет ещё одну полезную отличительную особенность - он поддерживает массу самых разнообразных платформ, как программных, так и аппаратных. Вначале список поддерживаемого "железа" (вернее, "кремния"), то есть процессорных архитектур: Alpha, ARM, Atmel AVR, Blackfin, H8/300, System/370, System/390, IA-32 x86, IA-32 x86-64, IA-64 Itanium, Motorola 68000, Motorola 88000, MIPS, MSP430 Texas Instruments, PA-RISC, PDP-11, PowerPC, SuperH, HC12, SPARC, VAX, Renesas R8C/M16C/M32C, MorphoSys, A29K, ARC, C4x, CRIS, D30V, DSP16xx, FR-30, FR-V, Intel i960, IP2000, M32R, 68HC11, MCORE, MMIX, MN10200, MN10300, NS32K, ROMP, Stormy16, V850, и Xtensa. Итого более сорока штук. И при этом при всём список не полон - он включает в себя только те платформы, back end'ы для которых официально поддерживаются фондом свободного программного обеспечения. А есть ещё и некоторые другие. Что касается кросс-компиляции, то она тоже поддерживается, так что можно компилировать, скажем, программы для ARM-процессора из-под i386-машины. Что касается программной кросс-платформенности, то излишне говорить о том, что для большинства современных POSIX-систем (Linux, *BSD, MacOS X) GCC - это основной набор компиляторов. Он не просто основной, потому что многие из этих систем и компилируются сами с помощью компилятора C, входящего в состав GNU Compilers Collection.

Что касается поддержки самой популярной в мире настольной ОС, постепенно перекочевывающей и на серверы - это я так витиевато написал слово "Windows", то здесь есть два варианта: Cygwin и MinGW. Cygwin - это практически Wine1 наоборот, то есть такой эмулятор POSIX-систем для Windows. Помимо необходимых библиотек для запуска POSIX -программ, в Cygwin входит и перенесённый на Windows пакет GNU Toolchain, частью которого является GNU Compilers Collection. MinGW (Minimalist GNU for Windows) - это менее радикальный вариант переноса GCC на Windows, не требующий такого количества сторонних для этой операционной системы библиотек.

Теперь стоит сказать кое-что о GNU Toolchain, в состав которого, как я уже упоминал, входит GCC. Зачём о нём рассказывать? Дело в том, что программирование с использованием одних только компиляторов попросту невозможно. И дело не столько во всяких посторонних, как говорят разработчики, приблудах, сколько в банальных инструментах отладки. Согласитесь, без отладки редко обходятся даже сравнительно несложные программы, что уж говорить о серьёзных проектах. Основное средство отладки, используемое при работе с GNU Compilers Collection, - это GNU Debugger (GDB). Этот отладчик, как и почти всё в мире POSIX-систем, консольная программа, то есть собственного графического интерфейса не имеет, что затрудняет работу с ним для тех пользователей, которые привыкли работать с дебаггером через GUI. Так что к отладке с помощью GDB нужно ещё привыкнуть. Но для настоящих гиков это, конечно, не проблема. Помимо, собственно, отладчика, есть также и профилировщик - он, соответственно, называется GNU Profiler. Есть в пакете утилиты для поиска утечек памяти и прочие отладочные инструменты.

Также в GNU Toolchain входят, помимо GNU Compilers Collection и инструментов отладки, такие компоненты, как GNU Binutils. Самые известные из "бинутилит" - это ассемблер as и компоновщик ld, без которых скомпилированная с помощью GCC программа никогда не смогла бы быть запущена операционной системой. Помимо Binutils, в Toolchain'е есть такая полезная вещь, как GNU Make, существенно упрощающая сборку крупных и не очень проектов, ну и другие интересные и несущие пользу программы.

Конечно, следует признать, что GCC - довольно-таки специфический программный продукт, который не слишком востребован белорусской (да и постсоветской) индустрией программирования. В то же время, переоценить его возможности и его уникальность сложно - согласитесь, сложно найти такой же хорошо отлаженный, хорошо документированный инструмент для нескольких языков программирования, доступный для такого количества процессорных архитектур и программных платформ. Ко всему прочему, GCC - это едва ли не сердце всех POSIX-систем, а если не сердце, тогда, пожалуй, душа. А может, даже и то, и другое одновременно. Хотя душа - это, скорее, язык Си, так что GCC всё же сердце.

В то же время, GCC - это инструмент, не слишком дружелюбный к новичкам. Тем, кто управляется с ним мастерски, он с удовольствием покоряется и помогает совершать подлинные чудеса. Поэтому если вам нужно начинать работать с GCC, стоит сначала прочитать русскоязычную литературу по данному инструментарию. Я хотел бы порекомендовать издание "GCC. Настольная книга пользователей, программистов и системных администраторов" за авторством Артура Гриффитса. Эта книга не научит программировать, но она расскажет о работе с великолепной, по своей идее, архитектурой GCC, о расширениях языков программирования, поддерживаемых компиляторами, о совмещении разных языков, интернационализации приложений, о разработке программного обеспечения для встраиваемых систем и даже немного о философии свободного программного обеспечения.

Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by

1 Wine - среда для запуска Windows-программ из-под POSIX-систем. О ней можно прочитать в "КВ" №49'2007

Версия для печатиВерсия для печати

Номер: 

05 за 2008 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!