Je vous fait part ici d’une réflexion et d’une intention naissantes.
J’ai encore besoin d’y réfléchir et de recueillir vos avis, mais globalement, je pense qu’il serait intéressant de migrer une partie du code Duniter écrite en JavaScript vers C++.
À priori, cela commencerait par le cœur : c’est-à-dire la blockchain, son cycle de vie (empilement, dépilement de bloc), ses règles d’acceptation d’un nouveau bloc. Puis éventuellement d’autres éléments viendraient se greffer, tels la génération d’un nouveau bloc valide, la preuve de travail.
Il resterait quand même Node.js pour gérer l’aspect modules, communication réseau (où il excelle !), gestion des piscines, interface graphique, etc.
De sorte que la migration peut se faire progressivement.
Les raisons
1. Les outils
C’est tout bête, mais JavaScript ne dispose pas d’outils aussi puissants, variés et surtout libres que le C++. C’est un fait : si vous ne travaillez pas avec WebStorm, un IDE JavaScript propriétaire, alors coder Duniter fait l’effet d’être au pied d’une montage à gravir, pieds nus et sans connaissance des chemins à emprunter.
Avoir un débogueur et des outils d’analyse mémoire et CPU est une aide extrêmement préciseuse à notre niveau.
2. Le typage statique
C’est un reproche régulièrement fait à JavaScript que d’avoir un typage dynamique. C’est-à-dire qu’à aucun moment avant l’exécution, vous n’êtes certain de la nature de l’objet contenu dans une variable. On peut se retrouver avec un entier, une chaîne de caractère ou un objet complexe à tout instant.
Cela n’aide pas du tout les IDE à nous proposer les fonctions, méthodes, propriétés des objets manipulés. Donc il faut se souvenir de tout. C’est vraiment une plaie pour un nouveau venu, et même pour moi qui connaît bien le code je dépense inutilement de l’énergie à me rappeler de chaque élément.
Enfin, cela « rassure » de connaître à l’avance le type d’objet reçu. On n’a plus à douter de cela, juste qu’au pire l’objet peut être null
, cas qu’il faut gérer. Cela évite bien des erreurs simples et libère l’esprit pour d’autres tâches.
3. Les contributeurs potentiels connaissent plutôt C++
C’est un fait : initialement OpenUDC a démarré avec 2 contributeurs en C++ (jbar, caner), puis Duniter a vu plusieurs contributions en C++ de @mmpio et maintenant @Beun, sans compter les développeurs déjà présents qui connaissent bien ce langage, par exemple @Inso. Et Il y en a certainement d’autres dont je ne connais pas l’affinité / le niveau avec C++.
Concernant Duniter en JavaScript, je crois que seul @inso a osé y toucher de façon conséquente.
Aussi historiquement, le logiciel Bitcoin est basé à 70% sur du C++. Tous ses dérivés suivent forcément cette ligne par inertie. Donc il y a une potentiellement une armée de développeurs en blockchain qui pourraient contribuer en C++ à Duniter.
Qui plus est, je suppose que les profils les plus enclins à toucher au cœur sont aussi des personnes qui cherchent à comprendre le fond et à maîtriser les détails. Or les langages répondant à ce niveau de maîtrise sont proches de la machine : le C++ paraît là encore être un bon candidat.
4. La crédibilité
Je trouve cet argument assez bête pour ma part, mais je l’entends régulièrement. : « JavaScript c’est pas sérieux », « C++ c’est un vrai langage ». Je croirais avoir à faire à des pseudo-scientifiques qui croient détenir la vérité, ou même à des économistes.
Mais bon, le fait est que ce sont des humains qui vont adopter la monnaie libre, et donc même si parfois leurs actions se basent sur des raisonnements douteux, on n’a pas besoin de rebuter ces humains avec JavaScript.
5. La vitesse d’exécution
Là aussi, je trouve l’argument léger, notamment car en C++ les opérations I/O, tels une lecture en base de donnée, sont bloquantes pour le thread courant. Les gains de performances obtenus dans le calcul sont perdues dans les opérations de lecture/écriture, sauf à jouer avec du multithreading, ce qui devient plus coton.
Mais après tout, si ce sont des extrémistes du C++ qui nous rejoignent, ce n’est pas tellement un problème.
Vous l’aurez donc compris, mon penchant pour le C++ tient surtout dans les points 1. à 3. Le reste c’est du bonus.
Vous en pensez quoi ?