Top Banner
33

Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Sep 13, 2018

Download

Documents

lamdan
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Le langage de programmation Go

Stéphane Bortzmeyer<[email protected]>

19 avril 2011

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 1 / 23

Page 2: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Exposé libre

Ce document est distribué sous les termes de la GNU Free DocumentationLicense http://www.gnu.org/licenses/licenses.html#FDL.Permission is granted to copy, distribute and/or modify this documentunder the terms of the GNU Free Documentation License, Version 1.2 orany later version published by the Free Software Foundation ; with noInvariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 2 / 23

Page 3: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Pourquoi parler de Go ?

1 Situé sur un créneau où il y a peu de langages concurrents,

2 Robert Griesemer, Rob Pike, Ken Thompson, Ian Taylor, Google. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 3 / 23

Page 4: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Positionnement de Go

Il existe des zillions de langages de programmation. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 4 / 23

Page 5: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Positionnement de Go

Il existe des zillions de langages de programmation. . .

Certaines familles sont très encombrées (langages fonctionnels : Haskell,Erlang, famille ML. . . )

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 4 / 23

Page 6: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Positionnement de Go

Certaines familles sont très encombrées (langages fonctionnels : Haskell,Erlang, famille ML. . . )

Go est sur le créneau des langages � systèmes et réseaux �, où il n'y aguère que C et C++ (et Erlang ?). La précédente tentative sérieuse dedétrôner C était D (peu de succès).

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 4 / 23

Page 7: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Positionnement de Go

Go est sur le créneau des langages � systèmes et réseaux �, où il n'y aguère que C et C++ (et Erlang ?). La précédente tentative sérieuse dedétrôner C était D (peu de succès).

Go est donc positionné comme langage de relativement bas niveau. Cen'est pas Python. Ce n'est pas Haskell.

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 4 / 23

Page 8: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Positionnement de Go

Go est donc positionné comme langage de relativement bas niveau. Cen'est pas Python. Ce n'est pas Haskell.

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 4 / 23

Page 9: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Au commencement, était Hello, World

package main

import ("flag"; "fmt"; "os";)

func main() {

if flag.NArg() != 1 {

fmt.Printf("Usage: program name\n");

os.Exit(1);

}

fmt.Printf("Hello, %s\n", flag.Arg(0));

}

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 5 / 23

Page 10: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Points importants du langage

1 Parallélisme (les goroutines),

2 Inférence de types,

3 Pas orienté objet (mais une fonction peut être attachée à un type),

4 Pas d'exceptions (mais les fonctions peuvent renvoyer plusieurs valeurset il existe un mécanisme de panic/recover),

5 Vues (slices) sur les tableaux,

6 Et bien d'autres choses. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 6 / 23

Page 11: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Points importants du langage

1 Parallélisme (les goroutines),

2 Inférence de types,

3 Pas orienté objet (mais une fonction peut être attachée à un type),

4 Pas d'exceptions (mais les fonctions peuvent renvoyer plusieurs valeurset il existe un mécanisme de panic/recover),

5 Vues (slices) sur les tableaux,

6 Et bien d'autres choses. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 6 / 23

Page 12: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Points importants du langage

1 Parallélisme (les goroutines),

2 Inférence de types,

3 Pas orienté objet (mais une fonction peut être attachée à un type),

4 Pas d'exceptions (mais les fonctions peuvent renvoyer plusieurs valeurset il existe un mécanisme de panic/recover),

5 Vues (slices) sur les tableaux,

6 Et bien d'autres choses. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 6 / 23

Page 13: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Points importants du langage

1 Parallélisme (les goroutines),

2 Inférence de types,

3 Pas orienté objet (mais une fonction peut être attachée à un type),

4 Pas d'exceptions (mais les fonctions peuvent renvoyer plusieurs valeurset il existe un mécanisme de panic/recover),

5 Vues (slices) sur les tableaux,

6 Et bien d'autres choses. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 6 / 23

Page 14: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Points importants du langage

1 Parallélisme (les goroutines),

2 Inférence de types,

3 Pas orienté objet (mais une fonction peut être attachée à un type),

4 Pas d'exceptions (mais les fonctions peuvent renvoyer plusieurs valeurset il existe un mécanisme de panic/recover),

5 Vues (slices) sur les tableaux,

6 Et bien d'autres choses. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 6 / 23

Page 15: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Points importants du langage

1 Parallélisme (les goroutines),

2 Inférence de types,

3 Pas orienté objet (mais une fonction peut être attachée à un type),

4 Pas d'exceptions (mais les fonctions peuvent renvoyer plusieurs valeurset il existe un mécanisme de panic/recover),

5 Vues (slices) sur les tableaux,

6 Et bien d'autres choses. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 6 / 23

Page 16: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Points importants du langage

1 Parallélisme (les goroutines),

2 Inférence de types,

3 Pas orienté objet (mais une fonction peut être attachée à un type),

4 Pas d'exceptions (mais les fonctions peuvent renvoyer plusieurs valeurset il existe un mécanisme de panic/recover),

5 Vues (slices) sur les tableaux,

6 Et bien d'autres choses. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 6 / 23

Page 17: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Parallélisme

Une des principales raisons de la conception de Go, selon les auteurs.

Toute fonction peut être exécutée en parallèle avec le mot-clé go :

go coffee_machine(chan_machine);

Très pratique pour les serveurs réseaux. Ici, un serveur echo :

