Vous êtes sur la page 1sur 33

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

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}

Ce type d'enregistrement a le jeu de valeurs :


Exemple
Considérons les définitions suivantes de l'ADA : Date = Month × Day-Number = {jan, feb, . . . ,
dec} × {1, . . . , 31}
type Month is (jan, feb, mar, apr, may, jun,jul, aug, sep, oct, nov,
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
m: Month; (jan, 1) (jan, 2) (jan, 3) . . . (jan, 31)
d: Day_Number; (feb, 1) (feb, 2) (feb, 3) . . . (feb, 31
). . . . . . . . . . . . . . .
end record; (dec, 1) (dec, 2) (dec, 3) . . . (dec, 31)
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.

Vous aimerez peut-être aussi