Vous êtes sur la page 1sur 63

Université 20 Aout 1955 – Skikda

Département d’Informatique

Paradigmes des langages de programmation

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.

Les différents langages de programmation prennent en charge différents types de valeurs :


- Le langage C : les nombres entiers, les nombres réels, les structures, les tableaux, les
unions, les pointeurs vers les variables et les pointeurs vers les fonctions.
- Python : les nombres entiers, décimaux, complexes, chaines de caractères, booléens, listes,
tuples, etc.
Chapitre 1: Concepts de base
Valeurs et type
1. Types
1.1. Types primitifs
• Une valeur primitive est une valeur qui ne peut être décomposée en valeurs plus
simples.
• Un type primitif est un type dont les valeurs sont primitives.
Chapitre 1: Concepts de base
Valeurs et type Types primitifs

Types primitives intégrés Types primitives définis Types primitifs discrets

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

Produits cartésiens, structures


et enregistrements

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}

Exemple Ce type d'enregistrement a le jeu de valeurs :


Considérons les définitions suivantes de l'ADA :
Date = Month × Day-Number = {jan, feb, . . . ,
type Month is (jan, feb, mar, apr, may, jun,jul, aug, sep, oct, nov, dec} × {1, . . . , 31}

dec); La cardinalité de ce type est :


type Day_Number is range 1 .. 31; #Date = #Month × #Day-Number = 12 × 31 = 372

type Date is et ses valeurs sont les paires suivantes :


record
(jan, 1) (jan, 2) (jan, 3) . . . (jan, 31)
m: Month; (feb, 1) (feb, 2) (feb, 3) . . . (feb, 31
d: Day_Number; ). . . . . . . . . . . . . . .
(dec, 1) (dec, 2) (dec, 3) . . . (dec, 31)
end record;
Chapitre 1: Concepts de base
Valeurs et type Types composites
Mappings, tableaux et fonctions

Le mappage est en fait à la base de deux caractéristiques du langage : les tableaux et les fonctions.
On écrit : m : S → T

m est un mappage de l'ensemble S vers l'ensemble 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.

 S → T représente l'ensemble de tous les mappings de S à T.

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

L'ensemble des valeurs possibles de ce tableau est donc :


Exemple {0, 1, 2} → {false, true}
Considérons la déclaration C++ : La cardinalité de cet ensemble de valeurs est de 𝟐𝟑 et les valeurs sont les huit
suivantes. mappings finis :
bool p[3] ;
{0 → false, 1 → false, 2 → false} {0 → true, 1 → false, 2 → false}
{0 → false, 1 → false, 2 → true} {0 → true, 1 → false, 2 → true}
{0 → false, 1 → true, 2 → false} {0 → true, 1 → true, 2 → false}
{0 → false, 1 → true, 2 → true} {0 → true, 1 → true, 2 →true
Chapitre 1: Concepts de base
Valeurs et type Types composites
Mappings, tableaux et fonctions
Fonction
Implémenter un correspondance dans S → T au moyen d'une fonction, qui prend une valeur dans S(l'argument) et
calcule son image dans T (le résultat).

Exemple Cette fonction implémente un mappage :


Considérons la fonction python suivante : Integer→Boolean

def isEven(n): Remarque


return (n % 2 == 0) ISEVEN est une fonction qui renvoie VRAI si le
nombre qui lui est transmis est pair(Even), et
n = 101 FAUX si le nombre est impair(Odd).
print("Even" if isEven(n) else "Odd")
Chapitre 1: Concepts de base
Valeurs et type Types composites
Unions disjointes, enregistrements discriminés et objets

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

variante choisie dans l'un ou l'autre des deux ensembles S et T.

 Formellement : S + T = {gauche x | x ∈ S} ∪ {droite y | y ∈ T}


Chapitre 1: Concepts de base
Valeurs et type Types composites
Unions disjointes, enregistrements discriminés et objets

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.

• Test d'étiquetage, déterminant si la variante a été choisie dans S ou T

• Projection pour récupérer la variante dans S ou la variante dans T.

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

Considérons la définition du type HASKELL :


