L'évolution du langage C++ s'accélère
10 groupes d'études et plusieurs nouvelles dates de sortie pour les prochaines normes

Le , par gbdivers

0PARTAGES

2  0 
L'évolution du langage C++ s'accélère
10 groupes d'études et plusieurs nouvelles dates de sortie pour les prochaines normes


Depuis la première annonce l'année dernière, le comité à fait plein de petits bébés : la famille s'est agrandie et compte maintenant 10 SG (study group), 4 WG (working group) et un comité.



Les working groups ont pour rôle de proposer les modifications à apporter à la norme, modifications qui seront approuvées, ou non, par le comité de normalisation.

  • le core working group (CWG) a la charge des corrections sur le langage (chapitres 1 à 16 de la norme) ;
  • l'evolution working group (EWG) travaille sur l'évolution du langage (travaux qui sont délégués aux study groups) ;
  • le library working group (LWG) s'occupe de le maintenance de la bibliothèque standard (chapitres 17 et suivants de la norme) ;
  • le library evolution working groupe (LEWG) est responsable de l'évolution de la bibliothèque standard (travaux qui sont délégués aux study groups).


Les study groups ont la charge d'étudier les évolutions du langage (SG 1, 2, 5, 7, 8 et 10) et de la bibliothèque (SG 3, 4, 6 et 9) sur des thèmes spécifiques et de proposer des modifications de la norme aux WG :
  • SG1 Concurrency : concurrence et parallélisme ;
  • SG2 Modules : utilisation de modules à la place du système d'en-têtes ;
  • SG3 File System : gestion des fichiers (basé sur Boost.Filesystem v3) ;
  • SG4 Networking : gestion du réseau, sockets et HTTP ;
  • SG5 Transactional Memory : mémoires transactionnelles (mémoire permettant de créer un ensemble indivisible d'écriture et lecture) ;
  • SG6 Numerics : analyse numérique, nombres réels fixes et flottants, fractions ;
  • SG7 Reflection : réflexion à la compilation ;
  • SG8 Concepts : ajout de contraintes sur les types ;
  • SG9 Ranges : alternative aux itérateurs ;
  • SG10 Feature Test : standardisation des tests.


Au niveau du planning, le comité s'active, avec plus d'une centaine de propositions pour le congrès de Bristol (voir la discussion [ISOC++] Mailing pre-Bristol). En plus de la prochaine norme qui devrait sortir en 2017, le comité prévoit des Technical Specifications, pour les ajouts de fonctionnalités indépendantes, et une révision mineure de la norme en 2014.



Quelles sont les fonctionnalités qui vous intéressent le plus ? Celles que vous auriez aimer avoir ?
Que pensez-vous de l’accélération prise par le comité pour le langage et la bibliothèque standard ?


Source : http://isocpp.org/std/the-committee

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de wirenth
Membre averti https://www.developpez.com
Le 21/03/2013 à 12:05
Modules et concepts, c'est ce qui m'arrangerait le plus. Et c'est ce qui nécessite les plus gros changements en profondeur dans le langage.
Network et FileSystem sont bien représentés dans Boost, ce n'est pas la priorité.
Avatar de barmic
Membre actif https://www.developpez.com
Le 21/03/2013 à 13:57
Citation Envoyé par rakotoarisoatahiana Voir le message
On devrait avoir des pointeurs sur des classes, surtout pour les débutants.
Ex : listes chaînées :
Code : Sélectionner tout
1
2
3
4
5
template<class t>
class list { public :
   t info ;
   list suiv ;
}*
Je ne pense pas que ce soit envisageable simplement parce que ça entraine d'énormes refonte dans le langage.

Pour ceux qui n'ont pas compris de quoi il s'agit les pointeurs de classe ça permet, par exemple de passer une classe en paramètre d'une méthode et celle-ci peut entre autre instancier des objets de cette classe.

C'est à mon avis pas faisable à cause du fait que les classes templates sont du code généré et c'est un problème qui, en C++, s'adresse avec les templates justement.
Avatar de Klaim
Membre expert https://www.developpez.com
Le 21/03/2013 à 14:11
Citation Envoyé par barmic Voir le message
Je ne pense pas que ce soit envisageable simplement parce que ça entraine d'énormes refonte dans le langage.

Pour ceux qui n'ont pas compris de quoi il s'agit les pointeurs de classe ça permet, par exemple de passer une classe en paramètre d'une méthode et celle-ci peut entre autre instancier des objets de cette classe.

C'est à mon avis pas faisable à cause du fait que les classes templates sont du code généré et c'est un problème qui, en C++, s'adresse avec les templates justement.
De loin je dirais que ca n'a aucun interet parcequ'on peut deja faire la meme chose en C++.

D'abord, via les template on peut avoir le type en question. Si on veut des infos au runtime on peut utiliser type_index pour identifier le type. Si tu veux faire une manip specifique avec le type, genere un lambda qui le manipule et mets le dans une map.
Enfin bref, ya trop de moyens de se passer de "pointeurs de classe".

Et j'imagine que ca sera encore plus simple si les gros chantiers cote reflexion (qui sont a priori necessaires pour rendre le networking attractif) sont mis en place. Par contre apparement ca va pas etre pour tout de suite...
Avatar de germinolegrand
Membre expert https://www.developpez.com
Le 21/03/2013 à 15:46
Très clairement pour moi File System, Networking et Ranges sont les seuls à m'intéresser.

Les modules ça a l'air cool comme ça, mais ça rajoute un truc à apprendre parce que c'est pas comme si ça remplaçait les #include. Bon, ça accélère la compilation sans affecter les performances du résultat je crois, donc je suis pas contre. Mais ça ne m'intéresse pas plus que ça, si ça y est pourquoi pas si ça y est pas je m'en passe fort bien.

Pour le reste je suis pas contre mais je n'en ai pas besoin.

Passons donc à ce qui m'intéresse .

Le File System, ça y'en a besoin. Clairement. La gestion des fichiers en C++ c'est une boucherie. (Si au passage ils pouvaient améliorer les stream je serais pas contre mais je rêve pas faudrait une modification du langage pour ça).

Le Networking : de la standardisation là dessus ça peut pas faire de mal, c'est le foutoir pardonnez moi l'expression.

Pour les ranges, je m'intéresse à la question parce que je travaille bien plus souvent sur des conteneurs complets que sur une partie (voire toujours, sauf si l'algo est vraiment tordu/optimisé à mort). De plus, il faudrait qu'il soit simple de fournir des ranges dans l'interface d'une classe, chose qui n'est pas vraiment agréable avec les itérateurs.
Avatar de Klaim
Membre expert https://www.developpez.com
Le 21/03/2013 à 16:14
Citation Envoyé par germinolegrand Voir le message