for { // ever...

conn, error := listener.AcceptTCP();

if error != nil {

...

go handle(conn);

}

// Prêt pour le client suivant

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 7 / 23

Page 18: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Canaux de communication

Les goroutines communiquent par des canaux typés.

func coffee_machine(c chan bool) {

// Do something

c <- true;

}

// Dans une autre goroutine:

result <- chan_machine;

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 8 / 23

Page 19: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Autre possibilités sur les canaux

Les canaux sont synchrones par défaut mais on peut les rendreasynchrones en indiquant la taille du tampon,

On peut, avec select, écouter sur plusieurs canaux en même temps.

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 9 / 23

Page 20: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Inférence de types

Go est typé mais il n'est pas indispensable de déclarer les variables.

conn, error := net.Dial("tcp", "", "whois.nic.fr:43");

Et conn sera de type net.Conn, sans avoir eu besoin de le déclarer, carc'est ce que renvoie net.Dial. Ce type sera véri�é :

whois.go:30: invalid operation: conn + 4 (type net.Conn + int)

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 10 / 23

Page 21: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Pas orienté-objet

Ce n'est plus à la mode.

Mais on peut attacher une fonction à un type.

// Définition

func (t *Twitter) FriendsTimeline() (string, os.Error) {

...

// Utilisation

tw := twitter.NewTwitter(*username, *password);

timeline, error := tw.FriendsTimeline();

os.Stdout.WriteString(timeline);

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 11 / 23

Page 22: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Pas d'exceptions

Les auteurs les voient comme une structure de contrôle dangereuse.

Mais :

Fonctions multi-valuées :

file, status := os.Open(filename, os.O_RDONLY, 0)

if status != nil {

fmt.Printf("Cannot open \"%s\": %s\n", filename, status.String())

}

Mécanisme panic/recover, moins général :

func clean() {

status := recover()

/* Do something */

...

defer clean()

...

panic("Something is horribly wrong")

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 12 / 23

Page 23: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Une vue sur le tableau

Les tableaux sont assez rigides et �xes.

Mais il y a les vues (slices) !

En Go, on utilise presque toujours une vue et pas le tableau sous-jacent.

binary.BigEndian.PutUint16(result[4:6], packet.Qdcount)

// result est le tableau, result[4:6] une vue (pas une copie)

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 13 / 23

Page 24: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Interfaces

Go, comme Java, a des interfaces : un ensemble de fonctions que doitmettre en ÷uvre un type, pour pouvoir être utilisé.

Très utilisé dans les bibliothèques. Exemple dans io :

/* Un type qui a une fonction d'écriture. Cela peut être un fichier,

une prise réseau, une chaîne de caractères, etc */

type Writer interface {

Write(p []byte) (n int, err os.Error)

}

/* Et ensuite : */

func NewBufferedWriter(wr io.Writer) *BufferedWriter

/* Permet de ``bufferiser'' tout io.Writer */

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 14 / 23

Page 25: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

La bibliothèque standard

Elle est très riche :

Crypto

Expressions rationnelles

Réseau (et protocoles comme HTTP)

XML

Grands entiers

mais pas encore de moyens standards de parler à un SGBD

et pas grand'chose encore question interface utilisateur. . .

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 15 / 23

Page 26: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Exemple bibliothèque : XML

Accès aux données du VéloStar de Rennes, KR (Keolis-Rennes). Lepaquetage XML utilisé la ré�exion de Go :

type Station struct {

Id int

...

Bikesavailable int

...

type ApiKR struct {

Request string

Answer Answer

}

...

result := ApiKR{}

error := xml.Unmarshal(buffer, &result)

fmt.Printf("Bikes available: %d\n",

result.Answer.Data.Station.Bikesavailable)

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 16 / 23

Page 27: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Autres bibliothèques

http://godashboard.appspot.com/package

Qualité variable...

Déjà un programme standard d'installation, goinstall

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 17 / 23

Page 28: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Mises en ÷uvre

gc, le compilateur natif original. Pour Linux, FreeBSD et MacOS X.Génère du code pour amd64, i386 et ARM. Les goroutines sont misessur des �ls du système sous-jacent, selon la demande (il n'y a pas decorrespondance univoque).

gccgo, désormais inclus dans gcc (depuis la 4.6).

erGo, écrit en Go, non libre, sur Windows.

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 18 / 23

Page 29: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Problèmes et limites

Nom incherchable dans Google,

Langage (et environnement) pas encore stabilisé, tout change tout letemps (il y a même un programme spécial pour mettre à jour lessources, go�x),

Manque encore de bibliothèques stables pour des choses commel'accès aux SGBD,

Langage de bas niveau (et c'est fait exprès), donc on n'essaie pas demasquer la machine,

Les chaînes de caractères sont en fait des chaînes d'octets (péniblepour Unicode, où on doit travailler avec des tableaux d'entiers).

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 19 / 23

Page 30: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Idiosyncrasies

Variable non utilisée ? C'est interdit...

hello.go:10: name declared and not used

Allocation mémoire avec make :

value := make([]byte, 1024)

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 20 / 23

Page 31: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Un serveur de noms en Go

Grong http://github.com/bortzmeyer/grong est un serveur de nomsfaisant autorité.

Il est séparé en deux parties, un frontal qui analyse les requêtes entranteset génère des requêtes sortantes correctes. Et un dorsal qui produit laréponse à partir de la requête. Plusieurs dorsaux di�érents sont possiblescomme un serveur AS112 ou bien un serveur qui renvoie au client l'adresseIP du résolveur.

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 21 / 23

Page 32: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Implémentation de Grong

Une fonction d'écoute pour TCP et une pour UDP, toutes les deux lancéesen goroutines.

Chacune lance ensuite une goroutine par requête (UDP) ou par connexion(TCP).

Avec les goroutines, écrire un serveur réseau est un plaisir.

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 22 / 23

Page 33: Le langage de programmation Go - bortzmeyer.org · 3 Pas orienté objet (mais une fonction peut être attachée à un type), 4 Pas d'exceptions (mais les fonctions peuvent renvoyer

Autres exemples de DNS en Go

[Développés à SIDN]

1 GoDNS, une bibliothèque https://github.com/miekg/godns

2 Funkensturm, un relais DNS (capable par exemple de signer à la volée)http://www.miek.nl/blog/archives/2011/01/23/funkensturm_

a_versatile_dns_proxy/index.html

Stéphane Bortzmeyer <[email protected]> ()Le langage de programmation Go 19 avril 2011 23 / 23