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...

L'expérience est plutôt négative chez les programmeurs individuels, ayant utilisé d'autres langages modernes. Go est principalement conçu pour une équipe où ajouter/remplacer un programmeur est récurrent. Il permet d'être rapidemment productif même pour des débutants.
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. Un garbage collector ne convient généralement pas pour la réalisation d'un OS, de pilotes, mais il a été spécialement optimisé pour parvenir à des pauses de moins de 100 microsecondes!

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.

Il est plus simple que C++, plus adaptable que Java, plus rapide et plus sûr que Python, dispose d'une bibliothèque complète et bien conçue (coté serveur) 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 éventuelles, contrairement à d'autres langages comme C++.

Une syntaxe venant du langage C

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

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 (celles-ci sont devenues obsolètes).
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.

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 variable. Le type peut être défini par inférence en Go.

Go: deux déclarations équivalentes.

var i : int = 10
var i = 10

C++

int i = 10;
Déclarer une chaîne. Le type peut être assigné par inférence.

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.

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;
Dans une fonction, une variable peut être déclarée implicitement. Elle est toujours déclaré explicitement 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.

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": 
  case "c": 
    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 et cela ne paraît pas un choix judicieux. "while i < 10" signifie: "tant que i est inférieur à 10" et est compréhensible, mais "for i < 10" signifie "pour i inférieur à 10" et cela 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 n'offre de sécurité, que l'on obtient avec l'incrément obligatoire en fin de boucle comme le fait le langage Scriptol.

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 ftuple(x int, y int) (int, int) {
  return x * 2, y * 2
}
x, y = ftuple(10, 15)

C++

int[] ftuple(int x, int y) {
  return { x * 2, y * 2 };
}
int z[] = ftuple(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 = "Démonstration"
  for i := 0; i < s; i++  {
    fmt.Println(s[i])
  }
}

C++

#include <stdio>
#include <string>

void main() {
  string s = "Démonstration";
  for(i : s) {
     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 - Prolog - Ruby - Scala - Scriptol - Swift - TypeScript - HTML - Wasm - XML - XAML - SQL