GO, un langage performant et ennuyant…

(source : medium.com / made by : Simplify Complexity)

Cet article vous demandera environ 20 minutes pour sa lecture complète.

Nous y dépeindrons le langage de programmation GO en commençant par les raisons de sa création, son utilité et pourquoi vous devez commencer à vous en servir.

Vous êtes prêt ? Alors Let's GO ! 

Introduction

GO aussi appelé Golang est un langage de programmation open source, compilé et typé développé par Google. On doit sa création à Rob Pike, KenThompson et Robert Griesemer qui publièrent la première version le 10 novembre 2009.

Mais pourquoi avoir créé ce langage, quelles étaient les motivations de ses créateurs ? 

La naissance de GO

Golang a été pensé de manière à faire face à deux grandes lois qui régissent l’évolution de la puissance de nos machines.

La première est la loi de Moore, cette loi énoncée par Gordon Moore en 1965 prédit que le nombre de transistors sur nos circuits intégrés doublera chaque année. 10 ans plus tard, il l'ajusta à deux ans au lieu d’un. Cette deuxième prédiction fut vérifiée jusqu’à 2012.

Plusieurs entreprises ont anticipé le ralentissement de cette règle et ont donc réfléchi à comment pallier ce problème, c’est alors que le processeur multi-core est né et depuis le nombre de core ne fait qu’augmenter.

C’est ainsi que la seconde loi prit le relais, la loi d’Amdhal décrite par l’informaticien Gene Amdhal en 1967. Elle prédit l'accélération théorique lors de l'utilisation de plusieurs processeurs.

Dans des termes plus simples, le temps d’exécution pourra être réduit si les programmes peuvent paralléliser au maximum leurs tâches (en utilisant tous les cores des processeurs).

C’est donc avec ces problématiques en tête et l’arrivée du cloud computing que Rob Pike, Ken Thompson et Robert Griesemer ont travaillé ensemble pour développer un langage moderne avec beaucoup d’avantages

 

Les avantages

I. Apprentissage et intelligibilités 

Pourquoi ai-je qualifié GO d’ennuyeux ?

Et bien contrairement à une regex incompréhensible qui récompense votre  cerveau  avec  de  la  dopamine  lorsque  vous  la  décryptez,  le  langage  GO est clair, lisible et facilement intelligible, donc ennuyeux.

GO est proche du C, mais il possède des avantages supplémentaires comme  un  ramasse-miettes  (garbage  collector),  du  typage  structurel  et  de  la concurrence de type CSP (Communicating Sequential Processes)

 

II. Performance
1. Concurrence CSP

