Les coulisses du standard C++

99
20
août
2016
C et C++

Le C++ a bientôt la quarantaine et pourtant très actif en ce moment avec la finalisation de la prochaine version C++17. Profitons‐en pour faire le point avec une série d’articles sur le C++. Cette première dépêche nous dévoile la face cachée du C++, et donc peut intéresser tous les lecteurs LinuxFr.org. :-)

Évolution du langage C++

Sommaire

logo "The C++ Programming Language"

Dépêches C++

Chère lectrice, cher lecteur de LinuxFr.org. Tes collègues sont en vacances et tu cherches à t’occuper ? Ou alors, tu es en vacances et l’actualité informatique te manque déjà ? Eh bien, voici une première dépêche d’une longue série sur le C++. Ainsi, tu seras en avance technologique dès la rentrée.

Résumé des dépêches :

  1. Cette première dépêche, Les coulisses du C++, présente la naissance du langage, puis du standard, sa spécification non libre, payant, ouvert, délaissé au profit de son brouillon (draft), peu lu par les développeurs C++, évoluant lentement mais sûrement…

  2. La deuxième dépêche, Genèse du C++17, reviendra sur les dernières réunions du comité de normalisation.

  3. La troisième dépêche, Nouveautés C++17 du langage, présentera des changements du langage très intéressants : déduction des arguments template std::array a{1,2,3};, décomposition du retour de fonction auto [x, y] = f(); , namespace aa::bb{} équivalent à namespace aa{ namespace bb{}}, if constexpr sélectionne du code à la compilation, lambda constexpr, lambda capture *this, if(init;condition) comme for(init;cond;inc), variables inline… Mais il faudra encore attendre pour l’intégration des Concepts, Modules, Syntaxe d’appel uniforme et Réflexion.

  4. 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 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), le réseau (networking) seront intégrés pour une version ultérieure.

  5. 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 (donc déjà supportées par un large panel d’anciens compilateurs). Conséquences sur le processus de normalisation ? Qu’attendre de C++20 ? Intérêt du C++ aujourd’hui ? Et les langages alternatifs ? Comment s’impliquer ?

  6. … d’autres dépêches à venir. :-)

Logo C++FRUG représenté par un gros "C++" au centre du cercle de la Francophonie

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. C’est là aussi que tu trouveras les versions de ces dépêches les plus à jour :

  1. Les coulisses du standard C++ ;
  2. Genèse d’une version mineure ;
  3. Nouveautés du langage ;
  4. Nouveautés de la bibliothèque standard ;
  5. 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, un article Wikipédia C++17 en français. :-)

Naissance d’un nouveau langage

À la fin des années 70, dans la cadre de sa thèse en Angleterre, le Danois Bjarne Stroustrup étudiait le paradigme de la programmation objet (avec le langage Simula). En 1979, aux Laboratoires Bell (États‐Unis), Bjarne propose de rajouter ce paradigme objet au langage C qu’il appela « C with Classes ».

Durant les années 80, les nouvelles fonctionnalités qui sont progressivement intégrées au tout nouveau C++ provoque un schisme entre les fans du C classique et les enthousiastes du C++.

Bjarne Stroustrup

Création du comité de normalisation C++

Dans la seconde moitié des années 80, le usenet comp.lang.c++ bouillonne, les premiers compilateurs C++ commencent à diverger, les développeurs ont du mal à écrire du C++ portable et dix ans après la création du C with Classes, des événements majeurs se produisent :

  • avril 1989, le groupe de travail WG14 (comité du C) souhaite une normalisation du C++ ;
  • mai 1989, à la demande du WG14, Andrew Koenig et Bjarne Stroustrup rédigent C++: as close as possible to C — but no closer, pour expliquer les divergences (incompatibilités) du C++ par rapport au C (ce qui est valide en C et qui ne l’est pas en C++) ;
  • juillet 1989, Dmitry Lenkov explique la création d’un groupe de travail C++ officiel et d’y inclure d’office Bjarne Stroustrup ;
  • février 1990, première réunion du comité ANSI C++ ;
  • juin 1991, la réunion du comité ANSI C++ réunit de très nombreux participants non états‐uniens et la décision est prise de travailler conjointement avec le groupe de travail WG21 international.

Organisation du WG21

Sigle   Définition
ISO Organisation internationale de normalisation
IEC Commission électrotechnique internationale
JTC 001 Joint Technical Committee 001
SC 22 Subcommittee 22 (sous‐comité 22) dédié aux langages de programmation, leur environnement et les interfaces avec les logiciels système
WG 14 Working Group 14 (groupe de travail 14) dédié au langage C (WG 14 sur le site de l’ISO)
WG 21 Working Group 21 dédié au C++ (WG 21 sur le site de l’ISO)

La puissance du C++

En 1991, un nouveau paradigme, la programmation générique (template) est ajouté, ainsi que les exceptions.

Le C++ devient alors un formidable langage alliant un découplage puissant et la performance du code exécutable optimisé par les compilateurs C adaptés (cette flexibilité est très bien illustrée dans l’excellent journal Expressions template pour les nuls de serge_sanspaille_). Mais cette compatibilité avec le langage C contraint à utiliser une grammaire pas toujours simple et un temps de compilation souvent long.

En 1994, Erwin Unruh présente au comité C++ un code source qui permet de calculer les nombres premiers à la compilation. Pour une partie des membres du comité, c’était une curiosité. Tandis que les autres membres se grattaient la tête et prirent conscience que l’on venait de découvrir, par hasard, que les templates du C++ permettaient le paradigme de la métaprogrammation !

Cette découverte ouvre la voie à d’extraordinaires optimisations en permettant au compilateur de réaliser des calculs à la compilation (à ne pas confondre avec la réalisation de calculs à l’initialisation ou durant l’exécution). Ces techniques atteignent des sommets avec boost::mpl (2002), boost::proto (2008) et le futur boost::simd.

Au détriment d’une grammaire difficile, des erreurs faciles, d’une compilation lente et d’un débogage laborieux. Mais c’est un des rares langages qui offre au développeur autant d’abstraction et de performance en même temps. La passion de ce langage l’emporte. Avec le temps, les pièges sont connus, les techniques maîtrisés, et le C++ devient un vrai bonheur. :-)

De plus, ce langage bien vivant continue d’évoluer dans le bon sens. Les très nombreux outils qui orbitent autour de ce formidable langage continuent aussi d’apporter plein de nouvelles fonctionnalités. :-D

C++ entouré d'autres langages de programmation

Les membres du comité de normalisation

En 1998, les membres finalisent le premier standard C++ : C++98. Soit une vingtaine d’années après la création du langage, et une dizaine d’années après l’initiative de normaliser celui‐ci.

Pour devenir membre du comité international de normalisation du C++, appelé officiellement ISO/IEC JTC 001/SC 22/WG 14/WG 21, il faut être membre d’une représentation ISO de son pays. Une dizaine de pays est représentée :

C’était IBM qui payait les frais de représentation du Comité de Normalisation Cpp de l’AFNOR. Mais, au départ à la retraite des employés IBM membres C++, plus personne ne payait les frais de représentation et la France n’était plus officiellement représentée. Depuis peu, les choses sont rentrés dans l’ordre.

Une centaine de membres actifs se rencontrent quelque fois par an dans le cadre de la normalisation du C++ (essentiellement pour voter). Le plus gros du travail se fait à distance. Les membres C++ et les autres passionnés du C++ se rencontrent également lors des grandes rencontres du C++ : CppCon, C++Now, Meeting C++

Logo CppCon Logo C++Now

