Vous êtes sur la page 1sur 50

Paradigmes de Langages

de Programmation
Prof. Sahnoun Zaidi

1 24/12/21
Définition de Langages de
Programmation
• Un paradigme de programmation est un
style fondamental de programmation
informatique qui traite de la manière dont
les solutions aux problèmes doivent être
formulées dans un langage de
programmation (à comparer à la
méthodologie, qui est une manière de
résoudre des problèmes spécifiques de
2
génie logiciel). 24/12/21
Utilisation1
• Un paradigme de programmation fournit
(et détermine) la vue qu’a le développeur
de l’exécution de son programme.

• Par exemple, en programmation orientée


objet, les développeurs peuvent considérer
le programme comme une collection
d’objets en interaction
3 24/12/21
Utilisation2
• En programmation fonctionnelle
un programme peut être vu
comme une suite d'évaluations
de fonctions sans états.

4 24/12/21
Utilisation3
• Lors de la programmation d’ordinateurs
ou de systèmes multi-processeurs, la
programmation orientée processus
permet aux développeurs de voir les
applications comme des ensembles de
processus agissant sur des structures
de données localement partagées.
5 24/12/21
• De la même manière que des
courants différents du génie
logiciel préconisent des
«méthodologies » différentes, des
langages de programmation
différents plaident pour des
«paradigmes de programmation »
différents.
6 24/12/21
• Certains langages sont conçus pour
supporter un paradigme en particulier
(Smalltalk et Java supportent la
programmation orientée objet)
• Tandis que Haskell supporte la
programmation fonctionnelle
• Alors que d’autres supportent des
paradigmes multiples (à l’image de C++,
Common Lisp, OCaml, Oz, Python, ou
Scheme).
7 24/12/21
• De nombreux paradigmes de
programmation sont aussi célèbres pour les
techniques qu’ils prohibent que pour celles
qu’ils permettent.
• La programmation fonctionnelle pure, par
exemple, interdit l’usage d’effets de bord ;
• la programmation structurée interdit
l’usage du goto

8 24/12/21
• En partie pour cette raison, les
nouveaux paradigmes sont souvent
considérés comme doctrinaires ou
abusivement rigides par les
développeurs habitués aux styles
déjà existants.

9 24/12/21
• Cependant, le fait d’éviter certaines
techniques peut permettre de
rendre plus aisé la démonstration de
théorèmes sur la correction d’un
programme
• — ou simplement la compréhension
de son fonctionnement —
• sans limiter la généralité du langage
de programmation
10 24/12/21
• De plus, il est possible d'écrire un
programme en adoptant la
programmation orientée objet
même si le langage, par exemple le
langage C, ne supporte pas ce
paradigme.

11 24/12/21
• La relation entre les paradigmes de
programmation et les langages de
programmation peut être complexe,
car un langage de programmation
peut supporter des paradigmes
multiples.

12 24/12/21
• Pour citer un exemple, C++ est conçu pour
supporter des éléments de programmation
procédurale, de programmation orientée objet
et de programmation générique. Cependant,
concepteurs et développeurs décident de la
méthode d’élaboration d’un programme en
utilisant ces éléments de paradigmes.
• Il est possible d’écrire un programme purement
procédural en C++, comme il est possible d’en
écrire un programme purement orienté objet,
ou encore qui relève des deux paradigmes.
13 24/12/21
Quelques paradigmes courants

14 24/12/21
Programmation impérative
• C'est le paradigme originel et le plus
ancien. L'implémentation de la quasi-
totalité des processeurs qui équipent
les ordinateurs est de nature impérative
• ils sont faits pour exécuter du code écrit
sous forme d'opcodes (pour operation
codes), qui sont des instructions
élémentaires exécutables par le
15processeur 24/12/21
• L'ensemble des opcodes forme le langage
machine spécifique au processeur et à son
architecture.
• L'état du programme à un instant donné est
défini par le contenu de la mémoire centrale à
cet instant,
• et le programme lui-même est écrit en style
impératif en langage machine, ou le plus
souvent dans une traduction lisible par les
humains du langage machine, dénommée
assembleur.

