IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Chroniqueur Actualités
    Avatar de Anthony
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Novembre 2022
    Messages
    1 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Rédacteur technique

    Informations forums :
    Inscription : Novembre 2022
    Messages : 1 230
    Points : 20 328
    Points
    20 328
    Par défaut GCC 13 se dote de nouvelles fonctionnalités dans la partie frontale du langage C pour le rapprocher du C++
    La première version officielle de GCC 13 est sur le point d'être publiée, mais n'inclura pas gccrs, le frontend pour le langage Rust, le compilateur gccrs ne serait pas prêt pour du "vrai" code Rust

    La sortie de la première version officielle de GCC 13 est imminente, cependant cette mouture n'inclura pas gccrs, le compilateur visant à fournir un frontend pour le langage Rust dans GCC. Selon les développeurs, gccrs n'est pas encore complet et des fonctionnalités essentielles de Rust ne sont pas encore implémentées. Ils indiquent par ailleurs que Rust est un langage difficile à mettre en œuvre et expliquent les défis auxquels ils font face lors de l'implémentation du langage.

    Nom : logo gcc.png
Affichages : 3781
Taille : 35,9 Ko

    La première version officielle de GCC 13 est sur le point de sortir, et vous serez peut-être surpris d'apprendre que gccrs ne sera pas inclus dans cette version. Le but de ce billet est d'expliquer un peu plus en détail pourquoi cela a été fait et comment vous pouvez encore essayer notre compilateur si vous le souhaitez.

    En 2022, nous avons commencé à étudier le processus de fusion de notre code en amont avec GCC. Rapidement, notre frontend a été accepté pour la fusion, ce qui a été un grand moment pour nous - cela a démontré la foi des gens dans la communauté gccrs et dans l'objectif du projet d'avoir une implémentation alternative de la chaîne d'outils GCC pour le langage de programmation Rust. Étant donné que le compilateur n'est pas encore prêt, nous avons décidé de suivre ce processus avec certaines limitations.

    Nous espérions qu'en montrant clairement que le compilateur n'était pas encore prêt pour du vrai code Rust, nous pourrions obtenir des retours précieux de la part des premiers utilisateurs ainsi qu'un plus grand engagement de la part de deux communautés différentes - celle de Rust et celle de GCC. Nous avons continué à travailler aussi dur que possible jusqu'à la date limite de publication pour faire fonctionner autant de choses que possible, mais maintenant que la version 13.1 de GCC est arrivée, nous ne sommes toujours pas au point en termes de complétude.

    Cela signifie qu'en utilisant gccrs, vous n'êtes toujours pas en mesure de faire les "choses faciles de Rust" - des exemples comme "Hello World !", ou l'utilisation de la bibliothèque standard en général, ne fonctionneront pas. De même, des concepts plus complexes qui sont essentiels au langage de programmation Rust, comme la vérification des emprunts, ne sont pas encore implémentés, et gccrs ne sera pas considéré comme complet sans ces fonctionnalités. Nous pensons que cela causerait beaucoup de confusion pour les utilisateurs peu méfiants, qui pourraient voir gccrs comme faisant partie d'une version officielle de GCC et s'attendre à un compilateur fonctionnel.

    Pourquoi ne sommes-nous pas "prêts" ?

    Dire que Rust n'est pas un langage facile à implémenter serait un euphémisme. Et même si nous pensons que le fait que Rust soit si strict est l'une des grandes forces du langage, car il limite le potentiel d'erreurs de l'utilisateur, annule la possibilité d'un comportement non défini dans un code idiomatique, et protège l'utilisateur et l'environnement contre de nombreuses vulnérabilités trouvées dans les programmes C et C++, cela a un coût - Rust est conçu de telle manière que rien ne fonctionnera, à moins que tout ne fonctionne.

    Mais qu'est-ce que cela signifie ?

    La bibliothèque standard de Rust

    La bibliothèque standard peut être vue comme un ensemble de crates dépendant les uns des autres, dont les deux composants principaux sont core et alloc. Le crate alloc fournit des abstractions autour des allocations dynamiques de mémoire en Rust, comme le type String ou Vec. Le crate core, quant à lui, fournit des fonctionnalités qui sont beaucoup plus intrinsèques au langage et qui ne nécessitent pas de mémoire dynamique - cela va de types cruciaux comme Option et Result, à des fonctionnalités moins connues comme la création de slices, ou l'implémentation d'opérations numériques pour les types de nombres primitifs en utilisant les traits Add, Sub, Mul et Div.

    Le crate core déclare également des abstractions qui sont implémentées directement dans le compilateur Rust : les intrinsèques du compilateur, les macros intégrées, les éléments lang... et il y a une abondance de ces abstractions !

    En l'état actuel, gccrs ne peut pas encore compiler la version du crate core que nous visons : par exemple, nous ne sommes toujours pas en mesure de compiler les boucles for, qui dépendent d'une certaine désucrage pour le pattern matching, ainsi que les itérateurs, un élément lang très complexe et un trait, tous définis dans libcore.

    De plus, bien que nous voulions cibler la version Rust 1.49 de la bibliothèque de base, nous devons également implémenter des fonctionnalités qui n'ont été stabilisées que dans les versions ultérieures de Rust, ou qui peuvent encore être instables à ce jour, car la bibliothèque standard de Rust est un ensemble de crates qui utilisent de nouvelles fonctionnalités et les testent.

    Ce qui est astucieux, c'est qu'en compilant le crate core sans aucune modification, nous évitons d'introduire des incohérences dans l'implémentation, puisqu'il implémente le comportement du langage de core. Pour compliquer les choses, Rust 1.49 n'a pas vraiment de suite de tests #![no_core], donc trouver le bon comportement nécessite beaucoup d'investigations de notre part.

    Un autre extrait de code que l'on peut s'attendre à voir géré par gccrs est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fn main() {
        println!("Hello, world!");
    }

    mais ce n'est pas le cas pour l'instant ! Si vous connaissez un peu Rust, vous savez que println! est une invocation de macro. Les macros sont compliquées, mais aussi extrêmement puissantes. Nous avons travaillé sur elles pendant un certain temps maintenant, et certaines des fonctionnalités les plus complexes ne sont toujours pas correctement implémentées.

    Si vous avez déjà utilisé println, vous savez qu'il permet d'obtenir des chaînes de format très puissantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    println!("Hello {name}");
    println!("Debugging {something:?} and {:#?}", this_as_well);
    println!("printing numbers: {:04}, {:#x}", leading_zeros, hexa_value)
    println!("printing dashes ! {:-<5}", "some string");

    La gestion de ces chaînes de format est effectuée par le compilateur, à l'aide des macros intégrées format_args! et format_args_nl!. Ces macros sont extrêmement complexes, tout comme les spécificateurs de format qu'elles offrent aux utilisateurs. Une fois que ces spécificateurs sont correctement analysés, nous devons penser à créer des appels aux fonctions fmt correspondantes de Debug, Display ou d'autres traits de formatage. La sortie résultant de ces appels doit alors être intercalée dans la chaîne de format d'origine, en supprimant les crochets ou d'autres parties des spécificateurs.

    Bien que tout cela semble assez facile à comprendre et à utiliser, le compilateur Rust doit faire beaucoup de travail pour gérer ces invocations de macros !

    Par ailleurs, nous avons récemment commencé à travailler sur les macros procédurales. Certaines macros procédurales intégrées sont nécessaires pour construire le crate core, comme les macros derive intégrées (#[derive(Clone, Copy)]) qui sont assez familières aux programmeurs Rust. Vous verrez aussi souvent du code Rust utiliser #[derive(Debug)], ce qui est lié à notre travail à venir sur les chaînes de format mentionnées ci-dessus.

    Où en sommes-nous ?

    Bien que tout cela semble représenter beaucoup de travail, nous sommes confiants dans nos progrès et nous espérons nous rapprocher de plus en plus du fonctionnement du crate core dans les prochains mois. Il reste également beaucoup de travail important pour produire un compilateur Rust valide, c'est pourquoi nous allons passer les prochains mois à nous concentrer sur le crate core ainsi que sur l'implémentation d'un borrow-checker, et sur le développement de l'outillage nécessaire pour nous permettre d'essayer de passer la suite de tests Rust 1.49.

    Notre objectif est de distribuer la version Rust 1.49 de la bibliothèque standard avec notre compilateur dans la prochaine version majeure de GCC, GCC 14, et nous espérons rétroporter suffisamment de changements sur la branche GCC 13 pour que le crate core fonctionne à temps pour la version GCC 13.2. Cela permettra aux utilisateurs de commencer facilement à expérimenter avec le compilateur pour les programmes Rust #![no_std] et, espérons-le, quelques cibles embarquées.

    En attendant, si vous souhaitez toujours essayer le compilateur et nous aider à résoudre les problèmes, il y a plusieurs possibilités :

    • Vous pouvez compiler GCC à partir des sources, soit à partir de notre dépôt GitHub, soit à partir du dépôt GCC en amont.
    • Utiliser Compiler Explorer
    • Utiliser notre image Docker. Ce conteneur est livré avec une version de gccrs ainsi que cargo-gccrs.
    • Enfin, nous prévoyons également de produire des versions binaires régulières très prochainement - cela vous permettra d'installer une version fonctionnelle, mais instable, de gccrs, et de l'utiliser avec cargo-gccrs ou seul. Ces binaires seront disponibles sur le site web d'Embecosm sous peu, à peu près au moment de la sortie de GCC 13.1.

    Aller de l'avant

    Bien que nous n'ayons pas atteint la ligne d'arrivée pour la première version de GCC 13, nous sommes satisfaits des progrès réalisés jusqu'à présent et nous nous réjouissons de l'avenir.

    Nous avons déjà achevé la fusion initiale avec GCC upstream, ce qui a pris beaucoup de temps et n'aura pas besoin d'être répété. Cela nous permettra de nous concentrer encore plus sur le développement du compilateur pour GCC 14, et nous permettra de pousser facilement des correctifs en amont. Ce temps sera utilisé pour produire un compilateur de meilleure qualité, et pour espérer se rapprocher d'un véritable compilateur Rust. Cela a également augmenté la visibilité du projet, avec de nombreux articles écrits sur nos différentes avancées.

    Nous continuerons à travailler dur pour produire un compilateur Rust de qualité pour GCC, et nous nous en tiendrons à nos principes existants : nous voulons respecter le langage de programmation Rust, et ne pas lui nuire de quelque manière que ce soit. Le but de gccrs n'est pas de contourner les différents processus entourant le langage Rust, ni d'offrir une échappatoire à ce qui devrait être du code Rust invalide. Nous utilisons rustc comme un guide, et continuerons à traiter chaque différence entre les deux compilateurs comme un bug.

    À très bientôt !
    Source : Rust GCC

    Et vous ?

    Quel est votre avis sur le sujet ?

    Que pensez-vous du projet d'implémentation du langage Rust dans GCC ? Selon vous, quelles en sont les motivations ?

    Pensez-vous que ce projet arrivera à termes compte tenu de la complexité du langage Rust ?

    Voir aussi

    GCC se dote d'un nouveau frontend pour le langage de programmation Rust, une version préliminaire de ce compilateur appelé "gccrs" devrait être incluse dans GCC 13

    GCC 13 prend désormais en charge Modula-2, le descendant de Pascal, il supporte également le langage Rust

    GCC 12 apportera de nouvelles fonctionnalités C++, des améliorations et les corrections de bogues, annoncée pour avril 2022

  2. #2
    Communiqués de presse

    Femme Profil pro
    Rédacteur technique
    Inscrit en
    Mai 2018
    Messages
    2 135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2018
    Messages : 2 135
    Points : 158 406
    Points
    158 406
    Par défaut La version 13.1 GCC prend en charge le langage Modula-2 et offre davantage de fonctionnalités pour C23/C++23
    La version 13.1 de GCC prend en charge le langage Modula-2 et offre davantage de fonctionnalités pour C23/C++23

    GCC 13.1 est la première version stable de GCC 13 dans le cadre de la mise à jour annuelle de la GNU Compiler Collection

    GCC 13.1 est une grosse mise à jour qui ajoute un langage Modula-2 pour ceux qui sont intéressés par la programmation vintage, il y a le nouveau code GCC Rust "gccrs" mais il est désactivé pour la v13.1 parce qu'il est encore en train de cuire, l'analyseur statique de GCC continue d'être amélioré, il y a beaucoup plus de fonctionnalités C23 et C++23, et il y a le support de nombreux nouveaux processeurs x86_64 / RISC-V / AArch64.

    GCC 13. 1 fournit également le support initial d'AMD Zen 4 (znver4) pour les processeurs des séries Ryzen 7000 et EPYC 9004, des améliorations du déchargement OpenMP, le support pour l'émission de diagnostics dans le format SARIF basé sur JSON, des ajouts Ada 2022, plusieurs nouveaux avertissements C/C++, le support pour la série AMD Instinct MI200 pour le back-end AMDGCN, le support Ampere-1A, le support Neoverse-V2 / Cortex-X3 / Cortex-X1C / Cortex-A715, et le support pour de nombreux nouveaux processeurs Intel. GCC 13 ajoute des cibles CPU Intel pour Raptor Lake, Meteor Lake, Sierra Forest, Grand Ridge, Emerald Rapids, et Granite Rapids ainsi que de nouvelles extensions du jeu d'instructions CPU Intel comme AMX-FP16, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT, RAO-INT, et AMX-COMPLEX.

    Des benchmarks du compilateur GCC 13 (et LLVM Clang 16) seront bientôt disponibles sur Phoronix.

    Nom : gcc.png
Affichages : 41026
Taille : 68,8 Ko

    Richard Biener déclare :

    Cette version intègre un frontend pour le langage Modula-2 qui était auparavant disponible séparément et pose les bases d'un frontend pour le langage Rust qui sera disponible dans une prochaine version. Pour le langage Rust qui sera disponible dans une future version.

    La prise en charge de l'émission du format de débogage STABS a été supprimée. GCC
    supporte DWARF dans presque toutes les configurations.

    Le frontend C a obtenu la prise en charge de plusieurs fonctionnalités de C23, le frontend C++ pour les fonctionnalités C++23. La prise en charge expérimentale de la bibliothèque standard C++ pour C++20 et C++23 a été améliorée. Pour la famille de langages C, vous pouvez maintenant utiliser -fstrict-flex-arrays[=niveau] pour contrôler le comportement des différents
    formes anciennes de spécification de membres de tableaux flexibles.

    L'analyseur statique de GCC a été grandement amélioré avec 20 nouveaux types de diagnostics.

    L'optimisation du temps de liaison utilise désormais automatiquement GNU makes jobserver lorsque celui-ci supporte les pipes nommés, ce qui est le cas à partir de la version 4.4.
    Il n'est plus nécessaire de modifier les fichiers makefiles.

    La prise en charge des nouvelles caractéristiques des processeurs de la famille ARM, x86, RISC-V et LoongArch ont été ajoutées. Notamment RISC-V supporte les intrinsèques vectorielles comme spécifié dans la spécification 0.11 et OpenMP.
    La spécification 0.11 et le délestage OpenMP/OpenACC pour les appareils de la série AMD Instinct MI200 a été ajouté.

    Certains codes compilés avec succès avec d'anciennes versions de GCC peuvent nécessiter des changements de source.
    Source : GCC

    Et vous ?

    Qu'en pensez-vous ?

    Voir aussi :

    GCC se dote d'un nouveau frontend pour le langage de programmation Rust, une version préliminaire de ce compilateur appelé "gccrs" devrait être incluse dans GCC 13

    La première version officielle de GCC 13 est sur le point d'être publiée, mais n'inclura pas gccrs, le frontend pour le langage Rust, le compilateur gccrs ne serait pas prêt pour du "vrai" code Rust

    GCC 13 prend désormais en charge Modula-2, le descendant de Pascal, il supporte également le langage Rust

  3. #3
    Membre émérite
    Profil pro
    retraité
    Inscrit en
    Décembre 2010
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Décembre 2010
    Messages : 830
    Points : 2 374
    Points
    2 374
    Par défaut
    Modula-2 ? Qui utilise encore cela aujourd'hui, je suis curieux.

  4. #4
    Chroniqueur Actualités
    Avatar de Anthony
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Novembre 2022
    Messages
    1 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Rédacteur technique

    Informations forums :
    Inscription : Novembre 2022
    Messages : 1 230
    Points : 20 328
    Points
    20 328
    Par défaut GCC 13 se dote de nouvelles fonctionnalités dans la partie frontale du langage C pour le rapprocher du C++
    GCC 13 se dote de nouvelles fonctionnalités dans la partie frontale du langage C pour le rendre plus proche du C++, et faire en sorte que la programmation en C soit plus facile et plus sûre

    La dernière version majeure de la GNU Compiler Collection (GCC), la 13.1, a été publiée en avril 2023. Comme toutes les versions majeures de GCC, cette version apportera de nombreux ajouts, améliorations, corrections de bogues et nouvelles fonctionnalités. GCC 13 est déjà le compilateur système de Fedora 38. Les utilisateurs de Red Hat Enterprise Linux (RHEL) obtiendront GCC 13 dans le Red Hat GCC Toolset (RHEL 8 et RHEL 9). Il est également possible d'essayer GCC 13 sur godbolt.org et d'autres sites similaires.

    Cet article décrit les nouvelles fonctionnalités mises en œuvre dans la partie frontale du langage C ; il ne traite pas des développements du langage C lui-même. Il ne couvre pas non plus les changements récents dans la bibliothèque C elle-même.

    Le dialecte C par défaut dans GCC 13 est -std=gnu17. Vous pouvez utiliser les options de ligne de commande -std=c2x ou -std=gnu2x pour activer les fonctionnalités C2X. C2X fait référence à la prochaine version majeure du standard C, qui devrait aboutir à la version C23.

    Nom : gcc 13.png
Affichages : 161537
Taille : 68,6 Ko

    Fonctionnalités C2X

    GCC 13 a mis en œuvre un grand nombre de propositions C2X. Cette section décrit les plus intéressantes d'entre elles.

    nullptr

    La constante nullptr est apparue pour la première fois en C++11 afin de résoudre les problèmes liés à la définition de NULL, qui peut être définie de différentes manières : (void *)0 (une constante de pointeur), 0 (un entier), etc. Cela posait des problèmes pour la résolution des surcharges, la programmation générique, etc. Bien que le C n'ait pas de surcharge de fonction, la définition protéiforme de NULL cause toujours des maux de tête. Considérez l'interaction de _Generic avec NULL : il n'est pas clair quelle fonction sera appelée parce qu'elle dépend de la définition de NULL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    _Generic (NULL,
                void *: handle_ptr (),
                int: crash (),
                default: nop ());

    Malheureusement, il existe des problèmes moins artificiels dans la pratique. Par exemple, des problèmes surviennent avec les opérateurs conditionnels ou lors du passage de NULL à une fonction variadique (taking ...) : dans un tel cas, l'application de va_arg à l'argument null peut faire planter le programme si une définition inattendue de NULL est rencontrée. GCC 13 introduit nullptr en C. Son type est nullptr_t et est défini dans <stddef.h>. En C2X, l'assert suivant passe donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static_assert (_Generic (nullptr,
       nullptr_t: 1,
       void *: 2,
       default: 0) == 1,
       "nullptr_t was selected");

    Énumérations améliorées

    Les énumérations améliorées sont une autre fonctionnalité apparue pour la première fois en C++11. En C, le type sous-jacent d'une enum n'était pas spécifié dans la norme. Dans la pratique, le type est déterminé en fonction des valeurs des énumérateurs. Typiquement, le type serait unsigned int, ou, si l'une des valeurs est négative, int. Dans tous les cas, le type sélectionné doit pouvoir contenir toutes les valeurs de l'énumération. Compte tenu de cette lacune dans la spécification, les enums posent des problèmes de portabilité. Pour combler cette lacune, le langage C a adopté la syntaxe du langage C++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    enum E : long long { R, G, B } e;
    static_assert (_Generic (e, long long: 1, default: 0) == 1, "E type");

    Il semble toutefois utile de mentionner que la spécification d'un mauvais type sous-jacent peut entraîner des problèmes subtils. Considérons ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum F : int { A = 0x8000 } f;

    Sur la plupart des plates-formes, ce code fonctionnera comme prévu. Cependant, la précision de int n'est pas garantie pour être au moins de 32 bits ; elle peut être de 16 bits, auquel cas l'exemple précédent ne sera pas compilé. Une meilleure variante consisterait donc à utiliser l'un des types définis dans <stdint.h>, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum F : int_least32_t { A = 0x8000 } f;

    Prototypes de fonctions(...)

    Le langage C, avant C2X, exigeait qu'une fonction à argument variable ait un argument nommé avant l'ellipse (...). Cette exigence était le résultat d'un bagage historique et n'est plus nécessaire, c'est pourquoi elle est supprimée. (Le C++ a toujours autorisé foo(...)).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void f(int, ...); // OK
    void g(...); // OK in C2X

    Notez cependant que fn(...) n'est pas une fonction non prototypée, et qu'il est donc possible d'utiliser les mécanismes va_start et va_arg pour accéder à ses arguments. Une fonction non prototypée a la forme void u();.

    De telles fonctions ont été supprimées dans C2X (voir ci-dessous).

    Inférence de type avec auto

    La déduction de type est une autre fonctionnalité apparue pour la première fois en C++11. Il s'agit d'une fonctionnalité pratique qui permet au programmeur d'utiliser l'espace réservé auto comme type dans une déclaration. Le compilateur déduira alors le type de la variable à partir de l'initialisateur :


    Il s'agit toutefois de bien plus qu'une simple fonctionnalité permettant d'éviter de taper quelques caractères supplémentaires. Considérez :


    Ici, le type de foo (y) peut dépendre de y (foo pourrait être une macro utilisant _Generic), donc changer y implique de changer le type de x. Utiliser auto dans l'exemple ci-dessus signifie que le programmeur n'a pas à changer le reste de la base de code lorsque le type de y est mis à jour. GCC propose __auto_type depuis GCC 4.9, dont la sémantique est assez proche de C2X auto, bien que pas exactement la même, et qui semble avoir été utilisé principalement dans les en-têtes standards. À la différence du C++, auto doit être utilisé en clair : il ne peut pas être combiné avec * ou [] et similaires. De plus, auto ne supporte pas les accolades autour de l'initialisateur. La fonctionnalité auto n'est activée qu'en mode C2X. Dans les modes plus anciens, auto est un spécificateur de classe de stockage redondant qui ne peut être utilisé qu'au niveau du bloc.

    Le spécificateur constexpr

    Le spécificateur constexpr est une autre caractéristique apparue pour la première fois en C++. En C, constexpr a été introduit avec une fonctionnalité beaucoup plus limitée. Déclarer une variable comme constexpr garantit que la variable peut être utilisée dans divers contextes d'expression constante. Le langage C exige que les objets ayant une durée de stockage statique soient initialisés avec des expressions constantes. Il s'ensuit que les variables constexpr peuvent être utilisées pour initialiser des objets à durée de stockage statique. Un autre grand avantage de constexpr est que diverses contraintes sémantiques sont vérifiées au moment de la compilation. Démontrons ces deux points à l'aide d'un exemple (notez que vous devez spécifier -std=c2x ou -std=gnu2x pour pouvoir utiliser constexpr) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    constexpr int i = 12;
    static_assert (i == 12);
     
    struct X {
      int bf : i;
    };
     
    struct S {
      long l;
    };
     
    constexpr struct S s = { 1L };
    static_assert (s.l == 1L);
    constexpr unsigned char q = 0xff + i; // initializer not representable in type of object

    Spécificateurs de classe de stockage dans les littéraux composés

    Un composé littéral est un moyen de créer des objets sans nom qui ont généralement une durée de stockage automatique. Comme il s'agit de lvalues, il est permis de prendre leur adresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int *p = (int []){2, 4}; // p points to the first element of an array of two ints
    const int *q = &(const int){1};

    L'utilisation de certains spécificateurs de classe de stockage (comme constexpr, static, thread_local) dans les littéraux composés en mode C2X est autorisée. Cela permet de modifier la durée de vie du littéral composé ou d'en faire une constante de littéral composé avec le mot-clé constexpr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct S { int i; };
    void
    f (void)
    {
      static struct S s = (constexpr struct S){ 42 };
    }
     
    int *
    g (void)
    {
      return &(static int){ 42 };
    }

    Notez que même si typedef, extern et auto sont des spécificateurs de classe de stockage, ils ne sont pas autorisés dans les littéraux composés.

    C2X typeof

    C2X a standardisé typeof, une fonctionnalité qui a été supportée en tant qu'extension GNU pendant de nombreuses années et qui permet au programmeur d'obtenir le type d'une expression. En plus de typeof, C2X ajoute également typeof_unqual, qui supprime tous les qualificateurs et _Atomic du type résultant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int i;
    volatile int vi;
    extern typeof (vi) vi; // OK, no conflict
    extern typeof_unqual (vi) i; // OK, no conflict

    Une différence mineure entre la version GNU et la version standard est le traitement de la propriété noreturn d'une fonction : la variante GNU de typeof prend noreturn comme partie du type d'un pointeur de fonction, mais la version standard ne le fait pas.

    Notez que C++11 a standardisé une fonctionnalité similaire sous le nom de decltype, ce qui fait que l'on se retrouve avec deux noms pour une fonctionnalité presque identique.

    Nouveaux mots-clés

    Cette proposition harmonise davantage le C et le C++ en faisant de alignas, alignof, bool, false, static_assert, thread_local et true des mots-clés ordinaires en mode C2X. Par conséquent, cette unité de traduction compilera correctement en mode C2X :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static_assert (true, "");

    Cette modification peut casser le code existant, par exemple


    ne se compilera pas en mode C2X.

    L'attribut noreturn

    Une autre amélioration de la compatibilité pour rapprocher le C et le C++. Le C11 a ajouté le spécificateur de fonction _Noreturn pour signaler au compilateur qu'une fonction ne retourne jamais à son appelant, mais _Noreturn ne fonctionne qu'en C. C2X a donc ajouté un attribut [[noreturn]] standard tout en marquant simultanément _Noreturn comme obsolète.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[noreturn]] void exit (int);

    Accolades initialisatrices vides

    C2X a normalisé les accolades initialisatrices vides ({}) et GCC 13 met en œuvre cette proposition. Certains cas étaient déjà supportés en tant qu'extension GNU (par exemple, l'initialisation d'un tableau ou d'une structure), mais il est désormais possible d'utiliser {} pour initialiser une variable scalaire ou un tableau de longueur variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i = {};
    int arr[10] = {};
    struct S { int i; };
    struct S s = {};
     
    void
    g (void)
    {
      int n = 10;
      int vla[n] = {};
    }

    Macro unreachable

    C2X apporte la macro unreachable(), définie dans <stddef.h>, qui est un raccourci pratique pour la fonction intégrée de GCC __builtin_unreachable() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stddef.h>
     
    int foo (int x)
    {
      if (x < 0)
    unreachable ();
      return x & 1;
    }

    Suppression des fonctions non prototypées

    Les fonctions non prototypées en C étaient de la forme int foo(), qui est une fonction foo qui renvoie un entier qui prend un nombre non spécifié d'arguments de types non spécifiés. C'est très dangereux car le compilateur ne peut effectuer aucune vérification lorsqu'une telle fonction est utilisée.

    Dans C2X, int foo() est équivalent à int foo(void), qui est une fonction foo qui retourne un entier et ne prend aucun argument.

    Nouveaux avertissements

    L'interface C a gagné quelques nouveaux avertissements dans GCC 13. Par exemple, -Wxor-used-as-pow, qui a été décrit dans la partie C++ du billet de blog de GCC 13. Il y a un nouvel avertissement spécifique pour le front-end C.

    -Wenum-int-mismatch

    En C, un type énuméré est compatible avec char, un type entier signé ou un type entier non signé, donc le code suivant se compile si le type sous-jacent de enum E est int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    enum E { l = -1, z = 0, g = 1 };
    int foo(void);
    enum E foo(void) { return z; }

    Toutefois, comme indiqué précédemment, le choix du type sous-jacent de l'énumération est défini par l'implémentation. Comme le code ci-dessus est probablement une erreur et constitue un problème de portabilité (le code ne se compilera pas si un type différent de int est choisi comme type sous-jacent), GCC 13 implémente un nouvel avertissement qui signale les incohérences entre les types enum et entier. Pour le code ci-dessus, l'avertissement ressemble à ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    q.c:5:10: warning: conflicting types for ‘foo’ due to enum/integer mismatch; have ‘enum E(void)[-Wenum-int-mismatch]
    5 |   enum E foo(void) { return z; }
      |         ^~~
     
    q.c:4:7: note: previous declaration of ‘foo’ with type ‘int(void)4 |   int foo(void);
      |

    Conclusion

    GCC 13 met en œuvre de nombreuses propositions de C2X. Ces propositions rapprochent un peu plus les langages C et C++ en combinant certaines caractéristiques, et rendent la programmation en C plus facile et plus sûre.

    Source : Annonce de l'ajout des fonctionnalités C à GCC 13

    Et vous ?

    Que pensez-vous des nouvelles fonctionnalités C apportées à GCC 13 ? Trouvez-vous qu'elles sont utiles et cohérentes ?

    Quel est votre avis général sur la collection de compilateurs GNU ?

    Voir aussi

    La version 13.1 de GCC prend en charge le langage Modula-2 et offre davantage de fonctionnalités pour C23/C++23

    La première version officielle de GCC 13 est sur le point d'être publiée, mais n'inclura pas gccrs, le frontend pour le langage Rust, le compilateur gccrs ne serait pas prêt pour du "vrai" code Rust

    GCC se dote d'un nouveau frontend pour le langage de programmation Rust, une version préliminaire de ce compilateur appelé "gccrs" devrait être incluse dans GCC 13

  5. #5
    Membre averti
    Avatar de VBurel
    Profil pro
    Développeur Indépendant
    Inscrit en
    Août 2004
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Indépendant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 122
    Points : 354
    Points
    354
    Billets dans le blog
    1
    Par défaut 'c' = language de programmation universel
    L'intérêt premier du 'C' est son caractère universel (compilable sur toute plateforme).
    Donc ceux qui programment en 'C' aujourd'hui utilisent le coeur du langage (souvent 1990 compatible) pour pouvoir conserver un code opérationnel (parfois sur plusieurs décennies).
    et n'ont que faire des améliorations syntaxiques créant des points d'incompatibilité...

    En conclusion, je ne vois pas l'intérêt de faire évoluer le 'C' vers le 'C++'. Laissons chacun utiliser le langage qu'il préfère.

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 740
    Points : 43 866
    Points
    43 866
    Par défaut
    Ce n'est pas forcément le cas de tout le monde. De nouvelles fonctionnalités, tu les utilise ou pas.

  7. #7
    Membre régulier Avatar de selmanjo
    Homme Profil pro
    Savant en programmation orienté objet
    Inscrit en
    Janvier 2020
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Savant en programmation orienté objet
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2020
    Messages : 55
    Points : 102
    Points
    102
    Par défaut C'est super
    On aime les nouvelles fonctionnalités.
    Enfin, un langage C qui grandit !
    Quand on est débutant en langage C, c'est un véritable régal.😋

    *(void *) 0xcc00leee;

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 673
    Points : 10 683
    Points
    10 683
    Par défaut
    Citation Envoyé par selmanjo Voir le message
    Enfin, un langage C qui grandit !
    Justement, c'est au jugé de chacun
    Moi, je pense que ce n'est pas avec des fonctionnalité du C++ moderne (nullprt, constexpr, énumération typée, …) que le C grandit.

    Si tu veux que le C grandit, il faut d'autres ajouts (*) : ajout de l'Unicode (avec 1 vrai type caractère/ chaîne de caractères transparent), ajout des containers (table de hachage, tableau associatif, …), ajout des "threads", support du json, …
    Là, j'ai l'impression que c'est + pour aider l'intégration du C++ moderne dans des projets C (ou l'inverse, l'intégration du C dans des projets C++ moderne)
    Si les langages comme Python ou JavaScript ont "le vent en poupe", c'est pour leur simplicité d'utilisation et leur "très large possibilité" … même si je sais que le C restera du C (les tests, les casts, les conversions, …)

    Édit : On peut aussi rajouter Linux qui commence à utiliser/ tester Rust. C'est bien que le C pose des questions sur "son utilisation".

    Mais pour ces ajouts, (*) on le sait depuis 2011 : que ce soit le C++ ou le C, ces langages n'auront jamais 1 bibliothèque standard étendue/ complète.
    L'intégration des threads dans le C++11, fut trop léger (trop bas niveau). Pareil pour l'Unicode : c'est juste en gros MBCS.

    Après, j'ai lu que le GCC a été critiqué pour son immobilisme face à LLVM : donc peut-être des mises à jour pour dire "GCC fait quelque chose"

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/03/2021, 22h45
  2. Réponses: 66
    Dernier message: 29/06/2020, 18h16
  3. Réponses: 0
    Dernier message: 15/02/2019, 16h13
  4. Réponses: 12
    Dernier message: 23/10/2018, 15h45
  5. Réponses: 5
    Dernier message: 07/10/2009, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo