CSI2520 Un langage de programmation impérative et concurrente.

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Introduction au Langage C,C++
A RECUPERER EN ENTRANT Le polycopié de Caml Partie 1
Programmation Orienté Objet en C++
Rappels C.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Approfondissement du langage
la programmation en langage C
C.
Programmer en JAVA par Tama
JAV - TD 6 Structures de données JAVA
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
IJA - TD 2 Bases du langage
M. BENJELLOUN : Info II Mohammed BENJELLOUN Service dInformatique Faculté Polytechnique de Mons
1 Une introduction à Java IFT 287 (Semaine 1). 2 Java - Historique Développé par Sun Microsystems en 1994 –Inventeur James Gosling (canadien!) Objectif.
Principes de programmation (suite)
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Introduction à la programmation (Java)
Langage Oriente Objet Cours 2.
Structures de données IFT-2000
Structures de données IFT-2000
Le langage JAVA Année scolaire
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 7 : Classes et fonctions paramétrables Département.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Principes de programmation
Programmation concurrente
Un langage de programmation impérative et concurrente
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
IFT 6800 Atelier en Technologies d’information
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Langages orientés objets
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI 1502 Principes fondamentaux de conception de logiciels
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Une introduction à Java
2.1 - Historique Chapitre 2 : Introduction au langage C++
Cours 1 1 Java. Cours 1 2 Plan général 1.Introduction 2.Les types primitifs, évaluation d’expressions 3.Instructions for, if…. 4.Introduction de l’objet,
et quelques rappels sur certains éléments du langage C
ALGORITHMIQUE ET PROGRAMMATION C
Langage C Chapitre I: Initiation à la programmation en C
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
CSI3525: Concepts des Langages de Programmation Notes # 13: Introduction au SmallTalk.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
Cours n° 1 Présentation du langage C++
Le langage Go 1ère partie
Tutorat en bio-informatique
Module I3 algorithmique et programmation
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
ISBN Chapitre 10 L'implémentation des sous- programmes.
CSI2520 Un langage de programmation par scripting orienté-objet (et fonctionnel)
IUT du Limousin L.U.P Michel Vergnaud Programmation Objet - Java.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
1 Programmation en C++ Marianne Morris. 2 Intro générale à la programmation On a déjà étudié le langage assembleur Langage de bas niveau Meilleur que.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Conception de Programmes - IUT de Paris - 1ère année Conception de Programmes Objectifs et organisation du cours Introduction à la P.O.O. et au.
Conception de Programmes - IUT de Paris - 1ère année Conception de Programmes Objectifs et organisation du cours Introduction à la P.O.O.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
Les bases de l’algorithmique
PRO-1027 Programmation Scientifique en C
22 Concepts de base du langage Java. 2-2 Objectifs A la fin de ce cours, vous serez capables de : Identifier les éléments essentiels de Java Identifier.
pour les programmeurs en C++ Java 2 Part 1 3 Histoire de Java Projet de connexion des machines: 1991 Le nom Java a été introduit dans un café Développé.
Conception de Programmes - IUT de Paris - 1ère année Les classes Introduction Déclaration d’une classe Utilisation d’une classe Définition des.
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Transcription de la présentation:

CSI2520 Un langage de programmation impérative et concurrente

CSI2520  Développé en chez Google par 3 ingénieurs sous leur 20% en libre travail: ◦ Robert Griesemer ◦ Rob Pike ◦ Ken Thompson (un des inventeurs de C)  Lancement publique le 8 janvier 2010 ◦ en logiciel libre ◦ golang.org  Premier langage du 21 ème siècle

 Go combine ◦ Compilation rapide (comme Java) ◦ Éxécution rapide (comme C/C++) ◦ Facilité de programmation (comme Python)  Go est un langage avec des types forts et une mémoire protégée ◦ Pas possible d’utiliser plusieurs types dans une expression ◦ Pas d’arithmétique des pointeurs ◦ Avec un ramasse-miette CSI2520

 Langage impératif  Avec des éléments de programmation concurrente intégrés ◦ Programmation réseau  Pas orienté-objet ◦ Mais avec interfaces, méthodes et polymorphisme  Aussi un langage fonctionel ◦ Autorise les fonctions lambda CSI2520

 Pas de surcharge de fonctions  Pas de conversions implicites  Pas de classes!  Pas de types paramétrisés  Pas d’exceptions  Pas d’assertions CSI2520

 Environ 20% plus lent que C  2x plus rapide que Java et 70% moins gourmand en mémoire CSI2520

 Code facile à lire, structuré en package ◦ Dont un package main ◦ Un package peut avoir une fonction init() ◦ Utilise le Unicode ◦ Sensible à la casse  Nombreux concepts orthogonaux  25 mots-clé  36 identificateurs prédéfinis ◦ Types et fonctions de base CSI2520

