0% ont trouvé ce document utile (0 vote)
267 vues27 pages

Cours Paradigm de Programmation

Ce document présente un cours sur les paradigmes de programmation. Il décrit les objectifs, l'organisation et le contenu du cours, notamment les concepts de base de la programmation, les différents paradigmes comme la programmation impérative et déclarative, et les patrons de conception.

Transféré par

Mariem Ben Kamel
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
267 vues27 pages

Cours Paradigm de Programmation

Ce document présente un cours sur les paradigmes de programmation. Il décrit les objectifs, l'organisation et le contenu du cours, notamment les concepts de base de la programmation, les différents paradigmes comme la programmation impérative et déclarative, et les patrons de conception.

Transféré par

Mariem Ben Kamel
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

29/04/2024

2
Ministère de l'Enseignement Supérieur et de la Recherche Scientifique
Institut Supérieur des Arts et du Multimédia de Manouba

Organisation du cours
Cours • 12 semaines
Paradigmes des Langages de Programmation
• 3h/semaine
Master DSIR
• Évaluations : Exposé (30%) + Note examen (70%)

• Questions : [email protected]
Kalthoum REZGUI

2023-2024

3 4

Objectifs du cours Introduction

• Un langage de programmation est une notation permettant de décrire


• Rappeler les concepts de base de la programmation des calculs d’une manière compréhensible à la fois pour l’ordinateur et
(programmation procédurale, programmation orientée objets, pour le programmeur.
etc.).
• Les premiers langages ont été inventés à la fin de seconde guerre
mondiale (Plankalkul, 1945).
• Introduire/ maîtriser les paradigmes de programmation.
• Depuis lors, une multitude de langages ont été inventé. Wikipedia liste
▫ Programmation impérative (structurée, procédurale, orientée
±680 langages différents.
objets, générique)
▫ Programmation déclarative (programmation fonctionnelle,
programmation logique)

• Introduire / maîtriser les patrons de conception.

1
29/04/2024

5 6

Pourquoi autant de Pourquoi apprendre


langages ? plusieurs langages ?

• Beaucoup de langages sont spécifiques à une machine. • Il n’existe pas de langage universel ultime qui conviendrait pour tout.
• De nouveaux langages sont constamment introduits pour résoudre les • Pour étoffer sa boîte à outils et aborder plus efficacement de nouveaux
limitations (supposées ou non) des langages existants. problèmes.
• Les langages doivent suivre les évolutions des machines et les nouveaux • Pour s’adapter à un domaine/environnement de travail, pour pouvoir
développements en génie logiciel. réutiliser/améliorer les outils de ce domaine.
• Pour des questions de hype et de marketing. • Pour apprendre d’autre paradigmes de programmation.
• Le nombre de degrés de liberté pour le design d’un langage est très ▫ Le langage utilisé façonne le processus de raisonnement
important. ▫ Différents problèmes sont résolus de manière efficace par différentes
• Beaucoup de langages sont spécialisés : web (JS, PHP, HTML), bases de approches.
données (SQL), texte (PERL, TeX), banques (COBOL), maths (Matlab, • Tant qu’on n’a pas testé un langage, on ne sait pas ce qu’on manque.
Mathematica), GPU (Cuda, OpenCL), etc. • Pour le challenge intellectuel.

7 8

Paradigmes de programmation Paradigmes de programmation

• Un paradigme est, en épistémologie et dans les sciences humaines et


• Quelle que soit votre expérience en développement, votre façon sociales, une représentation du monde, une manière de voir les
de coder suit un paradigme de programmation. choses, un modèle cohérent du monde qui repose sur un fondement défini
(matrice disciplinaire, modèle théorique, courant de pensée) (Larousse)
• Quel que soit votre niveau d’expérience en tant que développeur,
votre façon de coder suit un paradigme de programmation. • Un paradigme de programmation est une façon (parmi d’autres)
d’approcher la programmation informatique et de traiter les solutions aux
problèmes et leur formulation dans un langage de programmation approprié.
• Certains langages imposent un paradigme, comme C++ impose la (Wikipedia)
programmation orientée objet ou Lisp impose la programmation
fonctionnelle, tandis que d’autres comme PHP ou JavaScript sont • Un paradigme de programmation est une approche logique qu’un
plus permissifs et vous laisse dérouler votre code comme bon développeur va adopter pour résoudre son problème. Le paradigme le plus
vous le semble. courant est la programmation impérative. Les étapes d’instructions se
suivent jusqu’ à arriver au résultat escompté.

2
29/04/2024

9 10

Paradigmes de programmation Paradigmes de programmation

• Programmation :
• Un paradigme de programmation fournit (et détermine) la vue qu’à le
▫ « Ensemble des activités qui permettent l’écriture des programmes
développeur de l’exécution de son programme en situation
informatiques. Elle représente usuellement le codage, i.e., la rédaction
d’exploitation.
du code source d’un logiciel ».

• Un ensemble de concepts qui sont cohérents pour la résolution d’un • Langage :


certain genre de problèmes. ▫ « Une abstraction des opérations réalisée par un ordinateur. Un
langage est habituellement dominé par un paradigme à partir duquel
sa structure a été conçue. Souvent, des éléments issus de différents
• Par exemple: En programmation O.O, les développeurs peuvent paradigmes y sont présents ».
considérer le programme comme une collection d’objets en interaction,
• Programmer :
tandis qu’en programmation fonctionnelle, un programme peut être vu
▫ « Utiliser un langage afin de se conformer de façon plus ou moins
comme une suite d’évaluations de fonctions sans états.
rigoureuse a un ou plusieurs paradigmes de programmation ».

