C++17 - Genèse d’une version mineure
Auteurs | olibre, duckie, rom1v, Oliver H, cracky, Lucas, palm123, Adrien Dorsaz, Martin Peres, RyDroid, Davy Defaud, ZeroHeure, Benoît Sibaud, tankey, Storm, M5oul et Anthony Jaguenaud |
---|---|
Licence | CC BY-SA 4.0 |
URL | https://linuxfr.org/news/c-17-genese-d-une-version-mineure |
Date | 2016-06-27T00:11:42+02:00 (création de la dépêche sur LinuxFr.org) |
Tags | c++, cpp et c++17 |
Score | 60 |
La série de dépêches C++ continue. Cette seconde dépêche nous amène dans les réunions du comité de standardisation en vue de publier la prochaine version C++17 et nous permettra de vérifier ce titre provocateur (comment ça mineure ?). Cette dépêche peut intéresser tous les lecteurs de LinuxFr.org, pas seulement les développeurs. Les prochaines dépêches seront plus techniques.
- Journal de rewind : C++17 est sur les rails
- Contenu Markdown de la première dépêche sur le dépôt Git du C++FRUG
- Contenu Markdown de cette seconde dépêche sur le dépôt Git du C++FRUG
- Contenu Markdown de la troisième dépêche sur le dépôt Git du C++FRUG
- Contenu Markdown de la quatrième dépêche sur le dépôt Git du C++FRUG
- Contenu Markdown de la cinquième dépêche sur le dépôt Git du C++FRUG
- Article Wikipédia C++14
- Article Wikipédia C++17
- Mars 2016 - Rencontre du comité C++ - Intégration des fonctionnalités C++17 - par Herb Sutter
- Mars 2016 - Bilan des premières fonctionnalités C++17 - par botondballo
- Juin 2016 - Rencontre du comité C++ - Clôture de l’ajout de fonctionnalités C++17 - par Herb Sutter
- Liste très complète des nouveautés C++17 sur StackOverflow
- Liste des nouveautés C++17 sur Meeting C++
- Site officiel du comité de standardisation du C++ - Page expliquant le fonctionnement du comité
- Dépôt Git officiel du standard C++ en cours de rédaction
- Dépêche « Codeurs, Traducteurs, CppReference a besoin de vous », par nazcafan (2012)
- CppReference, wiki libre (CC-BY-SA 3.0 et GFDL) pour la documentation C et C++
Dépêches C++
Cette dépêche est la deuxième d’une série de cinq dépêches sur le C++. La première dépêche Les coulisses du standard C++ a été publiée fin août dernier.
-
La dépêche précédente, Les coulisses du C++, présente la naissance du langage, sa longue normalisation, sa spécification officielle non libre, payante, ouverte, délaissée au profit de son brouillon (draſt), peu lue par les développeurs C++…
-
Cette dépêche, Genèse du C++17, raconte les dernières réunions du comité de normalisation et donne des éléments pour expliquer ce long processus de normalisation.
-
La troisième dépêche, Nouveautés C++17 du langage, présentera les changements au niveau du langage : déduction des arguments
template
std::array a{1,2,3} ;
, décomposition du retour de fonctionauto [x,y]=f() ;
,namespace aa::bb{}
équivalent ànamespace aa{namespace bb{}}
,if constexpr
sélectionne du code à la compilation, lambdaconstexpr
, lambda capture*this
,if(init;condition)
commefor(init;cond;inc)
, variablesinline
… Mais il faudra encore attendre pour l’intégration des Concepts, Modules, Syntaxe d’appel uniforme et Réflexion. -
La quatrième dépêche, Nouveautés C++17 de la bibliothèque standard, présentera les changements au niveau de la bibliothèque standard qui pourraient bien bousculer notre petite vie de développeur : algorithmes parallélisés,
std::string_view
,std::filesystem
,std::variant
,std::any
,std::optional
, les fonctions spéciales mathématiques… Mais, les intervalles (ranges) et le réseau (networking) seront intégrés pour une version suivante du C++. -
Bilan C++17 et attentes pour C++20. Version mineure ou majeure ? D’un côté, les améliorations sont nombreuses et appréciables. Mais de l’autre, aucune fonctionnalité majeure n’est intégrée, exceptées celles qui sont déjà disponibles dans Boost. Cette cinquième dépêche s’attaquera aux questions existentielles du C++ : Quelles conséquences sur le processus de normalisation ? Qu’attendre de C++20 ? Intérêt du C++ aujourd’hui ? Quels langages alternatifs ? Que faire pour dynamiser l’évolution du C++ ? S’impliquer ?
-
… d’autres dépêches à venir. :-)
Partage
Chère lectrice, cher lecteur LinuxFr.org. Tu souhaites donner un coup de main pour les dépêches suivantes ? Rejoins‐nous dans l’espace de rédaction collaborative sur LinuxFr.org. Un compte est nécessaire pour y accéder.
Après publication, les dépêches sont figées sur LinuxFr.org. Alors, pour continuer à améliorer ce contenu libre (fôtes, oublis, franglais, maladresses…), n’hésite à pas à aller sur le dépôt Git C++FRUG. Tu y trouveras les versions de ces dépêches les plus à jour :
- Les coulisses du standard C++ ;
- Genèse d’une version mineure ;
- Nouveautés du langage ;
- Nouveautés de la bibliothèque standard ;
- Bilan et attentes pour C++20.
Avec toutes nos contributions réunies, nous profiterons davantage de nos découvertes individuelles et nous offrirons un contenu CC BY-SA de qualité pour créer, par exemple, des supports de formation (Meetups), des articles sur d’autres blogs… Par contre, pour le moment nous ne pouvons pas encore en faire profiter Wikipédia : notre dépêche étant en CC BY-SA version 4.0 et Wikipédia encore sur la version précédente :-/
Deux sommets pour délimiter le périmètre C++17
Comme le prévoit le cycle de publication triannuel, c’est en 2016 (année N-1) que le comité de normalisation du C++ vote le périmètre fonctionnel du C++17. Ainsi, les membres du comité se sont réunis à deux reprises pour intégrer de nouvelles fonctionnalités au C++ :
- Une semaine début mars, à Jacksonville (Floride), pour adopter beaucoup de fonctionnalités, mais aussi pour rejeter plusieurs fonctionnalités majeures très attendues ;
- Une semaine fin juin, à Oulu (Finlande), pour intégrer pas mal d’autres fonctionnalités et ainsi clore l’ajout des fonctionnalités.
La semaine se déroule sur six jours, du lundi au samedi. Pas de grasse matinée car les premières réunions débutent à 8h30. Ces réunions permettent de débattre et voter l’intégration de chacune des spécifications techniques (Technical Specification). Plusieurs réunions se déroulent en parallèle, et les membres rejoignent les réunions selon leur centre d’intérêt. Après ces réunions officielles, les membres se retrouvent pour continuer à échanger ou pour améliorer les spécifications techniques.
Mais à Oulu, un phénomène naturel a eu un impact direct sur la productivité : le soleil se couche après minuit en juin ! Si bien, que la plupart des membres ne se rendaient pas compte de l’heure et ont continué à bosser bien plus tard que d’habitude. En plus du soleil qui dort seulement deux heures par nuit, le décalage horaire (jetlag) a achevé les non-européens qui ont eu besoin de plusieurs jours de repos pour s’en remettre !
Voici à quoi ressemble le soleil à une heure du matin au mois de juin (ici c’est à Tromsø à 600 km de Oulu)
Des racines C++17 très profondes
Les membres du comité de standardisation C++ n’avaient pas pu intégrer toutes les fonctionnalités qu’ils souhaitaient dans C++11 car cela aurait retardé d’autant plus la publication de cette version (déjà que la publication était prévue avant 2010…). Les membres avaient donc décidé d’intégrer les fonctionnalités mineures dans C++14 et de continuer à mûrir les fonctionnalités majeures pour C++17.
Par conséquent, C++17 n’a pas commencé à être construit au lendemain de la publication de C++14, mais bien avant : certaines parties datent du début des années 2000 !
Plus de 10 ans pour intégrer les fonctionnalités
Effectivement, certaines fonctionnalités sont dans le tuyau depuis plus de dix ans :
- Fonctions spéciales mathématiques depuis 2003 ;
std::filesystem
depuis 2004.
Par contre, d’autres fonctionnalités majeures sont toujours dans le tuyau :
- Concepts depuis 2003 ;
- Réflexion statique (à la compilation) depuis 2005 ;
- Intervalles (Ranges) depuis 2005 ;
- Modules (pour remplacer
#include
) depuis 2005 ; - Réseau depuis 2005 (qui a pris le nom définitif Networking fin 2005) ;
- Mémoire transactionnelle dont son objectif de 2012 était d’intégrer C++17 ;
- …
Comme quoi, le comité de standardisation prend son temps pour bien s’assurer que chaque fonctionnalité soit parfaite et cela peut prendre une dizaine d’années ! L’objectif étant de ne pas dégrader d’avantage la complexité inhérente au C++, avec comme contre partie d’avoir un langage de programmation qui évolue doucement…
Mais pourquoi autant de temps ?
Avant de répondre à cette question, voici un petit exercice. Il faut trouver la correction pour que le code C++ suivant compile :
struct MaClasse
{
template <class T>
void f() { }
};
template <class T>
void maFonction (T& t)
{
t.f<int>();
// ^~~ expected primary-expression before 'int'
}
int main()
{
MaClasse maclasse;
maFonction(maclasse);
}
Quelques compilateurs en ligne pour tester tes idées :
- gcc.godbolt.org de Matt Godbolt propulsé par GCC Explorer sous licence BSD-2-Clause ;
- coliru.stacked-crooked.com (astuce : remplacer
g++
parclang++
) ; - cpp.sh ;
- codepad.org ;
- ideone.com ;
- rextester.com ;
- tutorialspoint.com/compile_cpp11_online.php ;
- repl.it ;
- webcompiler.cloudapp.net (permet de vérifier la compilation avec Visual C++ sans installer Windows).
Le message d’erreur du compilateur GCC : (le texte du message n’a pas changé entre GCC-4.4 et GCC-6.2)
$ g++ enigme.cpp
enigme.cpp: In function ‘void maFonction(T&)’:
enigme.cpp:10:12: error: expected primary-expression before ‘int’
t.f<int>();
^~~
enigme.cpp:10:12: error: expected ‘;’ before ‘int’
Allez une grosse image pour ne pas être tenté de lire la réponse tout de suite.
Allez, deux indices : Primo, c’est du vieux C++98 (ne cherchez pas midi à C++14 heures) ; Secundo, ci-dessous le message d’erreur fourni par le compilateur Clang-3.8.
$ clang++ enigme.cpp
enigme.cpp:10:7: error: use 'template' keyword to treat 'f' as a dependent template name
t.f<int>();
^
template
Les plus rapides qui publient en commentaire une solution sans regarder la réponse ont gagné :-) Les vainqueurs auront le droit de poser en commentaire d’autres énigmes sur le thème des bizarreries du C++.
Encore une grosse image. On joue le jeu, on ne triche pas !
Réponse
Il manquait juste le mot clef template
à un endroit un peu inattendu :
struct MaClasse
{
template <class T>
void f() { }
};
template <class T>
void maFonction (T& t)
{
t. template f<int>();
// Oh le piège !
}
int main()
{
MaClasse maclasse;
maFonction(maclasse);
}
Cette syntaxe permet de dire au compilateur que T::f()
est template
quelque soit le type T
(plus précisément, ici en absence du mot clef typename
, le compilateur sait que c’est un appel à une fonction template
). En effet, sans le mot clef template
dans maFonction()
, le compilateur ne peut pas être sûr que T::f()
soit une fonction template
. Le compilateur pourrait seulement s’en douter et le vérifier lors de l’instanciation de maFonction<MaClasse>()
…
Avouons que ce n’est pas très joli joli, non ?
Ceux qui ont décidé de cette syntaxe doivent s’en mordre les doigts.
Mais revenons en à notre question, Mais pourquoi autant de temps ? L’hypothèse est que ce type de décisions du passé a traumatisé les membres du comité de normalisation du C++ : « ne recommençons pas les mêmes erreurs, ne nous précipitons pas, prenons le temps de bien mûrir les nouvelles fonctionnalités… »
Chère lectrice, cher lecteur de LinuxFr.org, à ton avis, pourquoi aussi peu de fonctionnalités majeures dans C++17 ?
C++1z ou C++17 ?
Historiquement, les versions C++ n’étaient pas publiées à date fixe. De plus, la version C++ qui devait suivre C++03 avait été reportée à maintes reprises. Cette version a été nommée temporairement C++0x. Et, finalement, C++0x a été publié en 2011 ! (mais bon en hexadécimal 0x = 11
est correct avec x = B
)
Afin d’éviter tout nouveau glissement, le comité a alors décidé de publier un nouveau standard C++ tous les trois ans, en figeant les fonctionnalités l’année n - 1. Avec un cycle d’une version majeure (C++11) suivie d’une version mineure (C++14).
Malgré des dates de publication figées, les appellations C++1y (pour C++14) et C++1z (pour C++17) perdurent. Par exemple, l’option de compilation -std=c++1z
ou l’étiquette c++1z sur stackoverflow.
Donc, C++1z est utilisé par les sceptiques pour désigner la version qui succédera à C++14. Et C++17 est utilisé pour désigner la version qui sortira en 2017.
Les membres du comité de normalisation utilisent le terme C++17 (et non pas C++1z). Soyons confiants, C++1z verra bien le jour en 2017 (et non pas en 2018, ni après).
La suite…
La prochaine dépêche va nous permettre d’entrer enfin dans le vif du sujet C++17.
Merci de nous donner un coup de main à la rédaction des prochaines dépêches C++17. Pour participer ou lire en avance les prochaines dépêches :
- se rendre sur l’espace de rédaction LinuxFr.org ;
- ou sur le dépôt Git materials du C++FRUG (Groupe des Utilisateurs C++ FRancophones).
Droit d’auteur, licences, remerciements
Le texte de cette dépêche est protégé par le droit d’auteur la gauche d’auteur et réutilisable sous licence CC BY-SA 4.0.
Merci aux nombreux auteurs sur le dépôt Git et sur LinuxFr.org : olibre, duckie, rom1v, Oliver H, Benoît Sibaud, cracky, palm123, Lucas, Adrien Dorsaz, RyDroid, M5oul, Storm et Martin Peres. Cette dépêche fut commencée en juin 2016 et contient plus de 1300 révisions !
Merci à Klaim, Édouard A, rewind, et gasche pour leurs commentaires pertinents.
Merci à mes collègues développeurs qui, à défaut de m’aider à la rédaction, ont illustré cette série de dépêches avec des dessins humoristiques sous licence libre :
- Les deux collègues qui discutent sur la sortie du C++17 sous licence CC BY-SA 3.0 est de AKP, et le texte de Oliver H. (2016). La note repositionnable jaune (post-it tout à droite du comic strip) sous licence CC0 est de Dave (2010) ;
- Le logo C++ Francophonie (disponible sur commons.wikimedia.org) est dans le domaine public (même si ce n’est théoriquement pas possible en droit d’auteur de France) ;
- L’analogie entre la présidentielle 2017 et C++17 sous licence CC BY-SA 3.0 est de Oliver H. (2016) ;
- Les deux chatons déçus sous licence CC BY-SA 3.0 ont été dessinés au crayon par Ziyue et retouchés (avec GIMP) par Oliver H. (2016) ;
- La fonctionnalité des Concepts repoussée de version en version sous licence CC BY-SA 3.0 est de Oliver H. (2016).
Et merci à ceux qui permettent de réutiliser leur travail :
- La photo du soleil de minuit de Harald Groven sous licence CC BY-SA 2.0 ;
- L’image “C++ sur un fond de type Matrix” a été réalisée par Marek Dekys (anciennement webblaster48) et publiée sous licence CC BY-NC-ND 3.0 en 2009 ;
- La police de caractères Purisa utilisée par deux des illustrations est maintenue par Theppitak Karoonboonyanan sous licence GPL-2 ;
- La police de caractères Gillius N°2 utilisée par la dernière illustration est de H. Harendal (Arkandis Digital Foundry) sous licence GPL v2 avec une exception permettant d’inclure la police de caractères dans un document sans que ce document doive lui aussi être sous licence compatible GPL.
Merci d’avance de l’aide apportée sur les prochaines dépêches C++17 en cours de préparation : Micka pour ses exemples utiles et AMB007 pour les bogues trouvés dans les codes C++ d’exemple.