11.5.7 : Go



Initialement conçu par la société Google pour ses développements internes, le langage Go tente lui aussi d'investir la niche très convoitée de la programmation proche du système d'exploitation, mais avec une approche très différente de celle des langages précédents.

En effet, là où C++, Ada et Rust tentent de se placer aussi près de la machine que le C, tout en offrant des outils complémentaires pour rendre ce type de programmation plus expressif et/ou plus facile, Go prend le parti de se placer à un niveau d'abstraction un peu plus élevé afin de gagner en simplicité d'utilisation.

Ainsi, le langage utilise par exemple une gestion automatique de la mémoire ("ramasse-miettes"), ce qui diminue le contrôle du programmeur sur l'utilisation des allocateurs mémoire et le placement des données en mémoire mais offre en partie un plus grand confort d'utilisation puisque le programmeur ne doit plus se préoccuper de libérer la mémoire qu'il a allouée.

Le langage emploie une approche de conception minimaliste où une fonctionnalité n'est ajoutée au langage que s'il est rigoureusement impossible de reproduire le même comportement avec des fonctionnalités existantes. Grâce à cela, il possède un très faible nombre de concept et est facile à apprendre. Il donne également beaucoup moins de travail au compilateur, ce qui accélère les compilations.

La contrepartie de ce choix de conception est que certains types d'abstractions (ex~: indépendance de la précision flottante, interfaces dont la bonne utilisation est vérifiée à la compilation) ne peuvent être exprimés par une bibliothèque Go, et que certains types de code (ex~: algèbre linéaire, gestion des erreurs) sont beaucoup plus verbeux en Go que dans d'autres langages.

Comme Ada, Go fournit un support natif de la programmation parallèle et concurrente, en encourageant fortement l'utilisation d'un modèle de processus communiquants (le programme se compose d'un certain nombre de tâches concurrentes qui ne communiquent qu'en échangeant des messages). Ce modèle est très approprié à certains types de programmes comme les serveurs web, mais moins à d'autres cas d'utilisation comme le calcul scientifique où le partage direct de mémoire est souvent nécessaire à l'obtention de performances optimales. Pour ce type d'utilisation, Go fournit un ensemble de primitives de synchronisation similaire à celui du C++ moderne.

Du fait de son niveau d'abstraction plus élevé que le C, et notamment de l'utilisation de coroutines et d'un ramasse-miettes, le langage Go est relativement difficile à interfacer avec le C et avec les autres langages de programmation en général. Par conséquent, ses utilisateurs sont généralement contraints de réimplémenter en grande partie les bibliothèques de calcul établies en C ou Fortran pour obtenir une ergonomie optimale.

Le langage Go possède à l'IN2P3 une communauté d'utilisateurs modeste mais extrêmement active, qui voit en lui un bon compromis pour éviter de devoir combiner deux langages de programmation, un langage "pour informaticien" (comme C++ ou Rust) et un langage "pour physicien" (comme Python).

Go est généralement compilé statiquement vers des binaires natifs.

Ce serait bien d'évoquer Java et Scala (peut-être en faisant une partie commune pour les deux) si on va parler de Spark dans lasection parallélisme.