INF 321
Introduction au cours et ` a Java
Eric Goubault
Cours 1
13 mai 2013
L’informatique, c’est dur, c’est complexe...
...il faut comprendre les concepts de base...
L’informatique est partout...
Dans les ustensiles de la vie quotidienne
machine `a laver
t´el´ephone portable
t´el´evision
(HD: ∼1 TeraFlops pour la carte graphique...)
...et doit fonctionner sans bug !
Dans l’´energie, les transports...
avion
(A380: plus d’1 million de lignes de code pour le calculateur primaire de vol!)
centrale
C’est aussi une science...
“Computer science is no more about computers than astronomy is about telescopes”
Edsger W. Dijkstra, Prix Turing 1972
...mais contrairement `a la physique, les applications se sont construites plus vite que la th´eorie...
C’est aussi une science...
“Computer science is no more about computers than astronomy is about telescopes”
Edsger W. Dijkstra, Prix Turing 1972
...mais contrairement `a la physique, les applications se sont construites plus vite que la th´eorie...
Objectifs du cours
Apprendre `a programmer en Java (et comparaison avec Caml et C)
Comprendre les principes des langages de programmation (choix du au format du cours!):
programmation imp´erative, orient´e objet (Java...) programmation fonctionnelle (Caml, Haskell...) programmation r´eactive (Lustre...)
Commencer `a apprendre les outils de l’informatique math´ematique - calculabilit´e, complexit´e, s´emantique etc.
(plus : ann´ees 2 et 3)
Cursus
S O N D J F M A M J J
Ann´ee 1 TC (311/321)
Ann´ee 2 INF-421 INF-422/423 INF 431 L3
Ann´ee 3 PA1 PA2 Stage d’option M1
Ann´ee 4 Master (MPRI, COMASIC etc.) M2 Ann´ees 1 et 2
Organisation du cours
Pˆales...
Pˆale HC (12 juillet) D´el´egu´es
A ´elire d’urgence! (TD2, 1 d´elegu´e par groupe; 2 d´el´egu´es pour le cours)
Me tenir au courant r´eguli`erement, probl`eme ou pas
Les TDs
TD: mise en application pratique des concepts de base
suivi de chaque ´el`eve: les ´el`eves chargent leurs programmes sur un serveur, accessible aux MdC (pri`ere de se souvenir de son mot de passe au TD1! - mot de passeenex)
Les TDs
TD: mise en application pratique des concepts de base
suivi de chaque ´el`eve: les ´el`eves chargent leurs programmes sur un serveur, accessible aux MdC (pri`ere de se souvenir de son mot de passe au TD1! - mot de passeenex)
Fig.1 Les TDs sont avant tout fun
Architecture des ordinateurs
A l’origine, architecture de von Neumann (1940) (voire d’Harvard)
En vrai
unit´e arithm´etique et logique (ALU): op´erations de base, aid´e d’une unit´e flottante (FPU)
unit´e de contrˆole: s´equen¸cage des op´erations m´emoire cache, registres du processeur
bus de donn´ees et d’instructions, entr´ees/sorties...
Architecture, en bref...
Et en un peu plus moderne
plusieurs coeurs, plusieurs FPU, plusieurs niveaux de cache (L1, L2...)
ex´ecution sp´eculative, pipelines d’instructions etc.
Le tout dans un syst` eme
Vision “logique” d’une architecture:
Des applications programm´ees - g´en´eralement dans un langagede haut niveau, compil´e
Au dessus d’un syst`eme d’exploitation...
permettant de tirer partie du mat´eriel
Syst` eme d’exploitation (OS)
Le syst`eme d’exploitation permet de manipuler le mat´eriel, au travers d”’abstrations”
Diff´erents composants
noyau: ordonnance les processus, leur accorde de la m´emoire pilotes (drivers): g`ere le(s) mat´eriel(s) - sont souvent activ´es
par des interruptions
interface utilisateur: textuelle (dans unterminal, oushell) ou graphique (syst`eme de fenˆetrage, menus etc.)
processus utilisateurs
Syst` eme d’exploitation
G`ere g´en´eralement
la m´emoire vive, entre les diff´erentsutilisateurset les diff´erentsprocessus
la m´emoire de masse(disques...) entre les diff´erents utilisateurs, voire groupes d’utilisateurs
communications avec le monde ext´erieurs: ports physiques, sockets r´eseau etc.
Exemple: en salle TD
Network File System (NFS): tous les fichiers sont accessibles pour un utilisateur depuis n’importe quel ordinateur
Organisation arborescente des fichiers: r´epertoires et fichiers,
mais aussi liens symboliques etc.
Quelques syst` emes d’exploitation
MacOS (1984-)
Windows et variantes (1981-) Unix (1969-1973-)
BSD (Berkeley), SunOS (Stanford), Bell-Labs etc.
Linux 1991
On utilise ici Linux, qui est utilis´e aussi bien dans les t´el´ephones portables (Android...) que dans les super-calculateurs (plus de 90%
en utilisent une variante ou une autre).
Langages de programmation
Les langages de programmation sont `a la crois´ee de la linguistique et des math´ematiques car:
ils doivent ˆetre bien d´efinis formellement (syntaxe non ambigue, s´emantique claire) pour ˆetre traitables par une machine
ils doivent ˆetre lisibles par un ˆetre humain...
Permettent de programmer des processus, applications, voire mˆeme des syst`emes d’exploitation (ex. Unix, en C).
On peut faire appel `a des librairies qui communiquent
directement avec le syst`eme d’exploitation (appels syst`emes), pour contrˆoler au mieux, ou exploiter, le mat´eriel sous-jacent.
Exemple: affichage en JAVA (package System) System . o u t . p r i n t ( x ) ;
System . o u t . p r i n t l n ( ) ; System . o u t . p r i n t l n ( x ) ;
Mais aussi en d’autres domaines! latex pour ce document, VHDL/System C pour les circuits ´electroniques, SBML pour les
18
Un tour d’horizon des langages
Imp´eratifs
Algol (1958-60-78), Cobol (1959), Fortran (1954-77-90-...), PL/I (1964), Basic (1965), Pascal (1970), C (1970), Java (1995), Ada (1983, 1995...)...
Assembleur(s)...
Objet
C++ (1983)...
Java: aussi imp´eratif
OCAML (1996): aussi fonctionnel R´eactifs
Lustre (1983)
Un tour d’horizon des langages
D´eclaratifs Fonctionnels
LISP/Scheme (1958/1975)
CAML (1985), SML/NJ (1990/1997), Haskell (1990), OCAML (1996)...
Programmation Logique Prolog (1972)..
Programmation par contraintes etc.
Curieux...
APL 1957-67, Forth 1960 etc.
Le tout pouvant avoir des extensions ou des traits parall`eles, distribu´es etc.
On verra dans ce cours des traitsimp´eratifs(cours 1 en
particulier),orient´es objets (cours 4 en particulier),fonctionnels (cours 8, 9 en particulier),r´eactifs (cours 10).
Un peu de vocabulaire utile par la suite...
Syntaxe
Les symboles, et la grammaire utilis´ee pour programmer.
S´emantique
Le mod`ele d’ex´ecution (concret), mais aussi de fa¸con plus abstraite, n’importe quel “mod`ele” math´ematique, donnant un
“sens” `a la syntaxe.
Algorithmique
Mani`ere de calculer afin de r´esoudre un probl`eme; l’impl´ementation d’un algorithme dans un langage est le programme d´eduit de l’algorithme. Notions de complexit´e algorithmique.
Le cours est centr´e sur ces trois concepts
Compilateurs, interpr´ eteurs
Un langage de haut-niveau doit, pour ˆetre ex´ecut´e, soit ˆetre compil´e c.-a.d. transform´e en code ex´ecutable, binaire, ou venir avec un interpr´eteur
i n t main ( ) { i n t x ; x = 0 ; r e t u r n x ; }
gcc -S
−→
. t e x t . g l o b l m a i n
m a i n : LFB2 :
p u s h q %r b p LCFI0 :
movq %r s p , %r b p LCFI1 :
. . .
. a s c i i ”zR\0 ” . b y t e 0 x1
gcc -o −→
0 0 0 0 0 0 0 f a c f f e e d 0007 0100 0003 8000 0002 0000
0 0 0 0 0 2 0 000 b 0000 05 b0 0000 0085 0000 0000 0000
0 0 0 0 0 4 0 0019 0000 0048 0000 5 f 5 f 4150 4547 455 a
0 0 0 0 0 6 0 4 f 5 2 0000 0000 0000 0000 0000 0000 0000
. . .
Compilation: binaire d´ependant de l’architecture! (mais optimis´e)
Compilation s´ epar´ ee, librairies etc.
Compilation s´epar´ee
Un programme peut-ˆetre d´ecompos´e en de multiples fichiers (.java,.c),
On compile les fichiers un `a un (avec les d´eclarations des fonctions utiles, mais pas forc´ement avec le code) Edition de liens (”link”)
Permet de prendre le r´esultat de la compilation s´epar´ee et d’en faire un fichier unique ex´ecutable (en C, pas en Java o`u les fonctions externes sont charg´ees dynamiquement)
Moteur d’ex´ecution (”Runtime”)
Tout l’environnement pour ex´ecuter le programme compil´e (libc en C,JREincluant la JVM en Java)
En Java
Compilation en bytecode
javac fichier.java produit un bytecodeProg.class, ex´ecutable dans une machine virtuelle Java (JVM), par java Prog:
c l a s s Prog { p u b l i c s t a t i c
v o i d main ( . . . i n t x ;
x = 0 ; } }
javac
−→
C o m p i l e d f r o m ” f i c h i e r . j a v a ” c l a s s s i m p l e e x t e n d s . . . P ro g ( ) ;
Code : 0 : a l o a d 0
1 : i n v o k e s p e c i a l . . . 4 : r e t u r n
p u b l i c s t a t i c v o i d main ( . . . Code :
0 : i c o n s t 0 1 : i s t o r e 1 2 : r e t u r n }
Possibilit´e de compiler ´egalement en binaire (natif) - de mˆeme en Caml (ocamlc/ocamlopt)
Structure simplifi´ ee des programmes (Java)
c l a s s Prog {
s t a t i c T1 x1 = t 1 ; . . .
s t a t i c Tn xn = t n ; s t a t i c . . . f 1 ( . . . ) . . . s t a t i c . . . f p ( . . . ) . . .
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { . . . } }
main
fonction sp´eciale: c’est celle qui estle point d’entr´ee`a l’ex´ecution.
en argument, elle contient tous les arguments pass´es`a la ligne de commande:
java Prog premierarg deuxiemearg troisiemearg
Le noyau imp´ eratif
Dans pratiquement toutes les approches, cinq constructions
D´eclaration Affectation S´equence Test Boucle
Notion de variable
Avant de d´emarrer
Notion informatique un peu diff´erente de la notion math´ematique:
Math´ematiques: variables quantifi´ees, le nom importe peu (∀x,P(x),∃x,P(x)), seul le lien avecP importe...
Informatique: abstraction d’unelocation m´emoire (ou adresse m´emoire)
x: 8 y: 1 z: 6 t: 3
Permet en premier lieu de stocker des calculs interm´ediaires, de les r´eutiliser etc.
Plus profond que cela: pour effectuer certaines tˆaches en un temps raisonnable, il est n´ecessaire d’occuper de la m´emoire (complexit´e en temps et en espace...).
Types
Notion de type
D´ecrit et structure un ensemble de valeurs possibles (comme R,N,R2 etc.)
Types ´el´ementaires (valeurs simples), types compos´es (tableaux, enregistrements etc.)
Bien plus profond que cela (cours 2, 3, 4, 8...) Types ´el´ementaires
int: nombres entiers compris entre −231 et 231−1; types similaires, byte,short,long, (et en C: long long...) boolean (false,true) - pas en C
float, type similaire double char: ex. ’g’
Une premi` ere remarque sur le codage
Codage et affichage des entiers
Unint est cod´e sur 32 bits, donc en base 2...(signe cod´e par compl´ementation)
Doncx=19 est cod´e par le mot sur 32 bits:
00000000000000000000000000010011
On peut jongler avec la repr´esentation binaire, d´ecalage `a gauche: 19<<1 (...100110=38), `a droite 19>>1 (...1001=9), masquage (&,|) etc.
Affichage possible (System.out.print()) en d´ecimal, octal ou hexad´ecimal
Codage
Codage et affichage des flottants
Diff´erent des r´eels! pr´ecision finie: mantisseen base 2, exposant en base 2, sur un nombre fini de bits... (cf. norme IEEE 754)
Attention: pas associativit´e de l’addition, multiplication etc.
(erreurs d’arrondi), absorptions, cancellations...:
f l o a t x , y ; x = 1 . 0 f ;
y = x + 0 . 0 0 0 0 0 0 0 1 f ; −→ x et y ont la mˆeme
valeur!
Un grand classique (Kahan-Muller)
f l o a t x0 , x1 , x2 ; x0 = 1 1 . / 2 ;
x1 = 6 1 . / 1 1 ;
f o r ( i =1; i<=N ; i ++) { x2 =111 −
(1130−3000/ x0 ) / x1 ; x0=x1 ;
x1=x2 ; }
Produit la suite: 5.5902;
5.6333; 5.6721; 5.6675;
4.9412; -10.5622; 160.5037;
102.1900; 100.1251; 100.0073;
100.0004; 100.0000; 100.0000;
100.0000; ...(stable)
La vraie limite dans les r´eels est 6!
Ou beaucoup plus simple...!
f l o a t x0 , x1 ; x0 = 7 . / 1 0 ;
f o r ( i =1; i<=N ; i ++) { x1 = 11∗x0 − 7 ; x0 = x1 :
}
Produit la suite 0.7000;
0.7000; 0.7000; 0.6997;
0.6972; 0.6693; 0.3621; - 3.0169; -40.1857; -449.0428;
-4946.4712; -54418.1836;
-598607.0000; -6584684.0000;
diverge vers −∞...
Alors que dans les r´eels c’est la suite constante ´egale `a 0.7!
Variables et expressions
Variable: mot d’une ou plusieurs lettres (r`egles syntaxiques...), ex.
x,y,resultat1 etc.
Expression: form´ee `a partir de constantes et de variables avec des op´erations (+, -, *, / etc.). R`egles de priorit´e.
Ex. d’expression en Java 3+y∗5 ;
En C et Caml
C
x=3+y∗5 ;
(en fait, presque pas de diff´erence pour le noyau imp´eratif, entre C et JAVA)
Caml
x :=3+(! y )∗5
(`a part la syntaxe, notion de ! plus tard!)
D´ eclaration
D´eclaration/allocation/affectation
Avant de pouvoir utiliser une variable, pour faire des calculs, il faut pouvoir la d´eclarer
d´eclarer = donner un nom, et un type (´eventuellement) puis r´eserver un emplacement m´emoire
On peut g´en´eralement d´eclarer, allouer et initialiser en mˆeme temps une variable (attention en C n´eanmoins, quelques r`egles syntaxiques)
Exemples simples
Java i n t x =3;
C
i n t x =3;
Caml
l e t x= r e f 3 i n p ; ;
Plus compliqu´e car notion de port´ee: xconnu uniquement dans p
Variables locales/globales, notion de port´ ee
Les langages de programmation (“haut-niveau”) sont structur´es, notion de bloc.
Une variable peut ˆetre connue dans un bloc, mais pas `a l’ext´erieur...
Permet d’appliquer une m´ethodologie saine de codage;
structurer le code, et cloisonner les informations.
Plus en cours 2...
Instructions
Une instruction est un mot simple dans un langage de programmation
Qui fait une action;6= expression
Exemples (qui suivent): affectation, test, boucle etc.
Pour la clart´e, en TD, utilisez l’indentationautomatique et
´
ecrivez une seule instruction par ligne!
S´ emantique de l’affectation
x = e x p r ; Par exemple:
x = 3+y∗5 ;
Lit les valeurs de variables dont d´epend l’expression (en partie, et en g´en´eral dans les registres du processeur)
Calcule l’expression (avec ou sanseffet de bord) Remplace la valeur contenue dans xpar celle calcul´ee Remarque importante
L’affectation est aussi une expression...doncx=expr a une valeur, celle de l’expression...
S´ emantique ´ el´ ementaire (premi` ere approximation)
Etat m´emoire et fonctions de transfert
A chaque variable v ∈Var, on veut associer une valeur:
ρ: Var→Val
o`u Val est l’ensemble des valeurs machines (Zici pour simplifier)
Env est l’ensemble des environnements (“concrets”)
A chaque expression arithm´etique e ∈AExpr, on veut associer une valeur:
[[e]]ρ∈Val de l’expression e dans l’environnementρ
A chaque instruction du programmep (et donc au programme lui-mˆeme), on veut associer un environnement [[p]]ρ, apr`es ex´ecution, dans l’environnementρ
S´ emantique ´ el´ ementaire des expressions
R`egles inductives
Constantes n∈Val: [[n]]ρ=n Variables v ∈Var: [[v]]ρ=ρ(v)
Addition de deux sous-expressions a0,a1 ∈AExpr:
[[a0+a1]]ρ= [[a0]]ρ+ [[a1]]ρ [[a0−a1]]ρ= [[a0]]ρ−[[a1]]ρ [[a0∗a1]]ρ= ([[a0]]ρ) ([[a1]]ρ) etc.
On l’appelle s´emantique d´enotationnelle (ou compositionnelle)
Exemple
Dans l’environnementρ o`u ρ(y) = 3:
[[3∗y+ 5]]ρ = [[3∗y]]ρ+ [[5]]ρ
= [[3∗y]]ρ+ 5
= ([[3]]ρ) ([[y]]ρ) + 5
= 3∗3 + 5
= 14 Ouf!
Attention: tout ceci sans effet de bord !
Effet de bord Permis en JAVA:
i n t x = ( y =1)+1;
Renvoie l’environnement: ρ avecρ(y) = 1, ρ(x) = 2.
Pas permis dans notre s´emantique ´el´ementaire...
S´ emantique ´ el´ ementaire, suite
Affectation
Pour v ∈Var; e ∈AExpr, etρ∈Env:
[[v =e]]ρ=ρ[[[e]]ρ/v]
O`u, pouru,v∈Var etn ∈Val:
ρ[n/v](u) =
ρ(u) si u 6=v
n si u =v Plus (d’instructions) plus tard!
Exemple
Interpr´etation d’une affectation simple
Consid´eronsx = 3∗y+ 5 dans l’environnement ρtel queρ(y) = 3 etρ(x) = 1, on obtient l’environnementσ avec
σ(u) =
ρ(u) = 3 si u =y
[[3∗y+ 5]]ρ= 14 si u =x
Cas des tableaux
Tableaux?
Cas particulier de type produit(cours 2)
Ensemble de variables index´e par des indices, 1D, 2D, ...
Dans ce cours, juste 1D (=vecteur) D´eclaration
La taille n’est pas connue, aucun ´el´ement n’est encore allou´e i n t[ ] t a b ;
tab
Tableaux, suite
Allocation
On fixe la taille une fois pour toute, les ´el´ements sont allou´es
t a b = new i n t[ 1 0 ] ;
tab
? |? |. . .|? (en fait, valeurs par d´efaut en Java, ici ?=0)
Tableaux, fin
Affectation
Lesindices vont de 0 `a 9 (=tab.length-1) ici
t a b [ 0 ] = 3 ;
tab
3|? |. . . |?
D´eclaration/allocation/affectation On peut aussi faire les deux en mˆeme temps! :
i n t[ ] t a b = {3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2};
Variables finales
Variables ne pouvant ˆetre affect´ees qu’une fois (constC) f i n a l i n t x =4;
y=x +3;
Correct
f i n a l i n t x =4;
x =3;
Incorrect
Variables mutables
Caml
Explication du ! en Caml:
l e t x=4 i n y=x+3
Version finale
l e t x= r e f 4 i n y =! x+3
Version mutable
S´ emantique ´ el´ ementaire, suite
N´ecessit´e d’ajouter les “locations” m´emoire
tabest en fait unpointeur(our´ef´erence, ouadressem´emoire) De mˆeme on veut distinguer variables mutables et finales...
Il nous faut un environnement un peu plus compliqu´e...:
Soit Loc l’ensemble des adresses m´emoires (num´erotation des mots 32 ou 64 bits dans la m´emoire de quelques Go de votre ordinateur...), sous-ensemble deN
S´ emantique ´ el´ ementaire, suite
N´ecessit´e d’ajouter les “locations” m´emoire
tabest en fait unpointeur(our´ef´erence, ouadressem´emoire) De mˆeme on veut distinguer variables mutables et finales...
Il nous faut un environnement un peu plus compliqu´e...:
Soit Loc l’ensemble des adresses m´emoires (num´erotation des mots 32 ou 64 bits dans la m´emoire de quelques Go de votre ordinateur...), sous-ensemble deN
Les environnements sont maintenantρ: Var→(Val∪Loc)
S´ emantique ´ el´ ementaire, suite
N´ecessit´e d’ajouter les “locations” m´emoire
tabest en fait unpointeur(our´ef´erence, ouadressem´emoire) De mˆeme on veut distinguer variables mutables et finales...
Il nous faut un environnement un peu plus compliqu´e...:
Soit Loc l’ensemble des adresses m´emoires (num´erotation des mots 32 ou 64 bits dans la m´emoire de quelques Go de votre ordinateur...), sous-ensemble deN
En fait, plutˆotρ: (Var∪Loc)→(Val∪Loc), ou mˆeme ρ: (Var∪Loc)→(Val∪Var∪Loc) plus tard
Var repr´esente les adresses allou´ees statiquement, enpile (les d´eclarations de variables scalaires...), Loc repr´esente les adresses allou´ees dynamiquement, en g´en´eral sur letas(on y vient plus tard)
On noteraadrt pour l’adresset (pas de confusion avec Val!)
Pourquoi?
En premi`ere approximation
l e t x=4 i n y=x+3
Environnement final: ρ(x) = 4, ρ(y) = 7
l e t x= r e f 4 i n y =! x+3
Environnement final: ρ(x) = adru,ρ(adru) = 4,ρ(y) = 7 Dans le cas mutable,x contient une valeur de type “adresse”
(dans Loc) dans le cas final,x contient une valeur “scalaire”
On revient la-dessus (pointeurs C/r´ef´erences Caml/objets Java) `a partir du cours 3
Retour sur les tableaux
En Java D´eclaration:
i n t [ ] t a b ; ρ(tab) =⊥
pas de valeur connue! (c.a.d. d’adresse allou´ee au tableau) Allocation:
t a b = new i n t[ 1 0 ] ; ρ(tab) =adrt
adrt est moralementl’adresse de la premi`ere case m´emoire allou´ee pourtab
Sont cr´ees ´egalement les adressesadrt+1,adrt+2,. . .,adrt+9, mais pas les valeurs correspondantes: ρ(adrt) =⊥,
ρ(adrt+1) =⊥,. . .,ρ(adrt+9) =⊥
S´ emantique de l’affectation de tableaux
Tableaux 1D!
Pourtab∈Var,i ∈N,e∈AExpr, etρ∈Env:
[[tab[i] =e]]ρ=ρ[[[e]]ρ/(ρ(tab) +i)]
Calcul dans une expression e ∈AExpr
Il faut rajouter dans les expressions arithm´etiques le fait de lire une entr´ee d’un tableau:
[[tab[i]]]ρ=ρ(ρ(tab) +i)
(on lit l’adresse detab, on la d´ecale de i, puis on lit la valeur `a cette adresse - ici on suppose qu’on n’a que des tableaux 1D de valeurs scalaires!)
S´ emantique de l’affectation de tableaux
Exemple
i n t [ ] t a b = new i n t[ 1 0 ] ;
t a b [ 0 ] = 0 ; t a b [ 1 ] = 1 ; t a b [ 2 ] = 2 ; . . . t a b [ 9 ] = 9 ;
L’environnement
Ont ´et´e cr´ees les adresses adrt `aadrt+9 et ρ(tab) =adrt
On termine avec en plus ρ(adrt+i) =i pour i = 0, . . . ,9
La s´ equence d’instructions
Java
x =1; y=x +1;
On ex´ecute x=1puis y=x+1.
C
x =1; y=x +1;
Caml
l e t x=1 i n l e t y=x+1 i n p ; ; p ; q
S´ emantique ´ el´ ementaire, suite
Composition!
PourP et Q deux programmes compos´es s´equentiellement:
[[P;Q]]ρ= [[Q]] ([[P]]ρ)
C’est pr´ecis´ement cette r`egle qui fait qu’on appelle cette s´emantique,compositionnelle!
C’est ce que l’on a fait implicitement jusqu’`a pr´esent...
Conditionnelles
Java, C i f ( b )
p1 e l s e p2
i f ( x==0) y=−1;
e l s e y =1;
On calcule la valeur bool´eenne deb; si c’est true on ex´ecute p1, si c’estfalse on ex´ecute p2.
Attention erreur courante: if (x=true) p1 else p2fera
toujoursp1, alors qu’on voulait ´ecrire a priori if (x==true) ...!
Caml
i f b t h e n p1 e l s e p2
Tests bool´ eens
Java, C, Caml
&&, | | , ( e x p r 1==e x p r 2 ) , . . .
S´ emantique ´ el´ ementaire, suite
Les expressions bool´eenes permises forment l’ensemble BExpr; les valeurs Val sont suppos´ees comprendre ´egalement les bool´eens true,false:
S´emantique des expressions bool´eenes [[true]]ρ=true
[[false]]ρ=false
Si a0,a1∈AExpr, [[a0 ==a1]]ρ=
true si [[a0]]ρ= [[a1]]ρ false sinon
Si a0,a1∈AExpr, [[a0 <a1]]ρ=
true si [[a0]]ρ <[[a1]]ρ false sinon
De mˆeme poura0 <=a1 etc.
S´ emantique ´ el´ ementaire, suite
Conditionnelle
[[if b p1 else p2]]ρ=
[[p1]]ρ si [[b]]ρ=true [[p2]]ρ si [[b]]ρ=false
It´ eration - la boucle
Java, C w h i l e ( b )
p
w h i l e ( x<1000) x=x +2;
Caml
w h i l e b do p ;
best lacondition de terminaison
S´ emantique
La boucle est unraccourci pour tous ses d´eroulements finis (approximations successives):
w h i l e ( b ) p
i f ( b ) { p }
S´ emantique
La boucle est unraccourci pour tous ses d´eroulements finis (approximations successives):
w h i l e ( b ) p
i f ( b ) { p
i f ( b ) { p } }
S´ emantique
La boucle est unraccourci pour tous ses d´eroulements finis (approximations successives):
w h i l e ( b ) p
i f ( b ) { p
i f ( b ) { p
i f ( b ) { p } } }
S´ emantique
La boucle est unraccourci pour tous ses d´eroulements finis (approximations successives):
w h i l e ( b ) p
i f ( b ) { p
i f ( b ) { p
i f ( b ) { p
i f ( b ) { p } } } }
. . .et ainsi de suite. . .
Terminaison
Les approximations successives forment une suite finie quand la condition de terminaison devient vraie en un temps fini.
Toutes les boucles ne sont pas finies:
i n t x =3;
w h i l e ( x<=1000) x =2;
Ne termine pas!
Prouver la terminaison
Difficile en g´en´eral!
Par exemple: la terminaison du code suivant reposerait sur une preuve de la conjecture de Syracuse:
w h i l e ( x > 1 ) { i f ( x % 2 == 0 )
x = x / 2 ; e l s e
x = 3∗x +1; }
3, 10, 5, 16, 8, 4, 2, 1 4, 2, 1
5, 16, 8, 4, 2, 1
6, 3, 10, 5, 16, 8, 4, 2, 1 ...
S´ emantique ´ el´ ementaire, suite
Valeur ind´efinie
Toutes les boucles ne terminent pas!
w h i l e (t r u e) { . . . }
[[P]]ρ ne peut donc toujours renvoyer unσ ∈Env; seulement fonction partielle ou fonction totale `a valeur dans Env∪ {⊥}!
En fait...les ´el´ements de Env sont d´ej`a des fonctions partielles ρ: (Var∪Loc)→(Val∪Loc)⊥ - on note
Env⊥={ρ: (Var∪Loc)→(Val∪Loc∪ {⊥})}; par abus de notation ⊥ ∈Env⊥ l’environnement t.q. ∀x,⊥(x) =⊥ [[P]]ρ=⊥si P ne termine pas dans l’environnementρ!
S´emantique par approximations finies des boucles Principe...: limite d’une suite [[Pn]] des it´er´ees ni`eme de la boucle...
Pourquoi des fonctions?
Java, C
/∗ C a l c u l de x ∗/
. . .
i f ( x<0) s g n x =−1;
i f ( x==0) s g n x =0; e l s e s g n x =1;
. . .
/∗ C a l c u l de y ∗/
i f ( y<0) s g n y =−1;
i f ( y==0) s g n y =0; e l s e s g n y =1;
Et?
Pas pratique, redite, cause potentielle d’erreur
→ Structurer par des appels `a des fonctions!
Plus profond que cela...: r´ecursion et langages fonctionnels (Caml): “Functions as first-class citizens” (Christopher Strachey, ∼1960)
Fonctions et proc´ edures
Une fonction peut:
prendre en compte des donn´ees: arguments retourner une valeur: le retour de la fonction
effectuer une action (afficher quelque chose, modifier la m´emoire): effet de bord
Dans la plupart des langages, on indique le type des arguments et du retour de fonction (sauf en g´en´eral dans Caml, o`u il y a inf´erence de types - on y revient plus tard), par exempleint, floatetc.
Proc´edure: fonction sans retour de valeur
Ne pas retourner de valeur = retourner valeur dans un type vide
en Java, et C, mot cl´e void en Caml, type sp´ecial unit
Passage d’arguments
Java, (C)
s t a t i c i n t s i g n e (i n t x ) { i f ( x<0) . . .
(retour de fonction, apr`es...) Caml
l e t s i g n e x = i f ( x<0) t h e n . . .
Aussi fonctions pr´ed´efinies, par exemple paquetage(“module”,
“librairie”) de fonctions math´ematiques Math, en particulier, fonction racine carr´ee: Math.sqrt(...)
Appel de fonction/proc´ edure
Java, C
/∗ C a l c u l de x ∗/
. . .
s g n x = s i g n e ( x ) ; /∗ C a l c u l de y ∗/
. . .
s g n y = s i g n e ( y ) ; . . .
Remarque: les arguments d’une fonction sont ´evalu´es avant de d´emarrer le codede la fonction (on aurait pu faire signe(expr donnant x)): “passage par valeur”
Caml
. . . i n
l e t s g n x = s i g n e x i n . . . ; ;
Le retour de fonction
Java
s t a t i c i n t s i g n e ( [ f i n a l] i n t x ) {
i f ( x<0) r e t u r n −1;
i f ( x==0) r e t u r n 0 ; r e t u r n 1 ; }
(on revient surstatic plus tard) C
i n t s i g n e ( [c o n s t] i n t x ) { i f ( x<0) r e t u r n −1;
i f ( x==0) r e t u r n 0 ; r e t u r n 1 ; }
Caml
l e t s i g n e x = i f ( x<0) t h e n −1.0 e l s e i f ( x==0) t h e n 0 . 0 e l s e 1 . 0 ; ;
(pas besoin de d´efinir le type: inf´erence de types!)
S´ emantique de l’appel/retour de fonction
Java
s t a t i c i n t s i g n e (i n t x ) {
i f ( x<0) r e t u r n −1;
i f ( x==0) r e t u r n 0 ; r e t u r n 1 ;
}
return interrompt le d´eroulement de la fonction
S´ emantique de l’appel/retour de fonction
returninterrompt le d´eroulement de la fonction:
call signe(-3) signe(x)
return -1 x<0
return 0 x==0
return 1 yes
no yes
no
C’est tout pour aujourd’hui
La s´emantique des fonctions uniquement trait´ee dans le cours sur les langages fonctionnels (8, 9)
La prochaine fois
Passage par valeur/par r´ef´erence dans les fonctions Types produits
Bon TD!
(et pour ceux qui veulent approfondir, voir `a la biblioth`eque: “The formal semantics of programming languages, an introduction”, Glynn Winskel, MIT Press, 1993)
C’est tout pour aujourd’hui
La s´emantique des fonctions uniquement trait´ee dans le cours sur les langages fonctionnels (8, 9)
La prochaine fois
Passage par valeur/par r´ef´erence dans les fonctions Types produits
Bon TD!
(et pour ceux qui veulent approfondir, voir `a la biblioth`eque: “The formal semantics of programming languages, an introduction”, Glynn Winskel, MIT Press, 1993)