Релиз набора компиляторов GCC 16

После года разработки опубликован релиз свободного набора компиляторов GCC 16.1, первый значительный выпуск в новой ветке GCC 16.x. В соответствии со схемой нумерации выпусков, версия 16.0 использовалась в процессе разработки, а незадолго до выхода GCC 16.1 уже ответвилась ветка GCC 17.0, на базе которой будет сформирован следующий значительный релиз GCC 17.1.

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

  • Режим по умолчанию для языка C++ переключён на использование стандарта C++20 (диалект GNU C++20, -std=gnu++20) вместо ранее предлагавшегося C++17. Реализация C++20 в стандартной библиотеке объявлена стабильной.

  • В состав включён экспериментальный фронтэнд ga68 для компиляции программ на языке программирования Алгол 68 (Algol 68).

  • Добавлена возможность вывода диагностической информации в формате HTML. Расширена информация о ходе выполнения программы, включаемая при выводе диагностики в формате SARIF, основанном на JSON (поддержка »-fdiagnostics-format=json» прекращена).

  • Расширены оптимизации на этапе связывания (LTO, Link-Time Optimization). Добавлена опция »-flto-toplevel-asm-heuristics», включающая эвристику для улучшения оптимизации кода с ассемблерными вставками. Техника спекулятивной девиртуализации (-fdevirtualize-speculatively) теперь не ограничена преобразованием виртуальных методов и может применяться при преобразовании в прямые вызовы любых косвенных вызовов функций, например, вызовов через указатели.

  • Реализована поддержка векторизации циклов, для которых на этапе компиляции неизвестно число итераций. Повышена эффективность обработки досрочных выходов из цикла (например, через break).

  • Добавлена экспериментальная поддержка многих возможностей недавно утверждённого стандарта C++26. Например, реализованы:
    • Рефлексия (Reflection,»-freflection»), позволяющая отслеживать и модифицировать элементы программы на стадии компиляции. Добавлены новые операторы »^^» для получения метаинформации о грамматической конструкции и »[: …:]» для выполнения обратного преобразования. Для преобразования и обработки полученной в ходе инспектирования информации предложена библиотека std: meta и доступны такие возможности, как вычисления с константами.

    • Контрактное программирование (Contracts), позволяющее определять формальные спецификации интерфейсов при помощи трёх новых операторов: pre (предусловие), post (постусловие) и contract_assert (проверка утверждения). Оператор «pre» определяет предварительные условия, которые должны быть выполнены перед вызовом (проверка входных данных); «post» — условия, которые должны соблюдаться после выполнения (требования к выходным данным); contract_assert — условия возникновения исключений. Возможность появится в GCC 16.

    • Оператор «template for» для перебора элементов, таких как пакеты параметров, похожие на кортежи объекты и результаты рефлексии (метаобъекты), на этапе компиляции в стиле обычного цикла. При выполнении «template for» тело цикла раскрывается для каждого элемента и каждая итерация обрабатывается в отдельной области видимости, в которой элемент последовательности, по которой итерируется цикл, является константой для каждой итерации и может участвовать в константных выражениях (constexpr). В контексте рефлексии «template for» может применяться для обхода свойств классов или перечислений.

    • Библиотека std: simd для распараллеливания выполнения операций над данными при помощи наборов инструкций SIMD, таких как AVX-512 и NEON, с использованием стандартной системы типов C++.
    • Библиотеки std: inplace_vector, std: optional‹T&›, std: copyable_function, std: function_ref, std: indirect, std: polymorphic и std: owner_equal.

  • Реализованы возможности, связанные со стандартом C++23, такие как явное управление временем жизни объектов и поддержка указания кодировки символов диагностических сообщений.

  • Расширена поддержка стандарта C23, например, реализована возможность использования атрибута «counted_by» для проверки корректности использования указателей.

  • Продолжена реализация стандартов OpenMP 5.0, 5.1, 5.2 и 6.0 (Open Multi-Processing), определяющих API и способы применения методов параллельного программирования на многоядерных и гибридных (CPU+GPU/DSP) системах с общей памятью и блоками векторизации (SIMD). Улучшена реализация спецификаций параллельного программирования OpenACC 3.0, 3.3 и 3.4, определяющих средства для выноса операций (offloading) на GPU и специализированные процессоры, такие как NVIDIA PTX.

  • В бэкенд для архитектуры x86 добавлена поддержка процессоров AMD на основе микроархитектуры Zen6 (-march=znver6), а также процессоров Intel Wildcat Lake (-march=wildcatlake) и Nova Lake (-march=novalake).

  • В бэкенде генерации кода для GPU AMD Radeon (GCN) реализована поддержка ускорителей AMD Instinct MI300 (gfx942).

  • Для архитектур RISC-V, ARM, S/390 и LoongArch реализована поддержка типа »_BitInt (N)» для определения целых чисел с указанным числом битов.



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

© OpenNet