11 12

Paradigmes de programmation Paradigmes de programmation

• Un paradigme est donc une manière de programmer un ordinateur basé


• Il n’existe pas de paradigmes uniques bon pour toutes les
sur un ensemble de principes ou une théorie.
applications.
« Si le seul outil que vous avez est un marteau, vous verrez
• Chaque paradigme est bon pour certains problèmes. tout problème comme un clou. » Abraham Marslow

• Tout problème peut être résolu en se basant sur l’un ou l’autre des
paradigmes de programmation. Si un développeur ne comprend qu’un seul paradigme, il
abordera toujours les problèmes de la même façon quitte à écrire
un code inadapté ou inefficace.
• Un bon programme a presque toujours besoin de plusieurs
paradigmes.
• De fait, un paradigme de programmation est composé d’un ensemble de
concepts. Et on crée un nouveau paradigme en partant d’un paradigme
• Un bon langage doit soutenir plusieurs paradigmes (Ex: l’un pour existant et en lui ajoutant un ou plusieurs nouveaux concepts..
faire les calculs, l’autre pour structurer le problème.)

3
29/04/2024

13 14

Pourquoi étudier différents Aujourd’hui la plupart des


paradigmes? langages sont multi-paradigmes

• Afin de mieux exprimer des idées complexes • Python, Java, C++ et C# supportent le paradigme impératif structuré,
fonctionnel et objet, par exemple. En fonction du problème à résoudre,
il sera plus intéressant de travailler avec un paradigme plutôt qu’un
• Différentes tâches demandent des approches différentes
autre :
▫ En effet, un calcul matriciel se gère plus facilement avec de l’impératif
• Afin de faciliter l’apprentissage de nouveaux langages structuré.

• Afin de faire les bons choix ▫ De plus, un parcours d’arbre ne peut s’effectuer simplement qu’avec
de la programmation fonctionnelle.
• Afin de suivre l’évolution de l’état de l’art en programmation
▫ Enfin, les interfaces graphiques évoluées font un usage de la POO.

15 16

Catégorisation des langages Types des langages


• Les langages sont généralement caractérisés selon un ensemble de
propriétés :
▫ Expressivité
▫ Niveau d’abstraction
▫ Paradigme de programmation
▫ Processus de compilation/exécution des programmes
▫ Approche de gestion de la mémoire
▫ Système de typage des variables/valeurs
▫ Autres :
Ramasse-miètes
Exceptions
Evènements
Threads
• Exemple: C est un langage de bas niveau, à typage statique faible, de type
impératif procédural, compilé et dont la mémoire est gérée manuellement.

4
29/04/2024

17 18

Plusieurs paradigmes

• Programmation logique
• Programmation fonctionnelle
• Programmation impérative
• Programmation par scripting/dynamique
• Programmation déclarative
• Programmation orientée aspect
• Programmation concurrente
• et plus…

19 20

Historique A quel paradigme de


programmation se vouer?

• Tout d’abord, l’architecture des processeurs depuis la seconde guerre


mondiale jusqu’à aujourd’hui est intrinsèquement impérative… Les premiers
langages implémentés (comme FORTRAN en 1954, ALGOL en 1958 ou
COBOL en 1959) ont donc tout naturellement été basé sur le paradigme
« impératif structuré ». C’est celui qui est le plus simple à comprendre pour la
majorité des gens.

• Ensuite, les travaux de Church sur le λ-calcul et les travaux sur la calculabilité
vont faire émerger le paradigme fonctionnel. Le premier langage populaire à
l’implémenter fut LISP en 1958. Mais d’autres comme Haskell en 1990 ou
Scala en 2003 en sont d’autres exemples.

• Par ailleurs, le paradigme de la programmation orienté objet (ou POO) a été


inventé au début des années 1960 par les Norvégiens Ole-Johan Dahl et
Kristen Nygaard et poursuivi par les travaux de l’Américain Alan Kay dans les
années 1970. Ce sont les langages comme Simula 67 ou Smalltalk 71 qui l’ont
popularisé. Aujourd’hui la plupart des langages supportent ce paradigme.

5
29/04/2024

21 22

A quel paradigme de Niveaux d’abstraction des différents


programmation se vouer? paradigmes

• De plus, le paradigme logique est né de travaux effectués de 1930 jusqu’en


1965 sur la démonstration automatique de théorème. C’est le langage • Niveau 0 : Programmation impérative (la machine exécute les
PROLOG créé par Alain Colmerauer et Philippe Roussel (cocorico) vers instructions appartenant au langage qu’elle supporte).
1972 à Luminy qui l’a popularisé.
• Niveau 1 : Programmation procédurale et structurée : définition
• Enfin, le modèle par acteur est utilisé pour formaliser les interactions d’unités (autonomes et réutilisables = fonctions / procédures).
concurrentes. De fait les acteurs communiquent par échange de messages.
En réponse à un message, un acteur peut effectuer un traitement local, • Niveau 2 : Programmation modulaire : définition de modules (e.g.
créer d’autres acteurs, ou envoyer d’autres messages. fichiers .h en C) accessibles grâce à leurs interface. Plusieurs détails
• L’article de référence date de 1973. Le langage qui l’implémente le plus (allocation mémoire) restent à la charge du client de ces modules.
connu est Erlang. Il est en effet très utile dans le monde de l’embarqué.
• Niveau 3 : Programmation orientée objets : propose le concept de
l’objet qui encapsule à la fois le comportement et les données.

23 24

Niveaux d’abstraction des différents Niveaux d’abstraction des différents