data Number = Exact Int | Inexact Float
L'ensemble des valeurs de ce type algébrique est :
Number = Exact Integer + Inexact Float
Les valeurs du type sont donc :{. . . , Exact(-2),
Exact(-1), Exact 0, Exact(+1), Exact(+2), ...}∪ {. . . , Inexact(-1.0), . . . , Inexact 0.0, . . . Inexact(+1.0), ...}
Le code suivant illustre la construction d'une valeur algébrique :
let pi = Inexact 3.1416
in . . .
La fonction suivante illustre le test de l'étiquette et la projection :
Rounded num =
case num of
Exact i -> i
Inexact r -> round r
Cette méthode utilise la correspondance de motifs. Si la valeur de num est Inexact 3.1416, le motif ''Inexact r'' le correspond,
r est lié à 3.1416, et la sous-expression ''round r'' est évaluée, ce qui donne 3.
Chapitre 1: Concepts de base
Valeurs et type
1. Types
1.3. Types récursifs
Un type récursif est un type défini par lui-même.

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).

• Récursivité: Liste d'entiers = Unité nulle + cons(Entier × Liste d'entiers)

• Liste d'entiers = { nil() } ∪ {cons(i, l) | i ∈ Entier ; l ∈ Liste d'entiers }

• L'équation de l'ensemble récursif : L = Unité + (T × L)


Chapitre 1: Concepts de base
Valeurs et type
1.3. Types récursifs
Listes
Exemple

class IntList { La classe IntNode est définie


public IntNode first; en fonction d'elle-même.
public IntList (IntNode first) { Ainsi, chaque objet IntNode
this.first = first;
}
contient un composant
} IntNode nommé succ. Cela
class IntNode { peut sembler impliquer qu'un
public int elem; objet IntNode contient un
public IntNode succ; objet IntNode, qui contient à
public IntNode (int elem, IntNode succ) {
this.elem = elem;
son tour un autre objet
this.succ = succ; IntNode, et ainsi de suite à
} l'infini.
}
Chapitre 1: Concepts de base
Valeurs et type
1.3. Types récursifs
Chaînes de caractères

• Une chaîne de caractères est une séquence de caractères.

• 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

appelée chaîne vide.

• 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

de listes. Exemple, JAVA adopte cette approche.


Chapitre 1: Concepts de base
Valeurs et type
1.3. Types récursifs
Les types récursifs en général

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

Le système de types d'un langage de programmation regroupe les valeurs en types.

 Permettre aux programmeurs de décrire efficacement les données.

 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

Verification de type operations


Cette question apparemment pragmatique est en fait à
• Avant l'opération
l'origine d'une classification importante des langages de
• Au moment de la compilation programmation, entre langages typés statiquement et langages
typés dynamiquement.
• AU moment de l'exécution

• 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.

les formes fondamentales d'expression :


• Littéraux
• Constructions
• Appels de fonction
• Expressions conditionnelle
• Expressions itératives
• Accès aux constantes et aux variables.
Chapitre 1: Concepts de base
Valeurs et type
1.5. Expressions
Littéraux
Le type d'expression le plus simple est un littéral, qui désigne une valeur fixe de un certain type.
Exemple :
365 un entier
3.1416 un nombre réel
false un booléen
'%‘ un caractère
"Quoi ?« une chaîne de caractères
Chapitre 1: Concepts de base
Valeurs et type
1.5. Expressions
Constructions
Une construction est une expression qui construit une valeur composite à partir des valeurs qui la composent. Dans certains
langages, les valeurs composantes doivent être des littéraux. d'autres, les valeurs des composants sont calculées en évaluant
des sous-expressions.

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.

Accès aux constantes et aux variables


• Accès à une constante est une référence à une constante nommée, et donne la valeur de cette constante.
• Accès à une variable est une référence à une variable nommée et donne la valeur actuelle de cette variable.
EXEMPLE
pi : constante Float := 3.1416;
r : Flottant ;
On considère l'expression 2.0 * pi * r
''pi'' est un accès constant, donnant la valeur 3.1416 à laquelle pi est lié.
''r'' est un accès à une variable, donnant la valeur actuellement contenue dans la variable nommée r.
Chapitre 1: Concepts de base
Variable et stockage
 Un stockage est une collection de cellules de stockage,
chacune d'entre elles ayant une adresse unique.
 Chaque cellule de stockage a un état actuel: variable primitive 10
-Alloué
%
-Non alloué variable composée ? indéfinie
 Chaque cellule de stockage allouée a un contenu actuel: true
