Release du compilateur GCC 15

Après un an de développement, la version 15.1 du compilateur libre GCC a été publiée, marquant la première sortie significative de la nouvelle branche GCC 15.x. Conformément au schéma de numérotation des versions, la version 15.0 a été utilisée pendant le développement, et peu avant la sortie de GCC 15.1, la branche GCC 16.0 a déjà été lancée, qui servira de base pour le prochain lancement majeur, GCC 16.1.

Principales modifications :

  • Lors de la compilation de programmes en langage C, la norme C23 (aperçu des changements) avec les extensions GNU (« -std=gnu23 ») est activée par défaut. Auparavant, la norme C17 était utilisée par défaut — « -std=gnu17 ». Ce changement pourrait potentiellement causer des problèmes lors de la compilation de projets existants en raison de l'inclusion de la constante nullptr, du type _BitInt(n) et des mots-clés bool, true et false, qui peuvent entrer en conflit avec des identifiants portant le même nom définis dans les applications.
  • Les fonctionnalités de la norme C23 ont été mises en œuvre :
    • La directive « #embed », destinée à intégrer des ressources binaires dans le code.
    • L'attribut « unsequenced », signalant que le résultat ne dépend pas de l'ordre d'exécution.
    • L'attribut « reproducible », indiquant que la fonction renvoie toujours le même résultat avec les mêmes données d'entrée, c'est-à-dire qu'elle ne dépend d'aucun autre facteur.
  • Les éléments de la future norme C2Y (-std=c2y et -std=gnu2y) ont été réalisés :
    • La possibilité de déclarer des variables dans l'instruction « if », par exemple, « if (int x = get ()) {…} ».
    • La prise en charge de l'attribution de noms aux boucles pour pouvoir y faire référence dans le code. outer: for (int i = 0; i < IK; ++i) { switch (i) { case 1: break; // jumps to CONT1 case 2: break outer; // jumps to CONT2 } // CONT1 } // CONT2
    • La prise en charge de l'indication de plages de valeurs entières dans les expressions « case », par exemple, « case 1 … 10 : ».
    • Les suffixes « i » et « j » pour indiquer la partie imaginaire dans les nombres complexes.
    • La possibilité d'utiliser les opérateurs « ++ » et « — » avec des nombres complexes.
    • La construction « _Generic(type, expr1, expr2, …) » pour sélectionner une expression en fonction du type de l'opérande.
    • La prise en charge d'accéder à des tableaux d'octets comme à d'autres types d'objets, tels que des structures et des unions.
    • La prise en charge de l'application de l'opérateur « alignof » aux tableaux incomplets (déclarés sans spécification de taille, par exemple, « int a[] »).
    • Une nouvelle syntaxe a été ajoutée pour les séquences d'échappement de caractères en octal, hexadécimal et universel. Au lieu de «\u», «\x» et «\nnn», les séquences «\u{}», «\o{}» et «\x{}» sont proposées, permettant de spécifier un nombre arbitraire de chiffres.
    • Fonctions intégrées «__builtin_stdc_rotate_left» et «__builtin_stdc_rotate_right».
    • Les opérations de longueur zéro sur les pointeurs NULL sont autorisées (par exemple, «sizeof(*p)»).
  • Des fonctionnalités sont intégrées pour le langage C++ dans l'interface utilisateur, développées pour la future norme C++26 :
    • Opérateur variadique «friend» («friend Ts…»).
    • Possibilité d'utiliser le mot-clé «constexpr» avec une variante de l'opérateur «new» (placement new) pour allouer un objet dans une mémoire préallouée lors de la compilation.
    • Affichage d'une erreur lors de la suppression d'un pointeur vers un type incomplet.
    • La syntaxe de définition des paramètres variadiques avec des points de suspension sans virgule préalable (par exemple, en déclarant «void e(int…)» au lieu de «void e(int, …)») est déclarée obsolète.
    • Indexation des paquets de paramètres dans les templates.
    • Attributs pour les liaisons structurées;
    • Syntaxe ‘= delete(«raison»)’;
    • Inclusion de «@», «$» et «`» dans l'ensemble de caractères de base.
    • L'utilisation de macros pour déclarer des modules est interdite.
    • Possibilité d'appliquer des liaisons structurées comme condition dans les opérateurs if et switch.
    • La prise en charge de la comparaison directe des tableaux a été abandonnée (par exemple, «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
    • Mécanisme «#embed» pour l'intégration de ressources binaires.
    • La classe template is_trivial a été déclarée obsolète.
  • Fonctionnalités C++23 ajoutées :
    • Interdiction de certaines applications de la directive «export» et autorisation d'utiliser «export {}».
    • Prise en charge de l'allongement de la durée de vie des objets temporaires dans les boucles «for» qui parcourent des plages.
  • Une prise en charge expérimentale des modules std et std.compat a été mise en œuvre dans la bibliothèque libstdc++.
  • L'utilisation de l'initialiseur «{0}» pour des unions en code C et C++ ne garantit plus le nettoyage de tout le contenu, mais conduit à l'annulation du premier élément de l'union. Pour nettoyer toute l'union, l'expression «{}» définie dans la spécification C23 doit être utilisée, ou l'option «-fzero-init-padding-bits=unions» doit être spécifiée pour restaurer l'ancien comportement.
  • Le support de l'attribut «musttail» ([[gnu::musttail]] et [[clang::musttail]]) a été mis en œuvre pour garantir les appels de queue. L'attribut s'applique aux expressions return où un appel récursif à la fonction actuelle est effectué, garantissant que cet appel utilisera la récursion terminale, ce qui ne nécessite pas d'allocation mémoire supplémentaire sur la pile (évitant ainsi le risque d'épuisement de la mémoire en cas de très nombreux appels).
  • La prise en charge de l'attribut flag_enum ([[gnu::flag_enum]] et [[clang::flag_enum]]) a été mise en œuvre, utilisé pour indiquer que le contenu est utilisé dans des opérations sur des bits (exclut l'affichage d'avertissements en mode « -Wswitch »).
  • Ajout du support de l'attribut « counted_by », qui permet de spécifier un champ dans une structure avec un tableau flexible déterminant le nombre d'éléments. Cet attribut peut être utilisé pour améliorer l'efficacité des vérifications de dépassement de tampon.
  • Pour les fonctions, l'attribut « nonnull_if_nonzero » a été ajouté, précisant que certains paramètres de fonction avec des pointeurs peuvent accepter la valeur NULL uniquement si un autre paramètre est égal à zéro.
  • L'utilisation d'instructions d'assemblage étendues « asm (…) » est désormais autorisée en dehors des fonctions. Dans les insertions d'assemblage, il est permis de réécrire la mémoire dans la zone rouge de la pile (zone au sommet de la pile).
  • La compilation du code C++ a été accélérée grâce à un hachage amélioré des modèles.
  • De nouvelles optimisations ont été ajoutées. Le support de la vectorisation des boucles contenant du code pour une sortie prématurée (par exemple, via un appel à break ou return) a été mis en œuvre, même si ces boucles manipulent des tableaux ou des tampons alloués dynamiquement dont la taille n'est pas connue lors de la compilation. Lorsque l'option « -O2 » est spécifiée, la vectorisation de certaines boucles facilement vectorisables pour lesquelles aucune information sur le nombre d'itérations (tripcount) n'est disponible est activée.
  • Un mode d'optimisation incrémentale pendant la liaison (LTO, Link-Time Optimization) a été ajouté, réduisant significativement le temps de recompilation lors de l'utilisation de LTO dans les situations où des modifications mineures du code (modification d'une fonction) ont été apportées. Pour activer ce mode incrémental, l'option « -flto-incremental » est proposée.
  • La compilation de fichiers d'entrée très volumineux a été améliorée. Le suivi des numéros de colonnes dépassant 4096 a été mis en œuvre. La précision de localisation des erreurs et avertissements dans des fichiers très volumineux a été accrue.
  • La clarté des rapports lors du diagnostic des problèmes a été améliorée. Par exemple, l'indication du lieu d'apparition d'un problème par le symbole « ⚠️ » a été assurée, la mise en page de la sortie a été modifiée en cas d'erreurs dans les modèles C++, des conseils ont été ajoutés pour faciliter la transition vers la norme C23, et le schéma de couleurs a été retravaillé. La possibilité d'afficher le diagnostic au format Sarif (-fdiagnostics-format=sarif-file) a été ajoutée.
  • La bibliothèque libgdiagnostics a été mise en œuvre, permettant d'intégrer dans vos projets les fonctionnalités de GCC liées à la gestion des messages de diagnostic (par exemple, il est possible d'utiliser des outils de citation, de mise en surbrillance et de suggestions de correction).
  • Des avertissements « -Wtrailing-whitespace » et « -Wleading-whitespace » ont été ajoutés pour détecter les espaces résiduels à la fin des lignes et les espaces superflus au début des lignes.
  • Un avertissement « -Wheader-guard » a été ajouté pour informer sur les problèmes dans les macros de protection des fichiers d'en-tête, empêchant la réinclusion du fichier d'en-tête.
  • Le frontend pour le langage D a été mis à jour vers la version 2.111.0.
  • Le frontend pour le langage Fortran a ajouté la prise en charge des entiers non signés.
  • Un compilateur pour le langage COBOL — gcobol, prenant en charge les plateformes x86-64 et AArch64, a été inclus et n'est pas conçu pour une utilisation sur des systèmes 32 bits. Le compilateur met en œuvre la spécification ISO/IEC 1989:2023 et passe la plupart des tests NIST CCVS/85.
  • La 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 de la programmation parallèle sur des systèmes multicœurs et hybrides (CPU+GPU/DSP) avec mémoire partagée et blocs de vectorisation (SIMD), se poursuit. La prise en charge des métadirectives et des constructions tile, unroll, interop et dispatch a été ajoutée. Pour certaines GPU AMD et NVIDIA, une prise en charge de la mémoire partagée unifiée a été ajoutée (activée par la directive « requires » avec unified_shared_memory). La prise en charge de l'expression « self_maps » a été ajoutée.
  • Le backend pour l'architecture AArch64 a ajouté le support de la plateforme MinGW (aarch64-w64-mingw32). Plus de 20 extensions ARM8 ont été mises en œuvre et le soutien à l'extension ACLE (Arm C Language Extensions) a été amélioré. De nombreuses améliorations ont été apportées au générateur de code. Le support pour les CPU a été ajouté :
    • Apple A12 (apple-a12)
    • Apple M1 (apple-m1)
    • Apple M2 (apple-m2)
    • Apple M3 (apple-m3)
    • Arm Cortex-A520AE (cortex-a520ae)
    • Arm Cortex-A720AE (cortex-a720ae)
    • Arm Cortex-A725 (cortex-a725)
    • Arm Cortex-R82AE (cortex-r82ae)
    • Arm Cortex-X925 (cortex-x925)
    • Arm Neoverse N3 (neoverse-n3)
    • Arm Neoverse V3 (neoverse-v3)
    • Arm Neoverse V3AE (neoverse-v3ae)
    • FUJITSU-MONAKA (fujitsu-monaka)
    • NVIDIA Grace (grace)
    • NVIDIA Olympus (olympus)
    • Qualcomm Oryon-1 (oryon-1)
  • Dans le backend de génération de code pour GPU AMD Radeon (GCN), la prise en charge de la bibliothèque libstdc++ a été mise en œuvre et un support expérimental pour la génération de code pour les séries de dispositifs gfx9-generic, gfx10-3-generic et gfx11-generic a été ajouté.
  • Le backend pour l'architecture x86 a ajouté le support des extensions de l'ensemble d'instructions Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Le support des CPU Intel Diamond Rapids et Xeon Phi a été ajouté.
  • Les capacités des backends pour les plateformes LoongArch et AVR ont été étendues.
  • Le support de l'architecture cible nios2, utilisée dans les processeurs Nios II, a été supprimé. Le support de l'ABI ILP32 (-mabi=ilp32) dans le port AArch64 a été déclaré obsolète et sera supprimé dans la prochaine version majeure.

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster