Langage Go de Google, une Ford T avec moteur Ferrari

Google a créé le langage Go pour pour pouvoir fonctionner avec les processeurs multi-coeurs actuels ce qui est difficile avec les langages actuels. Comme toujours, un nouveau langage répond à l'insatisfaction ressentie vis à vis des langages actuels. Dans ce cas, on le destinait à remplacer C++ pour la programmation de bas niveau, ce que ni Java ni C# ne peuvent faire. Mais cela ne signifie pas qu'il est effectivement utilisé pour cela. Il est amusant que les créateurs aient voulu conserver une syntaxe à laquelle les programmeurs soient habitués, celle de C, mais que la majorité utilisent Go pour remplacer Python!

Pour le concevoir, il a fait appel à plusieurs vétérans de la programmation ce qui explique la syntaxe vénérable du langage...

Langage de programmation Go, Ford T avec moteur Ferrari
Fonctions modernes et syntaxe vieille de 40 ans!

Ces développeurs n'ont rien à voir avec C++, qui a été créé par Bjarne Stroutstrup sur la base du C, ce qui explique des choix de conception différents, tels que la composition à la place de l'héritage.

L'objectif de Go est de rester le plus proche possible du langage C tout en améliorant de beaucoup la productivité, et se substituer à lui.
Il s'inspire de C, Java, Pascal, Python et reprend même des caractéristiques de Scriptol!
Google nous dit dans la présentation:

"Nous affirmons que Go est un langage moderne."

Et c'est vrai quand à ses fonctionnalités, non quand à la syntaxe qui date de 1969 exactement et du langage B, et avec des emprunts à Pascal (1970)!
Il est utilisé en production chez Google depuis mai 2010, mais outre le fait qu'il remplace C++ très efficacement, il tend aussi à être utilisé à la place de Python et Ruby car sa vitesse de compilation convient au scripting, tout en produisant des binaires exécutables rapides. Il peut donc remplacer tous les langages pour des programmes en ligne de commande.

Une autre citation, par l'auteur, Rob Pike:

Le point central ici est que nos programmeurs sont des Goggleurs, ce ne sont pas des chercheurs. Typiquement ils sont plutôt jeunes, fraichement sortis de l'école, ont probablement appris Java, peut-être C ou C++, et peut-être Python. Ils ne sont pas capables de comprendre un langage brillant mais nous voulons les amener à réaliser de bons programmes. Ainsi, le langage que nous leur donnons doit être facile à comprendre et facile à adopter.

Pourquoi utiliser Go? L'expérience des utilisateurs...

Conçu pour les programmes parallèles, il peut sur des ordinateurs modernes fournir un traitement accéléré.
Sa syntaxe et la façon dont il traite les objets le destine surtout à la programmation sur les serveurs comme remplacement de Perl, Python ou PHP. Il permet à la fois un développement rapide et des scripts véloces.
Il possède d'emblée les fonctionnalités de concurrence et un garbage collector. Mais le choix du garbage collector et le runtime requis ne conviennent pas pour la réalisation d'un OS, de pilotes...

On peut l'utiliser pour réaliser des logiciels serveurs et par exemple pour construire un CMS et générer des pages HTML, un domaine où il est supérieur à Python et Java. Le site golang.org est réalisé avec Go.

Quel que soit leur langage précédent (mais à priori un langage de scripts), les programmeurs ont une expérience favorable avec Go. Il est plus simple que C++, plus adaptable que Java, dispose d'une bibliothèque complète et bien conçue et fournit les services requis aux applications Web, tel que WebSocket, les closures.
Et les programmes sont compilés instantanément ce qui facilite la mise au point tout comme la description précise des erreurs qu'il affiche. Les programmeurs C savent de quoi il est question.

Quand à la question de la vitesse d'exécution, on est plus partagé. Go est nettement plus rapide que Python, c'est un fait, mais pour des grandes quantité de données, on trouvera que Java est nettement plus rapide, notamment parce qu'il sait utiliser d'emblée les multiples coeurs ce que Go ne sait pas (encore) faire.

Un langage C de plus haut niveau

La syntaxe améliore la productivité.

La technologie CSP, (Communicating Sequential Processes) gère la communication entre programmes et aide à la gestion des processeurs multi-coeurs.

Go vs. Java, C#

Java a été conçu comme un langage pour le Web et est devenu populaire grâce à cela. Il peut fonctionner sur le serveur ou sur le poste client grâce à des applets.
Son principal intérêt est sa bibliothèque d'interface graphique très étendue.
Go comme Java permet de tester immédiatement un programme ou un script en développement, mais il produit du code binaire, donc plus rapide et compact.
Cela s'applique aussi vis à vis de C#.

Go vs C++

Même s'il reprend la même syntaxe des années 70, Go simplifie la programmation par rapport à C++. Quelques causes d'erreurs fréquentes provenant de la syntaxe sont supprimées.
Le fonctionnement multi-thread devient simple, avec une seule commande.
Le garbage collector facilite la gestion de la mémoire.

Comparaison des syntaxes...

Afficher un message.

Go

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

C++

#include <stdio.h>

void main() {      
  puts("Hello, World!");  
}
Déclarer une chaîne.

Go

var str = "Hello in Go"
fmt.Println(str)

C++

string str = "Hello in C++";
puts(str);
Constante...

Go

const a = 1

C++

const int a = 1;
Déclaration. On peut les grouper. Il y a permutation par rapport à C++, mais pas d'avantage évident. Juste l'envie d'être différent!

Go

var b int = 2
var x, y, z int
var i, j, k int = 5, 10 , 20
b += x 