paradigmes paradigmes

• Niveau 3* : Programmation générique : s’applique aux autres paradigmes


pour augmenter la réutilisabilité des algorithmes indépendamment des
structures de données (types, fonctions, paquetages, etc.). Le langage de
programmation instancie la version générique en utilisant des types,
fonctions ou même des packages comme paramètres.

• Niveau 4 : Programmation déclarative : basée sur des fondements


théoriques solides (lambda calcul, logique) limite les effets de bord (e.g.
Erlang) ou les élimine complètement (langages fonctionnels purs e.g.
Haskel)

6
29/04/2024

25 26

Quelques concepts de Quelques concepts de


paradigme … paradigme …

• Enregistrement : • Fermeture ou clôture


▫ Un regroupement de données avec un accès direct à chaque donnée. ▫ Une des bases du paradigme de programmation fonctionnel. Le terme
C’est le type RECORD du langage Pascal ou le struct du C. complet est « fermeture à portée lexicale » (en anglais : lexically
▫ p=Personne( prenom=’Jean’, nom=’De Bon Fumet’, scoped closure) ou clôture (en anglais : closure).
telephone=’0102030405’ )
▫ p.nom est égal à “De Bon Fumet” ▫ Une fermeture regroupe une procédure avec ses références
▫ Doivent proposer un certain nombre d’opérations : création, externes.
décomposition, les examiner, de manière dynamique pendant ▫ Le plus souvent une fermeture est donc créée lorsqu’une fonction est
l’exécution. déclarée au sein d’une autre fonction et utilise des paramètres ou des
▫ Afin de construire les types complexes comme les listes, les chaînes et variables locales de cette dernière.
les arbres, ils seront dérivés des enregistrements. ▫ Egalement, quand la valeur retournée par une fonction est elle-même
une fonction.

27 28

Quelques concepts de Quelques concepts de


paradigme … paradigme …
• Fermeture ou clôture • Fermeture ou clôture
▫ Presque tous les langages de programmation utilisent les fermetures : ▫ Les fermetures permettent également de faire des fonctions
Les objets sont des fermetures partielles :
Les classes sont des fermetures ▫ Une fonction partielle est une fonction qui n’a pas besoin de la
Les composants sont des fermetures totalité de ses paramètres pour s’exécuter.
Les fonctions sont des fermetures ▫ Cette propriété est héritée des langages de
… programmation fonctionnels.
▫ Exemples : ▫ Intérêt : Le code source est beaucoup plus clair dans la définition de
la fonction.
▫ Cela permet d’éviter de créer de nouvelles fonctions si celles-ci
sont similaires, tout en les appelant avec des noms précis.

Fermetures

7
29/04/2024

29 30

Quelques concepts de Quelques concepts de


paradigme … paradigme …
• Fermeture ou clôture
▫ Les fermetures permettent également de faire des fonctions • Indépendance
partielles. ▫ C’est un concept clé car il induit comment créer un programme en
▫ Exemple de fonction partielle : parties indépendantes. Il est la base de plusieurs concepts dérivés :

La concurrence : les activités concurrentes s’exécutent en même


• La fonction who() dans le code temps sans interactions.
est une fonction partielle, car
elle n’est définit qu’avec son Le choix non-déterministe : les activités interagissent
paramètre name, et elle se sert de indirectement.
la variable word, donnée par la
fonction say qui l’englobe.
L’état : interactions directes entre les activités

31 32

Quelques concepts de paradigme … Quelques concepts de


paradigme …
• Indépendance : La concurrence
▫ Le monde informatique, à l’instar du monde réel, est concurrent : • À la base, deux activités concurrentes sont indépendantes.
• La concurrence doit être associée avec un autre concept si les activités
Système distribué : Sur un réseau chaque ordinateur agit de manière doivent interagir.
concurrente. • L’indépendance : le choix non-déterministe
Système d’exploitation de nombreux programmes/services (représentés ▫ Le non-déterminisme est nécessaire quand deux entités indépendantes
par des processus) agissent de façon concurrente. Chaque processus a une interagissent avec une troisième entité
mémoire indépendante.
A l’intérieur d’un processus, plusieurs fils d’exécution (threads) peuvent ▫ Nous avons trois entités (A, B et C). A et B peuvent interagir avec C mais A et B
coexister. Les fils partagent la même mémoire. n’ont pas d’influence l’une sur l’autre. C reçoit des messages de A et de B
indépendamment et, donc, fait un choix.
Pour qu’un programme concurrent puisse fonctionner, il faut que les
différentes activités puissent communiquer (échanger des informations)
et se synchroniser (attendre qu’un événement survienne pour poursuivre
l’activité).

8
29/04/2024

33 34

Quelques concepts de Quelques concepts de


paradigme … paradigme …
• Exemple 1 : Supposons que l’on a deux clients indépendants qui • Exemple 2 : Comme le cas précédent, sauf que S ne connaît pas tous les
interagissent avec le même serveur. clients
• N’importe quel client peut envoyer un message à S à n’importe quel
moment, sans que S connaisse l’existence du client

35 36

Quelques concepts de État et modularité


paradigme …
• L’indépendance : l’état • Avantage principal d’avoir un état : Rendre le programme modulaire
▫ Deux formes : ▫ Un programme est modulaire si on peut changer une partie du programme
Variable affectable que l’on retrouve dans la majorité des langages sans devoir changer le reste.
(comme C, C++, Java, C# ou Python) …
Canal de communication comme dans le langage Erlang. • L’inconvénient principal est qu’un programme peut se planter facilement
▫ L’état d’une partie du programme peut devenir erroné
▫ Le canal de communication permet la concurrence par envoi de ▫ C’est extrêmement difficile à tracer et à corriger
messages (systèmes distribués par exemple) et les variables permettent
la concurrence par mémoire partagée. • Deux solutions
▫ Concentrer l’état dans une partie du programme seulement et programmer le
▫ Le principal défaut de l’état c’est que l’état d’une partie du programme reste sans état (une machine à état)
peut devenir erroné et cela est difficile à détecter et corriger : par ▫ Garder d’anciens états et utiliser un comportement transactionnel
exemple, le crash pour Access Violation ou SIGSEGV en C++.

9
29/04/2024

37 38

Quelques concepts de Polymorphsime


paradigme … Exemple

• Abstraction: Manière d’organiser l’utilisation des données selon des règles. De


fait, il y a 3 types : l’encapsulation, le polymorphisme et l’héritage.

• Encapsulation :
• définir la visibilité et l’accessibilité des propriétés et méthodes d’une classe
pour mieux en maîtriser leur utilisation
• Polymorphisme :
• une entité est alors dite polymorphe si elle peut prendre différentes formes
• Une opération est de fait polymorphe si elle peut prendre des arguments
différents.

• Héritage :
• créer de nouvelles abstractions en se basant sur d’autres abstractions
• sans réécrire le code commun
• éviter le code dupliqué qui est une source de risques

39 40

L’héritage et les classes L’héritage versus la


composition
• Il peut être intéressant de définir des abstractions sans répéter les parties
communes
▫ Parties communes = code dupliqué
▫ Si une partie est changée, toutes les parties doivent être changées
Source d’erreurs!
L’héritage est une manière de définir des abstractions de façon
incrémentale
Une définition A peut “hériter” d’une autre définition B
La définition A prend B comme base, avec éventuellement des
modifications et des extensions
La définition incrémentale A est appelée une classe
Attention: le résultat est une abstraction de données complète

10
29/04/2024

41 42

Surcharge en POO Redéfinition en POO


• Appelée « overloading », consiste à déclarer, dans une même classe, • Appelée « overriding », consiste à définir le comportement
deux méthodes de même nom mais avec des sémantiques différentes : d’une méthode selon le type de l’objet qui l’invoque, i.e., elle
▫ Même nom de méthode, consiste à donner une nouvelle implémentation à une méthode
▫ Paramètres différents (soit sur le nombre ou le/les type(s)), héritée sans changer sa signature :
▫ Le type de retour n’est pas pris en compte.
▫ Le même nom de méthode
▫ Même type de retour
▫ Même paramètre (nombre et type)

43 44

COMMENT
Catégories des Paradigmes QUOI Catégories des Paradigmes
? ?

Programmation Programmation
impérative déclarative

Programmation Programmation Programmation Programmation


structurée procédurale fonctionnelle logique

Programmation
modulaire
Programmation
descriptive

11
29/04/2024

45 46

Programmation impérative Programmation impérative

• Définit les programmes comme un ensemble d’instructions :


▫ Ecrites les unes à la suite des autres dans l’ordre de leur exécution.
▫ Agissent sur un ensemble de données (état du programme).
• Principales instructions :
▫ Déclaration de variables
▫ Assignation (affectation, Ex: a=5),
▫ Branchement conditionnel (if..then..else),
▫ Branchement sans condition (goto, appels de procédures),
▫ Boucles (for, while, etc.).
▫ Entrées / sorties
• Ces instructions sont traduites (grâce aux compilateurs/interpréteurs) en
instructions de plus bas niveau (langage machine spécifique au
processeur).

47 48

Programmation impérative Programmation procédurale

• Les instructions sont ordonnées ; il est toujours possible de connaître la


prochaine instruction ainsi que la manière avec laquelle elle doit être • Etend l’approche impérative à la possibilité de subdiviser des
réalisée. algorithmes en plusieurs parties (procédures, sous-programmes,
• Paradigme de base sur lequel sont construits les autres modèles. routines, fonctions) plus facilement maîtrisables.
• Exemple :
• L’objectif : faciliter la compréhension du code de
programmation et d’éviter les répétitions de code inutiles.

• On déclare différentes variables auxquelles on attribue des valeurs.


• + fonctions / modules --> Paradigme de programmation procédurale
ou un langage procédural.

12
29/04/2024

49 50

Programmation structurée Programmation modulaire

• Forme simplifiée de programmation impérative. • Style de programmation adapté aux exigences de projets logiciels plus
volumineux et plus complets.
• Recommande une organisation hiérarchique simple du code.
• Le code source est ici subdivisé de manière ciblée en blocs logiques
indépendants les uns des autres pour plus de clarté et pour faciliter
• Exemple :
le processus de débogage (dépannage).
▫ Utilisation de boucles et structures de contrôle au lieu
d’instructions de saut absolu (instructions entraînant le traitement,
non pas avec l’ordre suivant, mais à un autre endroit). • Les différents blocs, encore appelés modules, peuvent être testés
séparément avant d’être liés au sein d’une application commune.

51 52

Programmation procédurale Programmation procédurale

13
29/04/2024

53 54

Programmation impérative
Programmation impérative

• Visibilité : Ensemble de règles


qui fixent qui peut utiliser la
variable.
▫ Public
▫ Private
▫ Protected
▫ Package

55 56

Programmation impérative Programmation impérative

14
29/04/2024

57 58

Programmation impérative Programmation impérative

• Avec Python
▫ Le langage Python est un langage multi-paradigme, qui autorise naturellement
la programmation impérative.

• Exemple : Calculer la moyenne du tableau tab = [1, 2, 3, 4, 5] avec code python.


• En paradigme séquentiel, les instructions sont exécutées ligne par ligne.

Python Explication
tab = [1, 2, 3, 4, 5] On définit le tableau
somme = 0 On initialise la somme des éléments de tab à 0
for elt in tab: On parcourt le tableau tab et on affecte à elt les éléments de tab
somme = somme + elt On ajoute elt à la somme précédente
On affecte à la variable moyenne le quotient de la
moyenne = somme/len(tab)
variable somme et de la taille du tableau tab
print(moyenne) On affiche la moyenne

59 60

Programmation impérative
• Avec Python
• Exemple : Calculer la moyenne du tableau tab = [1, 2, 3, 4, 5] avec code python.
• En programmation procédurale, cela peut donner le code suivant :

Python Explication
tab = [1, 2, 3, 4, 5] On définit le tableau
def somme(tab): On définit la fonction somme qui prend en paramètre tab un
resultat = 0 tableau de nombres et retourne la somme de ses éléments.
for elt in tab:
resultat = resultat + elt
return resultat
def moyenne(tab): On définit la fonction moyenne qui prend en paramètre tab un
n = len(tab) tableau de nombres et retourne la moyenne de ses éléments
return somme(tab)/n
print(moyenne(tab)) On affiche la moyenne

• Code plus long que le précédent.


• Fonctions somme(tab) et moyenne(tab) seront directement réutilisables sans nécessité
de les coder à nouveau car elle ont été définies.

15
29/04/2024

61 62

Programmation impérative Programmation impérative


Effets de bord

• L’avantage principal de la programmation impérative est que le code est très • Les modifications qu’une fonction peut effectuer sur l’état du système
lisible, ce qui en facilite l’apprentissage. sont appelées effets de bord.
• Ce paradigme produit toutefois vite des programmes volumineux, les codes
peuvent ainsi perdre en clarté. De plus, en cas de modification ou de mise à • Effet de bord une fonction modifie l'état d'une variable globale.
jour du code, la programmation impérative peut induire un bon nombre de
bugs puisque il faut relire le code dans son entier et effectuer de nombreuses
retouches.
• Risque de se retrouver avec des variables qui auront des valeurs qui
• L’inconvénient immédiat de la programmation impérative et la multiplication n'étaient pas prévues par le programmeur.
des variables.

• On doit souvent se questionner sur l’état d’une variable durant le déroulement • L'état futur des variables est difficilement prévisible à un instant donné.
des instructions. Eviter autant que possible l'utilisation du "global".
• Les fonctions ont-elles connaissance de cet état ? Est-ce une variable globale ?

63 64

COMMENT
Catégories des Paradigmes QUOI Programmation déclarative
? ?

Programmation Programmation
impérative déclarative • En programmation déclarative, on décrit le QOUI, c'est-à-dire le problème.
• En programmation impérative (Ex: C ou Java), on décrit le COMMENT,
c'e-à-d la solution.

Programmation Programmation Programmation Programmation • Exemple :


structurée procédurale fonctionnelle logique ▫ Pages HTML sont déclaratives car elles décrivent ce que contient une page (texte,
titres, paragraphes, etc.) et non comment les afficher (positionnement, couleurs,
polices de caractères, etc.).

Programmation • Plusieurs formes de programmation déclarative :


modulaire ▫ Programmation descriptive, à l'expressivité réduite, qui permet de décrire des
Programmation
descriptive structures de données (Ex: HTML, XML),
▫ Programmation fonctionnelle, qui perçoit les applications comme
un ensemble de fonctions mathématiques (Ex: LISP, Caml, Haskell),
▫ Programmation logique, pour laquelle les composants d'une application sont des
relations logiques (Ex: Prolog, Mercury).

16
29/04/2024

65 66

Programmation déclarative Programmation fonctionnelle

• Remonte aux années 1930, dans le cadre de la recherche mathématique


• Se focalise sur l’« objectif » à atteindre, et non du « déroulement » des étapes fondamentale par Alonzo Church sur lambda calculus.
de résolution. ▫ Parmi les principes : « tout est fonction »
• Le programmeur ne s’occupe pas de la manière d’obtenir le résultat; par contre, le ▫ Fonctions sont des données comme les autres.
programmeur doit faire la description du problème à résoudre en décrivant les ▫ Peuvent être par exemple passées en paramètre à d’autres fonctions.
objets concernés, leurs propriétés et les relations qu’ils vérifient.
• Cette description constitue la base de connaissances. • Appelé également programmation prédictive, s’inspire des fonctions
• Ensuite, le mécanisme de résolution intégré au langage, général et universel, mathématiques.
parcourt de façon non déterministe toutes les possibilités du problème et calcule
les solutions. • D’autres principes découlent également de la thèse de Church :
• En Prolog, la résolution s’appuie sur une déduction logique de toutes les ▫ Les fonctions sont des fonctions au sens mathématique du terme : elles se
conséquences de la base de connaissance via l’unification. contentent de renvoyer une valeur en fonction de leurs arguments ;
▫ Il n’y a pas de notion « d’état », ni à l’extérieur des fonctions, ni dans les
• Le code est plus difficile à comprendre en raison de son haut niveau fonctions. Un programme n’est donc qu’une composition de fonctions.
d’abstraction, mais est également plus court et plus précis

67 68

Programmation fonctionnelle Programmation fonctionnelle

• Le paradigme fonctionnel consiste à décomposer les programmes


réalisés en un ensemble de fonctions. • Le paradigme fonctionnel a d’abord été implanté au sein de langages
dédiés, plus ou moins « purement fonctionnel ».
• Fonctions qui ne modifient pas l’état courant des variables.
• Parmi les langages dits fonctionnels, on distingue deux grandes
• En programmation fonctionnelle, l’ordre d’exécution du code n’a familles de langages :
aucune importance. ▫ les langages fortement typés, ex : ML, CAML (Categorical Abstract
Machine Language) , Haskell
• Cherche à éviter au maximum les effets de bord --> Eviter de modifier
les valeurs associées à des variables. ▫ les langages non typés, ex : Lisp, Scheme:

• L’entité centrale est la fonction, au sens mathématique du terme, donc


définie par une expression donnée telle que :

17
29/04/2024

69 70

Programmation fonctionnelle Programmation fonctionnelle

• Elle utilisée en particulier dans le développement des programmes ou


codes suivants :
▫ Applications techniques et mathématiques
▫ Intelligence Artificielle (IA)
▫ Compilateurs et Parseurs
▫ Algorithmes

• Concepts sous-jacent :
▫ Pureté
▫ Fonction de première classe/ d’ordre supérieur
▫ Notion de fermeture
▫ Lambda-expressions
▫ Evaluation paresseuse

• Avantages :
▫ Stabilité, déterminisme, testabilité, cloisonnement, fluidité
d’utilisation, compositionalité, généralisation, extensibilité, etc.

71 72

Programmation fonctionnelle Programmation fonctionnelle


Fonctions pures et impures Fonctions pures et impures

• Exemples : Lesquels des fonctions suivantes est pures?


• Fonctions pures
▫ Produisent des sorties qui dépendent uniquement des paramètres passés à la
fonction et pas des valeurs externes à la fonction elle-même.
▫ Ne modifient rien ; elles ne font que renvoyer des valeurs en fonction de leurs
paramètres.

• Fonctions impures
▫ Fonctions qui ne respectent pas ce principe.

18
29/04/2024

73 74

Programmation fonctionnelle Programmation fonctionnelle


Fonction de première classe Fonction de première classe

• Être de première classe, c’est donc avoir le même statut qu’une valeur • Fonction map
telle qu’un entier ou un caractère, c’est-à-dire :
▫ Permet d’appliquer une fonction à tous les éléments d’un itérable (ex:
▫ Pouvoir être nommé, affecté (et typé) : x = sin tableau, liste, etc.)

▫ Pouvoir être défini et créé à la demande : x= lambda x: x+1 map(func, tab) prend ainsi en paramètres une fonction func et un
tableau tab (ou un objet itérable) ; cette fonction retourne
▫ Pouvoir être passé en argument à une fonction : map(lambda x: x*x, [1, 3, 4 ] ) un itérateur dont les éléments sont les images des éléments de tab par
la fonction func.
▫ Pouvoir être le résultat d’une fonction : (f( 3 ) ) ( 5 )

▫ Pouvoir être stocké dans une structure de données quelconque :


array=[ log, exp, tan ]

75 76

Programmation fonctionnelle Programmation fonctionnelle


Fonction de première classe Fonction de première classe

• Fonction map • Fonction map


▫ Exemples : ▫ Exemples :
def carre(n) : Exemple 1 :
return n * n const numbers = [1, 2, 3, 4];
l1 = [1, 2, 3, 4] const doubled = numbers.map(item => item * 2);
res = map(carre, l1) console.log(doubled); // [2, 4, 6, 8]
print(type(res)) Exemple 2 :
l2 = list(res) const numbers = [4, 9, 16, 25];
print(l2) const newArr = numbers.map(Math.sqrt)
console.log(newArr); // [2,3,4,5]
Exemple 3 :
let jeux = ['go', 'de'];
[1, 4, 9, 16] let prix = [99, 15];
let t = jeux.map((j, i) => ({ nom: j, prix: prix[i]})); // [{ nom: 'go', prix: 99 }, {
nom: 'de', prix: 15 }]

