Релиз набора компиляторов GCC 4.7. Проекту GCC исполнилось 25 лет

Сегодня Фонд свободного ПО, проект GNU и всё сообщество разработчиков свободного ПО празднует двадцатипятилетие с момента основания свободного набора компиляторов GCC. Подарком к столь знаменательной дате стал релиз GCC 4.7, на разработку которого был потрачен примерно год. В новой версии реализованы новые методы оптимизации, прекращена поддержка устаревших систем, расширена поддержка стандартов C++11 и C11, реализована поддержка транзакционных блоков для C/C++, улучшена поддержка языка Google Go, обеспечена поддержка процессоров ARM Cortex-A7, Intel Ivy Bridge, Intel Haswell и AMD Fusion Piledriver.

Основные изменения:

  • Улучшения в оптимизации кода:

    • Улучшение фреймворка для оптимизации во время динамического связывания (LTO — Link Time Optimization) — проведена работа по увеличению масштабируемости, повышению стабильности и сокращению потребления ресурсов. Например, при использовании LTO для Firefox на 64-разрядной системе достаточно 3 Гб ОЗУ, в то время как ранее требовалось 8 Гб.
    • Ускорены операции связывания (linking). Например, связывание компонентов Firefox ускорилось в 10 раз. Сокращён размер объектных файлов и уменьшено дисковое пространство, необходимое для хранения временных данных в процессе связывания;
    • Улучшены эвристические методы inlinе-раскрытия функций, дополнительно учитывающие известные значения параметров функции. Например, для кода
         void foo(int a)
         {
           if (a10)
             ... много кода ...
         }
         void bar (void)
         {
           foo (0);
         }
      

      код функции foo будет развёрнут внутри bar, даже в ситуации включения режима оптимизации по размеру (изначально известно что блок «много кода» при нулевом аргументе никогда не будет вызван).

    • Улучшены внутрипроцедурные оптимизации размещения констант. Например, при компиляции кода
         void foo(bool flag)
         {
           if (flag)
             ... do something ...
           else
             ... do something else ...
         }
         void bar (void)
         {
           foo (false);
           foo (true);
           foo (false);
           foo (true);
           foo (false);
           foo (true);
         }
      

      GCC сгенерирует две копии функции foo: одна для флага true, другая для флага false;

    • Добавлены новые оптимизации строковых операций, основанные на отслеживании размера строк и пытающиеся оптимизировать использование функций strlen, strchr, strcpy, strcat и stpcpy. Например, оптимизатор заменит «strcpy (a, b); strcat (a, c); strcat (a, d);» на «strcpy (stpcpy (stpcpy (a, b), c), d);»;
  • Изменения в поддержке языков C и C++:

    • В компиляторе C++ обеспечена поддержка большей части стандарта ISO C++11, включая поддержку атомарных операций, модели памяти C++11, нестатических инициализаторов членов классов, определяемых пользователем литералов, псевдонимов-деклараций, вызова конструкторов класса из других конструкторов этого же класса, расширенного синтаксиса декларатора классов friend и т.п. В runtime-библиотеке libstdc++ обеспечена экспериментальная поддержка C++11. Управление поддержкой C++11 осуществляется через опции -std=c++11, -std=gnu++11 и -Wc++11-compat;
    • В компиляторе Си добавлена поддержка дополнительных элементов, определённых в стандарте ISO C11, например, Unicode-строки, выравнивание (_Alignas), не возвращающие значения функции, макросы CMPLX. Управление поддержкой C11 осуществляется через опции -std=c11 и -std=gnu11;
    • Экспериментальная поддержка в компиляторе транзакционной памяти и создание сопутствующей библиотеки libitm. Транзакционная память определяется конструкцией __transaction_atomic { … } и позволяет обеспечить атомарное выполнение блока кода, все результаты работы которого будут или полностью видны для других нитей или невидны совсем. Поддержка транзакционной памяти пока обеспечена для платформ x86-32, x86-64 и Alpha, для включения поддержки при сборке следует использовать опцию «-fgnu-tm»;
  • Улучшения в поддержке процессорных архитектур:

    • Поддержка процессоров ARM Cortex-A7 (опция для включения -mcpu=cortex-a7), Texas Instruments C6X, Tilera TILE-Gx и TILEPro, Adapteva Epiphany, National Semiconductor CR16,
    • Поддержка семейств процессоров Intel Ivy Bridge (-march=core-avx-i), Intel Haswell (-march=core-avx2) и AMD 15h/Piledriver (-march=bdver2). Процессоры Intel Haswell поступят в продажу только в следующем году и будут отличаться поддержкой расширенных инструкций AVX2, FMA, BMI, BMI2 и LZCNT;
    • Поддержка расширенных наборов инструкций процессоров IA-32/x86-64:
      Intel AVX2 (-mavx2), Intel BMI2 (-mbmi2), Intel FMA3 (-mfma), Intel rdrnd (-mrdrnd), дополнительных векторных преобразований AVX (-mf16c);
    • Поддержка архитектуры семейства микроконтроллеров XMEGA AVR (ATxmegaxxx);
  • Разное:

    • Предварительная поддержка первой версии стандарта языка программирования Go. Довести до конца поддержку всех элементов спецификации планируется в выпуске GCC 4.7.1;
    • Поддержка различных расширений GNU для отладочного формата DWARF, таких как контроль входящих значений и получение информации о вызовах. Поддержка данных расширений ожидается в GDB 7.4;
    • Большая порция улучшений для языка Фортран;
    • Поддержка в компиляторах C, C++ и Fortran спецификации OpenMP 3.1.
  • Нюансы:

    • Объявлены устаревшими и будут удалены в следующих выпусках порты IRIX 6.5 (mips-sgi-irix6.5), MIPS OpenBSD (mips*-*-openbsd*), Solaris 8 (*-*-solaris2.8) и Tru64 UNIX V5.1 (alpha*-dec-osf5.1*).
    • Переведены в разряд устаревших порты ARM, поддерживающие только устаревший акселератор вычислений с плавающей запятой (FPA) и смешанный формат кодирования чисел с плавающей запятой. Большинство портов для устаревших систем ARM будет сохранено, так как они поддерживают альтернативный формат кодирования чисел с плавающей запятой (VFP). Среди подлежащих скорому удалению портов, для которых есть остающиеся в составе альтернативы: arm*-*-rtems (замена arm*-*-rtemseabi), arm*-*-linux-gnu (замена arm*-*-linux-gnueabi), arm*-*-elf (замена arm*-*-eabi), arm*-*-uclinux* (замена arm*-*-uclinux*eabi). Устаревшие порты для которых нет замены на базе VFP: arm*-*-ecos-elf, arm*-*-freebsd, arm*-wince-pe*;
    • Объявлена устаревшей поддержка сопроцессора Maverick для ARM;
    • Удалена поддержка конфигурации для NetWare x86;
    • Убрана поддержка архитектур, объявленных устаревшими в GCC 4.6.0;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.