16 24/12/21
• Les langages de plus haut niveau utilisent
des variables et des opérations plus
complexes, mais suivent le même
paradigme. Les recettes de cuisine et les
vérifications de processus industriel sont
deux exemples de concepts familiers qui
s'apparentent à de la programmation
impérative ;
• de ce point de vue, chaque étape est une
instruction, et le monde physique constitue
l'état modifiable.
17 24/12/21
• Puisque les idées basiques de la
programmation impérative sont à la
fois conceptuellement familières et
directement intégrées dans
l'architecture des microprocesseurs,
la grande majorité des langages de
programmation sont impératifs

18 24/12/21
Instructions impératives
principales
• La plupart des langages de haut niveau
comportent quatre types d'instructions
principales
• l'assignation ;
• le branchement conditionnel ;
• le branchement sans condition ;
• le bouclage.
19 24/12/21
• Les instruction d'assignation , en général,
effectuent une opération sur l'information
en mémoire et y enregistrent le résultat
pour un usage ultérieur. Les langages de
haut niveau permettent de plus l'évaluation
d'expressions complexes, qui peuvent
consister en une combinaison d'opérations
arithmétiques et d'évaluations de fonctions,
et l'assignation du résultat en mémoire

20 24/12/21
• Les branchements conditionnels
permettent à un bloc d'instructions de
n'être exécuté que si une condition
prédéterminée est réalisée. Dans le
cas contraire, les instructions sont
ignorées et la séquence d'exécution
continue à partir de l'instruction qui
suit immédiatement la fin du bloc.

21 24/12/21
• Les branchements sans condition
permettent à la séquence
d'exécution d'être transférée à un
autre endroit du programme.
• Cela inclut le saut, appelé « goto »
dans de nombreux langages, et les
sous-programmes, ou appels de
procédures.

22 24/12/21
• Les instructions de bouclage servent
à répéter une suite d'instructions un
nombre prédéfini de fois, ou jusqu'à
ce qu'une certaine condition soit
réalisée. Les instructions de bouclage
peuvent être vues comme des sauts
conditionnels, c'est-à-dire la
combinaison d'un branchement
conditionnel et d'un saut.
23 24/12/21
Programmation procédurale
• La programmation procédurale est un
paradigme de programmation basé sur le
concept d'appel procédural. Une procédure,
aussi appelée routine, sous-routine ou fonction
(à ne pas confondre avec les fonctions de la
programmation fonctionnelle reposant sur des
fonctions mathématiques) contient
simplement une série d'étapes à réaliser.

24 24/12/21
• N'importe quelle procédure peut être appelée à
n'importe quelle étape de l'exécution du
programme, incluant d'autres procédures voire
la procédure elle-même (récursivité).
La programmation procédurale est souvent un
meilleur choix qu'une simple programmation
séquentielle ou programmation non-structurée.

25 24/12/21
• La possibilité de réutiliser le même code à
différents emplacements dans le programme
sans avoir à le retaper ;
• Une façon plus simple de suivre l'évolution du
programme. La programmation procédurale
permet de se passer d'instructions telles que
"GOTO" et "JUMP" évitant ainsi bien souvent de
se retrouver avec un programme compliqué qui
part dans toutes les directions (appelé souvent «
programmation spaghetti ») ;
• La création d'un code plus modulaire et
structuré.
26 24/12/21
• Les langages de programmation
procédurale facilitent la tâche du
programmeur en permettant de
privilégier une approche
procédurale. Le plus vieil exemple de
ce type de langage est l'ALGOL.