19
29/04/2024

77 78

Programmation fonctionnelle Programmation fonctionnelle


Fonction de première classe Fonction de première classe

• Fonction filter • Fonction Filter


▫ Permet de filtrer les éléments d’un tableau. ▫ Exemples :
Exemple 2 :
filter(func, tab) prend ainsi en paramètres une fonction func qui def est_pair(n) : const mots = ["singe", "également", "faire",
retourne True ou False et un tableau tab (ou un objet itérable) ; cette return n % 2 == 0 "certainement"];
fonction retourne un itérateur dont les éléments de tab ont True pour l1 = [1,3, 4, 6, 7, 9, 10] const longMots = mots.filter(mot => mot.length > 6);
image par la fonction func. console.log("Les mots les plus longs : "+ longMots);
res = filter(est_pair, l1)
// Les mots les plus longs : également,certainement
l2 = list(res)

[4, 6, 10]

79 80

Programmation fonctionnelle Programmation fonctionnelle


Fonction de première classe Fonction de première classe
• Fonction Reduce • Fonction Reduce
▫ La fonction reduce permet de calculer une valeur à partir d’une fonction
et de tous les éléments d’un tableau. ▫ Exemples :

reduce(func, tab), du module functools, prend ainsi en paramètres Exemple 1 :


une fonction func à deux paramètres et un tableau tab (ou un objet const total = [0, 1, 2, 3];
itérable) ; cette fonction retourne une valeur.
const res = total.reduce((sum,value) => { return sum + value;});
console.log(res); // 6
• Principe
▫ Au premier appel, les deux premiers éléments de tab sont les Exemple 2 :
arguments de func. let t = [0, 1, 2, 3];
▫ Le résultat et le troisième élément de tab sont ensuite les arguments let somme = t.reduce((a, b) => a + b);
de func, et ainsi de suite. console.log("Somme=" + somme); //Somme=6
▫ Ainsi, après le parcours de tous les éléments de tab, la valeur finale
est retournée. Exemple 3 :
let pets = ['cat', 'dog', 'fish'];
let nb = pets.map(s => s.length).reduce((a, b) => a + b);
console.log('nb = ' + nb); //nb = 10

