À quoi sert vraiment la langue Go?

Au cours de ses neuf années et plus dans la nature, le langage Go de Google, alias Golang - avec la version 1.13 sortie en septembre 2019 - est passé du statut de curiosité pour les geeks alpha à celui de langage de programmation éprouvé derrière certains des plus importants au monde. projets centrés sur le cloud. 

Pourquoi Go a-t-il été choisi par les développeurs de projets tels que Docker et Kubernetes? Quelles sont les caractéristiques déterminantes de Go, en quoi diffère-t-il des autres langages de programmation et quels types de projets convient-il le mieux à la construction? Dans cet article, nous explorerons l'ensemble des fonctionnalités de Go, les cas d'utilisation optimaux, les omissions et les limitations du langage, et où Go peut aller à partir d'ici.

Le langage Go est petit et simple

Go, ou Golang comme on l'appelle souvent, a été développé par des employés de Google - principalement le gourou Unix de longue date et ingénieur distingué de Google, Rob Pike - mais ce n'est pas à proprement parler un «projet Google». Go est plutôt développé comme un projet open source mené par la communauté, dirigé par des dirigeants qui ont des opinions bien arrêtées sur la façon dont Go devrait être utilisé et la direction que le langage devrait prendre.

Go est conçu pour être simple à apprendre, simple à utiliser et facile à lire par les autres développeurs. Go n'a pas un grand ensemble de fonctionnalités, en particulier par rapport à des langages comme C ++. Go rappelle le C dans sa syntaxe, ce qui le rend relativement facile à apprendre pour les développeurs C de longue date. Cela dit, de nombreuses fonctionnalités de Go, en particulier sa simultanéité et ses fonctionnalités de programmation fonctionnelle, rappellent des langages tels que Erlang.

En tant que langage de type C pour créer et maintenir des applications d'entreprise multiplateformes de toutes sortes, Go a beaucoup en commun avec Java. Et pour permettre le développement rapide de code pouvant s'exécuter n'importe où, vous pouvez établir un parallèle entre Go et Python, bien que les différences soient bien plus importantes que les similitudes.

Go Language a quelque chose pour tout le monde

La documentation Go décrit Go comme «un langage compilé rapide, typé statiquement, qui ressemble à un langage interprété et typé dynamiquement». Même un gros programme Go se compilera en quelques secondes. De plus, Go évite une grande partie de la surcharge des fichiers et des bibliothèques d'inclusion de style C.

Go facilite la vie du développeur de plusieurs manières:

  • Commodité.  Go a été comparé aux langages de script comme Python dans sa capacité à satisfaire de nombreux besoins de programmation courants. Certaines de ces fonctionnalités sont intégrées dans le langage lui-même, comme les «goroutines» pour la concurrence et le comportement de thread, tandis que des capacités supplémentaires sont disponibles dans les packages de bibliothèque standard Go, comme le package http de Go. À l'instar de Python, Go fournit des fonctionnalités de gestion automatique de la mémoire, y compris la récupération de place.

    Contrairement aux langages de script tels que Python, le code Go se compile en un binaire natif à exécution rapide. Et contrairement au C ou au C ++, Go compile extrêmement rapidement - assez rapidement pour que le travail avec Go ressemble plus à un langage de script qu'à un langage compilé. De plus, le système de construction Go est moins complexe que ceux des autres langages compilés. Il faut quelques étapes et peu de comptabilité pour créer et exécuter un projet Go.

  • La vitesse.  Les binaires Go s'exécutent plus lentement que leurs homologues C, mais la différence de vitesse est négligeable pour la plupart des applications. Les performances de Go sont aussi bonnes que C pour la grande majorité du travail, et généralement beaucoup plus rapides que les autres langages connus pour leur vitesse de développement (par exemple, JavaScript, Python et Ruby).
  • Portabilité.  Les exécutables créés avec la chaîne d'outils Go peuvent être autonomes, sans dépendances externes par défaut. La chaîne d'outils Go est disponible pour une grande variété de systèmes d'exploitation et de plates-formes matérielles, et peut être utilisée pour compiler des binaires sur plusieurs plates-formes.
  • Interopérabilité.  Go offre tout ce qui précède sans sacrifier l'accès au système sous-jacent. Les programmes Go peuvent parler à des bibliothèques C externes ou effectuer des appels système natifs. Dans Docker, par exemple, Go s'interface avec des fonctions Linux de bas niveau, des groupes de contrôle et des espaces de noms pour travailler la magie des conteneurs.
  • Soutien.  La chaîne d'outils Go est disponible gratuitement en tant que binaire Linux, MacOS ou Windows ou en tant que conteneur Docker. Go est inclus par défaut dans de nombreuses distributions Linux populaires, telles que Red Hat Enterprise Linux et Fedora, ce qui facilite un peu le déploiement de Go source sur ces plates-formes. La prise en charge de Go est également forte dans de nombreux environnements de développement tiers, de Microsoft Visual Studio Code à l'IDE Komodo d'ActiveState.