27 24/12/21
Procédures et modularité
• La modularité est généralement une
caractéristique souhaitable pour un
programme informatique. C'est
particulièrement le cas pour les
programmes complexes et/ou
importants en taille, que l'on peut ainsi
découper en modules indépendants les
uns des autres.
28 24/12/21
• Dans ce cadre, on parle d‘«arguments »
pour les entrées et de « valeurs de retour
» pour les sorties.
La portée des variables est l'un des
mécanismes qui permet la modularité des
procédures. Elle empêche une procédure
d'accéder aux variables locales d'une autre
procédure, évitant ainsi les collisions de
noms.

29 24/12/21
• Il est possible, pour une procédure
donnée, de définir une interface
simple (et idéalement permanente).
Les procédures constituent donc un
moyen efficace de développement
de code par plusieurs personnes, ou
plusieurs groupes de personnes,
notamment via des bibliothèques.

30 24/12/21
Programmation structurée
• La programmation structurée constitue un
sous-ensemble de la programmation
impérative. C'est un paradigme important de la
programmation, apparu vers 1970. Elle dérive
de travaux de Niklaus Wirth pour son Algol W et
reçut son coup d'envoi avec l'article fondateur
de Dijkstra dans Communications of the ACM
nommé GO TO statement considered harmful.