20
29/04/2024

81 82

Programmation fonctionnelle Programmation fonctionnelle


Fonction de première classe Lambda fonctions
• Opérateur lambda : pour définir des fonctions que l’on peut stocker dans des variables
ou passer en paramètre : il s’agit de
• Avantages : • Les lambda fonctions, ou fonctions anonymes, permettent de définir des fonctions sans
▫ Eviter les effets de bord --> une fonction renvoie toujours le même résultat pour le mot-clé def et pour lesquelles le mot-clé return est implicite. Ces fonctions utilisent
une entrée donnée, indépendamment de l’état du système – ce qui permet de le mot-clé lambda.
mettre le résultat en cache et simplifie le débogage ;
• Syntaxe générale :
▫ Rendre facile la parallélisation du code. Avec les fonctions Map, Reduce et
Filter, le résultat sera le même quel que soit l’ordre de la liste en entrée. lambda param1, ... , paramN: valeur_retournée
Au lieu de def ma_fonction(param1, ... , paramN):
Traiter de grands volumes de données et bien allouer la mémoire
... return valeur_retournée

• Inconvénients : • Exemple : Deux manières d’écrire la fonction carre qui prend en paramètre un
▫ Avec fonctions d’ordre supérieur, il fallait à chaque fois commencer par définir la nombre a et retourne son carré.
fonction qu’on souhaitait utiliser, ce qui rend l’écriture un peu lourde.
▫ Dans le paradigme fonctionnel, il existe un opérateur pour définir des fonctions
que l’on peut stocker dans des variables ou passer en paramètre : il s’agit de Fonction classique Lambda fonction
l’opérateur lambda. carre = lambda a : a*a
def carre(a):
la lambda fonction est référencée par la
return a*a
variable carre.

