Julien Jorge's Personal Website

Compter en C++, de 98 jusqu'à 11

Wed Jun 2, 2021

Salut ’nal,

Non, ça ne fonctionne pas.

Bonjour ’nal,

Ah c’est mieux !

Il y a quelques temps, un collègue m’a proposé de faire une présentation au sein de la boîte pour faire le tour des modifications qui ont été apportées au langage C++ depuis la version de 2011. J’ai commencé à faire quelques slides en me concentrant sur les parties qui me semblent essentielles mais, assez rapidement, il m’est paru clair qu’il faudrait plus d’une présentation si je voulais être un minimum exhaustif.

Finalement la présentation n’a pas eu lieu :( Néanmoins, j’avais quand même quelques morceaux de prêts, et l’idée de faire un petit bilan des dix dernières années du langage me plaisait bien. J’ai donc opté pour un changement de format : au revoir \documentclass{beamer}, bonjour \documentclass{book}.

Et ouais, si tu lis le LaTeX tu as bien compris : j’écris un livre. Je n’avais plus rien à lire et je n’ai trouvé que ça pour y remédier.

Enfin quand je dis que j’écris un livre, c’est surtout que j’essaye d’écrire un livre. C’est très loin d’être terminé. Parce que mine de rien, rédiger de longs textes cohérents, c’est pas hyper simple. Je ne suis pas développeur sur GIMP moi :)

À l’heure où j’écris ces lignes, seul C++11 est abordé, et encore, c’est à peine relu et il en manque (coucou <chrono>). Laisse-moi quand même te parler un peu du projet.

Le but

L’objectif est d’avoir au final quelque chose d’intermédiaire entre la frugalité du standard et les subtilités que l’on trouve dans les détails du langage (par exemple, je n’irai probablement pas y parler de l’empty base optimization). J’aimerais que quelqu’un qui a peu ou pas suivi les évolutions du langage puisse y trouver l’intention des différents ajouts afin de les utiliser le jour où cela semblera utile.

Rien que comme cela, en se limitant à de courtes sections qui montrent l’avant et l’après de l’introduction d’une fonctionnalité, avec quelques exemples de code, le nombre de pages monte très vite. Je voudrais néanmoins que le volume d’information ne soit pas rédhibitoire.

Où le trouver

Tu peux trouver les sources du document sur GitHub, et même récupérer un pdf à lire tout de suite.

Avec quoi c’est écrit

Le document est rédigé en LaTeX, un langage réputé pour faire de beaux documents par défaut et permettant de se concentrer sur le contenu, en le séparant de la forme. C’est évidemment pourquoi je passe des heures à chercher comment faire des trucs comme barrer un mot, afficher une icône dans la marge, ou encore mettre une police digne de ce nom, qui gère le gras et l’italique, pour les extraits de code.

Cela fait une petite quinzaine d’années que je n’avais pas rédigé sérieusement en LaTeX, et pas mal de choses bien sympathiques à son sujet sont arrivées entre temps. Déjà, j’ai trouvé un module UseLATEX pour CMake, qui permet de séparer proprement les sources et la construction du document. C’est fini les fichiers .aux, .toc, et autres, qui polluent le dépôt ! En plus cela gère très bien les enchaînements de compilation. Là où auparavant il fallait compiler les sources, puis la bibliographie, puis à nouveau des sources pour enfin avoir les références dans le document ; maintenant ça se fait tout seul.

À l’usage c’est très simple, il suffit de faire un CMakeLists.txt qui ressemble à ça :

include(UseLATEX)

add_latex_document(
  # Fichier principal
  counting-in-c++.tex

  BIBFILES
  bibliography.bib

  # Ici on peut faire une passe de la commande configure_file() de
  # CMake sur certains fichiers. Je m'en sers pour injecter le numéro
  # de version.
  CONFIGURE
  counting-in-c++.tex

  IMAGE_DIRS
  assets

  # Et là on met tous les autres fichiers référencés depuis le fichier
  # principal, hors bibliographie et images qui sont gérés avec les
  # directives ci-dessus.
  INPUTS
  examples/extern-template/some_template-11.hpp
  examples/extern-template/some_template-98.hpp
  parts/11.tex

  # …
  )

Autre truc sympa qui n’existait pas il y a quinze ans : https://tex.stackexchange.com/. Avec l’explosion des sites StackExchange, il était naturel d’avoir des questions-réponses au sujet de TeX et LaTeX. Chose étonnante, la plupart des questions que je me posait ont des réponses vers 2011. Après ça c’est plutôt mort. Pareil pour les packages conseillés, nombreux n’ont pas été mis à jour depuis des années. Par exemple, cancel a été mis à jour en 2013. LaTeX est-il complet ou bien est-il en train de mourir ?