Dans l’intérêt des utilisateurs du C++, les membres du comité accordent au comité et à l’ISO une licence mondiale, non exclusive, irrévocable, permettant l’octroi d’une sous‐licence transférable pour l’affichage du contenu, la reproduction, l’adaptation, la distribution, la création de travaux dérivés à des fins commerciales ou non commerciales. En 2012, cette règle a notamment été rappelée à IBM, Intel et Oracle (voir N3423 §2.4).

Le standard ne peut être reproduit

Comme la plupart des documents publiés par l’ISO, la mention de droit d’auteur indique que la reproduction n’est pas autorisée :

Logo ISO
© ISO/IEC 2014 — All rights reserved

COPYRIGHT PROTECTED DOCUMENT

All rights reserved. Unless otherwise specified, no part of this publication may be reproduced or utilized otherwise in any form or by any means, electronic or mechanical, including photocopying, or posting on the internet or an intranet, without prior written permission.
Permission can be requested from either ISO at the address below or ISO’s member body in the country of the requester.

Cette position est la même pour les autres langages gérés par l’ISO (Fortran, C…). Mais aussi pour Java, C# et de nombreux autres.

Dans la pratique, cela ne gène pas les développeurs de ces langages. Ce type de mention empêche juridiquement la reproduction du standard (même un paragraphe ou un code d’exemple). Des sites qui respectent à la lettre le droit d’auteur, comme Wikipédia, refusent de contenir la reproduction même partielle d’un tel document. D’autres sites, comme stackoverflow, sont plus pragmatiques.

Notons que d’autres langages de programmation ont des spécifications libres :

Le standard est payant

De plus, obtenir le standard C++ coûte cher. Même la version PDF téléchargée :

(voir aussi d’autres sites vendant le standard)

Logo C++ en forme hexadécimal

Les anciens standards supprimés

Encore plus incroyable : chaque nouvelle publication du standard révoque ou supprime (withdraw) la version précédente :

L’embêtant est que la plupart des projets C++ actuellement utilisés sont codés en C++03. Et la plupart des entreprises utilisent encore aujourd’hui des versions de compilateurs qui ne supportent pas (ou partiellement) le standard C++11.

Alors, comment s’informer du standard C++ utilisé par le bon vieux compilateur que l’on est obligé d’utiliser ? Aller les consulter à l’INRIA ? Par exemple, cet utilisateur a besoin d’acheter le standard C++03 qui n’est plus à la vente.

Ouf, les brouillons du comité

Les documents en cours de rédaction (draft) du comité de normalisation sont gratuitement accessibles :

Quand le comité de normalisation C++ valide un brouillon (nouvelle version C++), ce brouillon bénéficie de dernières corrections. Puis, le comité le fournit à l’ISO qui change la mise en forme pour en faire une version officielle.

Documentations C++ de référence

Les standards C++ (officiels ou brouillons) ne sont pas simples à lire. Ces documents utilisent une terminologie très spécifique pour une spécification très rigoureuse. En fait, ces documents sont surtout utiles aux développeurs des compilateurs et à ceux qui implémentent des bibliothèques standards (std::).

Les utilisateurs du C++ (langage et bibliothèque standard) utilisent historiquement des livres (souvent ceux écrits par Bjarne Stroustrup et Scott Meyers) et plus récemment des sites Web :

  • fr.cppreference.com en français sous double licence CC BY-SA 3.0 et GFDL (disponible en différentes langues, la version en anglais est la plus à jour) ;
  • cplusplus.com seulement en anglais et n’autorisant pas la reproduction (pas de licence libre) ;
  • … liste à compléter dans les commentaires.

    livre _The C++ Programming Language_ livre _A Tour of C++_ livre _The C++ Programming Language (Special 3rd Edition)_ logo cppreference.com

Un standard ouvert

Note des auteurs de cette dépêche : Nous avons un profil plutôt technique (développeurs) et non pas juriste. Ce chapitre contient peut‐être des erreurs importantes, mais nous avons tenté de rédiger ce qui nous semble correct… Nous n’avons pas pris le risque de nous aventurer à comparer C++ avec Java, C#… Celles et ceux qui connaissent bien le sujet, merci de nous éclairer dans les commentaires. :-)

Le C++ est bien un standard ouvert, sans brevet logiciel, sans propriété intellectuelle. C’est‐à‐dire que le langage et sa bibliothèque standard (API) peuvent être implémentés librement.

De même, le nom C++ n’est pas une marque, ni aucun type de propriété intellectuelle. À la différence de la marque JavaScript® déposée par Oracle, ou des marques non déposées Rust™, Go™ (et une autre Go™).

Et, même si C++ n’est pas encore aussi ouvert que peut l’être Rust™, de nombreux membres du comité améliorent constamment la façon de travailler pour plus de transparence et plus de proximité avec les utilisateurs C++, comme l’utilisation d’un compte GitHub.

Les versions C++

Même si le langage naît à la fin des années 1970, il n’est normalisé que vingt ans plus tard, afin d’arrêter la profusion de versions C++ incompatibles.

Le tableau suivant liste les différentes versions C++ normalisées, ainsi que le brouillon C++17 en cours de consolidation. Nous pouvons remarquer le saut considérable du nombre de pages entre C++03 et C++11.

Version Pages
C++98 ISO/IEC 14882:1998 1998-09-01 776 pages
C++03 ISO/IEC 14882:2003 2003-10-15 786 pages (+ 1 %)
C++11 ISO/IEC 14882:2011 2011-09-01 1356 pages (+ 73 %)
C++11 Draft N3376 2012-02-28 1 324 pages
C++14 Draft N4296 2014-11-19 1 368 pages (+ 3 %)
C++17 Draft N4606 2016-07-12 1 586 pages (+ 16 %)

Attention, ce dernier lien est celui du brouillon C++17 le plus récent lors de la rédaction de cette dépêche. Cette version sera certainement obsolète quelques mois après la publication de cette dépêche.

Ceux qui ont l’œil aiguisé remarqueront que le brouillon N3376 représentant la version C++11 a été publiée (28/02/2012) après la norme officielle 14882:2011 (1/09/2011). Ce N3376 correspond en fait à des corrections éditoriales mineures apportées au brouillon N3291 fourni à l’ISO. C’est le premier brouillon de post‐publication, le first post‐publication draft en anglais.

Analogie entre chaque version C++ et l'évolution depuis le singe jusqu'à homo sapiens puis homo sapiens se courbe de plus en plus pour se retrouver devant un ordinateur qui correspond à la version C++17 et ce dernier homme moderne dit Cool  On va pouvoir coder

Technical Specification (TS)

Les spécifications techniques, notées TS pour Technical Specification, sont les documents de travail les plus importants du comité de normalisation. Ces documents sont la base de discussion des évolutions du standard.

Généralement, les spécifications techniques sont composées de deux parties :

  • la première partie donne les motivation du changement (l’avantage d’avoir telle fonctionnalité dans le C++ avec des exemples de code) ;
  • la seconde partie liste toutes les modifications à appliquer au standard C++ en cours de rédaction (au draft).

Illustration C++ de Dominic Alves sous license CC-BY-SA 2.0

Numérotation des documents

À partir de 1990, le comité numérote ses documents officiels sur quatre chiffres en commençant par le n°0000. Ce numéro est incrémenté pour chaque nouveau document ou nouvelle révision d’un document.

En 1991, le préfixe N est adoptée, et le premier document à en profiter est le N0007. N comme Number (numéro).

Ces numéros xxxx peuvent paraître obscurs, mais sont très importants, car ils sont utilisés comme références rigoureuses aux fonctionnalités C++ :

  • dans les échanges entre membres du comité ;
  • par de nombreux sites Web.