83 84

Programmation fonctionnelle Programmation fonctionnelle


Notion de fermeture
• Évaluation paresseuse :
▫ Ne calculer une valeur que lorsque celle-ci est nécessaire.
• Pour être pure et/ou de première classe, une fonction doit parfois être
transformée en fermeture (closure), i.e. l’association du code de la
fonction avec un environnement de définitions.

def f(i, j):


def h(k):
return i + j + k
return h

• La fonction f retourne une fonction h qui prend un argument mais


dépend des 2 arguments passés à f.

21
29/04/2024

85 86

Programmation fonctionnelle
Avantages Programmation logique

• La programmation fonctionnelle évite les états


▫ Coder des fonctions qui ne modifient pas l’état courant de l’objet.
• Un paradigme de programmation déclaratif
▫ Fonction pure qui ne dépend QUE de ses arguments. Peu importe les
arguments, les résultats des fonctions pures seront toujours les mêmes. ▫ Repose essentiellement sur la logique des prédicats (ou
▫ --> Eviter les effets de bords de son programme. logique du premier ordre).

• La programmation fonctionnelle sépare les données et la logique • Exemples de langages :


▫ Séparation entre la donnée et les fonctions de traitement de cette donnée.
▫ Prolog
• La programmation fonctionnelle pratique l’invariabilité ▫ Mercury
▫ Fonctions pures
▫ C’est ce caractère prédictible et déterministe qui garantit la fiabilité du
programme

87 88

Programmation logique Programmation logique


Prolog Prolog
• Créé en 1972 par A. Colmerauer et P. Roussel.
• Le nom Prolog vient de Programmation Logique. • Résoudre des problèmes impliquant
• Utilisé dans le domaine de l'intelligence artificielle (IA), des systèmes ▫ Un Domaine : Ensemble d’objets
experts (SE), mais aussi dans le traitement automatique des langages ▫ Des connaissances : Relations entre objets
naturelles (TALN).
• Dans Prolog, un programme = base de faits + règles,
• Programmer en Prolog : Spécifier le QOUI pas le comment. Exécuté en posant une question dans l'interpréteur.

• Langage descriptif (faits et relations) et prescriptif (inférence), céad: • Pour utiliser Prolog :
▫ il suffit de décrire ce que l'on sait sur le domaine étudié = Base de
▫ Installer swi-prolog sur votre marchine
connaissances en IA
Fonctionne sous Linux, Windows et MacOS.
▫ puis on pose une question à propos de ce domaine
Disponible gratuitement (licence BSD) au département informatique de
▫ et Prolog va nous répondre, sans que l’on ait à lui dire comment construire l'Université de Psychologie d'Amsterdam http://www.swi-
sa réponse ! prolog.org/download/stable
▫ Utiliser l'interpréteur en ligne swish

22
29/04/2024

89 90

Programmation logique Programmation logique


Prolog

• Base de connaissances : description du problème à résoudre. • Exercice : Base de connaissances

• Une base de connaissance est composée de Clauses : • Choisissez un domaine particulier et déterminez sa base de
▫ Les Faits connaissances.
▫ Les Règles
• Travail en groupe.
• L’utilisateur pose ensuite une Question

• Le programme donne sa Réponse

91 92

Programmation logique Programmation logique


Prolog Prolog

• Base de connaissances : Collection de Faits • Spécifier des faits


