Après un an de développement publiée publication d'un ensemble libre de compilateurs GCC 16.1, la première version significative dans la nouvelle branche GCC 16.x. Conformément à le schéma de numérotation des versions, la version 16.0 a été utilisée dans le processus de développement, et peu avant la sortie de GCC 16.1, une branche a déjà été dérivée GCC 17.0, sur laquelle sera formé la prochaine version significative GCC 17.1.
Principales modifications:
- Le mode par défaut pour le langage C++ a été changé pour utiliser la norme C++20 (-std=gnu++20, dialecte GNU C++20) au lieu de C++17. L'implémentation de C++20 dans la bibliothèque standard a été déclarée stable.
- Un frontend expérimental a été inclus ga68 pour compiler des programmes dans le langage de programmation Algol 68.
- La possibilité d'afficher des informations de diagnostic au format HTML a été ajoutée. Les informations sur l'exécution du programme, incluses lors de l'affichage des diagnostics au format SARIF, basé sur JSON (le support de « -fdiagnostics-format=json » a été abandonné).
- Les optimisations au stade de l'édition de liens (LTO, Link-Time Optimization) ont été élargies. Une option « -flto-toplevel-asm-heuristics » a été ajoutée, intégrant une heuristique pour améliorer l'optimisation du code avec des insertions d'assembleur. La technique de dévirtualisation spéculative (-fdevirtualize-speculatively) n'est plus limitée à la transformation des méthodes virtuelles et peut être appliquée à la transformation en appels directs de tous les appels indirects de fonctions, par exemple, les appels via des pointeurs.
- La prise en charge de la vectorisation des boucles dont le nombre d'itérations est inconnu au moment de la compilation a été mise en œuvre. L'efficacité du traitement des sorties anticipées de boucle (par exemple, via break) a été augmentée.
- Support expérimental ajouté pour de nombreuses possibilités de la norme récemment approuvée C++26. Par exemple, les éléments suivants ont été implémentés :
- Réflexion (Reflection, « -freflection »), permettant de suivre et de modifier des éléments du programme à l'étape de la compilation. De nouveaux opérateurs «^^ (open-std.org)» pour obtenir des méta-informations sur la construction grammaticale et «[:…:]» pour effectuer la transformation inverse. Pour la transformation et le traitement des informations obtenues lors de l'inspection, une bibliothèque std::meta a été proposée, et des possibilités telles que des calculs avec des constantes sont disponibles.
- Programmation par contrat (Contrats), permettant de définir des spécifications formelles d'interfaces à l'aide de trois nouveaux opérateurs : pre (précondition), post (postcondition) et contract_assert (vérification de l'affirmation). L'opérateur « pre » définit les conditions préalables qui doivent être remplies avant l'appel (vérification des données d'entrée) ; « post » — les conditions qui doivent être respectées après l'exécution (exigences relatives aux données de sortie) ; contract_assert — conditions de déclenchement d'exceptions. Cette fonctionnalité sera disponible dans GCC 16.
- L'opérateur «template for» pour itérer sur des éléments tels que des paquets de paramètres, des objets similaires à des tuples et des résultats de réflexion (métaobjets), au moment de la compilation dans le style d'une boucle classique. Lors de l'exécution de « template for », le corps de la boucle est développé pour chaque élément et chaque itération est traitée dans une portée distincte, dans laquelle l'élément de la séquence sur laquelle la boucle s'itère est une constante pour chaque itération et peut participer à des expressions constantes (constexpr). Dans le contexte de la réflexion, « template for » peut être utilisé pour parcourir les propriétés des classes ou des énumérations.
- La bibliothèque std::simd pour le parallélisme des opérations sur les données à l'aide d'instructions SIMD, telles que AVX-512 et NEON, en utilisant le système de types standard C++.
- Bibliothèques std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic et std::owner_equal.
- Fonctionnalités liées à la norme C++23, telles que la gestion explicite du cycle de vie des objets et la prise en charge la spécification de l'encodage des caractères des messages de diagnostic.
- Extension du support de la norme C23 (opennet.ru), par exemple, la possibilité d'utiliser l'attribut « counted_by » pour vérifier la validité de l'utilisation des pointeurs.
- Poursuivie mise en œuvre des normes OpenMP 5.0, 5.1, 5.2 et 6.0 (Open Multi-Processing), définissant l'API et les méthodes d'application des techniques de programmation parallèle sur des systèmes multi-cœurs et hybrides (CPU+GPU/DSP) avec mémoire partagée et blocs de vectorisation (SIMD). Améliorée mise en œuvre des spécifications de programmation parallèle OpenACC 3.0, 3.3 et 3.4, définissant les outils pour le déchargement (offloading) sur des GPU et des processeurs spécialisés, tels que NVIDIA PTX.
- Le backend pour l'architecture x86 a ajouté le support des processeurs AMD basés sur l'architecture Zen6 (-march=znver6), ainsi que des processeurs Intel Wildcat Lake (-march=wildcatlake) et Nova Lake (-march=novalake).
- Dans le backend de génération de code pour GPU AMD Radeon (GCN), la prise en charge des accélérateurs AMD Instinct MI300 (gfx942) a été mise en œuvre.
- Pour les architectures RISC-V, ARM, S/390 et LoongArch, le support du type « _BitInt (N) » a été ajouté pour définir des entiers avec un nombre de bits spécifié.
Source : linux.org.ru
