Go (langage)

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
Page d'aide sur l'homonymie Pour les articles homonymes, voir GO.
Page d'aide sur l'homonymie Cet article concerne le langage de programmation open source créé par Google en 2009 . Pour le langage de programmation créé en 2003 , voir Go! (langage de programmation). Pour go dans d'autres contexte, voir GO.
Go
Logo.

Apparu en
Auteur Robert Griesemer
Rob Pike
Ken Thompson
Développeur Google Inc.
Paradigme Langage compilé, programmation concurrente, impérative et structurée
Typage Fort, statique
Influencé par C, Pascal, Modula, Oberon, Newsqueak, Limbo [1]
Système d'exploitation Windows, Linux, Mac OS X, FreeBSD, Plan 9[2]
Licence Licence BSD[3], breveté[4]
Site web golang.org

Go est un langage de programmation compilé et concurrent inspiré de C et Pascal. Ce langage a été développé par Google[5] à partir d'un concept initial de Robert Griesemer, Rob Pike et Ken Thompson. Go possède deux implémentations, la première utilise gc, le compilateur Go et la seconde utilise gccgo un « frontend » GCC écrit en C++. Go est écrit en C en utilisant yacc et GNU Bison pour l'analyse syntaxique[6]

Logo de Google Go
Mascotte de Google Go

Go a pour but de faciliter et d'accélérer la programmation à grande échelle : La compilation est de 80 % à 90 % plus rapide que la compilation classique du C[7]. Il vise également la rapidité d'exécution, indispensable à la programmation système.

« Hello, world »[modifier | modifier le code]

Voici un exemple d'un programme Hello world typique écrit en Go.

package main
 
import "fmt"
 
func main() {
	fmt.Printf("Hello, World\n")
}

Caractéristiques[modifier | modifier le code]

Le langage Go a été créé pour la programmation système et a depuis été étendu aux applications, ce qui constitue la même cible que le C et surtout le C++. Il s'agit d'un langage impératif et concurrent.

Concurrence[modifier | modifier le code]

Go intègre la concurrence en son cœur, permettant très facilement d’exécuter du code en concurrence. Il suffit d'utiliser le mot clé go pour qu'un appel de fonction puisse être exécuté en concurrence du thread courant. Ce code exécuté en concurrence s'appelle une goroutine par analogie avec les coroutines. Le programme prendra alors avantage de la topologie de l'ordinateur pour exécuter au mieux les goroutines, pas forcément dans un nouveau thread, mais il est aussi possible qu'un groupe de goroutines soit multiplexé sur un groupe de threads.

Les goroutines peuvent communiquer entre elles par passage de messages, en envoyant ou en recevant des messages sur des canaux. Cet échange de message est le mécanisme principal de synchronisation des goroutines entre elles, conformément au modèle CSP, considéré par les auteurs comme plus facile à maîtriser par le développeur que le modèle multi-threadé (avec synchronisation via sémaphores, verrous ...).

Système de types[modifier | modifier le code]

Go a un système de type statique, fortement typé et sûr, basé sur l'inférence de types avec la possibilité d'utiliser un typage explicite.

La compatibilité des types composés est basée sur les propriétés plutôt que sur le nom. C'est-à-dire que deux types composés seront équivalents si leurs propriétés sont équivalentes : même nom pour la propriété et équivalence de type.

Cela a pour conséquence que le langage n'est pas objet au sens classique (soit avec classes, soit avec prototype), cependant les concepteurs du langage ont fait un choix plus original pour un langage statique. Il est possible de définir des interfaces portant des méthodes décrivant le comportement d'un objet (Il est aussi facilement possible de mélanger plusieurs interfaces en une seule)[8]. Les fonctions Go peuvent déclarer accepter un argument de cette interface. Un objet déclarant toutes les méthodes de cette interface, avec la même signature, peut être passé en argument de cette méthode. La vérification du type est effectuée statiquement par le compilateur.

Le fait que Go ne soit pas objet au sens classique fait que Go n'a pas d'héritage de type et pas de sous-classage. Ceci permet de contourner les problèmes posés par ces systèmes tels l'héritage multiple dans les langages qui le permettent (en C++ par exemple), ou l'héritage simple (en Java par exemple). Grâce à l'équivalence de types basée sur les propriétés, Go n'a pas besoin d'héritage de type. Le sous-classage est émulé par l'« embarquement de type ».

La visibilité des structures, attributs, variables, constantes, méthodes, types de haut niveau et des fonctions hors de leur paquetage de déclaration est définie par la casse du premier caractère de leurs identificateurs.

Divers[modifier | modifier le code]

Dans Go, la gestion de la mémoire est laissée à un ramasse-miettes[8].

Il n'y a pas encore de programmation générique même si les concepteurs du langage y réfléchissent. Il n'y a pas de surcharge de méthodes ou d'arithmétique des pointeurs. Enfin, il n'y a pas d'assertions ou d'exceptions. Pour remplacer ces deux derniers, Go fournit les mots clés defer, panic et recover qui donnent des mécanismes similaires aux systèmes de gestion des exceptions de langages tels que C++ et Java (mots clés try, catch, finally et throw).

Go peut s'interfacer avec des bibliothèques en C/C++, des développeurs tiers ayant déjà développé des bindings pour SDL, MySQL, ...

Go définit un format de code standard (au niveau des indentations, de la présentations des structures de contrôle) et fournit un outil pour l'appliquer (go fmt).

Go propose également un système de documentation à partir du code et un framework de test.

L'unité de compilation de go est le package qui est représenté dans l'implémentation standard par un répertoire et les fichiers directement contenu dans ce répertoire. L'import d'un package se fait par son chemin d'importation et peut préciser soit une bibliothèque standard, soit également des packages tiers installé dans des dépôts de sources distants (actuellement supporté : dépôt sous svn, git, mercurial et bazaar)

Notes et références[modifier | modifier le code]

  1. (en) What are Go's ancestors?
  2. (en) « Go on Plan9 »
  3. (en) « Text file LICENSE » (consulté le 27 January 2011)
  4. (en) « Additional IP Rights Grant » (consulté le 17 January 2012)
  5. (en) http://www.techcrunch.com/2009/11/10/google-go-language/
  6. (en) « FAQ - The Go Programming Language », golang.org, 6 octobre 2011.
  7. (en) [PDF] « Go Tech Talk » (ArchiveWikiwixArchive.isGoogleQue faire ?). Consulté le 2013-04-13, page 37
  8. a et b (en) Rob Pike, « Go at Google » (consulté le 06 November 2012)

Liens externes[modifier | modifier le code]

Sur les autres projets Wikimedia :