Les modules ça a l'air cool comme ça, mais ça rajoute un truc à apprendre parce que c'est pas comme si ça remplaçait les #include. Bon, ça accélère la compilation sans affecter les performances du résultat je crois, donc je suis pas contre. Mais ça ne m'intéresse pas plus que ça, si ça y est pourquoi pas si ça y est pas je m'en passe fort bien.
Je sais pas pour toi mais perso le probleme N1 du C++ en pratique c'est bien la lenteur de la compilation, meme apres avoir fais en sorte de minimiser les degats.

L'autre truc c'est qu'q priori les module vont justement retirer la necessite de comprendre pas mal de trucs lies aux headers (si ils vont par la solution sans headers mais c'est pas clair ou on en est...)
Avatar de guillaume07
Débutant https://www.developpez.com
Le 21/03/2013 à 16:57
avec les modules il n'y aurait plus de définition séparée de l'implementation ?
Avatar de Klaim
Membre expert https://www.developpez.com
Le 21/03/2013 à 18:17
Citation Envoyé par guillaume07 Voir le message
avec les modules il n'y aurait plus de définition séparée de l'implementation ?
Si, ca n'impacte pas le code lui meme, juste comment il est encapsule.
Actuellement il y a deux grandes lignes pour les modules et ce qui est pas clair c'est ou on en est aujourd'hui (ya rien dans la derniere liste de papiers).
La premiere direction c'est simplement de faire en sorte que les fichiers generes par le compilateur a partir de la compilation du module, soient lisible par un humain, ce qui fait qu'en gros on aura plus besoin de headers puisque ces fichiers ne contiendraient que les interfaces publiques (et inline) du code du module en question. Mais cela est tellement radical que l'autre direction plus "pragmatique" mais peut etre pas incompatible serait de garder les headers et de s'en servir aussi dans le systeme de modules, mais de virer les commandes #include.

Enfin bref, on a trop peu d'info depuis la fin de l'annee derniere sur l'avancee de cette feature malheureusement.
Avatar de zartc
Candidat au Club https://www.developpez.com
Le 23/03/2013 à 19:16
Citation Envoyé par Klaim Voir le message
Si, ca n'impacte pas le code lui meme, juste comment il est encapsule.
Ouaip, en fait pour moi les modules ça n'aurrait d'intérest que si ça permet de se passer complètement des headers. D'autre langages l'on fait et franchement ça allège vraiment les choses.
Avatar de gbdivers
Inactif https://www.developpez.com
Le 23/03/2013 à 19:32
Citation Envoyé par zartc Voir le message
Ouaip, en fait pour moi les modules ça n'aurrait d'intérest que si ça permet de se passer complètement des headers. D'autre langages l'on fait et franchement ça allège vraiment les choses.
Pour rappel, la séparation du code dans un fichier header et un fichier d'implémentation n'est pas une obligation. Cela se justifie surtout pour une question de design. Donc si tu veux pas séparer ton code, ne le fais pas (mais c'est moins propre)
Avatar de Kalith
Membre confirmé https://www.developpez.com
Le 24/03/2013 à 12:15
Je me demandais s'il serait réalisable d'ajouter un overload de l'opérateur '.', de façon à rendre transparente l'utilisation de certains wrappers comme reference_wrapper<T> :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
struct test {
    void foo() {}
};

test t;

// Norme actuelle
std::reference_wrapper<test> trw(t);
trw.foo(); // error
trw.get().foo(); // ok
Ou alors, puisque c'est l'idée sous-jacente, supporter de manière transparente les conteneurs de références d'une manière ou d'une autre :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::vector<test&> v;
test t1, t2;
v.push_back(t2);
v.push_back(t1);

for (auto& t : v) {
    t.foo();
}

// Une implémentation possible actuellement (pseudo code) :
using std::vector<T&> = std::vector<std::reference_wrapper<T>>
// Seul inconvénient :
for (auto& t : v) {
    t.foo(); // error: 'auto' = std::reference_wrapper<T>
    t.get().foo(); // ok
}

v[0].foo(); // error
v[0].get().foo(); // ok
Dans le fond, c'est comme un conteneur de pointeurs si ce n'est que
  1. on a la "garantie" de ne pas avoir de nullptr dans le conteneur (sauf si on veut être mauvais : v.push_back(*(test*)nullptr);, c'est donc une garantie sémantique plutôt que technique),
  2. on bénéficie de la notation "objet" plutôt que "pointeur", ce qui peut être plus simple pour les débutants (et un caractère de moins à taper, c'est toujours ça de pris pour tout le monde).
Contacter le responsable de la rubrique C++

Partenaire : Hébergement Web