package main import "fmt" // importation func main() { fmt.Println("Hello le monde") } // débuter par une lettre majuscule // donne à une fonction une visibilité // externe au package (exportation)

 int, int8, int16, int32  byte, uint, uint16, uint32, uint64  float32, float64  complex, complex64, complex128  bool  String  et les pointeurs… CSI2520

package main import ( "fmt" ) const pi= // declaration du type optionnel: const pi float= var x int = 5 // variable globale func main() { var ( // declaration en groupe a float64 = 8.8 b float64 ) b= fonction(a) fmt.Printf("valeur: %f", b) } func fonction(z float64) float32 { u := 3.3 // declaration initialisee return u*z }

CSI2520 func main() { var s int var d int s, d = plusmoins(7,9) fmt.Printf("resulat= %d et %d", s, d) for i,j:= 1,5 ; j<100 ; i,j= i+1, j+5 { fmt.Printf("%d et %d", i, j) } // une fonction peut retourner plus d'une valeur func plusmoins(a int, b int) (somme int, difference int) { somme= a+b difference= a-b return }

CSI2520 func imc(taille float64, poids float64) (float64, bool) { if taille > 0.0 { return poids / (taille*taille), true } else { return 0.0, false }

CSI2520 // if initialisaton; condition if valeur, ok := imc(1.50, 55); ok { fmt.Printf("valeur: %f\n", valeur) }

CSI2520 type Point struct { x float64 y float64 } func Distance(p1 Point, p2 Point) (distance float64){ distance = math.Sqrt(math.Pow(p1.x - p2.x, 2.0) + math.Pow(p1.y - p2.y, 2.0)) return } func calc(p1 Point, p2 Point, d func(Point, Point)(float64))(float64) { return d(p1,p2) }

CSI2520 func main() { a := Point{2.,4.} b := Point{5.,9.} dist := calc(a,b,Distance) fmt.Printf("resulat= %f\n", dist) dist = calc(a,b, func(p Point, q Point)float64{ // definition d’une fonction lambda return math.Abs(p.x-q.x)+math.Abs(p.y-q.y)}) fmt.Printf("resulat= %f\n", dist) } /* Affectation: d1:= func(p Point, q Point)float64{ return math.Abs(p.x-q.x)+math.Abs(p.y-q.y)} Appel: func(p Point, q Point)float64{ return math.Abs(p.x-q.x)+ math.Abs(p.y-q.y)}(p1,p2) */

func main() { var p *int // pointeur var i int i= 7 ptr:= &i *ptr= i+5 // déréférence fmt.Printf("resulat= %d\n", i) }

type Point struct { x int y int } var ( p1= Point{1,2} p2= Point{y:7} pp= &Point{3,4} // pointeur a un Point ) func main() { // allocation dynamique ptr1:= new(Point) ptr2:= &Point{9,8} }

CSI2520 type Point struct { x int y int } func main() { un := Point{8, 1} complement(&un) fmt.Printf("resulat= %d et %d\n", un.x, un.y) } func complement(p *Point) { // operateur de de-reference non-requis p.x, p.y = -p.y, -p.x }

type point struct { // point est maintenant privé x int// les autres packages doivent y int// utiliser la fabrique } func main() { p1 := NewPoint(1,2) fmt.Printf("point= %v\n", p1) // point= &{1 2} } func NewPoint(i, j int) *point { p:= new(point) p.x, p.y = i, j return p }

CSI2520 package main import "fmt" func moyenne(tab [5]int) (moyenne float64){ // for index, valeur := range collection for _, valeur := range tab { moyenne+= (float64)(valeur) } moyenne /= (float64)(len(tab)) return } func main() { // le tableau est un type var tableau = [5]int{3, 4, 8, 9, 2} m := moyenne(tableau) // passage par valeur fmt.Printf("resulat= %f\n", m) }

 Un ‘slice’ est une référence à un segment contigue d’éléments dans un tableau  Les slices sont utilises plus fréquemment que les tableaux en Go  Un slice a une dimension et une capacité  Pour les créer: ◦ var slice []int = tableau[start:fin] ◦ slice: := make([]int, 10, 100) CSI2520

// tab est une slice func moyenne(tab []int) (moyenne float64){ // for index, valeur := range collection for _, valeur := range tab { moyenne+= (float64)(valeur) } moyenne /= (float64)(len(tab)) return } func main() { var tableau = [5]int{3, 4, 8, 9, 2} m := moyenne(tableau[:]) // tous les elements fmt.Printf("resulat= %f\n", m) m = moyenne(tableau[2:]) // elements 2 a la fin fmt.Printf("resulat= %f\n", m) m = moyenne(tableau[1:3]) // element 1 a 3 (exclu) fmt.Printf("resulat= %f\n", m) }

CSI2520 package main import "fmt" func main() { var nom string fmt.Printf("Votre nom? ") fmt.Scanf("%s", &nom) fmt.Printf("\nBonjour %s\n", nom) }

CSI2520 func CopierFichier(dstN, srcN string) (ecrit int64, err error) { src, err := os.Open(srcN) if err != nil { return } dst, err := os.Create(dstN) if err != nil { src.Close() // fermer le fichier source return // en cas d’erreur } ecrit, err = io.Copy(dst, src) dst.Close() src.Close() return }

 L’énoncé defer permet de différer l’execution d’un bloc jusqu’à la fin de la fonction qui le contient  Celui-ci est principalement utilisé pour faire du nettoyage avant de quitter la fonction  Les paramètres d’une fonction différée sont évalués lorsque l’énoncé est rencontré  L’exécution de la fonction différée est garantie peu importe comment la fonction qui la contient retourne CSI2520

func CopierFichier(dstN, srcN string) (ecrit int64, err error) { src, err := os.Open(srcN) if err != nil { return } defer src.Close() dst, err := os.Create(dstN) if err != nil { return } defer dst.Close() return io.Copy(dst, src) }

 Le retour de codes d’erreur rempace les exceptions  Lorsqu’une erreur grave se produit, il est possible d’utiliser l’énoncé panic ◦ À n’utiliser que pour les erreurs imprévues ◦ Correspond aux violations d’assertions  En cas de panique la fonction s’interrompt immédiatement, les fonctions différées sont exécutées et retourne à la fonction appelante qui déclenche à son tour une nouvelle panique CSI2520

func main() { fmt.Println("Debut") var desMots []string traite(desMots) fmt.Println("Fin") } func traite(mots []string) int { defer func() { fmt.Println("quelques nettoyages") }() if len(mots) == 0 { // erreur! panic("aucun mot!") } // traitement du tableau de mots... return len(mots) }

CSI2520

 L’énoncé recover permet de regagner le controle après une panique  À utiliser dans une function différée  En l’absence de panique, le recover retourne simplement nil CSI2520

func main() { fmt.Println("Debut") defer func() { if r := recover(); r != nil { fmt.Printf("Une erreur dans ce package: %v", r) } }() var desMots []string traite(desMots) fmt.Println("Fin") }

CSI2520

 Une méthode est une fonction agissant sur une variable associée à un certain type (ou structure) ◦ Le type peut être un pointeur (par référence); obligatoire si la méthode modifie les attributs de l’instance  La structure et ses méthodes ne sont pas liés ensemble ◦ pas d’encapsulation comme avec les classes ◦ Les propriétés et les comportements sont des concepts orthogonaux  Elles doivent seulement faire partie du même package CSI2520

// structure type Point struct { x float64 y float64 } // methode (ici un pointeur afin d’éviter une copie de l’objet) func (pt *Point) norme() float64 { return math.Sqrt(pt.x*pt.x + pt.y*pt.y) } func main() { a := Point{2.,4.} // appel a la methode n := a.norme() // traduit en (&a).norme() fmt.Printf("resulat= %f\n", n) ptr := &Point{2.,4.} // appel a la methode // il y aurait déréférencement automatique si // le récepteur était une valeur m := ptr.norme() fmt.Printf("resulat= %f\n", m) } Go specs: If x is addressable and &x’s method set contains m, x.m() is shorthand for (&x).m()

CSI2520 Package point // structure type Point struct { // le type est exporté x float64 // mais pas ses attributs y float64 } // getter func (pt *Point) GetX() float64 { // méthode exportée return pt.x }

CSI2520 // structure avec type embarque type PointColore struct { Point couleur string } // une autre structure type Boite struct { poids float64 couleur string } // interface type Coloreur interface { SetCouleur(string) Couleur() string }

 Un type n’a pas besoin de déclarer explicitement qu’il réalise une interface ◦ Il satisfait implicitement l’interface si il possède les méthodes requises  Un type peut satisfaire plusieurs interfaces  Une interface peut être définit dans un autre package que les types qui la satisfont  Une variable interface peut référer à n’importe quelle instance satisfaisant celle-ci

CSI2520 func (p *PointColore) Couleur() string { return p.couleur } // doit etre pointeur afin de modifier la couleur func (p *PointColore) SetCouleur(newCouleur string) { p.couleur = newCouleur } func (p *Boite) SetCouleur(newCouleur string) { p.couleur = newCouleur } func (p *Boite) Couleur() string { return p.couleur }

CSI2520 func main() { var p Coloreur p= new(PointColore) // pour être accepté, le type p.SetCouleur("rose")// doit définir les méthodes // de l’interface tableau := [4]Coloreur{ &PointColore{Point{1.1,2.2},"rouge"}, &Boite{32.4,"jaune"}, &PointColore{Point{1.1,2.2},"bleu"},p} for _,element := range tableau { fmt.Printf("couleur= %s\n", element.Couleur()) } L’utilisation d’une référence (pointeur) est obligatoire car c’est le pointeur à des Boite qui satisfait l’interface Un pointeur peut accèder aux méthodes de son type (déréférencement automatique), mais pas l’inverse Go specs: The method set of any other named type T consists of all methods with receiver type T. The method set of the corresponding pointer type *T is the set of all methods with receiver *T or T (that is, it also contains the method set of T).