Où la langue Go fonctionne le mieux

Aucune langue ne convient à tous les emplois, mais certaines langues conviennent à plus d'emplois que d'autres.

Go brille le plus pour développer les types d'applications suivants:

  • Services en réseau distribués. Les applications réseau vivent et meurent par la concurrence, et les fonctionnalités de concurrence native de Go - goroutines et canaux, principalement - sont bien adaptées à ce type de travail. Par conséquent, de nombreux projets Go concernent la mise en réseau, les fonctions distribuées et les services cloud: API, serveurs Web, cadres minimaux pour les applications Web, etc.
  • Développement cloud natif. Les fonctionnalités de simultanéité et de mise en réseau de Go, ainsi que son degré élevé de portabilité, le rendent bien adapté à la création d'applications cloud natives. En fait, Go a été utilisé pour créer plusieurs pierres angulaires de l'informatique cloud native, notamment Docker, Kubernetes et Istio.
  • Remplacement des infrastructures existantes. Une grande partie des logiciels dont nous dépendons pour l'infrastructure Internet vieillit et est traversée par des exploits. La réécriture de ces éléments dans Go offre de nombreux avantages: une meilleure sécurité de la mémoire, un déploiement multiplateforme plus facile et une base de code propre pour promouvoir la maintenance future. Un nouveau serveur SSH appelé Teleport et une nouvelle version du Network Time Protocol sont en cours d'écriture en Go et proposés en remplacement de leurs homologues conventionnels.
  • Utilitaires et outils autonomes. Les programmes Go se compilent en binaires avec un minimum de dépendances externes. Cela les rend parfaitement adaptés à la création d'utilitaires et d'autres outils, car ils se lancent rapidement et peuvent être facilement emballés pour la redistribution.

Limitations linguistiques Go

L'ensemble de fonctionnalités avisées de Go a suscité à la fois des éloges et des critiques. Go est conçu pour être petit et facile à comprendre, certaines fonctionnalités étant délibérément omises. Le résultat est que certaines fonctionnalités courantes dans d'autres langues ne sont tout simplement pas disponibles dans Go - volontairement.

L'une de ces caractéristiques est les génériques, qui permettent à une fonction d'accepter de nombreux types de variables. Go n'inclut pas les génériques, et les responsables de la langue sont contre leur ajout, car les génériques compromettraient la simplicité de la langue. Il est possible de contourner cette limitation, mais de nombreux développeurs sont toujours impatients de voir des génériques ajoutés à Go d'une manière ou d'une autre. Au moins une proposition de mise en œuvre de génériques dans Go a été soulevée, mais rien n'a été gravé dans le marbre.

Un autre inconvénient de Go est la taille des binaires générés. Les binaires Go sont compilés statiquement par défaut, ce qui signifie que tout ce dont vous avez besoin à l'exécution est inclus dans l'image binaire. Cette approche simplifie le processus de construction et de déploiement, mais au prix d'un simple «Bonjour tout le monde!» pesant environ 1,5 Mo sur Windows 64 bits. L'équipe Go a travaillé pour réduire la taille de ces binaires à chaque version successive. Il est également possible de réduire les binaires Go avec compression ou en supprimant les informations de débogage de Go. Cette dernière option peut mieux fonctionner pour les applications distribuées autonomes que pour les services cloud ou réseau, où il est utile de disposer d'informations de débogage en cas de défaillance d'un service.

