Prise en charge de la programmation générique par Go
Comme annoncé il y a environ un mois, l'équipe Go a commencé à tester le support des génériques dans Go 1.18 Beta 1, publié mardi. Cette fonctionnalité était très attendue par les utilisateurs du langage. En effet, sans la prise en charge de la programmation générique, les bibliothèques et les applications fonctionnelles de Go sont forcées de suivre l'une des deux voies suivantes : sécurité du type + spécificité du cas d'utilisation ou non-sécurité du type + agnostic du cas d'utilisation. Maintenant, l'introduction des génériques dans le langage permettra de nouvelles sortes de solutions de programmation fonctionnelle en Go.
Rappelons que la généricité (ou programmation générique) consiste à définir des algorithmes identiques opérant sur des données de types différents. On définit de cette façon des procédures ou des types entiers génériques. On pourrait ainsi programmer une pile, ou une procédure qui prend l'élément supérieur de la pile, indépendamment du type de données contenues. Le type de données réel n'est indiqué que lors de l'appel de la fonction. Il est également possible de définir une structure de données qui stocke des valeurs de n'importe quel type, le type réel à stocker n'étant indiqué que lors de la création d'une instance de la structure de données.
C'est donc une forme de polymorphisme, le « polymorphisme de type » dit aussi « paramétrage de type » : en effet, le type de donnée général (abstrait) apparaît comme un paramètre des algorithmes définis, avec la particularité que ce paramètre-là est un type. C'est un concept important pour un langage de haut niveau, car celui-ci permet d'écrire des algorithmes généraux opérant sur toute une série de types : la généricité augmente donc le niveau d'abstraction des programmes écrits dans un langage qui possède cette fonctionnalité. Divers mécanismes ont été conçus pour permettre la programmation générique dans Go 1.18.
Toutefois, l'équipe demande de la prudence lors du test de ce nouveau mode de fonctionnement, car les génériques ne faisaient pas partie du langage de programmation jusqu'à présent. Un guide devrait aider les développeurs à faire leurs premiers pas. De plus, une vidéo (ci-dessous) de la GopherCon de la semaine dernière présente cette nouveauté.
Autres nouveautés importantes dans Go 1.18 Beta 1
Go 1.18 Beta 1 apporte également le support pour l'écriture de tests basés sur le fuzzing. Cela devrait permettre de détecter plus facilement les entrées automatiques qui font planter les programmes ou qui renvoient des réponses non valides. En outre, l'équipe de développement introduit un nouveau mode d'espace de travail Go qui devrait permettre aux développeurs de travailler avec plusieurs modules Go en même temps, ce qui semble être particulièrement important pour les grands projets.
Une autre nouveauté est la commande go version -m, qui devrait à l'avenir enregistrer les détails de la construction, comme les indicateurs de compilation. Ainsi, un programme peut demander ses propres informations de construction avec debug.ReadBuildInfo, mais aussi les lire à partir d'autres fichiers binaires avec le nouveau paquet debug/buildinfo. Selon l'équipe, ce nouveau fonctionnement est destiné à servir de base à tout outil qui doit créer une facture logicielle (SBOM) pour les fichiers binaires Go.
En outre, plus tôt cette année, Go 1.17 a ajouté une nouvelle convention d'appel basée sur les registres pour accélérer le code Go sur les systèmes x86-64. Go 1.18 Beta 1 étend cette fonctionnalité aux systèmes ARM64 et PPC64, ce qui permet d'accélérer le code jusqu'à 20 %. Les autres changements plus visibles dans Go 1.18 Beta 1 sont :
- la syntaxe des déclarations de fonctions et de types accepte désormais les paramètres de type ;
- les fonctions et les types paramétrés peuvent être instanciés en les faisant suivre d'une liste d'arguments de type entre crochets ;
- le nouveau jeton ~ a été ajouté à l'ensemble des opérateurs ;
- la syntaxe des types Interface permet maintenant d'intégrer des types arbitraires (pas seulement les noms de type des interfaces) ainsi que des éléments de type union et ~T. Ces interfaces ne peuvent être utilisées que comme contraintes de type. Une interface définit désormais un ensemble de types ainsi qu'un ensemble de méthodes ;
- le nouvel identifiant prédéclaré any est un alias pour l'interface vide. Il peut être utilisé à la place de interface{} ;
- le nouvel identifiant prédéclaré comparable est une interface qui désigne l'ensemble de tous les types qui peuvent être comparés à l'aide de == ou !=. Il ne peut être utilisé que comme (ou intégré dans) une contrainte de type.
En sus, l'équipe note que l'implémentation actuelle des génériques présente les limitations suivantes :
- le compilateur Go ne peut actuellement pas gérer les déclarations de type à l'intérieur des fonctions ou méthodes génériques. L'équipe espère fournir un support pour cette fonctionnalité dans Go 1.19 ;
- l'incorporation d'un paramètre de type, ou d'un pointeur vers un paramètre de type, en tant que champ non nommé dans un type struct n'est pas autorisée. De même, l'intégration d'un paramètre de type dans un type interface n'est pas autorisée. Il n'est pas clair pour l'instant si cela sera un jour autorisé.
Correction de bogues
Le compilateur signale maintenant correctement les erreurs déclarées, mais non utilisées pour les variables qui sont définies à l'intérieur d'un littéral de fonction, et qui ne sont jamais utilisées. Avant Go 1.18, le compilateur ne signalait pas d'erreur dans de tels cas. Ceci corrige le problème du compilateur qui existait depuis longtemps. À la suite de ce changement, des programmes (éventuellement incorrects) peuvent ne plus compiler. Selon l'équipe, la correction nécessaire est simple : « corrigez le programme s'il était en fait incorrect, ou utiliser la variable incriminée, par exemple en l'assignant à l'identifiant vide _ ».
Comme go vet a toujours signalé cette erreur, le nombre de programmes affectés est probablement très faible. Par ailleurs, le compilateur signale désormais un dépassement de capacité lors du passage d'une expression constante rune telle que '1' << 32 comme argument aux fonctions prédéclarées print et println, ce qui est cohérent avec le comportement des fonctions définies par l'utilisateur. Avant Go 1.18, le compilateur ne signalait pas d'erreur dans de tels cas, mais acceptait silencieusement de tels arguments constants s'ils rentraient dans un int64.
En conséquence de ce changement, les programmes (éventuellement incorrects) peuvent ne plus compiler. La correction nécessaire est simple : « corrigez le programme s'il était en fait incorrect, ou convertir explicitement l'argument incriminé au type correct ». Comme go vet a toujours signalé cette erreur, le nombre de programmes affectés est probablement très faible.
Source : Go 1.18 Beta 1, Notes de version de Go 1.18 Beta 1
Et vous ?
Quel est votre avis sur le sujet ?
Que pensez-vous de l'ajout des génériques à Go ?
En quoi cela améliorera-t-il la productivité des développeurs Go ?
Voir aussi
Go 1.18, le langage de programmation open source développé par Google, arrive avec la généricité par défaut, elle ouvrira de nouvelles solutions, d'approches et de paradigmes
Go 1.17 est disponible et s'accompagne de la prise en charge de l'architecture ARM 64 bits sous Windows, cette version maintient la promesse de compatibilité avec Go 1
Go 1.17 Bêta apporte la prise en charge de l'architecture ARM 64 bits sous Windows, le langage devrait être en disponibilité générale en août 2021
Langage de programmation Go : combien de professionnels l'utilisent ? Où sont-ils ? Quelles sont les perspectives d'avenir du langage ? JetBrains fait un état des lieux de son écosystème