Pour faire le lien entre les principales spécifications techniques (TS) et leur numéro xxxx de révision la plus récente, une astuce est d’utiliser la page experimental sur cppreference.com.

Voici, en exemple, l’historique des TS à propos des Modules :

Année Numéro Titre Révision
2004 N1736 Modules in C++ 1
2005 N1778 Modules in C++ 2
2006 N1964 Modules in C++ 3
2006 N2073 Modules in C++ 4
2007 N2316 Modules in C++ 5
2012 N3347 Modules in C++ 6
2014 N4047 A Module System for C++ 1
2014 N4214 A Module System for C++ 2
2015 N4465 A Module System for C++ 3
2016 P0142R0 A Module System for C++ 4

Remarquons le changement de nommage pour la révision de 2016. Le nouveau nommage PxxxxRx a été mis en place en septembre 2015 avec un P comme Proposal (Proposition). Progressivement, les PxxxxRx doivent remplacer les Nxxxx. L’avantage est de conserver le même numéro xxxx pour toutes les révisions du document.

Comme en C++, on commence par compter la première Révision à partir de R0. L’exemple ci‐dessus est un cas particulier : R0 est bien la première révision du nouveau format, mais la quatrième révision des documents A Module System for C++.

Defect Report (DR)

Même après moult relectures par les meilleurs experts C++ au monde, avec toutes les précautions prises par les institutions officielles, les publications des standards C++ contenaient 5 000 anomalies ayant fait l’objet, chacune, d’un rapport d’anomalie (Defect Report) !

Lors de ses réunions, le comité discute des rapports d’anomalie et devrait publier régulièrement des rectificatifs techniques (Technical Corrigendum). Mais le comité n’a jamais publié aucun rectificatif technique à ce jour !

Par exemple, le comité avait approuvé un rectificatif technique en 2003. Et, finalement, le comité publie comme étant une nouvelle version du standard, le C++03 :

A technical corrigendum was approved in 2003, and the standard was published again as the ISO/IEC 14882:2003 edition, published 2003-10-16.

Bon, c’est vrai, à la décharge du comité, ce rectificatif technique de 2003 contenait une nouvelle fonctionnalité : Value initialization. C’était la dernière fois, que le comité avait travaillé sur un rectificatif technique.

Néanmoins, même si le comité ne publie aucun rectificatif technique, les rapports d’anomalie approuvés doivent être pris en compte par les compilateurs. Des sites comme cppreference.com listent les changements induits par ces rapports d’anomalie :

Les versions officielles du C++ deviennent donc vite obsolètes après leur publication, car ces documents sont figés et ne bénéficient pas des corrections apportées par les rapports d’anomalie. Par conséquence, celui qui achète une version officielle du standard C++, devrait aussi suivre tous les rapports d’anomalie approuvés par le comité…

Pour terminer, notons aussi que des rapports d’anomalie approuvés lors d’une réunion du comité se retrouvent ne plus être approuvés lors de la réunion suivante.

Alors, chère lectrice, cher lecteur de LinuxFr.org, es‐tu étonné(e) par ce fonctionnement. Connais‐tu d’autres façons de maintenir un tel document ? Comment cela se passe‐t‐il dans d’autres langages de programmation ? As‐tu des idées d’amélioration ?

Un langage compliqué qui se simplifie

Par rapport à tous les langages utilisés en production, avouons que le C++ est peut‐être le langage le plus complexe que l’humanité ait pu inventer ! Les développeurs C++ en ont bien conscience. C’est peut‐être la raison pour laquelle les participants aux meetups se montrent souvent bienveillants à l’égard des autres langages. Les développeurs C++ aimeraient un langage plus simple, à condition de « ne pas sacrifier la sacro‐sainte performance ».

Le C++ est tellement vaste et semé de subtilités, que les développeurs C++ n’en connaissent bien souvent qu’une petite portion. Ainsi, lors d’un entretien de Bjarne Stroustrup (un des experts C++ les plus actifs du comité), celui‐ci avait indiqué qu’il connaissait seulement 60 % du standard. Ceux qui maîtrisent vraiment le C++ sur le bout des doigts sont appelés des juristes du C++, ou plus généralement « language lawyers » en anglais (ils ne sont pas forcément de bons développeurs).

Bjarne Strouput

Pour inverser la tendance, certains membres du comité de normalisation, comme Bjarne Stroustrup (le créateur du C++) souhaitent accélérer l’évolution du langage vers un C++ plus intuitif, plus sûr, et toujours plus performant.

Un processus de normalisation qui s’ouvre davantage

C’est dans ce cadre que l’initiative C++ Core Guidelines (Recommandations C++) a été lancée. A la fois pour proposer un sous‐ensemble du C++ plus sûr, plus simple et sans sacrifier les performances. Mais aussi pour faire pression sur les membres du comité pour adopter les idées de la Guidelines Support Library (Bibliothèque de support des recommandations) activement implémentée sur le dépôt Git de Microsoft, mais aussi sur le dépôt Git de Martin Moene qui est compatible avec beaucoup plus de compilateurs.

Pour faciliter les contributions au standard, le comité a aussi migré sur GitHub. Le standard en cours de rédaction/maintenance est sur le dépôt Git draft (brouillon). L’intégration d’une fonctionnalité au brouillon (standard en cours de rédaction) est souvent formalisée par une fusion (merge) d’une branche Nxxxx vers la branche master.

Cycle de publication triannuel

Après la version majeure C++98 (et son correctif C++03), un nouveau standard C++ devait être publié dans les années suivantes. Comme sa date de publication n’était pas fixée, cette version a été nommée temporairement C++0x.

Mais, avec le manque de maturité de certaines fonctionnalités et les requêtes continuelles d’ajout de nouvelles fonctionnalités, le comité de normalisation n’arrivait pas à stabiliser le standard. Et, finalement, C++0x a été publié en 2011 ! Ne perdons pas la face, 0x = 11 est correct mathématiquement avec x = B en hexadécimal :-)

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.

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).

Implémentation de référence

Le comité ne fournit pas plus d’implémentation de référence ou de preuve de concept. Mais les membres du comité travaillent en étroite collaboration avec les éditeurs de compilateurs (notamment GCC et LLVM/Clang).

logo GCC logo LLVM

Néanmoins, en 1999, des membres du comité ont quand même créé le projet Boost.org afin de proposer et valider des implémentations de fonctionnalités candidates de la bibliothèque standard. Ainsi, dès 2005, la publication du brouillon C++ TR1 est en lien direct avec les développements fournis par le projet Boost.org.

logo Boost.org

D’ailleurs, c’est devenu le parcours classique pour les nouveaux composants de la bibliothèque standard. C’est, par exemple, le cheminement de std::filesystem. Et plus récemment, quand le Français Joël Falcou a proposé la fonctionnalité SIMD, les membres du comité l’ont invité à intégrer Boost dans un premier temps. Cela permet également de vérifier la popularité d’un composant.

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 :

Droit d’auteur, remerciements et licences

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, cracky, Lucas, palm123, Adrien Dorsaz, Martin Peres, RyDroid, M5oul, Anthony Jaguenaud et Benoît Sibaud. Merci aussi à Klaim, Édouard A, rewind, David Demelier, gasche, freem et ®om pour leurs commentaires pertinents.