▫ Enoncés incontestablement vrais à propos du domaine d’étude.

• Définir des règles


▫ Permettant d’établir de nouveaux faits.
• Poser des questions
▫ Répondues par l’interpréteur Prolog.
• Prolog repose sur la logique du premier ordre

23
29/04/2024

93 94

Programmation logique Prolog


Logique de premier ordre Les données

• Ensemble de symboles (variables). • Constantes ou Atomes


▫ Symbole: Chaine de caractères (commencent par une minuscule ou
• Ensemble de relations. entre apostrophes)
▫ Nombres : Entiers ou flottants

• Des connecteurs logiques.


• Variables : une lettre ou un nom (commencent par une majuscule ou
par _ )
• Des quantificateurs « Pour Tout » et « Il existe au moins un ». ▫ Exprimer une propriété concernant une catégorie d’objets
▫ Interroger Prolog à l’aide d’une question

95 96

Prolog Prolog
Les données Les données

• Sont utilisées dans les règles afin de les généraliser : • Propriété qui lie un certain nombre d’objets
▫ Ex: La possession lie le propriétaire et l’objet possédé

• Utilité des relations :


▫ Lien entre objets
▫ Propriété d’un objet

• Peuvent aussi être utilisées dans les faits : • Plusieurs possibilités pour établir la même relation :

▫ Attentions aux ambigüités !

24
29/04/2024

97 98

Prolog Prolog
Les faits Les faits

• Généralement, on place toutes les déclarations de faits au début du


• Les faits sont des données élémentaires que l’on considère vraies. programme même si ce n’est pas obligatoire.
• Ce sont des formules atomiques constituées d'un prédicat suivi ou pas • Un fait se termine toujours par un point « . »
d’une liste ordonnée d’arguments mis entre parenthèses qui sont les
• Forme : nomprédicat(arg1,arg2, …, argn).
objets auxquels s'appliquent le prédicat.
• Les parenthèses et arguments sont optionnels.
• Un programme Prolog est au moins constitué d’un ou plusieurs faits car
c’est à partir d’eux que Prolog va pouvoir rechercher des preuves pour • Exemples :
répondre aux requêtes de l’utilisateur. ▫ univers.
▫ astre(terre).
• Ce sont en quelque sorte les hypothèses de travail. ▫ étoile(soleil).
▫ satellite(terre, soleil).
▫ satellite(lune, terre).
▫ capitale('France', ‘Paris').

99 100

Prolog Prolog
Prédicats Arité d’un prédicat

• En Prolog, une relation possède : • Nombre d’arguments du prédicat = arité


▫ un nom ▫ Unaire --> propriété de l’argument
▫ un nombre d’arguments Ex: homme(socrate).
▫ Arité zéro --> signification logique très restreinte
• Exemples : Ex: p() proposition vraie
▫ Henri IV est le père de Louis XIII se traduit par : ▫ Binaire :
pere(henri4,louis13). pere(jean, paul)
▫ Marie de Médicis est la mère de Henri IV se traduit par : pere(paul, martin)
mere(marie-de-medicis,henri4).
mere(marie, paul)
▫ 0! = 1 se traduit par : factorielle(0,1).
mere(marie, luc)

25
29/04/2024

101 102

Prolog Prolog
Formule Prolog Règles Prolog

• Enoncent la dépendance d’un prédicat par rapport à • Un programme Prolog contient presque toujours des règles, cependant
d’autres prédicats. ce n’est pas une obligation.

• Si les faits sont les hypothèses de travail, les règles sont des relations qui
• Concernent des catégories d’objets / faits permettent à partir de ces hypothèses d’établir de nouveaux faits par
▫ Fait : homme(socrate). déduction (si on a démontré F1 et F1⇒F2 alors on a démontré F2).
▫ Règle : si X est un homme alors X est mortel qui s'écrit:
mortel(X) :- homme(X). • Cette règle est appelée en logique le Modus Ponens
▫ Le « si » s’écrit « :- » en Prolog et correspond à l’implication ⇒
homme(X) ⇒ mortel(X).

103 104

Prolog Prolog
Règles Prolog Règles Prolog

• Il peut y avoir plusieurs conditions derrière le « :- », séparées par des


virgules ou des points-virgules.
▫ La virgule correspond à un ET logique (conjonction)
▫ Le point-virgule correspond à un OU logique (disjonction)
▫ Exemple : La relation telle que si on est le père du père ou de la mère de
quelqu’un alors on est son grand-père se traduit par :

26
29/04/2024

105 106

Prolog Prolog
Question Prolog Exercice

• Question: est-ce que socrate est mortel? • Exprimer en Prolog les propositions suivantes, identifier les objets,
▫ La question s’exprime avec « ?- » en Prolog les faits, les règles
▫ la chèvre est un animal herbivore
▫ le loup est un animal cruel
• En Prolog la question est un but. ▫ toute chose cruelle est carnivore
▫ un animal carnivore mange de la viande et un animal herbivore mange
• Le canard est un oiseau. Les oiseaux volent. Est-ce que le de l’herbe
canard vole? ▫ un animal carnivore mange des animaux herbivores
▫ les carnivores et les herbivores boivent de l’eau
▫ un animal consomme ce qu’il boit ou ce qu’il mange
▫ Question : y a-t-il un animal cruel et que consomme-t-il ?

107 108

Prolog Prolog
Exercice Question Prolog

• Question : y a-t-il un animal cruel et que mange-t-il?


• Attention : la modélisation dépend des raisonnements que nous
voulons mener !

27

Vous aimerez peut-être aussi