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

C Discussion :

C1x : future version du langage C


Sujet :

C

  1. #1
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut C1x : future version du langage C
    C1x : future version du langage C
    Le nouveau Release de GCC intègre déjà certaines de ses fonctionnalités


    La nouvelle ne date pas d'hier, mais pour ceux qui ne sont pas encore au courant, une nouvelle version du C est en fait en cours d'élaboration et le dernier release de GCC (du 26 octobre 2011) intègre même déjà certaines de ses fonctionnalités.

    Ce langage, couramment appelé C1x, est destiné à remplacer le C99, le standard actuel. Il est clair que le C99 a terriblement été un échec, notamment en raison du choix de Microsoft de ne pas le supporter. Mais ce n'est pas tout. Le C99 a peut-être aussi échoué parce qu'il n'apportait rien qui soit véritablement essentiel au langage.
    Certes, les nouvelles fonctionnalités (types, commentaires, déclarations, initialisations, bibliothèque standard, etc.) étaient toutes aussi intéressantes les unes que les autres, mais aucune qui ouvre réellement de nouveaux horizons pour le langage.

    Cette fois-ci, c'est différent. Parmi les nouveautés majeures, on peut citer : le contrôle des alignements en mémoire, un meilleur support d'Unicode, la normalisation des structures et unions anonymes, la normalisation des fonctions "secure" de Microsoft (et suppression définitive de la fonction gets au profit de gets_s) et le support du multithreading (<threads.h> et <stdatomic.h>). Comme d'habitude, des macros permettent de tester si telle fonctionnalité est disponible ou non dans une implémentation donnée. Par exemple, la macro __STDC_NO_THREADS__ permet de savoir si l'implémentation supporte ou non les threads.

    Le dernier draft de cette norme date du 12 avril 2011 et est disponible ici.

    Source : change log de GCC

    Alors, qu'en pensez-vous ?
    Approuvez-vous ces changements ?
    En attendez-vous d'autres ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    suppression définitive de la fonction gets au profit de gets_s
    Bon c'est déja ça. Sinon scanf, quand est ce qu'il lui font la peau?

    Pour ce qui est du mulithreading, il existe déja plein de librairie pour ça. Pthreads marche très bien et est plus ou moins standard, alors quel interêt de balancer encore un autre standard ça me fait penser à ça
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Bon c'est déja ça. Sinon scanf, quand est ce qu'il lui font la peau?
    Ce n'est pas comparable. gets() introduit un buffer overflow potentiel qu'il n'est pas possible de pallier. Ça peut arriver avec scanf() aussi mais il y a quand même moyen de spécifier une taille de champ.

    Ce qu'on reproche à scanf(), c'est d'être difficile à utiliser et de ne pas être ce qu'il y a de plus indiqué pour débuter, surtout s'il ne s'agit que de lire un nombre ou une ligne de texte. Ça s'explique cependant parce qu'elle est censée être la réciproque de printf(), et qu'elle s'utilise de la même façon.

    Mais autant, je suis assez d'accord pour orienter d'emblée les nouveaux venus vers d'autres fonctions, autant ça me ferait suer qu'elle disparaisse complètement au quotidien.

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Mouais,

    C99 n'est pas encore entierement supporte par tous les compilateurs : http://en.wikipedia.org/wiki/C99#Implementations

    C1x apporte aussi de nouvelles joyeusetes qui ne servent a rien:

    • no-return function : le type void est visiblement trop complexe pour les pauvres demeures que nous sommes
    • at_quick_exit et quick_exit : si on concoit bien son programme, pas besoin de ces cochonneries qui, sauf erreur de ma part, vont necessiter l'utilisation de variables globales la ou ce n'est pas necessaire.
    • ...
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Les no-return functions ne sont pas des fonctions void, mais des fonctions qui ne retournent pas (comme abort() ou exit()).

    Pour at_quick_exit() et quick_exit(), le débat n'a pas lieu d'être puisque la fonctionnalité que tu critiques est déjà disponible en C99 et même C89 avec atexit() et exit(). at_quick_exit()/quick_exit() amènent simplement un deuxième jeu de fonctions qu'on peut utiliser quand il n'est pas pertinent d'utiliser les fonctions installées avec atexit() (et appelées en cas d'exit()).

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Je me suis penche un peu plus sur les changements entre C99 et C1x, et j'avoue que le fait de rendre optionnel en C1x des choses (les VLA (tableaux a longueur variables) et les complexes) qui etaient obligatoires en C99 me laisse pantois.

    En gros, j'ai un peu l'impression que la norme n'est plus une norme que chacun doit respecter, mais que c'est l'inverse : les gens n'ont pas voulu implementer les VLA, donc on les rend optionnels.

    Certes, c'est un point tres complexe a integrer dans un compilateur, mais est-ce raisonnable de casser la backward compatibilite sur une norme ??
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Membre actif Avatar de ratomms
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2009
    Messages : 163
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    alors quel interêt de balancer encore un autre standard
    il ne sera plus un library à part entier.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 995
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 995
    Points : 2 528
    Points
    2 528
    Par défaut
    Citation Envoyé par matafan Voir le message
    Les no-return functions ne sont pas des fonctions void, mais des fonctions qui ne retournent pas (comme abort() ou exit()).
    Ah oui, vraiment ? Ce qui veut dire ? Imaginons qu'une fonction f1 appelle une fonction f2, qui est no-return. Que se passe-t-il à la fin de f2 ? Le flux d'exécution ne va pas exécuter l'instruction suivant l'appel de f2 dans f1 ? Mais alors que se passe-t-il ?

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    @traroth : Effectivement, le code suivant l'appel de f2 ne sera jamais exécuté, c'est déjà ce qui se passe lorsqu'on appelle exit() ou abort() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void f2()
    {
        exit(0);
    }
     
    void f1()
    {
        f2();
        /* le code suivant l'appel à f2 ne sera jamais exécuté */
    }
    noreturn permettra juste d'indiquer au compilateur qu'on ne sortira jamais d'une fonction (soit parce qu'on sort du programme, soit parce qu'on rentre dans une boucle infinie inconditionnelle). Le compilateur pourra donc optimiser le code (par exemple en omettant de poser l'adresse de retour sur la pile).
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  10. #10
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    Citation Envoyé par Melem Voir le message
    la normalisation des structures et unions anonymes
    Ça veut dire que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct
    {
        int a;
        int b;
    } MaStruct;
    n'est pas normalisé ??
    ou alors il s'agit seulement de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct
    {
        int a;
        int b;
    } aStruct;
    ??

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    @atha2 : Je pense qu'il s'agit de pouvoir écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct S
    {
        union
        {
            int i;
            float f;
        };
    };
    plutôt que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct S
    {
        union 
        {
            int i;
            float f;
        } u;
    };
    Et de pouvoir traiter les membres de l'union comme s'ils faisaient partie de la structure englobante (comme c'est le cas en C++).
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  12. #12
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    atha2, une structure anonymes c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct s1 {
        int a;
        int b;
    };
     
    struct s2 {
        int c;
        int d;
    };
     
    struct s12 {
        struct s1; /* On ne nomme pas le champ */
        struct s2; /* On ne nomme pas le champ */
    };
    Et on peut accéder aux champs de la structure anonyme directement de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct s12 mys12 = { { 1, 2 }, { 3, 4 } };
    printf("%d %d %d %d\n", mys12.a, mys12.b, mys12.c, mys12.d);
    Certains compilateur les supportent déjà et c'est extrêmement pratique, par exemple pour faire "hériter" deux structures d'une structure commune et y accéder de manière transparente.

    C'est aussi très pratique pour les unions, dont le nom ne sert généralement à rien (mystruct->u.myfield... Qui n'a jamais pesté en écrivant celà).

  13. #13
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    @matafan et Niark13 : merci
    Je pensai que le anonyme faisait référence au nom du type (comme les classes anonymes en Java par exemple) et pas au nom du champ.

    Citation Envoyé par gangsoleil Voir le message
    Je me suis penche un peu plus sur les changements entre C99 et C1x, et j'avoue que le fait de rendre optionnel en C1x des choses (les VLA (tableaux a longueur variables) et les complexes) qui etaient obligatoires en C99 me laisse pantois.

    En gros, j'ai un peu l'impression que la norme n'est plus une norme que chacun doit respecter, mais que c'est l'inverse : les gens n'ont pas voulu implementer les VLA, donc on les rend optionnels.

    Certes, c'est un point tres complexe a integrer dans un compilateur, mais est-ce raisonnable de casser la backward compatibilite sur une norme ??
    Une implémentation simple* est d'allouer dans le tas le tableau (de ce que j'ai vu, la norme ne précise pas où doit être alloué le tableau) et d'ajouter un free à la fin de la fonction / block. Franchement ça doit pas prendre plus de 10 minutes à implémenter.

    *mais pas forcément efficace. Je n'ai jamais fait de benchmark pour comparer les 2 types d'allocation mais j'imagine qu'allouer sur le tas est moins efficace.

  14. #14
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 555
    Points : 1 597
    Points
    1 597
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Bon c'est déja ça. Sinon scanf, quand est ce qu'il lui font la peau?
    Elle est très bien cette fonction, qu'as-tu a lui reprocher en dehors du fait qu'elle soit souvent apprise à des débutants qui n'ont pas la moindre idée de comment gérer une chaîne formatée ?
    Là où gets() nous obligeait à faire confiance à la chaîne entrée, scanf() peut tout contrôler, de la simple longueur de chaîne jusqu'à un modèle strict imposé par des regex.
    Ça fait économiser pas mal de lignes de test, d'après moi.

  15. #15
    Membre éclairé
    Homme Profil pro
    Développeur C++
    Inscrit en
    Octobre 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur C++

    Informations forums :
    Inscription : Octobre 2008
    Messages : 242
    Points : 706
    Points
    706
    Par défaut
    Moi je suis déçu qu'il y ai toujours pas une gestion des répertoire de manière standard. Pourquoi ne pas mettre dirent.h dans le standard du C ?

    Je pense que c'est bien plus important que les threads qui eux ont été prévus dans C1x

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/06/2009, 21h35
  2. L'heure système (version) et langage ?
    Par troxsa dans le forum Windows XP
    Réponses: 10
    Dernier message: 16/07/2008, 13h36
  3. La future version de DreamShield ( 0.9 )
    Par smyley dans le forum Dreamshield
    Réponses: 30
    Dernier message: 01/09/2007, 23h43
  4. Réponses: 2
    Dernier message: 24/12/2006, 10h13
  5. connaitre sa version des langages
    Par lyxthe dans le forum Access
    Réponses: 3
    Dernier message: 16/11/2006, 12h35

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