Aussi un immense merci à mes collègues développeurs qui, à défaut de m’aider à la rédaction, ont illustré cette dépêche (et les dépêches suivantes) avec des dessins humoristiques sous licence libre : Ziyue, AKP, Florent B, et Jae-Zun. Merci aussi à Dominic Alves pour son dessin C++ sous licence libre. Merci à Theppitak Karoonboonyanan pour maintenir la police de caractères Purisa.

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.

  • # Dépêche actuelle et la suite

    Posté par (page perso) . Évalué à 10. Dernière modification le 21/08/16 à 00:30.

    Cette dépêche est figée (sauf gentillesse des modérateurs pour de grosses erreurs).
    Alors merci de corriger les oublis, imperfections, fôtes, franglais, mensonges, maladresses, irritations… sur le dépôt Git :
    https://github.com/cpp-frug/materials/blob/gh-pages/news/2016_n1_Coulisses-du-standard.md
    (même des années après la publication).
    Donc, c'est aussi là qu'il faut aller pour lire la version la plus à jour de cette dépêche ;-)

    La rédaction de la dépêche suivante "C++17, Genèse d'une version mineure" se passe sur LinuxFr.org :
    https://linuxfr.org/redaction/news/c-17-genese-d-une-version-mineure
    (un compte LinuxFr.org est nécessaire pour accéder à l'espace de rédaction collaborative)
    C'était la dépêche originelle qui a été tronçonnée en plusieurs articles, du coup elle en est déjà à 1241 éditions !
    (j'avais commencé la rédaction fin juin 2016)

    Un immense merci à tous ceux qui m'ont aidé à la rédaction de cette dépêche. Tout le monde n’apparaît pas parmi les auteurs en entête de dépêche car leurs contributions ont été apportées sur la dépêche originelle avant le tronçonnage ou proviennent du dépôt Git. Voici la liste complète des auteurs, même pour des changements mineurs :

    J'ai beaucoup apprécié les modérateurs LinuxFr.org qui ont patiemment corrigé mes tournures de phrases. Pour anecdote, à deux fois au mois de juillet, j'avais cru avoir terminé la rédaction de la dépêche originelle (avant le tronçonnage) et j'avais donc posté un message pour une ultime relecture avant soumission : Benoît Sibaud avait tout relu, tout corrigé… et finalement ce n'était pas encore prêt ! Merci aussi aux nombreuses aides, notamment à Klaim et Édouard A du C++FRUG pour m'avoir donné de nombreux conseils par e-mail ;-)

    Les illustrations francophones réalisées spécialement pour l'occasion sont sympas, non ?
    Elles proviennent de mes collègues développeurs C++ dont Ziyue, Florent B et AKP :-D
    https://github.com/cpp-frug/materials/blob/gh-pages/images/README.md
    Tout est sous licence libre et je peux fournir les fichiers XCF si besoin…
    Merci de partager vos dessins si vous vous avez des idées ;-)

    Commentaire sous licence Creative Commons Zero CC0 1.0 Universal (Public Domain Dedication)

    • [^] # Re: Dépêche actuelle et la suite

      Posté par . Évalué à -10.

      Les illustrations francophones réalisées spécialement pour l'occasion sont sympas, non ?
      Non.

      Ca fait un peu bricolage/remplissage ou panneau publicitaire c'est pas beau.

      • [^] # Re: Dépêche actuelle et la suite

        Posté par . Évalué à -10.

        Les livres par exemple ne peuvent pas être disposé sur une seul ligne plutot qu'en colonne ?

        • [^] # Re: Dépêche actuelle et la suite

          Posté par (page perso) . Évalué à 4.

          Pour illustrer cette série de dépêches C++, mes collègues m'ont dessiné des images.
          C'est ce que j'appelle les illustrations francophones réalisées spécialement pour l'occasion.
          Elles sont toutes disponible sur le dépôt Git :
          https://github.com/cpp-frug/materials/blob/gh-pages/images/README.md
          (mais je n'ose pas y déposer les fichiers XCF volumineux, vous pouvez me les réclammer)

          Pour info, les illustrations des livres C++ n'ont font pas partie.
          Le moteur de rendu de LinuxFr.org pourrait les afficher sur la même ligne :

          ![livre _The C++ Programming Language_](https://isocpp.org/files/img/tcpl4e.png) ![livre _A Tour of C++_](https://isocpp.org/files/img/tour.jpg) ![livre _The C++ Programming Language (Special 3rd Edition)_](http://www.pdfdrive.net/assets/thumbs/069/069cb03b9970368939ef71f49534cc4b-s.jpg)

          Mais LinuxFr.org insère un retour chariot entre chaque images :
          livre _The C++ Programming Language_ livre _A Tour of C++_ livre _The C++ Programming Language (Special 3rd Edition)_

          GitHub les affiche bien sur la même ligne :
          https://github.com/cpp-frug/materials/blob/gh-pages/news/2016_n1_Coulisses-du-standard.md#documentations-c-de-r%C3%A9f%C3%A9rence-
          Mais ce dernier alignes toutes les images sur la gauche, ce qui n'est pas toujours joli.

          Commentaire sous licence Creative Commons Zero CC0 1.0 Universal (Public Domain Dedication)

          • [^] # Re: Dépêche actuelle et la suite

            Posté par . Évalué à -3. Dernière modification le 21/08/16 à 23:50.

            Je tiens à m'excuser je veux éviter toute confusion les illustrations sont très bien je parlais simplement des livres et de leur alignement.

            De plus j'aurai pu mentionner que j'ai apprécié la lecture qui donne envit de lire du C++ à des gens qui ne lisent pas le C++.

            En parcourant rapidement rien que cette histoire de template est allucinante pour moi qui fait du ladder, et la photo du dévelopeur est plutot cool, qui est ce ?

          • [^] # Re: Dépêche actuelle et la suite

            Posté par (page perso) . Évalué à 9.

            livre _The C++ Programming Language_ livre _A Tour of C++_ livre _The C++ Programming Language (Special 3rd Edition)_

            Hmm on peut mais bon niveau Markdown c'est tordu (tableau avec des en-têtes vides).

            • [^] # Re: Dépêche actuelle et la suite

              Posté par (page perso) . Évalué à 2.

              Merci Benoît pour l'astuce. Veux-tu bien apporter cette correction à la dépêche ?
              Il faudrait faire de même avec les images CppCon - C++Now, et tout en bas avec GCC - LLVM.
              Merci :-)

              Commentaire sous licence Creative Commons Zero CC0 1.0 Universal (Public Domain Dedication)

              • [^] # Re: Dépêche actuelle et la suite

                Posté par (page perso) . Évalué à 7.

                Fait. Au passage tu peux récupérer le code Markdown si tu veux détecter les modifications post-modération (j'en ai fait plusieurs pour enlever la majuscule sur les langues et sur d'autres aspects orthographiques mineurs).

                • [^] # Re: Dépêche actuelle et la suite

                  Posté par (page perso) . Évalué à 5.

                  C'est super sympa, merci Benoît pour tes contributions :-)
                  Le contenu Markdown de la dépêche LinuxFr.org est régulièrement synchronisé avec la version sur le dépôt Git ;-)

                  En ce moment, je suis en vacances avec la connexion de mon mobile.
                  Et c'était plus facile de contribuer sur le dépôt Git local que sur l'espace de rédaction LinuxFr.org.
                  Alors je me demandais si chaque dépêche LinuxFr.org ne pouvait pas être un dépôt Git.
                  En mode rédaction :

                  • l'interface web LinuxFr.org envoie ses requêtes HTTP comme d'hab vers le serveur en Ruby, mais ce dernier réalise des opérations de commit sur un dépôt Git (en cas de conflit de merge, le contenu à résoudre est envoyé au rédacteur) ;
                  • possibilité de cloner en local la dépêche en cours de rédaction pour être éditée sans connexion HTTP et avec l'éditeur de son choix.

                  Commentaire sous licence Creative Commons Zero CC0 1.0 Universal (Public Domain Dedication)

            • [^] # Re: Dépêche actuelle et la suite

              Posté par . Évalué à 10.

              20 ans d'évolution du HTML/CSS pour ressortir une mise en page en tableau… C'est dommage.

              Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

              • [^] # Re: Dépêche actuelle et la suite

                Posté par (page perso) . Évalué à 6.

                Le Markdown n'a que 12 ans, c'est pour ça :). (enfin 2 ans seulement pour CommonMark et quelques mois pour les dernières RFC).

                • [^] # Re: Dépêche actuelle et la suite

                  Posté par . Évalué à 6.

                  En partant d'un commentaire sur un autre journal, je suis tombé sur cette présentation du protocole HTTP2. Le code se trouve sur github et est au format markdown. Au chapitre 2, par exemple, on peut voir des illustrations flottantes autour de certains paragraphes. Je me suis alors demandé comment il faisait cela, et en fait pour les images ils permettent le code html avec des propriétés CSS :

                  <img style="float: right;" src="https://raw.githubusercontent.com/bagder/http2-explained/master/images/page-load-time-rtt-decreases.png" />
                  

                  (source)

                  Ne pourriez-vous pas faire de même ? Au moins au niveau de l'équipe de modération avant publication, tant il est vrai que la mise en page à base tableau c'est un peu old-school. :-P

                  Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

    • [^] # Re: Dépêche actuelle et la suite

      Posté par . Évalué à 4.

      Elles proviennent de mes collègues développeurs C++ dont Ziyue, Florent B et AKP :-D
      https://github.com/cpp-frug/materials/blob/gh-pages/images/README.md

      Vraiment rigolo :)
      Continuez….

    • [^] # Re: Dépêche actuelle et la suite

      Posté par . Évalué à 7.

      Les illustrations francophones réalisées spécialement pour l'occasion sont sympas, non ?
      Elles proviennent de mes collègues développeurs C++ dont Ziyue, Florent B et AKP :-D
      https://github.com/cpp-frug/materials/blob/gh-pages/images/README.md
      Tout est sous licence libre et je peux fournir les fichiers XCF si besoin…

      Elles sont très sympas :)

      Par contre quel est l'intérêt d'écrire (ici)

      auto i {0};

      plutôt que

      int i = 0;

      Je comprends bien le mot clef auto et le pseudo constructeur à base de {}, mais je vois pas ce que ça apport ici dans une boucle.

      Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

      • [^] # Re: Dépêche actuelle et la suite

        Posté par . Évalué à 1.

        De la même manière, "\n" ou << std::endl ?

        • [^] # Re: Dépêche actuelle et la suite

          Posté par . Évalué à 8.

          std::endl force le flush du flux, ce qui n’est pas le cas de \n. Donc dans le cas présent, il y a une réelle différence.

          Mes commentaires sont en wtfpl. Une licence sur les commentaires, sérieux ? o_0

      • [^] # Re: Dépêche actuelle et la suite

        Posté par . Évalué à -10.

        Tu préfères le vert ou tu préfères le gris ?

        • [^] # Re: Dépêche actuelle et la suite

          Posté par . Évalué à 5.

          Euh… Je préfère un type explicite surtout quand la version inférée est plus longue. Question de lisibilité.

          Là la seule chose que je vois pour cette solution, c'est de montrer qu'on fait du C++11 ou supérieur.

          Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

          • [^] # Re: Dépêche actuelle et la suite

            Posté par . Évalué à 0.

            C’est dans l’idée du AAA (« Almost Always Auto »). par exemple.

            Le seul bénéfice que j’y vois dans le cas présent (la boucle for), c’est de s’habituer à utiliser auto.

            Mes commentaires sont en wtfpl. Une licence sur les commentaires, sérieux ? o_0

            • [^] # Re: Dépêche actuelle et la suite

              Posté par (page perso) . Évalué à 4.

              C++17 à l'école primaire


              auto i{0}

              C'est barmic qui a la meilleure intuition pour la raison du auto i{0} à la place de int i=0 :
              C'est une nouveauté de C++17 introduite par la Technical Specification N3922 "New Rules for auto deduction from braced-init-list" (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html). Cette image doit illustrer cette nouveauté (et donc l'exemple fonctionne avec C++17 seulement). Mais n'en parlons pas trop tôt, gardons cette discussion pour la dépêche n°3…

              Promis, je vais générer une autre image avec :

              for (int i = 0; i < 100; ++i)

              std::endl

              Et c'est whity qui a trouvé une des raisons du "\n" à la place de << std::endl. Mais la raison principale est l'espace utilisé sur le tableau. Je voulais le code le plus simple, le moins large, avec le moins d’accolades…

              Qui préfère l'écriture ci-dessous ?

              int main()
              { 
                for (auto i{0}; i < 100; ++i)
                  std::cout
                    << "Je ne dois pas jeter d'avion en papier en classe"
                    << std::end; 
              }

              Ou encore, cette autre alternative ?

              int main()
              { 
                for (auto i{0}; i < 100; ++i)
                  std::cout <<
                       "Je ne dois pas jeter"
                       "d'avion en papier"
                       "en classe"   "\n"; 
              }

              L'objectif étant de trouver un bon compromis entre élégance du C++ et la rapidité de compréhension du code.

              Promis aussi, je vais mettre ce gros fichier XCF (178 Mo) quelque part pour que vous puissiez facilement personnaliser le texte du tableau ;-)

              Commentaire sous licence Creative Commons Zero CC0 1.0 Universal (Public Domain Dedication)

              • [^] # Re: Dépêche actuelle et la suite

                Posté par . Évalué à 4.

                Promis, je vais générer une autre image avec :[…]

                Ne te fais pas cette peine. C'était vraiment pour savoir s'il y avait autre chose qui m’échappait.

                Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

              • [^] # Re: Dépêche actuelle et la suite

                Posté par . Évalué à -10. Dernière modification le 23/08/16 à 22:38.

                «Je vais te dire non !» Si tu as fait le choix de cette syntaxe c'est que tu n'as rien compris à le C++.

                Si tu enseignes le C++ tu ne peu pas commencer par simplifier une structure standardisée par celle là qui introduit un faux ami : auto.

                Tu ne peu pas faire cette impasse. Cela montre que tu n'as pas de recul sur ton texte et lorsque tu vas faire une implémentation en septembre ca ne sera pas bon.

                Il faut initialiser la variable telle que i = 0 dans ta fonction main().
                Si tu ne fais pas cela tu fais une impasse importante sur le vrai enjeu du comment du pourquoi tu crée ta boucle for avec C++.

                Je développement un programme pour automatiser une procédure, je choisi une syntaxe lisible et simple à comprendre, je ne tombe pas dans le piège grossier qui est tendu devant mes pieds. Pourquoi apprendre l'obfusquation de code au moment où développement des concepts fondamentaux est de mise ?

                Parfois on dit que pour expliquer un concept il faut faire l'abstraction de choses importantes, là tu ne peux pas ne pas l'expliquer ou tu crée une zone d'ombre dans l'esprit de ton interlocuteur qui est trop importante pour la suite.

                • [^] # Re: Dépêche actuelle et la suite

                  Posté par (page perso) . Évalué à 5.

                  Je développement un programme pour automatiser une procédure, je choisi une syntaxe lisible et simple à comprendre

                  Tu devrais surtout bosser ta syntaxe sur tes posts…

                  • [^] # Re: Dépêche actuelle et la suite

                    Posté par . Évalué à -9.

                    Si j'avais utilisé HTTPS correctement je n'aurai aucun doute sur le fait c'est bien moi qui ai pu écrire une telle phrase…

                    «Si je développe un programme pour automatiser une procédure, je choisis une syntaxe lisible et simple à comprendre»

              • [^] # Re: Dépêche actuelle et la suite

                Posté par (page perso) . Évalué à 7.

                Il y a plus simple:

                std::fill_n(std::ostream_iterator<string>(std::cout), 100, "Je ne dois pas jeter d'avion en papier en classe");

                http://devnewton.bci.im

                • [^] # Re: Dépêche actuelle et la suite

                  Posté par . Évalué à 10.

                  Qu'est-ce que c'est ignoble…

                  Quand on sait qu'en ruby c'est :

                  100.times { puts "Je ne dois pas jeter d'avion en papier en classe" }

                  Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

                  • [^] # Re: Dépêche actuelle et la suite

                    Posté par . Évalué à 1.

                    Faire de l'adverbe un attribut de son complément, voilà une chose bien étrange. Et après on s'étonne d'un tel état de fait : « Au détriment d’une grammaire difficile, des erreurs faciles, d’une compilation lente et d’un débogage laborieux », lorsque l'on cherche à mettre en place des structures grammaticales un peu évoluées dans le paradigme de la POO.

                    Ils sont bien étranges ces créateurs de grammaires ex nihilo, au lieu de se contenter de la découvrir en remontant à la source. :-P

                    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

                    • [^] # Re: Dépêche actuelle et la suite

                      Posté par . Évalué à 2.

                      C'est pourtant très lisible et très élégant.

                      (Ruby lover inside)

                      "Quand certains râlent contre systemd, d'autres s'attaquent aux vrais problèmes." (merci Sinma !)

                      • [^] # Re: Dépêche actuelle et la suite

                        Posté par . Évalué à 1. Dernière modification le 24/08/16 à 17:23.

                        Arf, j'ai mal vendu mon lien ! :-/

                        C'était une boutade, visiblement ratée, pour inciter à visionner une conférence de Philip Wadler dont le thème central est la question Qu'est-ce qu'un type ?. Ce qui revient à se poser la question : qu'est-ce que la grammaire ?

                        La conf est dans la lignée de ce commentaire que j'avais fait en réponse à une énième critique de Riendf sur la grammaire, et auquel tu avais répondu à l'époque, je te cite in extenso :

                        I hit the "pertinent" button like a motherfuckin' truck on a motherfuckin' wall !!1!one

                        La vidéo est très instructive, et la conclusion… je la laisse découvrir à ceux qui voudront bien prendre le temps de la regarder (c'est en anglais, et elle dure une cinquantaine de minutes).

                        Philip Wadler enseigne l'informatique théorique à l'université d'Edimbourg, est spécialisé dans la conception des langages de programmation et a à son actif, entre autre, le langage Haskell et l'implémentation des génériques en Java.

                        Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

                      • [^] # Re: Dépêche actuelle et la suite

                        Posté par . Évalué à 2. Dernière modification le 24/08/16 à 17:33.

                        Je ne peux plus éditer mon message, mais pour résumer : ce que tu trouves beau et élégant dans l'exemple c'est sa syntaxe concrète, ce que je lui reproche c'est sa grammaire. ;-)

                        Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

                    • [^] # Re: Dépêche actuelle et la suite

                      Posté par (page perso) . Évalué à 1.

                      Salut kantien,

                      Je ne comprends pas bien où tu veux en venir. Suggères-tu une amélioration de la structure grammaticale de la dépêche ? Ou peut-être je n'ai pas compris ton humour… Merci d'apporter un peu plus d'explications :-)

                      Commentaire sous licence Creative Commons Zero CC0 1.0 Universal (Public Domain Dedication)

                      • [^] # Re: Dépêche actuelle et la suite

                        Posté par . Évalué à 1.

                        C'était une boutade ratée. Voir la réponse à xcomcmdr. ;-)

                        Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

                  • [^] # Re: Dépêche actuelle et la suite

                    Posté par (page perso) . Évalué à 10.

                    Besoin d'un times à la Ruby? C++ sait faire!

                    struct times_looper {
                    
                        unsigned long long n;
                    
                        template<typename F>
                        void operator()(F fun) {
                            for(int i = 0; i<n; ++i) {
                                fun();
                            }
                        }
                    
                    };
                    
                    times_looper operator "" _times(unsigned long long n) {
                        return times_looper{n};
                    }
                    
                    int main(int argc, char** argv) {
                        12_times( []() { std::cout << "la maitresse en maillot de bain" << std::endl; } ) ;
                        return 0;
                    }
                    

                    http://devnewton.bci.im

                    • [^] # Re: Dépêche actuelle et la suite

                      Posté par . Évalué à 2.

                      Et est-ce qu’on peut faire :

                      int main()
                      {
                          int n;
                          std::cin >> n;
                      
                         n_times ( []() { std::cout << "Il ne faut pas faire de c++ pendant les heures de travail." << std::endl; });
                      
                         return 0;
                      }
                    • [^] # Re: Dépêche actuelle et la suite

                      Posté par . Évalué à 1.

                      Effectivement, c'est tout de suite beaucoup plus clair. :-O

                      La punition infligée à l'élève pourrait s'énoncer : « copier 100 fois "je ne dois pas jeter d'avion en papier en classe" ». Le verbe de l'énconcé étant bien sûr « copier », son COD le texte « je ne dois pas jeter d'avion en papier en classe », et les mots « 100 fois » une expression adverbiale. Le noyau du groupe adverbiale est le mot « fois », le nombre 100 en étant son complément afin de préciser sa signification (sémantique), mais dans la langue française (tout comme en anglais) il pourrait être autre chose qu'un nombre comme dans « quelque fois », « à chaque fois ». L'énoncé ne comporte pas de complément circonstanciel de lieu, mais dans le dessin cela semble être le tableau, et dans le code c'est la sortie standard.

                      Voilà comme on peut également analyser tout cela dans un langage de programmation :

                      (* une verbe d'action dont le COD est un type quelconque 'a *)
                      type 'a action = 'a -> unit
                      
                      (* le groupe adverbial qui exprime la répétition prend une action 
                      * complète avec son COD et la réitère un certain nombre de fois *)
                      
                      let times ~(nb:int) (verbe:'a action) (comp: 'a) =
                        for i = 1 to n do verbe comp done;;
                      
                      (* ajout d'un verbe pour avoir le même nom qu'en Ruby et un peu de sucre syntaxique *)
                      
                      let puts = print_endline;;
                      let ( ** ) nb f x = times ~nb f x;;
                      
                      (* et voili-voilou *)
                      
                      (10 ** puts) "Lambda Power !!";;
                      Lambda Power !!
                      Lambda Power !!
                      Lambda Power !!
                      Lambda Power !!
                      Lambda Power !!
                      Lambda Power !!
                      Lambda Power !!
                      Lambda Power !!
                      Lambda Power !!
                      Lambda Power !!
                      - : unit = ()

                      En espérant avoir été plus clair sur ce que je voulais dire. :-)

                      Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

                      • [^] # Re: Dépêche actuelle et la suite

                        Posté par . Évalué à 2. Dernière modification le 27/08/16 à 22:26.

                        En évitant la définition d'un opérateur ad-hoc qui rend, amha, la compréhension de la sémantique plus ardue. C'est un peu l'éternel débat des macros, quelles soient basiques comme en C ou puissante comme en LISP, ce qu'on gagne en lisibilité avec le sucre syntaxique, on le perd en compréhension de la sémantique…

                        Donc bref, voici ma solution simple et lisible :p

                        # let times n = fun f -> for i = 1 to n do f () done;;
                        val times : int -> (unit -> 'a) -> unit = <fun>
                        # (10 |> times) (fun _ -> print_endline "coin ! coin !");;        
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        - : unit = ()

                        Voire encore:

                        # let times n = fun f a -> for i = 1 to n do f a done;;   
                        val times : int -> ('a -> 'b) -> 'a -> unit = <fun>
                        # (10 |> times) print_endline "coin ! coin !";;
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        coin ! coin !
                        - : unit = ()
                        #
                        • [^] # Re: Dépêche actuelle et la suite

                          Posté par . Évalué à 3. Dernière modification le 29/08/16 à 16:40.

                          Étrangement, c'est la partie en prose de ton commentaire que je ne comprends pas trop. :-P

                          Ce que je voulais signaler, au départ, c'est l'identité de méthode qu'il y entre le typage d'un langage de programmation et l'analyse grammaticale des langues dites naturelles; comme peut le montrer, par exemple, l'isomoprhisme qu'il y a entre un arbre d'analyse syntagmatique comme celui en bas de la page 2 de ce document et un arbre de syntaxe abstrait avec des annotations de typage sur les nœuds. Ce qui, dans le cas de Ruby, me faisait analyser le noyau du groupe adverbial comme un attribut de son complément (ce qui n'est pas du tout la façon dont on se représente la chose en français comme en anglais).

                          Cela étant, ton code m'a donné une idée et une représentation plus proche des structures grammaticales du français et de l'anglais.

                          (* quelques alias de types *)
                          type void = unit
                          type 'a action = 'a -> void
                          (* un adverbe prend une action et renvoie une action *)
                          type 'a adverbe = 'a action -> 'a action
                          
                          (* le noyau du groupe adverbial attend un complément
                          *  de type entier pour former un groupe adverbial *)
                          let fois (n:int):'a adverbe =
                            fun (verbe:'a action) (cod:'a) -> 
                              for i = 1 to n do verbe cod done;;
                          val fois : int -> 'a adverbe = <fun>
                          
                          (* deux verbes qui attendent un groupe adverbial et
                          *  un complément de type string, qui ne se distinguent
                          *  que par la position du COD et de l'adverbe *)
                          let ecrire texte (adv:string adverbe) =
                            adv print_endline texte;;
                          val ecrire : string -> string adverbe -> void = <fun>
                          
                          let copier (adv:string adverbe) texte =
                            adv print_endline texte
                          val copier : string adverbe -> string -> void = <fun>
                          
                          (* leur utilisation permet de retrouver
                          *  une morphologie proche du français *)
                          
                          ecrire "coin ! coin !" (fois 5);;
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          - : void = ()
                          
                          ecrire "coin ! coin !" (5 |> fois);;
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          - : void = ()
                          
                          copier (fois 5) "coin ! coin !";;
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          - : void = ()
                          
                          copier (5 |> fois) "coin ! coin !";;
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          coin ! coin !
                          - : void = ()

                          Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

                          • [^] # Re: Dépêche actuelle et la suite

                            Posté par . Évalué à 1. Dernière modification le 29/08/16 à 22:31.

                            Ce que je voulais dire, c'est qu'utiliser des artifices syntaxiques pour "transformer" la grammaire au lieu d'utiliser la grammaire de base rend la compréhension plus compliquée pour quelqu'un de familié avec le langage. Dans certains cas, c'est justifié, par exemple si cela serait trop verbeux, ou que la nouvelle syntaxe est communément utilisée (par exemple, la notation "do" pour un monad). J'ai aussi l'impression que l'on peut constater ce même mouvement vers une syntaxe "standardisé" avec la dépréciation de camp4 au profis de la nouvelle façon.

                            Si je reprends tes exemple, je n'aimes pas que le verbe soit paramètré par un adverbe, Je préfèrerais que l'adverse soit paramètré par le verbe et retourne un nouveau verbe, dans la plus simple tradition de la composition de fonctions, lambda power ;-). Cela renverse aussi la syntaxe usuelle lambda pour l'application de fonction, qui est (fonction arguments…). Sans utiliser d'opérateur customisé, il y a moyen de le faire, au prix d'une lisibilité légèrement diminuée. Après, cela reste une question de goût et une préférence pour le kiss :-)

                            PS: avec mon exemple, on peut aussi écrire (print_endline >| (5 |> fois)) "xxx", sans devoir réécrire quoi que ce soit. Par contre on ne peut pas s'affranchir des parenthèses… mais bon, je trouve ça un avantage, c'est justement l'argument que j'essaye de développer,
                            PS2: je me dis parfois qu'un opérateur '$' à la haskell serait agréable à utiliser…

                            • [^] # Re: Dépêche actuelle et la suite

                              Posté par . Évalué à 1.

                              Si je reprends tes exemple, je n'aimes pas que le verbe soit paramètré par un adverbe, Je préfèrerais que l'adverbe soit paramètré par le verbe et retourne un nouveau verbe, dans la plus simple tradition de la composition de fonctions, lambda power ;-).

                              C'est exactement ce que j'ai fait, c'est d'ailleurs pour cela que j'ai rajouté un nouvel alias de type pour illustrer la nature fonctionnelle d'un adverbe :

                              type 'a adverbe = 'a action -> 'a action
                              val fois : int -> 'a adverbe = <fun>

                              Le code de ma fonction fois est identique au tien, j'ai simplement rajouté des annotations de types et changer le nom des arguments pour souligner l'analogie avec la grammaire française. Ensuite j'ai défini deux fonctions — que j'ai certes improprement qualifier de verbes — pour illustrer deux morphologies possible de la langue française, que l'on retrouve également en anglais par exemple. Sinon, on peut tout à fait écrire le même code que toi à l'usage, en respectant la syntaxe d'application des fonctions du lambda-calcul ou en ayant recours à l'opérateur infixe |> pour inverser le nom de la fonction et de son argument (à la manière du pipe du shell) :

                              (fois 5) print_endline "coin ! coin !";;
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              
                              (5 |> fois) print_endline "coin ! coin !";;
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              
                              (print_endline |> (5 |> fois)) "coin ! coin !";;
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !

                              PS2: je me dis parfois qu'un opérateur '$' à la haskell serait agréable à utiliser…

                              Il existe en OCaml, c'est le double arobase @@ :

                              (fois 5) print_endline @@ (^) "coin ! " "coin !";;
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !
                              coin ! coin !

                              Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

                              • [^] # Re: Dépêche actuelle et la suite

                                Posté par . Évalué à 1. Dernière modification le 30/08/16 à 21:47.

                                C'est exactement ce que j'ai fait

                                Effectivement j'avais mal interprété.

                                PS2: je me dis parfois qu'un opérateur '$' à la haskell serait agréable à utiliser…

                                Il existe en OCaml, c'est le double arobase @@ :

                                Ah ça c'est cool, merci !

    • [^] # Re: Dépêche actuelle et la suite

      Posté par . Évalué à 6. Dernière modification le 22/08/16 à 12:52.

      Les illustrations francophones réalisées spécialement pour l'occasion sont sympas, non ?

      Je ne sais pas si elles sont sympas (les goûts et les couleurs…), mais beaucoup d'illustrations de cette dépêche sont vides de contenu : elles prennent beaucoup de place et n'apportent rien à l'article.

  • # ECMA

    Posté par (page perso) . Évalué à 4.

    Pourquoi le C++ n'est-il pas un standard publié (aussi) par l'ECMA?
    Ils ont la bonne idée de proposer le téléchargement gratuit des PDF de leurs standards, par exemple dans la catégorie "langages de programmation" pour C#, EcmaScript, Eiffel, et Dart. Mais aussi plein d'autres choses comme le système de fichier "ISO9660" pour les CDROM, le JSON, les codes de contrôles "ANSI" (ECMA-48), le format physique des disquettes 3.5", et plein d'autres trucs.

    • [^] # Re: ECMA

      Posté par (page perso) . Évalué à 6.

      Peut être que si c'est ISO, les droits appartiennent à l'ISO et ne peuvent être publié ailleurs sans payer ?

      Malheureusement, les normes sont rarement gratuites (et sont parfois/souvent un moyen de faire du protectionnisme/élimination de la concurrence).

      • [^] # Re: ECMA

        Posté par . Évalué à 5.

        J'ai pas mal travaillé avec la norme Fortan qui fonctionne de la même façon: Elle est payante mais les 'working drafts' sont gratuits.

        Je disposais des deux versions et en pratique je n'ai jamais noté la moindre différence (à l'exception de la 1ère page) ; identiques à la virgule près. Je suppose que c'est pareil avec le C++.

        Pour les particuliers, le 'working draft' gratuit est de-facto la norme.

        Les versions payantes ne sont utiles que pour les entreprises et les professionnels qui veulent un document officiel.

      • [^] # Re: ECMA

        Posté par . Évalué à 3.

        Peut être que si c'est ISO, les droits appartiennent à l'ISO et ne peuvent être publié ailleurs sans payer ?

        Je ne pense pas, en tout cas ça n'a pas l'air d'être le cas pour Ada qui est un standard ISO (http://www.iso.org/iso/home/store/catalogue_ics/catalogue_detail_ics.htm?csnumber=61507) mais qui est aussi disponible en ligne (http://www.adaic.org/ada-resources/standards/ada12/).

        • [^] # Re: ECMA

          Posté par . Évalué à 3.

          Et je présume que c'est le cas pour le système de fichier "ISO9660" :)

          Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # Très instructif

    Posté par (page perso) . Évalué à 10.

    C'est très intéressant. J'ai hâte de voir les prochaines dépêches !

    Je salue la démarche de publier in fine sur wikipedia. Le meilleur moyen d'y trouver des articles de qualité, c'est quand même quand des gens qui connaissent un peu leur domaine participent. J'aimerais bien que des pointures en physique, en mathématiques ou en cosmologie contribuent aussi conséquemment :)

    • [^] # Re: Très instructif

      Posté par . Évalué à 1. Dernière modification le 21/08/16 à 16:54.

      Je "plussoie"…lorsque je vois wikipedia pris d'assaut par des idéologues, dans d'autres domaines même ceux qui ne les concernent pas, …certe!

    • [^] # Re: Très instructif

      Posté par . Évalué à 1.

      L'article est en effet très intéressant et je félicite les auteurs pour leur travail !

      Toutefois j'aimerai en savoir plus sur le fait que le standard ne puisse être reproduit.
      Dans l'article il est dit que stackoverflow est plus pragmatique mais dans ce cas là ne peut-on pas dire que c'est une citation plutôt qu'une copie ?

      • [^] # Re: Très instructif

        Posté par (page perso) . Évalué à 3. Dernière modification le 21/08/16 à 23:56.

        C'est un aspect qu'un relecteur m'avait conseillé d'éclaircir : Klaim m'avait parlé du "Fair use" (jurisprudence des États-Unis) :
        https://fr.wikipedia.org/wiki/Fair_use#Port.C3.A9e_du_copyright

        Le fait de se servir d'un texte existant sous copyright comme matériel de base apportant des éléments factuels n'est pas interdit. Il faut simplement remettre les informations en forme, et surtout compléter.
        - Dès lors que l'article d'origine ne représente plus une part significative de l'œuvre, et que l'œuvre ne représente plus une part significative de l'article, il n'y a plus de lien évident de copyright (on tombe rapidement dans la zone des « citations », licites).
        - Par ailleurs, les informations de type « scientifique » sont dans le domaine public, ou couvertes par des brevets, ou par des secrets professionnels, mais pas par le « copyright ».
        Les faits peuvent donc être librement copiés, dès lors que l'assemblage de faits (qui, en tant qu'assemblage, peut constituer une œuvre) n'est pas servilement transposé.

        Ne connaissant pas suffisamment bien le sujet, j'avais posté un e-mail dans la liste de diffusion Juridique de l'APRIL. Mais, j'ai du louper mon abonnement à cette liste car je ne reçois pas les e-mail :-(. Si un expert sur ces aspects de propriété intellectuelle passait dans le coin, merci de nous expliquer :

        Dans quelle mesure est-il légal de reproduire des extraits de la norme C++ sur stackoverflow ?
        http://stackoverflow.com/questions/2693199

        Commentaire sous licence Creative Commons Zero CC0 1.0 Universal (Public Domain Dedication)

    • [^] # Re: Très instructif

      Posté par . Évalué à 1.

      J'aimerais bien que des pointures en physique, en mathématiques ou en cosmologie contribuent aussi conséquemment :)

      La wikipedia anglaise est très très complète en sciences (au moins physiques) : c'est notre langue de travail. Il est vrai que la version française laisse un peu à désirer cependant…

  • # coquille

    Posté par . Évalué à 2. Dernière modification le 21/08/16 à 21:40.

    Un processus de normalisation qui s’ouvre d’avantage
    => Un processus de normalisation qui s’ouvre davantage

    "Cela permet également de vérifier de la popularité d’un composant"
    Y'a pas un "de" en trop ?

  • # Java ou JS ?

    Posté par . Évalué à 2.

    À la différence de la marque JavaScript® déposée par Oracle

    J'ai peut-être raté un épisode, mais ce n'est pas plutôt la marque Java qui est déposée par Oracle ?

    • [^] # Re: Java ou JS ?

      Posté par (page perso) . Évalué à 8.

      • [^] # Re: Java ou JS ?

        Posté par . Évalué à 3.

        Hé bien j'aurais appris quelque chose ! J'étais loin de m'en douter.

        • [^] # Re: Java ou JS ?

          Posté par (page perso) . Évalué à 8.

          De mémoire : Cela s'est produit, à l'époque de Netscape et Sun. Le navigateur de Netscape gérait la première version de son langage de script appelé au début LiveScrit. De l'autre côté, Sun souhaitait que Java soit utilisé pour les sites web, marché en pleine expansion à l'époque. Du coup, Netscape et Sun se sont mis d'accord pour créer de l’ambiguïté entre les noms de leur deux langages qui n'ont rien à voir : Java et JavaScript. Ainsi, chaque entreprise profitait mutuellement du matraquage médiatique faite par l'autre entreprise sans se concurrencer. Les décideurs "non-techos" n'y voyait que du feu !

          À confirmer avec des références…

          Commentaire sous licence Creative Commons Zero CC0 1.0 Universal (Public Domain Dedication)

  • # Excellent

    Posté par . Évalué à 4. Dernière modification le 22/08/16 à 18:49.

    avouons que le C++ est peut‐être le langage le plus complexe que l’humanité ait pu inventer !

    hahahaha merci à toute l'équipe pour cette excellente vanne, you made my day :'-) :'-)

    -Spart, programmeur C++ expatrié en Hongrie depuis un an,
    toujours au stade csecsemő après 18h de hongrois par semaine

    • [^] # Re: Excellent

      Posté par (page perso) . Évalué à 4.

      À part les trucs un peu exotique à la Malbolge ou Brainfuck, tu vois quoi comme langage plus complexe qui est réellement utilisé ?

    • [^] # Re: Excellent

      Posté par . Évalué à 2.

      D’après mon papa hongrois, "Franchement le français est une langue bien plus difficile que le hongrois. Au moins le hongrois est logique." Evidemment, le fait qu'il parle couramment plusieurs langues couramment, et soit relativement avance dans d'autres langues invalide peut-être son jugement (dans le sens ou il a déjà une grande experience pour l'apprentissage des langues).

  • # Excellent

    Posté par . Évalué à 3.

    J'adore cette série.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.