Principes des langages de Programmation Amphi 1-7 avril 2015 Benjamin Werner
Bienvenue Poly : celui d Eric Goubault + compléments à venir Groupes de TDs : attention, les noms des responsables ne sont pas à jour sur ENEX (mea culpa) 10 séances : amphi + TD. Légèrement découplés Amphis : pb aujourd hui. Normalement Point K ou Faure Vote électronique : amenez les zappettes Composition écrite : le 29 juin Délégués! 2 ou 3 pour le cours. 2 par groupe de TD
Objectifs Apprendre à programmer en Java - Apprendre les idiotismes de Java - Découvrir la programmation orienté-objet Comprendre les principes (comparaison avec Caml et C) Commencer à découvrir les outils permettant de décrire la signification des programmes Apprendre des algorithmes (utilisant les listes, les arbres )
Les langages de programmation Permettent de programmer (interaction avec le programmeur) Permettent l exécution des programmes (avec la machine) Permettent de raisonner sur les programmes (aspect mathématique)
L ordinateur La mémoire (RAM) n0 n1 n2 n3 nk ni : nombre composé de 32, 64, 16 ou 8 bits (suivant le processeur) Le processeur (CPU)
Compilateurs, interpréteurs Compilateur : traduit le programme (source) en code exécutable (machine) Interpréteur : garde le code source en mémoire, l exécute pas-àpas Compilateur bytecode : traduit le code en code facile à interpréter
Le noyau impératif x := e {T x; p} p; p if e then p else p while e do p affectation déclaration séquence test boucle
Affectation x = 4; y = y + 3 * x; toto = true; variable : nom composé de un ou plusieurs caractères, commençant par une lettre expression : formée à partir des variables et des opérateurs (+, -, *, &&,, ) En Caml : x := 4; y :=!y + 3 *!x; En C : comme en Java
La déclaration { int x = 4; int y; y = x + 5; } { int x = 4; {int y; y = x + 5; } } On réserve une nouvelle case mémoire La variable est visible dans sa portée lexicale fin de la portée A la fin de l instruction, cette case mémoire peut être ré-utilisée : sa valeur est oubliée.
Options de la déclaration int x; float y = 3.14 ; boolean b = true; final float racine2 = 1.4142135 ; racine2 = 1.5; interdit! Le type : obligatoire en Java Une valeur initiale : optionnelle en Java final : on ne peut pas changer la valeur ensuite En C : comme en Java (sauf final! const)
Déclaration en Caml let x = ref 4 in p; let racine2 = 1.414235 in q; Le type n est pas précisé Les variables sont finales par défaut La portée est plus explicite
A propos des types primitifs int: nombres entiers compris entre -2 31 et 2 31-1 Outre int, trois autres intervalles byte, short, long Autres types : boolean (false, true) Flottants : float, double (6.02E23) Caractères char ( g ) Huit types primitifs Types composites (a` suivre) : String ("Bonjour")
La séquence {p1 p2} Exécuter p1 puis p2 x = 4; y = x * 5; z = x + y; x = 4; { y = x * 5; z = x + y; } { ou x = 4; y = x * 5;? } z = x + y; Ca revient au même
Le test if (b) p1; if (b) p1 else p2; if (y!= x) {y = x + 1; } else y = x - 1; La condition b doit être booléenne si elle vaut true on exécute p1, si elle vaut false, on exécute p2 En Caml : if b then p1 else p2 En C : comme en Java
La boucle while (b) p; while (x < 1000) {x = x + 1;} Si b est false, on ne fait rien Si b est true, on exécute p, puis on recommence Si b est true, on exécute p, puis si b est true on exécute p, puis si b est true on exécute p puis si b est true on exécute p puis si b est true on exécute p if (b) { p; if (b) { p; if (b) { p; if (b) { }}}} On peut remplacer la boucle par un programme sans boucle, mais infini
Terminaison while (x < 1000) {x = x + 1;} Termine x = 3; while (x!= 2) {x = 1;} ne termine pas while (x > 1) { if (x % 2) x = x / 2; // pair else x = 3 * x + 1; } // impair on ne sait pas! (conjecture de Syracuse) Problème indécidable omniprésent en informatique théorique
Avant la boucle En langage archaïque (mélange de Java et Fortran) : : l1 if (b) { p; goto l1; } l1 if b no yes p Programmes «plats de spaghettis» Edgser Dijkstra : «On the GOTO statement considered harmful» (1968) - pour la programmation structurée Permet de : raisonner sur le programme définir sa sémantique
Un jeu Nr et Nb boules Tant que Nb+Nr > 1 tirer deux boules au hasard si elles sont de la même couleur, on met une nouvelle boule rouge dans le vase sinon on remet la boule bleue dans le vase On a 666 boules rouges et 69 bleues. La dernière boule sera : A rouge C je ne sais pas B bleue D On peut prévoir
Un jeu Nr et Nb boules Tant que Nb+Nr > 1 tirer deux boules au hasard si elles sont de la même couleur, on met une nouvelle boule rouge dans le vase sinon on remet la boule bleue dans le vase La parité du nombre de boules bleues reste constante A oui C je ne sais pas B dans certains cas D non
Un jeu Nr et Nb boules Tant que Nb+Nr > 1 tirer deux boules au hasard si elles sont de la même couleur, on met une nouvelle boule rouge dans le vase sinon on remet la boule bleue dans le vase On a 666 boules rouges et 69 bleues. La dernière boule sera : A rouge C je ne sais pas B bleue D On peut prévoir
Invariant de boucle P while C do E à prouver : ( ) ( ) ( ( )) P Quelle propriété est vraie à la fin?
La récurrence ( ). ( ) ( + ). ( ) + + + + < ne «passe pas à la récurrence» Il faut «renforcer» l hypothèse de récurrence : + + + + = +
( ). ( ) ( + ) La récurrence. ( ) En général, deux difficultés : trouver la bonne hypothèse de récurrence faire la preuve ne «passe pas à la récurrence» C est pareil pour les invariants Il faut «renforcer» l hypothèse de récurrence : + + + + = +
L état (première approximation) A priori : une fonction partielle des variables vers les valeurs Var un ensemble infini (x, y, a, x1 ) un ensemble Val = [-2 31 ; 2 31-1] [true; false] Un état : une fonction d une partie finie de Var vers Val [x = 5; y = 4; a = true] un programme transforme l état : x = x + y; [x = 5; y = 4] [x = 9; y = 4]
Sémantique des expressions A une expression e, on associe sa valeur dans l environnement ρ = e o m
C est plus compliqué En Caml let x = ref 4 in let y = x in y :=!y + 1; print(!x); Affiche quoi?
L état Deux composantes : l environnement : associe une adresse à une variable Loc ensemble des adresses (sous-ensemble des mots de 32 ou 64 bits) e : Var Loc la mémoire : associe une valeur à chaque adresse m : Loc Val environnement : ρ = m o e
Sémantique de l affectation Si f est une fonction, on note f+(r=v) la fonction qui est identique partout à f, sauf en r où elle vaut v
Sémantique de la déclaration On travaille dans un environnement étendu
Sémantique de la séquence Très facile : juste la composition On retrouve l associativité de la séquence :
Sémantique du test Facile encore : si si =true =false
Sémantique de la boucle Approximation finies q0 = giveup; q1 = if (b) giveup; q2 = if (b) {p; if (b) giveup}; qi+1 = if (b) {p; qi} jamais défini Si est défini, alors sont aussi définis (et égaux)
Il faut des variables globales Un programme Java minimal public class NomDuProgramme { static int x = 4; static int y = 3 * x; static boolean toto = true; } public static void main (String[] args) { int i = args.length - 1; while (i >= 0) System.out.println(args[i]); i -; }
Il faut des variables globales Un programme Java minimal public class NomDuProgramme { static int x = 4; static int y = 3 * x; static boolean toto = true; } public static void main (String[] args) { for (int i = args.length - 1; i >= 0; i--) System.out.println(args[i]); }
Les tableaux Tableau de taille n a[0] a[1] a[2] a[3] a[n-1] int[] a = new int[10]; a[1] = 4; a.length rend la valeur 10