La majorité des langages que l’on connaît (Java, C#, Python, etc.) implémente le multithreading pour faire face aux deux lois évoquées précédemment. Mais cela leur cause des ralentissements.

Une attention particulière a donc été accordée au soutien de la concurrence, en développant des «goroutines» par opposition aux threads. Ces «goroutines» sont des fonctions qui s'exécutent en même temps que d'autres fonctions, elles peuvent être considérées comme des threads légers.

Au lieu de verrouiller les variables pour se partager la mémoire, les «goroutines» se communiquent entre elles la valeur des variables.

Leur coût de création est infime comparé à celui d'un thread. Il est donc courant que des milliers de «goroutines» soient exécutées simultanément dans une application. 

2. Compilation
GO est compilé en langage machine, ce qui le rendra naturellement plus performant que les langages interprétés.
 
Non seulement l’exécutable qui en résulte est compilé très rapidement, mais le binaire finit par être étonnamment petit.
 
Par exemple le temps de compilation des 1,8 millions de lignes de code pour le projet Kubernetes v1.20.2 peuvent être compilés en 45 secondes avec un MacBook Pro de 2019 ayant un intel core i9 avec 8 core cadencés à 2,4Ghz et 32Go de RAM.
 
III. Cross-platform

Le langage permet la compilation pour différents langages machines et architectures de processeur (amd64, arm, etc.). De ce fait, les programmes GO peuvent  être  exécutés  sous  les  environnements  Linux,  Mac  OS,  Windows, Android même Web avec l’utilisation de Web Assembly.

 

IV. Stabilité linguistique

Il a été défini par le projet Golang que toute application codée en version 1 reste compatible, c’est-à-dire qu’une application codée en GO 1.0.0 peut être compilée en GO 1.18.2 sans soucis.

Ceci représente un réel avantage car bon nombre de langages empêche la rétro-compatibilité après une montée de version.

 

Les inconvénients

I. Jeunesse

Avec maintenant un peu plus de 12 ans d’existence, le langage n’a pas forcément  la  maturité  et  l’expérience  que  beaucoup  d’autres  langages  plus anciens possèdent.

La bibliothèque native de Golang est intelligemment conçue et efficace, mais  elle  est  en  concurrence  avec  des  langages  comme  Java  qui  sont soutenus par une énorme collection de code intégré maintenu et amélioré par une communauté enthousiaste et engagée.

 

II. Gestion des erreurs

Dans GO, les erreurs sont tout simplement des valeurs. De ce fait, beaucoup de fonctions finissent par renvoyer une erreur.

Cela peut causer des problèmes lorsque la source de l’erreur est perdue, ce qui entraîne une absence de logique utile pour déboguer.

 

III. Sécurité d’exécution 

Par rapport à de nombreux langages de programmation, Golang est relativement  sûr,  mais  il  est  loin  d’offrir  le  niveau  de  sécurité  qu’offrent  des langages comme Rust.

Cependant, cette faiblesse n’existe que lors de la compilation et, dans une certaine mesure, de l’exécution.

 

IV. Pas de bibliothèque graphique

Golang ne dispose malheureusement pas de bibliothèque d’interface graphique,  ce  qui  signifie  que  l’on  doit  connecter  une  bibliothèque  au  lieu d’utiliser des solutions natives disponibles dans des langages tels que Python ou Java.

 

Intérêts d'apprendre GO

Popularité et emploi

Pourquoi apprendre à développer en GO et qu’est-ce qu’on peut développer avec ?

Actuellement, le GO est en pleine expansion sur le marché du travail. Différentes   entreprise   de   toute   taille   recherchent   des   développeurs   qui affectionnent ce langage.

On peut remarquer cette expansion avec les tableaux de popularité des langages ci-dessous :

 

Index TIOBE (https://www.tiobe.com/tiobe-index/)

Popularité des langages sur GitHub (https://madnight.github.io/githut/)

 

Utilisation
GO est de par nature multiplatform, il peut donc être utilisé pour une multitude de choses.
Nous verrons ci-dessous 3 différentes utilisations de celui-ci.
Développement d’outils pour le Cloud

Le logiciel Docker est une technologie de conteneurisation qui permet la création et l’utilisation de conteneurs.

Il est très vite devenu la référence après sa sortie en 2013.
 
Développement d’outils CLI

Terraform est un outil logiciel open source d'infrastructure en tant que code (IaaS) créé par HashiCorp. Les utilisateurs définissent et fournissent l'infrastructure à l'aide d'un langage de configuration déclaratif spécifique à la société (HashiCorp), ou en option, JSON
 
Développement de jeux vidéo

https://ebiten.org/
 
Cette librairie externe permet de développer des  petits jeux vidéo cross-platform en Go. 
En suivant le lien, vous pourrez trouver des exemples comme 2048, Flappy Bird, etc.
 
 

Exemple de projets

GO étant créé avec les problématiques du cloud computing en tête, ce dernier est donc l’un des plus utilisé pour développer ces outils. En voici une liste non exhaustive :

Kubernetes est un système open source qui vise à orchestrer l’automatisation et la montée en charge de conteneurs d'application sur des clusters de serveurs ».
 
 
Consul est un service mesh, il permet de découvrir et sécurisé des services au sein d’un cloud. Il est souvent utilisé dans les architectures micro-services.
 
 
Prometheus est un outil open source permettant de tracer et stocker des mesures sous forme de données chronologiques pour mieux comprendre les différentes interactions de notre architecture cloud.
 
 
 
CockroachDB est une base de données relationnelle SQL horizontalement scalable qui incorpore un mode de réparation automatique la rendant résiliente.
 
 
Traefik est un routeur Edge open source. Il reçoit les demandes provenant des utilisateurs ou de vos services et les redirige aux responsables de leur traitement.
À savoir qu’il peut communiquer avec le daemon Docker pour automatiser l’accès à vos services.
 

Comment bien démarrer ?

 

Vos premiers programmes en GO

HelloWorld ! 
Pour votre premier programme, vous devrez tout d’abord installer GO pour ce faire, rendez-vous sur cette url : https://go.dev/dl/
Une fois installer, vous pouvez créer un dossier nommé « helloworld » 
 
Dans ce dernier, créez un fichier « main.go » ayant comme contenu les lignes suivantes :
 
 
Pour l’exécuter, démarrez un terminal dans le dossier créé précédemment nommé « helloworld » et tapez « go run main.go » 
 
Voilà ! Vous venez de faire votre premier programme en GO, simple non !?
 
Peut-être trop simple pour vous alors voyons comment on fait une API !
 
Une API HelloWorld !
Comment allons-nous faire pour développer notre API ?
 
Devons-nous importer une librairie externe pour pouvoir en développer une 
facilement ?
 
La réponse est oui et non, cela va dépendre de vos besoins, si vous souhaitez développer une grosse API résiliente, il est préférable d’utiliser des dépendances externes comme celles-ci dessous :
- Revel
- Gin
- Gorilla
- Et bien d’autres…
 
Mais vous allez voir que développer une API est extrêmement simple même 
sans utiliser une librairie externe !
 
Commençons par créer un dossier nommé « myAPI » 
Dans ce dernier, créez un fichier « main.go » ayant comme contenu les lignes suivantes :
 
 
Voilà ! En seulement quelques lignes de code intelligible vous venez de faire une API qui renvoie « HelloWorld !! » au format JSON.
 
Comment faire plus simple ?
Vous remarquerez que j’ai mis des commentaires mais même sans, vous auriez compris au moins dans les grandes lignes ce que fait chaque bloc.
 
Vous êtes convaincu et voulez en découvrir plus sur les librairies, logiciels en GO ?
 
Vous pouvez vous rendre sur les liens suivants :
 
 

Bibliographie

Livres

Cloud Native GO. (2021). Building Reliable Services In Unreliable Environments. (1er éd). O’Reilly

Concurrency in GO. (2017). Tools & Techniques For Developers. (1er éd). O’Reilly

Learning GO. (2021). An Idiomatic Approach to Real-World Go Programming. (1er éd). O’Reilly

 

Sites
Hashicorp : Consul - https://www.consul.io/
 
Wikipédia :
 
Médéric Bazart

Consultant Versusmind