После 13 месяцев разработки увидел свет релиз свободного набора компиляторов GCC 4.9. Новый выпуск примечателен реализацией поддержки OpenMP 4.0 и Cilk Plus, улучшением поддержки стандартов C++11 и C++14, режимом подсветки предупреждений и ошибок при выводе на экран, включением в состав детектора неопределенного поведения программы.

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

  • Реализована поддержка спецификации OpenMP 4.0 (Open Multi-Processing), определяющей API и способы применения методов параллельного программирования для языков Си, Си++ и Фортран (в GCC OpenMP 4.0 пока доступен только для Си и Си++ ). В OpenMP 4.0 обеспечена поддержка ускорения за счет привлечения мощностей GPU, представлены значительные улучшения в модели выполнения задач, добавлены механизмы обработки ошибок, добавлена поддержка определенных пользователем редукций, обеспечена векторизация циклов с использованием инструкции SIMD, добавлен ряд расширений для поддержки параллельного выполнения на уровне задач;
  • Частично реализована поддержка набора расширений Cilk Plus, предлагающего новую эффективную методику параллельного программирования для языков Си и Си++, позволяющую существенно упростить разработку программ, части которых выполняются параллельно с задействованием разных процессорных ядер и векторных сопроцессоров (Vector Units). Для управления генерацией кода с улучшенной векторизацией предусмотрена pragma simd. Поддерживается два метода увеличения производительности - параллелизм данных и параллельное выполнение подпрограмм. В первом случае, обеспечиваются механизмы прозрачного распараллеливания типовых операций над массивами данных и автоматическое задействование SIMD-инструкций. Для организации параллелизма на уровне подпрограмм в обиход вводится три ключевых слова: _Cilk_spawn - запуск функции в параллельном режиме, _Cilk_sync - ожидание завершения параллельно выполняемой функции, и _Cilk_for - организация работы цикла в параллельном режиме. "_Cilk_for" в GCC пока не поддерживается.
  • Для языков C и C++ добавлен компонент UBSAN (Undefined Behavior Sanitizer) с реализацией детектора неопределенного поведения, выявляющего во время выполнения программы ситуации, когда поведение программы становится неопределенным (зависит от реализации компилятора) из-за ошибки программиста. Для включения UBSAN следует использовать опцию "-fsanitize=undefined";
  • Улучшена работа оптимизаций во время динамического связывания (LTO, Link Time Optimization) и межпроцедурных оптимизаций, в которых устранена серия негативно сказывающихся на масштабируемости узких мест. В реализации межпроцедурных оптимизаций добавлен новый проход для выполнения спекулятивной девиртуализации (-fdevirtualize-speculatively), а также добавлен новый модуль с анализов наследования типов. В LTO переписан код слияния типов, новая реализация значительно быстрее и потребляет меньше памяти. Реализована техника раннего удаления виртуальных методов и загрузки функций по мере необходимости, что позволило снизить потребление памяти во время связывания. В итоге потребление памяти при сборке Firefox в отладочном режиме удалось сократить с 15 до 3.5 Гб, а время связывания уменьшить с 1700 до 350 секунд;
  • Улучшена техника оптимизации на основе обратной связи (Feedback directed). Добавлен новый проход для изменения порядка функций (-freorder-functions), позволяющий значительно сократить время запуска больших приложений;
  • Распределитель локальных регистров (Local Register Allocator), ранее доступный только для ia32 и x86-64, теперь адаптирован и включен по умолчанию для целевых архитектур Aarch64, ARM, S/390 и ARC, а также реализован в качестве опции для платформ PowerPC и RX;
  • Существенно расширена поддержка архитектуры ARM. Внесены оптимизации для процессоров Cortex-A15, Cortex-M4, Cortex-A52, Cortex-A53 и Cortex-A57. Добавлены оптимизации для big.LITTLE. Обеспечена поддержка архитектуры ARMv8-A. Добавлены опции для поддержи процессоров Cortex-A12 (-mcpu=cortex-a12), Cortex-R7 (-mcpu=cortex-r7), Cortex-A53 - Cortex-A57 (-mcpu=cortex-a5x);
  • Поддержка новой little-endian платформы powerpc64le-linux для которой предлагается новый PowerPC ELFV2 ABI. Поддержка Power ISA 2.07, включая транзакционную память;
  • В компоненте Address Sanitizer обеспечена поддержка архитектуры ARM в дополнение к ранее поддерживаемым архитектурам x86 и x86_64. Address Sanitizer позволяет выявлять ошибки работы с памятью и факты некорректного обращения к памяти, такие как обращение к областям памяти, после их освобождения ("use-after-free"), разрушение кучи, повреждение стека и переполнение буферов;
  • Прекращена поддержка устаревшего runtime-детектора утечек памяти mudflap;
  • Добавлена поддержка некоторых новшеств, развиваемых в рамках будущего стандарта C++14, например, реализованы массивы переменного размера, форма инициализации "[x = 42]{ ... };", разделители цифр (int j = 1'048'576;). В стандартную библиотеку С++ добавлена поддержка компонента "regex". Внесена серия улучшений, связанная с поддержкой стандарта C++11;
  • По реализации возможностей уровень поддержки стандарта C11 доведён до C99. В новой версии добавлена поддержка таких компонентов С11, как _Atomic, _Generic и _Thread_local. Добавлено новое Си-расширение __auto_type, предоставляющее для GNU C подмножество функциональности "auto" из C++11;
  • Улучшена поддержка языка ADA. GNAT переведён на использование по умолчанию стандарта ADA 2012, вместо ADA 2005;
  • В компиляторе для языка Fortran улучшена поддержка спецификации Fortran 2008 и добавлена поддержка Fortran 2003 finalization;
  • Обеспечена поддержка развиваемого компанией Google языка программирования Go 1.2.1;
  • Реализовано поддержка микроархитектур Intel Silvermont (-march=silvermont) и Broadwell (-march=broadwell), процессоров 15 семейства процессоров AMD (Excavator, -march=bdver4 и -mtune=bdver4), процессоров IBM Power8 и RX100, RX200 и RX600;
  • Для процессоров Intel добавлена поддержка инструкций AVX-512, которая может использоваться для целевых архитектур x86-64 и ia32;
  • Возможность подсветки текста выводимых ошибок и предупреждений ("-fdiagnostics-color=auto");
  • Объявлена устаревшей поддержка платформы Solaris 9 (*-*-solaris2.9), код для которой будет удалён в выпуске GCC 4.10. Компания Oracle прекратила стандартную поддержку Solaris 9 в 2011 году, расширенная платная поддержка завершится в октябре 2014 года.


Источник: http://www.opennet.ru/opennews/art.shtml?num=39621