C++

int b = 2;
int x, y, z;
int i = 5, j = 10, k = 20 b += x;
Le type peut être déterminé par inférence. Il est toujours déclaré en C++.

Go

x := 2

C++

int x = 2;
Structure if. On peut inclure une déclaration devant la condition. Cela n'apporte rien et rend le code moins lisible. On est dans le concours d'haltérophiles ici.

Go

if x < 1 {
  fmt.Println("ok")
}

if x = mult(y, 100); x < 1000 {
  fmt.Prinfln("ok")
}  

C++

if(x < 10) {
  puts("ok");
}
  
x = mult(y, 100);
if(x < 1000) {
  puts("ok");
}  
La structure switch. La différence avec C++ est la disparition du break terminal, dont l'omission permettait d'associer plusieurs cas à un même traitement. Mais on peut avoir le même résultat avec le mot réservé fallthrough qui joue le rôle opposé à break.

Go

switch x {
 case "a":
     fmt.Println("a")
 case "b":
     fallthrough
 case "c":
     fmt.Println("b ou c")
 default:
    fmt.Println("x")
}

C++ 11

switch(x) {
  case "a": 
    puts("a"); 
    break;
  case "b": 
    puts("b"); 
  case "b": 
    puts("b ou c"); 
    break;
  default:
    puts("x");  
}
La boucle for est la seule structure de contrôle pour les itérations. On notera la disparition des parenthèses. Cela rend obligatoires les accolades.

Go

for i:= 0; i < 10; i++ {
  fmt.Println(i)
}

C

int i;
for(i = 0; i <= 10; i++) 
  puts(i);
For dispense de while. Encore une fois, cela n'apporte rien sauf à compliquer le parser et en anglais çà n'a pas de sens.

Go

var i  = 0
for i < 10 {
  fmt.Println(i)
  i += 1
}

C

int i = 0;
while(i < 10) {
  puts(i);
  i += 1;
}
Une boucle infinie est très simplifiée. Rust quand à lui a choisi d'inventer inutilement une nouvelle structure, mais aucun des deux langages bien qu'ils se veulent plus sûrs, n'offre de sécurité, comme le fait Scriptol avec l'incrément obligatoire en fin de boucle.

Go

for {
  if condition {
  	break
  }
}

C++

while(true) {
  if(condition) 
    break;
}

For ... each. Cela se fait avec le mot range. Mais c'est plus simple en C++ 11.

Go

var arr = []int { 10,20,30 }
for i, v := range arr {
  fmt.Println(v)
  ...
}

C++ version 11

int arr[] = { 10,20,30 };
for(x : arr) {
  puts(x);
  ...  
}
Déclaration d'une fonction. Notons que JavaScript utilise le mot réservé function, Python def, Rust fn, Go func. Chacun cherche à se distinguer, pourquoi ne pas appeler une fonction function?
La syntaxe de Go pour déclarer une fonction reste simple, celle de Rust étant inutilement compliquée et abscon.
Si plusieurs arguments sont de même type, on déclare le type une seule fois. Mais cela reste des types statiques dans les deux langages et n'offre pas le multiple dispatch de Julia.

Go

func mult(x int, y int) int {
  return x * y
}

C++

int mult(int x, int y) {
  return (x * y);
}
Par contre, une fonction peut retourner plusieurs valeurs sous forme de tuple alors que C++ doit recourir à un tableau, ou un objet tuple, mais sans assignement direct.

Go

func tuple(x int, y int) (int, int) {
  return x * 2, y * 2
}
x, y = tuple(10, 15)

C++

int[] tuple(int x, int y) {
  return { x * 2, y * 2 };
}
int z[] = tuple(10, 15);
x = z[0]; y = z[0];
Les structures de données sont déclarées à la mode verlan. Les auteurs du langage ne roulent pas en voiture. Ils roulent en véhicule de type voiture, c'est bien mieux.

Go

type Point struct {
    x int
    y int
}

C++

struct Point {
    int x;
    int y;
}
Exemple de script: afficher les lettres d'une chaîne avec une boucle for.

Go

package main  
import ("os";"flag";)

func main() {
  var s string = "Démonstration"
  for i := 0; i < s; i++  {
    fmt.Println(s[i])
  }
}

C++

#include <stdio>

void main() {
  string str = "Démonstration";
  for(i : str) {
     puts(i);
  }
}

 

Sur le plan des bibliothèques, Go va directement à l'encontre de C++, non seulement il n'y a pas de fichiers d'en-têtes, mais on peut même inclure des modules externes directement depuis un site distant, car toute l'information pour l'intégration est stockée dans les modules.
En général cela facilite la distribution des programmes, mais cela à des inconvénients. Les modules importés directement cessent d'être compatibles et obligent à réécrire les logiciels...

Polémique au sujet du nom

Lors du lancement public du langage, un ticket a été créé sur le forum du langage avec pour code d'identification issue 9.
L'auteur d'un langage totalement inconnu clame que le nom Go est déjà celui de son propre langage. Le fait est qu'un livre a été écrit sur celui-ci, sous le titre Let's Go!
Mais ce langage s'appelle Go! et non pas go, et le mot Go appartient au domaine public: il s'agit d'un jeu de tableau chinois qui existe depuis plusieurs milliers d'années! (Et aussi le verbe "aller" en anglais).

Sites et outils pour Go

Langages de programmation et de données Asm.js - Basic - C - C++ - C# - Dart - Eiffel - Go - Java - JavaScript - Julia - Pascal - PHP - Python - Ruby - Scala - Scriptol - TypeScript - HTML - Wasm - XML - XAML - SQL