Il y a des trucs que je n’arrive toujours pas à bien faire, notamment mettre en évidence une ou plusieurs lignes d’un extrait de code. Pour l’instant j’ai juste une solution bricolée avec l’aide d’Internet, où le listing est coupé en plusieurs blocs selon la région à faire ressortir, et seule celle-ci a une couleur d’arrière plan. C’est pas fou.

L’anglais

La présentation initiale était prévue pour un public international, du coup elle était rédigée en langage technique, qui s’avère être très proche de l’anglais. Le livre a gardé ça, il est aussi écrit en anglais.

Alors je sais ce que tu vas me dire : « ouiiiii, je trouve ça triiiiiste de ne pas écrire ça en beeeeelge », et c’est pas faux. Mais bon, j’avais déjà un gros morceau en anglais et la force de la flemme est très convaincante.

Le contrat

J’hésite un peu à annoncer cela ici… pfiou ! allez, courage… Le livre est dispo en CC-BY-SA.

patapé

Tu te demandes sûrement pourquoi je n’ai pas mis cette Œuvre™ d’Art® sous les termes d’un NC ou ND, aussi connus comme des contrats « semi libre », « presque libre », « à 99% libre », ou encore « non mais au taux d’aujourd’hui ça ferait 13,67% libre » ? Si ça se trouve quelqu’un va récupérer mon travail et le vendre pour faire de l’argent. Tu te rends compte ? de l’argent !

Alors en vrai, oui, j’aurais un peu les boules si quelqu’un tirait profit de mon travail sans m’en reverser une part. S’il perd de l’argent, ça ne me dérange pas qu’on ne partage pas, mais s’il en gagne j’aimerais bien en recevoir.

Mais c’est un peu le jeu du partage, il faut savoir donner pour recevoir. J’ai moi même beaucoup reçu de personnes qui partageaient leurs connaissances, ça me semble normal de donner en retour. Et je préfère de loin un livre libre qui pourra vivre sa vie quand bien même je l’abandonnerais, plutôt qu’un projet fermé qui ne servira à rien et ne pourra s’épanouir à moins que je ne le pousse au bout et que j’arrive, plus ou moins seul, à le publier.

Note que j’ai bien mis « livre libre », car à mon sens le libre, que se soit logiciel ou art, est avant tout le fait de libérer le produit de son auteur. Ensuite seulement cela donne des libertés aux utilisateurs, mais pour moi l’essentiel est vraiment que n’importe qui peut prendre le produit, le détacher de celui qui l’a créé, pour ensuite le transformer ou le travailler. Et c’est là que j’aime le SA : celui qui prend ne peut s’approprier le logiciel ou l’œuvre. Ce dernier reste détaché de celui qui le fait.

Quant au BY, et bien… Bon, ça ne sert à rien, mais je tiens à porter la responsabilité de ce que je fais, surtout s’il s’avère que c’est bien. Par contre si c’est de la crotte, pas de souci, je ne t’en voudrai pas d’omettre mon nom quand tu en parleras :)

Contribuer

Comment contribuer à un livre contenant plein d’opinions personnels de l’auteur original ? C’est pas simple.

Grosso modo, je me dis que n’importe quelle retouche sur l’existant est bienvenue (corrections de fautes, reformulations). Ensuite pour les nouvelles sections c’est plus délicat mais c’est faisable. Je souhaite surtout que les sujets abordés soient traités en expliquant pourquoi c’est utile. Par exemple, dire que « auto c’est bien parce que ça permet de ne pas préciser le type de la variable », c’est nul. Par contre, dire que « auto permet de déclarer une variable à laquelle on affecte une lambda, dont le type est par définition inaccessible au programmeur », c’est acceptable. Dans tous les cas, il faut que ça reste concis et simple. Pas besoin de détailler tous les cas d’utilisation.

Enfin, si les contributions contiennent des opinions, je doute que ça passe. Après tout il y a mon nom sur la couv’, alors si je ne suis pas en phase avec les opinions du contenu, ça m’embête.

Dernière chose, je ne demande pas le transfert de propriété pour les contributions, donc le meilleur moyen de garder ce livre libre est de contribuer. Si suffisamment de personnes font des modifications je ne pourrai pas changer de licence sans leur accord :)