Новости IT, хостинга
Новость от 23.03.2012

Адрес в интернете:
https://news.hostdb.ru/index/show/id/5886

Релиз набора компиляторов 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 (a>10)
... много кода ...
}
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.


Распечатано с HostDB.ru.