31 24/12/21
• Elle est en effet célèbre pour son
essai de suppression de l'instruction
goto ou du moins pour la limitation
de son usage à des cas inhabituels
et graves (que l'on nommerait
aujourd'hui (2008) des exceptions).

32 24/12/21
• La programmation structurée est possible dans
n'importe quel langage de programmation
procédural, mais certains, comme le FORTRAN
IV, s'y prêtaient très mal. Vers 1970, la
programmation structurée devint une technique
populaire, et les langages de programmation
procéduraux intégrèrent à l'image d'Algol et en
le dépassant des mécanismes rendant aisée la
programmation structurée.

33 24/12/21
• Parmi les langages de programmation les
plus structurants, on trouve PL/I, Pascal et,
plus tardivement pour les projets de très
grande taille, Ada.
Pour l'écriture de fragments assez courts, la
programmation structurée recommande
une organisation hiérarchique simple du
code. On peut le faire dans la plupart des
langages de programmation modernes par
l'utilisation de structures de contrôles
while, repeat, for, if .. then .. else.
34 24/12/21
• Cette technique, bien qu'un peu
contraignante (c'est-à-dire qu'il
serait parfois utile d'avoir un
traitement différent selon la façon
dont on est sorti d'une boucle sans
avoir à effectuer de test ultérieur),
facilite ensuite considérablement le
débogage ultérieur.

35 24/12/21
• Les programmeurs décomposent
leur code en modules (appelés
fonctions et procédures dans
certains langages) ne dépassant
guère 60 lignes, afin d'être
présente en entier sous les yeux

36 24/12/21
• On recommande aux programmes d'éviter l'usage
des variables globales afin de prévenir les effets de
bord (side effects) : les sous-programmes utilisent
donc des variables locales et agir sur des arguments
fournis explicitement en paramètre, par valeur (leur
contenu) ou par référence (l'adresse de ce
contenu). Ces techniques aident à créer des petits
morceaux de code, faciles à comprendre isolément
et sans nécessité d'avoir à en connaître le contexte.

37 24/12/21
Programmation orientée objet
• La programmation orientée objet (POO) ou
programmation par objet, est un paradigme de
programmation informatique qui consiste en la
définition et l'assemblage de briques logicielles
appelées objets ; un objet représente un
concept, une idée ou toute entité du monde
physique, comme une voiture, une personne
ou encore une page d'un livre.

38 24/12/21
• Le langage Simula-67 jette les prémisses
de la programmation objet, résultat des
travaux sur la mise au point de langages
de simulation informatique dans les
années 1960 dont s'inspira aussi la
recherche sur l’intelligence artificielle
dans les années 1970-80.

39 24/12/21
• Mais c'est réellement par et avec
Smalltalk 72 puis Smalltalk 80, inspiré
en partie par Simula, que la
programmation par objets débute et
que sont posés les concepts de base
de celle-ci : objet, messages,
encapsulation, polymorphisme,
héritage (sous-typage ou sous-
classification), redéfinition, etc.
40 24/12/21
• Smalltalk est plus qu'un langage à objets, il est
aussi un environnement graphique interactif
complet.
À partir des années 1980, commence
l'effervescence des langages à objets :
Objective C (début des années 1980), C++ (C
with classes) en 1983, Eiffel en 1984, Common
Lisp Object System dans les années 1980, etc.

41 24/12/21
• Les années 1990 voient l'âge d'or de
l'extension de la programmation par
objet dans les différents secteurs du
développement logiciel.
Quelques langages à objets : Ada,
Java, C#, Objective C, Eiffel, Python,
C++, PHP, Smalltalk...

42 24/12/21
Programmation fonctionnelle
• La programmation fonctionnelle est un paradigme de
programmation qui considère le calcul en tant
qu'évaluation de fonctions mathématiques et rejette
le changement d'état et la mutation des données.
• Elle souligne l'application des fonctions,
contrairement au modèle de programmation
impérative qui met en avant les changements d'état.

43 24/12/21
• Un langage fonctionnel est donc un langage de
programmation dont la syntaxe et les
caractéristiques encouragent la
programmation fonctionnelle.
• Alors que l'origine de la programmation
fonctionnelle peut être trouvée dans le
lambda-calcul, le langage fonctionnel le plus
ancien est Lisp, créé en 1958 par McCarthy.

44 24/12/21
• Lisp a donné naissance à des variantes telles
que Scheme (1975) et Common Lisp (1984),
qui comme Lisp ne sont pas ou peu typés.
• Des langages fonctionnels plus récents tels ML
(1973), Haskell (1987), OCaml, Erlang, Clean et
Oz ou CDuce (2003) sont fortement typés.
• La programmation fonctionnelle s'affranchit
de façon radicale des effets secondaires en
interdisant toute opération d'affectation.

45 24/12/21
• Le paradigme fonctionnel n'utilise pas de
machine d'états pour décrire un programme,
mais un emboîtement de fonctions que l'on peut
voir comme des « boîtes noires » que l'on peut
imbriquer les unes dans les autres.
• Chaque boîte possédant plusieurs paramètres
en entrée mais une seule sortie, elle ne peut
sortir qu'une seule valeur possible pour chaque
n-uplet de valeurs présentées en entrée.
• Ainsi, les fonctions n'introduisent pas d'effets de
bord.
46 24/12/21
• Un programme est donc une application, au
sens mathématique, qui ne donne qu'un seul
résultat pour chaque ensemble de valeurs en
entrée.
• Cette façon de penser, qui est très différente
de la pensée habituelle en programmation
impérative est l'une des causes principales de
la difficulté qu'ont les programmeurs formés
aux langages impératifs pour aborder la
programmation fonctionnelle.

47 24/12/21
• Cependant, elle ne pose généralement pas de
difficultés particulières aux débutants qui
n'ont jamais été exposés à des langages
impératifs.

• Un avantage important des fonctions sans


effet de bord est la facilité que l'on a à les
tester unitairement.

48 24/12/21
Programmation concurrente
• La programmation concurrente est un style de
programmation tenant compte, dans un programme,
de l'existence de plusieurs piles sémantiques.
• Ces piles peuvent être appelées threads, processus
ou tâches.
• Elles sont matérialisées en machine par une pile
d'exécution et un ensemble de données privées.
• Les threads disposent d'une zone de mémoire
partagée alors que les processus sont strictement
isolés.

49 24/12/21
• La concurrence est indispensable
lorsque l'on souhaite écrire des
programmes interagissant avec le
monde réel (qui est concurrent) ou
tirant parti de multiples unités
centrales (couplées, comme dans un
système multiprocesseurs, ou
distribuées, éventuellement en grille
ou en grappe).
50 24/12/21

Vous aimerez peut-être aussi