Académique Documents
Professionnel Documents
Culture Documents
Département d’Informatique
Master 1: Enseignante :
Réseaux et Systèmes Distribués (RSD) Dr. K.KHETTABI
karimakhettabi29@gmail.com
2022-2023
Chapitre 1: Concepts de base
Valeurs et type
1. Types
Une valeur est toute entité qui peut être manipulée par un programme.
Les valeurs peuvent être évaluées, stockées, transmises comme arguments, retournées
comme résultats de fonctions, etc.
Un ou plusieurs types primitifs Autoriser les programmes à définir leurs Dans un type primitif discret les valeurs ont
sont intégrés à chaque langage de propres types d'entiers et de virgule une relation de un à un avec une plage
programmation. flottante, en indiquant explicitement la d'entiers.
Booléen = {faux, vrai} (2.1) plage et/ou la précision souhaitée pour Exemple par ADA
Caractère = {. . . , 'a', . . . , ‘z', . . chaque type. Cette approche est adoptée type Month is (jan, feb, mar, apr, may, jun,
. , '0', . . . , '9', . . . , '?', . . .} par ADA. jul, aug, sep, oct, nov, dec);
Integer = {. . . ,-2,-1, 0,+1,+2, . . Exemple : length: array (Month) of Natural :=(31, 28,
.} type Population : plage 0 ... 1e10; 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
)Flottant = {. . . ,-1.0, . . . , 0.0, . countryPop : Population ; for mth in Month loop
. . ,+1.0, . . .} worldPop : Population ; put(length(mth));
Exemple: Le type entier défini l'ensemble de end loop;
JAVA fournit byte {-128, . . . ,+127} valeurs suivant : Les indices du tableau length sont des valeurs de type
Month. De même, la variable de contrôle de la boucle
Population = {0, . . . , 1010 }
mth prend une séquence de valeurs de type Month.
Chapitre 1: Concepts de base
Valeurs et type
1. Types
1.2. Types composites
• Une valeur composite (ou structure de données) est une valeur composée de valeurs
plus simples.
• Un type composite est un type dont les valeurs sont composées.
Tuples
Enregistrements
Tableaux
Types algébrique
Objets
Listes
Arbres
Fichiers
Chapitre 1: Concepts de base
Valeurs et type Types composites
Dans un produit cartésien, les valeurs de plusieurs types sont regroupées en tuples.
(x, y) désigner le premier composant est x et le second composant est y.
S × T désigner l'ensemble des paires (x, y) telles que x est choisi dans l'ensemble S et y est choisi dans l'ensemble T.
Formellement : S × T = {(x, y) | x ∈ S ; y ∈ T}
Le mappage est en fait à la base de deux caractéristiques du langage : les tableaux et les fonctions.
On écrit : m : S → T
Si m fait correspondre la valeur x de l'ensemble S à la valeur y de l'ensemble T ,on écrit y = m(x). La valeur y est
appelée l'image de x sous m.
Formellement : S → T = {m | x ∈ S ⇒ m(x) ∈ T}
Chapitre 1: Concepts de base
Valeurs et type Types composites
Mappings, tableaux et fonctions
Tableau
Un tableau est une séquence indexée de composants.
• Il possède un composant de type T pour chaque valeur de type S, de sorte que le tableau lui-même a le type S
→ T.
• La longueur du tableau est son nombre de composants.
• S est toujours une plage de valeurs consécutives, que l'on appelle la plage d'index du tableau.
• Les opérations de base sur les tableaux
La construction
L'indexation
Chapitre 1: Concepts de base
Valeurs et type Types composites
Mappings, tableaux et fonctions
Tableau
Union disjointe, permet de choisir une valeur dans l'un plusieurs ensembles (généralement différents).
S + T un ensemble de valeurs d'union disjointe, chacune d'entre elles étant composée d'une balise et d'une
Les opérations de base sur les valeurs de disjoint-union dans S + T sont les suivantes :
• Construction d'une valeur de disjoint -union, en prenant une valeur dans S ou T et en l'étiqueter en conséquence.
Le langage fonctionnel HASKELL possède des types algébriques que l'on peut comprendre en termes d'unions disjointes.
En fait, la notation HASKELL est très proche de notre notation mathématique des unions disjointes.
Chapitre 1: Concepts de base
Valeurs et type Types composites
Unions disjointes, enregistrements discriminés et objets
Listes
Une liste est une séquence de valeurs.
Les opérations de liste
Longueur
Test de vide
Sélection de la tête
Sélection de queue
Concaténation.Supposons que l'on souhaite définir un type de listes d'entiers, dont les valeurs sont des
listesd'entiers.
Chapitre 1: Concepts de base
Valeurs et type
Listes
• Liste d'entiers : une valeur soit vide soit une paire constituée d'un entier (sa tête) et d'une autre
liste d'entiers (sa queue).
• Une chaîne de caractères peut avoir un nombre quelconque de caractères, et même aucun.
• Le nombre de caractères est appelé la longueur de la chaîne. La chaîne unique ne contenant aucun caractère est
• Les chaînes de caractères sont prises en charge par tous les langages de programmation modernes.
• Les opérations typiques des chaînes de : - longueur- comparaison - sélection de caractères- sélection de sous-chaînes -
concaténation.
Chapitre 1: Concepts de base
Valeurs et type
1.3. Types récursifs
Chaînes de caractères
• Dans un langage de programmation qui prend en charge les listes, l'approche la plus naturelle consiste à traité les chaînes
de caractères comme des listes de caractères. Cette approche rend toutes les opérations de liste habituelles
automatiquement applicables aux chaînes de caractères. Les opérations utiles spécifiques aux chaînes de caractères
doivent être fournies en plus des opérations générales de la liste. Exemple, HASKELL et PROLOG adoptent cette approche.
Chapitre 1: Concepts de base
Valeurs et type
1.3. Types récursifs
Chaînes de caractères
• Dans un langage orienté objet, l'approche la plus naturelle est de traiter les chaînes de caractères comme des objets.
Cette approche permet de doter les chaînes de caractères avec des méthodes fournissant toutes les opérations
souhaitées et évite les inconvénients de traiter les chaînes de caractères comme des cas particuliers de tableaux ou
Un type récursif est un type défini en fonction de lui-même. Les valeurs d'un type récursif sont composées de valeurs du
même type.
En général, l'ensemble des valeurs d'un type récursif, R, est défini par une équation d'ensemble récursive de la forme :
R = . . . + (. . .R. . .R. . .)
Exemple
def countdown(n):
print(n)
if n > 0:
countdown(n - 1)
Chapitre 1: Concepts de base
Valeurs et type
1.4. Systèmes de types
Eviter des opérations illogiques, comme la multiplication d'une chaîne de caractères par un booléen.
Chapitre 1: Concepts de base
Valeurs et type
1.4. Systèmes de types
Typing statique vs dynamique
• Langage à type statique, chaque variable et chaque expression possède un type fixe ( indiqué par le programmeur ou le
compilateur). Tous les opérandes peuvent être vérifiés au moment de la compilation.
• Exemple: SMALLTALK, LISP, PROLOG.
Chapitre 1: Concepts de base
Valeurs et type
1.4. Systèmes de types
Typing statique vs dynamique
• Langage à typage dynamique, les valeurs ont des types fixes, mais les variables et les expressions n'ont pas de
types fixes.
Chaque fois qu'une opérande est calculée, elle pourrait donner une valeur d'un type différent. Les opérandes
doivent donc être vérifiés après leur calcul, mais avant d'effectuer l'opération , au moment de l'exécution.
Exemple: PERL ,PYTHON
Chapitre 1: Concepts de base
Valeurs et type
1.4. Systèmes de types
Équivalence type
Considérons une opération qui attend un opérande de type T1. Supposer que on lui donne à la place un opérande
dont le type devient T2. Ensuite, nous devons vérifier si T1 est équivalent à T2, noté T1 ≡ T2.
Définition
Equivalence de type est l'équivalence structurelle :
T1 ≡ T2 si et seulement si T1 et T2 ont le même ensemble de valeurs.
Chapitre 1: Concepts de base
Valeurs et type
1.4. Systèmes de types
Équivalence type
Règles
• Si T1 et T2 sont tous deux primitifs, alors T1 ≡ T2 si et seulement si T1 et T2 sont identiques.
Par exemple :
Integer ≡ Integer
Entier /≡Float
• Si T1 = A1 × B1 et T2 = A2 × B2, alors T1 ≡ T2 si et seulement si A1 ≡ A2 etB1 ≡ B2.
Par exemple :Entier × Flottant ≡ Entier × Flottant
Integer × Float /≡Float × Integer
• Si T = A1 → B1 et T2 = A2 → B2, alors T1 ≡ T2 si et seulement si A1 ≡ A2et B1 ≡ B2.
Par exemple :Entier → Flottant ≡ Entier → Flottant
Integer → Float /≡Integer → Boolean
Chapitre 1: Concepts de base
Valeurs et type
1.4. Systèmes de types
Équivalence type
Règles
• Si T1 = A1 + B1 et T2 = A2 + B2, alors T1 ≡ T2 si et seulement si
Soit A1 ≡ A2 et B1 ≡ B2, ou A1 ≡ B2 et B1 ≡ A2
Par exemple :Entier + Flottant ≡ Entier + Flottant
Entier + Flottant ≡ Flottant + Entier
Integer + Float /≡Integer + Boolean
Chapitre 1: Concepts de base
Valeurs et type
1.4. Systèmes de types
Équivalence type
Exemple:
le call ''show(today);'' passerait son contrôle de type, que le langage
struct Position { int x, y; }; adopte l'équivalence structurelle ou de nom.
struct Position pos;
struct Date { int m, d; }; En revanche, l'appel ''show(pos);'' ne passerait son contrôle de type que
struct Date today; si le langage adopte l'équivalence structurelle.
void show (struct Date d);
Chapitre 1: Concepts de base
Valeurs et type
1.4. Systèmes de types
Complétude des types
Les concepteurs de langage doivent garder à l'esprit, car les restrictions tendent à réduire le pouvoir expressif d'un
langage de programmation. Parfois, les restrictions sont justifiées par d'autres considérations de conception
contradictoires.
Cependant, il y a très peu de justification pour la restriction de PASCAL sur les types de résultats de; des
langages plus modernes permettent aux résultats de fonctions d'être de n'importe quel type.
Chapitre 1: Concepts de base
Valeurs et type
1.5. Expressions
Une expression est une construction qui sera évaluée pour produire une valeur.
Exemple
type Month is (jan, feb, mar, apr, may, jun,jul, aug, sep, oct, nov,
dec);
type Day_Number is range 1 .. 31; Construit une valeur du type Date, les valeurs
type Date is qui la composent doivent être des littéraux.
record
m: Month;
d: Day_Number;
end record;
Chapitre 1: Concepts de base
Valeurs et type
1.5. Expressions
Appels de fonction
Un appel de fonction calcule un résultat en appliquant une procédure de fonction (ou méthode) à un ou plusieurs arguments.
L'appel de fonction a généralement la forme ''F(E)''
• F détermine la procédure de la fonction à appliquer,
• Expression E est évaluée pour déterminer l'argument.
Expressions conditionnelles
Une expression conditionnelle calcule une valeur qui dépend d'une condition. Elle a deux ou plusieurs sous-expressions,
parmi lesquelles une seule est choisie pour être évaluée.
Tous les langages de programmation fournissent des expressions conditionnelles.
C, C++ et JAVA fournissent des expressions if.
HASKELL, Python fournit des expressions if et des expressions case.
Chapitre 1: Concepts de base
Valeurs et type
1.5. Expressions
Expressions itératives
Une expression itérative est une expression qui effectue un calcul sur une série de valeurs ( tableau ou , liste) pour obtenir
un résultat.
2. Variables composées
Exemple
Considérons les déclarations C++:
struct Date {
int y, m, d;
};
Date today
Stockage pour (a) une variable d'enregistrement, et (b) une variable de tableau
Chapitre 1: Concepts de base
Variable et stockage
2. Variables composées
Mise à jour totale ou sélective
Une variable composite peut être mise à jour soit en une seule étape, soit en plusieurs étapes, un composant à la fois.
Mise à jour totale d'une variable composite consiste à avec une nouvelle valeur (composite) en une seule étape.
Mise à jour sélective d'une variable composite consiste à mettre à jour une seule composante.
Chapitre 1: Concepts de base
Variable et stockage
2. Variables composées
Mise à jour totale ou sélective
Met à jour un seul composant tomorrow, laissant les autres composants inchangés.
Chapitre 1: Concepts de base
Variable et stockage
2. Variables composées
Tableaux statiques, dynamiques et flexibles
Tableaux statiques
Un tableau statique est une variable de tableau dont la plage d'index est fixée au moment de la compilation. Le code
du programme détermine la plage d'index.
Exemple
float v1[ ] = {2.0, 3.0, 5.0, 7.0};
float v2[10];
• La variable tableau v1 a une plage d'index de 0 à 3, qui est déterminée par la construction de tableau utilisée pour
l'initialiser.
• La variable de tableau v2 a une plage d'index de 0 à 9, qui est déterminée par sa longueur déclarée de 10.
Chapitre 1: Concepts de base
Variable et stockage
2. Variables composées
Tableaux statiques, dynamiques et flexibles
Tableaux dynamique
Un tableau dynamique est une variable de tableau dont la plage d'indexation est fixée au moment où la variable
tableau est créée.
Exemple Considérons la déclaration de type ADA suivante :
type Vector is array (Integer range <>) of Float;
Cette définition de type indique uniquement que la plage d'index du vecteur sera de type Integer ;
''<>'' signifie que les limites inférieure et supérieure restent ouvertes.
Les limites d'une variable Vector ne seront fixées que lors de la création de la variable.
Considéronsles déclarations de variables suivantes :
v1 pointe vers un tableau dont l'intervalle d'index est de 0-2. Ainsi, la plage d'index de v1 peut varier pendant la durée de
vie de v1.
Chapitre 1: Concepts de base
Variable et stockage
3. Sémantique de copie vs sémantique de référence
un programme affecte une valeur composite à une variable du même type. Il existe en fait deux possibilités distinctes
:
Sémantique de la copie: L'affectation copie tous les composants de la valeur composite dans les composants
correspondants de la variable composite.
Sémantique de la référence: L'affectation fait en sorte que la variable composite contienne un pointeur (ou une
référence) vers la valeur composite.
Chapitre 1: Concepts de base
Variable et stockage
3. Sémantique de copie vs sémantique de référence
Exemple
Sémantique de copie
struct Date {
int y, m, d;
}; dateB contient maintenant une copie complète de la dateA
Date dateA = {2003, 12, 25};
Date dateB;
dateB = dateA;
Sémantique de référence
Variable globale : la variable est créée au démarrage du programme et est détruite à l'arrêt du programme.
Variable locale : la variable est créée à l'entrée du bloc et est détruite à la sortie du bloc.
Chapitre 1: Concepts de base
Variable et stockage
4. Durée de vie
Variables globales et locales
Exemple
int g;
void main () {
int x1; float x2;
. . . P(); . . . Q(); . . .
}
void P () {
float y1; int y2;
. . . Q(); . . .
}
void Q () {
int z;
...
}
Chapitre 1: Concepts de base
Variable et stockage
4. Durée de vie
Une variable tas est une variable qui peut être créée et détruite à tout moment pendant l'exécution du programme.
Une variable tas est créée par une expression ou une commande.
Elle est anonyme, et on y accède par un pointeur
Chapitre 1: Concepts de base procedure main is
type IntNode;
Variable et stockage type IntList is access IntNode;
4. Durée de vie type IntNode is
Variables de tas record
Exemple elem: Integer;
• Chaque valeur de type IntList est soit un pointeur vers un succ: IntList;
end record;
enregistrement IntNode, soit le pointeur null. odds, primes: IntList := null;
• A chaque fois que la fonction cons est appelée, l'expression ''new function cons (h: Integer; t: IntList)
return IntList is
IntNode'(h, t)'' crée une variable de tas de type IntNode. l'initialise begin
pour qu'elle contienne l'entier h et le pointeur t, et produit une return new IntNode'(h, t);
end;
variable de tas de type IntNode. procedure P is
• La fonction cons renvoie simplement ce pointeur. begin
odds := cons(3, cons(5, cons(7, null)));
• la procédure P fait en sorte que la variable odds contienne un primes := cons(2, odds);
pointeur vers une liste contenant les entiers 3, 5 et 7 dans cet ordre. end;
procedure Q is
et fait pointer la variable odds variable vers une liste contenant begin
l'entier 2 suivi des trois entiers. odds.succ := odds.succ.succ;
end;
begin
. . . P; . . . Q; . . .
end;
Chapitre 1: Concepts de base procedure main is
type IntNode;
Variable et stockage type IntList is access IntNode;
4. Durée de vie type IntNode is
Variables de tas record
elem: Integer;
succ: IntList;
end record;
Exemple odds, primes: IntList := null;
function cons (h: Integer; t: IntList)
return IntList is
begin
return new IntNode'(h, t);
end;
procedure P is
begin
Le code de la procédure Q met à jour le odds := cons(3, cons(5, cons(7, null)));
composant pointeur du premier nœud primes := cons(2, odds);
end;
de la odds list pour pointer vers le procedure Q is
troisième nœud, supprimant en fait le begin
odds.succ := odds.succ.succ;
deuxième nœud de cette liste. end;
begin
. . . P; . . . Q; . . .
end;
heapq
Chapitre 1: Concepts de base
Variable et stockage
4. Durée de vie
Variables de tas
Remarque
Un tas est un arbre binaire pour lequel chaque nœud parent a une valeur inférieure ou égale à n'importe lequel de
ses enfants.
Le module « heapq » en Python fournit une implémentation de l'algorithme de file d'attente du tas, également
connu sous le nom the priority queue algorithm.
Chapitre 1: Concepts de base
Variable et stockage
4. Durée de vie
Variables persistantes
Un variable persistante est une variable dont la durée de vie transcende l'activation d'un élément particulier.
Chapitre 1: Concepts de base
Variable et stockage
4. Durée de vie
Variables persistantes
une variable transitoire est une variable dont la durée de vie est limitée par l'activation du programme qui l'a créé.
Variables persistantes
Exemple
Considérez les déclarations de type ADA suivantes :
type Country is (AT, BE, DE, DK, ES, FI, FR, GR,
IE, IT, LU, NL, PT, SE, UK);
type Statistics is
record
population: Integer;
area: Float;
end record;
type StatsTable is array (Country) of Statistics;
un fichier séquentiel nommé stats.dat comporte des composants de type Statistics, un composant pour chaque valeur de
type Country.
Chapitre 1: Concepts de base
Variable et stockage
4. Durée de vie
Variables persistantes
Exemple
Le code suivant illustre comment les données stockées dans le tableau transitoire:
procedure analyzeStats (stats: in out StatsTable) is
-- Print the population density of each country using the data in stats.
begin
for cy in Country loop
put(Float(stats(cy).population)/stats(cy).area);
end loop;
end;
procedure main is
stats: StatsTable;
begin
loadStats(stats);
analyzeStats(stats);
end;
Chapitre 1: Concepts de base
Variable et stockage
5. Pointeurs
Chaque valeur de type ''IntNode*'' est un pointeur sur une variable de type
struct IntNode {
IntNode. Si p est un pointeur (mais non nul), la variable d'accès ''*p'' donne la
int elem;
IntNode* succ; variable de structure vers laquelle p pointe, et ''(*p).elem'' sélectionne le
}
composant elem de cette variable de structure.
IntNode* p;
Chapitre 1: Concepts de base
Variable et stockage
5. Pointeurs
Remarque
Les pointeurs et les variables de tas utilisés pour représenter des valeurs récursives telles que des listes et les arbres.
Chapitre 1: Concepts de base
Variable et stockage
5. commandes
Saute
Affectations
La commande d'affectation a typiquement la forme ''V = E;'' ou '‘ V := E; ''
Appel de procédure
Un appel de procédure est une commande qui produit son effet en appliquant une procédure (ou méthode) à certains
arguments.
Chapitre 1: Concepts de base
Variable et stockage
5. commandes
Commandes conditionnelles
Une commande conditionnelle comporte au moins deux sous-commandes, dont l'une est choisie pour être exécutée.
La commande conditionnelle est « if ».
Commandes itératives
Une commande itérative (boucle) comporte une sous-commande qui est exécutée de façon répétée.
Chapitre 1: Concepts de base
Variable et stockage
5. commandes
Commandes itératives
Une commande itérative (boucle) comporte une sous-commande qui e st exécutée de façon répétée.
Itération indéfinie : le nombre d'itérations n'est pas fixé à l'avance. Assurée par la commande while
Itération définie : le nombre d'itérations est fixé à l'avance. Assurée par la commande for
Chapitre 1: Concepts de base
Liaisons et portée
1. Liaisons et environnements
Les langages de programmation permettent de déclarer le même identificateur dans plusieurs parties du programme.
L'interprétation d'une expression ou d'une commande utilisant cet identificateur dépend alors de l'endroit où
l'expression ou la commande apparaît dans le programme.
Chapitre 1: Concepts de base
Liaisons et portée
1. Liaisons et environnements
Exemple
Considérons l'expression ADA ''n+1'', qui utilise l'identificateur n.
- Si n est déclaré comme suit :
n : constant Integer := 7 L'expression ''n+1'' est évaluée en ajoutant un à sept.
Une liaison est une association fixe entre un identificateur et une entité telle qu'une valeur, une variable ou une
procédure.
Une déclaration produit une ou plusieurs liaisons.
La portée d'une déclaration est la partie du texte du programme sur laquelle la déclaration est effective.
La portée d'une liaison est la partie du texte du programme sur laquelle la liaison s'applique.