-Une valeur stockable
-Une valeur indéfinie.
cellule non allouée
Chapitre 1: Concepts de base
Variable et stockage
1. Variables simples
 Une variable simple est une variable qui peut contenir une valeur stockable.
 Chaque variable simple occupe une seule cellule de stockage.
Exemple
Variable simple en C
{ int n;
n = 0;
n = n+1;
}

2. Variables composées

 Une variable composite est une variable de type composite.


 Chaque variable composite occupe un groupe de cellules de stockage adjacentes.
 Une variable d'un type composite a la même structure qu'une valeur de ce type.
Chapitre 1: Concepts de base
Variable et stockage
2. Variables composées
Par exemple, une variable d'enregistrement est un tuple de variables composées ; et une variable de type tableau est
un mappage d'une plage d'index à un groupe de variables de composants.

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

Exemple struct Date


{ int y, m, d;
};
Date today, tomorrow;

 Mise à jour totale


L'affectation suivante : tomorrow = today;
Copie la valeur complète today dans la variable tomorrow. Elle copie le contenu des trois cellules de stockage
today dans les trois cellules de stockage de tomorrow .

 Mise à jour sélective


L'affectation suivante : tomorrow.d = today.d + 1;

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 : Vecteur(1 .. 4) := (2.0, 3.0, 5.0, 7.0) ; v1 a des limites de 1 à 4,


v2 : Vecteur(0 .. m) := (0 .. m => 0,0) ; V2 a des limites de 0 à 2 si la valeur actuelle de m = 2.
Chapitre 1: Concepts de base
Variable et stockage
2. Variables composées
Tableaux statiques, dynamiques et flexibles
Tableaux flexible
Un tableau flexible est une variable de tableau dont la plage d'index n'est pas fixée. Il peut être modifiée lorsqu'une
nouvelle valeur de tableau lui est affectée.
Exemple
Considérons les déclarations de variables JAVA suivantes :
float[] v1 = {2.0, 3.0, 5.0, 7.0};
float[] v2 = {0.0, 0.0, 0.0};

v1 a une plage d'indices de 0 à 3, v2 a une plage d'indices de 0 à 2.


Après l'affectation suivante :
v1 = v2 ;

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

Date* dateP = new Date;


Date* dateQ = new Date; dateP et dateQ contiennent des pointeurs vers des variables Date.
*dateP = dateA;
dateQ = dateP;
Chapitre 1: Concepts de base
Variable et stockage
4. Durée de vie
Durée de vie: L'intervalle entre la création et la destruction d'une variable .
Variables globales et locales

 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

Variables de tas (Heap)

 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

 Fichiers sont des variables composites.


 Fichier séquentiel est un séquence de composants. Il est lu ou écrit un composant à la fois, dans l'ordre de série.
 Fichier direct est un tableau de composants. Il est également lu ou écrit un composant à la fois, mais dans un ordre
arbitraire, en utilisant le numéro de position unique de chaque composant.
 Variables persistants : les fichiers contiennent de grands corps de données à longue durée de vie.

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 globales, locales et de tas sont transitoires.


Chapitre 1: Concepts de base
Variable et stockage
4. Durée de vie

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

 Un pointeur est une référence à une variable particulière.


 Les pointeurs sont parfois appelés références.
 La variable à laquelle un pointeur fait référence est appelée la variable du pointeur référent.
Exemple
Pointeurs En C++, chaque valeur de type ‘‘T*’’ est soit un pointeur vers une variable de type T soit un pointeur nul.

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

Le type de commande le plus simple possible est la commande skip.


En C, C++ , JAVA et Python, la commande skip s'écrit simplement '';''.

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.

-Si n est déclaré comme suit


L'expression ''n+1'' est évaluée en ajoutant un à la valeur actuelle de cette
n: Integer;
variable.
Chapitre 1: Concepts de base
Liaisons et portée
1. Liaisons et environnements

 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.

 Un environnement (ou espace de noms) est un ensemble de liaisons.


 Chaque expression ou commande est interprétée dans un environnement particulier, et tous les identificateurs
utilisés dans l'expression ou la commande doivent avoir des liaisons dans cet environnement.
Chapitre 1: Concepts de base
Liaisons et portée
2. Portée

 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.

Vous aimerez peut-être aussi