Encore une autre fonctionnalité vantée de Go, la gestion automatique de la mémoire, peut être considérée comme un inconvénient, car le ramasse-miettes nécessite un certain temps de traitement. De par sa conception, Go ne fournit pas de gestion manuelle de la mémoire, et le garbage collection dans Go a été critiqué pour ne pas gérer correctement les types de charges de mémoire qui apparaissent dans les applications d'entreprise. Du côté positif, Go 1.8 apporte de nombreuses améliorations à la gestion de la mémoire et au garbage collection qui réduisent le temps de latence impliqué. Bien sûr, les développeurs Go ont la possibilité d'utiliser l'allocation de mémoire manuelle dans une extension C, ou au moyen d'une bibliothèque de gestion de mémoire manuelle tierce.

La culture des logiciels autour de la création d'interfaces graphiques riches pour les applications Go, telles que celles des applications de bureau, est encore dispersée.

La plupart des applications Go sont des outils de ligne de commande ou des services réseau. Cela dit, divers projets s'efforcent d'apporter des interfaces graphiques riches pour les applications Go. Il existe des liaisons pour les frameworks GTK et GTK3. Un autre projet est destiné à fournir des interfaces utilisateur natives de la plate-forme, bien que celles-ci reposent sur des liaisons C et ne soient pas écrites en Go pur. Et les utilisateurs de Windows peuvent essayer la marche. Mais aucun gagnant clair ni pari sûr à long terme n'a émergé dans cet espace, et certains projets, comme une tentative de Google de créer une bibliothèque d'interface graphique multiplateforme, ont été abandonnés. De plus, comme Go est de par sa conception indépendant de la plate-forme, il est peu probable que l'un d'entre eux fasse partie de l'ensemble de packages standard.

Bien que Go puisse parler aux fonctions système natives, il n'a pas été conçu pour créer des composants système de bas niveau, tels que des noyaux ou des pilotes de périphériques, ou des systèmes intégrés. Après tout, le runtime Go et le garbage collector pour les applications Go dépendent du système d'exploitation sous-jacent. (Les développeurs intéressés par un langage de pointe pour ce type de travail pourraient se pencher sur le langage Rust.)

Aller vers l'avenir des langues

La phase suivante du développement de Go pourrait bien être davantage motivée par les désirs et les besoins de sa base de développeurs, les responsables de Go changeant le langage pour mieux accueillir ce public, plutôt que de simplement montrer l'exemple têtu. En d'autres termes, Go peut bénéficier des fonctionnalités qui ne lui étaient pas initialement destinées, comme les génériques.

Il est clair que les développeurs de Golang veulent ces choses. L'enquête auprès des utilisateurs de Go 2018 a placé les génériques parmi les trois principaux défis en matière d'adoption plus large de Go, avec une meilleure gestion des dépendances et des packages. Et une proposition existante sur GitHub pour les génériques reste active en tant que proposition pour Go 2.x. Des changements comme ceux-ci peuvent aider Go à prendre une place plus centrale dans le développement d'entreprise, où Java, JavaScript et Python règnent actuellement en maître.

Même sans changements majeurs, nous pouvons nous attendre à une utilisation accrue de Go pour les projets de reconstruction d'infrastructure, conformément aux remplacements de SSH et NTP décrits ci-dessus, et dans le cadre de projets multilingues. 

Les implémentations tierces de la chaîne d'outils Go ont également proliféré. ActiveGo d'ActiveState fournit une édition commercialement prise en charge du langage Go, et les projets LLVM et gccgo fournissent des implémentations open source de Go sous licence libérale par le biais de chaînes d'outils alternatives.

Enfin, Go a également servi de base au développement de langages entièrement nouveaux, bien que deux exemples en aient cessé le développement actif. Un exemple était le langage Have, qui rationalisait la syntaxe Go, implémentait certains des mêmes concepts à sa manière et transposait en Go pour une exécution facile. Un autre projet disparu, Oden, a utilisé l'assembleur et la chaîne d'outils de Go pour compiler un langage nouvellement conçu qui s'est inspiré de langages comme Lisp et Haskell.

Ce dernier ensemble de projets illustre l'une des façons dont toute innovation informatique devient véritablement révolutionnaire: lorsque les gens la démontent et la réorientent, trouvant des utilisations auxquelles ses concepteurs n'ont jamais pensé. L'avenir du langage Go en tant que projet piratable ne fait que commencer. Mais son avenir en tant que langage de programmation majeur est déjà assuré, certainement dans le cloud, où la rapidité et la simplicité de Go facilitent le développement d'une infrastructure évolutive qui peut être maintenue à long terme.