Principes & paradigmes
Eric Lecolinet - Télécom Paris – Institut Polytechnique de Paris
http://www.telecom-paris.fr/~elc
2024
Dans ce cours
Organisation du cours
§ principaux paradigmes et principes des langages informatiques
§ orienté objet illustré en C++ (et comparaison Java)
§ autres concepts et compléments
§ programmation événementielle et interfaces graphiques Java Swing
Liens
§ http://www.telecom-paristech.fr/~elc/
§ http://www.telecom-paristech.fr/~elc/inf224/ - lien vers page eCampus
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 2
Paradigmes
Paradigme
§ approche, philosophie
§ la plupart des langages actuels
sont multi-paradigmes
Ali Mili et al. 2004
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 3
Paradigmes
Principaux paradigmes
§ Impératif
§ exécution pas à pas des instructions
§ Fortran, C, Pascal ...
§ Fonctionnel
§ évaluation de formules, lambda-calcul
§ Lisp, Scheme, Caml, Haskell ...
§ Orienté objet
§ modélise des interactions entre des entités
§ Smalltalk, C++, Python, Java, C#, Swift ...
§ Logique
§ recherche via des règles (Prolog)
§ démonstration automatique
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 4
Paradigmes
§ Déclaratif
§ décrire le "quoi" plutôt que le "comment"
§ Evénementiel
§ gérer les réponses à des événements
§ typique des interfaces graphiques, du Web ...
§ Concurrent
§ langages orientés concurrence pour gestion multi-tâches (Go, Erlang ...)
§ partiellement intégré dans langages courants (thread, mutex, future ...)
§ Langages spécialisés
§ pour le Web (PHP, Perl, JavaScript, TypeScript ...)
§ langages de scripts (bash, zsh ...)
§ langages de simulation (circuits)
§ langages réactifs/synchrones (embarqué), etc.
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 5
Paradigme impératif
Principe
§ un programme est :
§ une suite d'instructions
§ à l’intérieur de structures
de contrôle emboîtées
§ exécution pas à pas des instructions
Structures de contrôle de l'exécution :
§ if-then-else, etc.
§ boucles for, while, etc.
§ appels de fonctions
§ exceptions, etc.
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 6
Paradigme impératif
Principe
§ un programme est :
§ une suite d'instructions
§ à l’intérieur de structures
de contrôle emboîtées
§ exécution pas à pas des instructions
La gestion des données incombe au programmeur
§ qui doit :
§ déclarer les variables (et leur type)
§ decider de leur durée de vie (on y reviendra)
§ décider des effets de bord (affectations = ce que les variables contiennent)
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 7
Origines du paradigme impératif
Machine de Turing
§ modèle abstrait permettant des calculs arbitraires
Machine de von Neumann
§ architecture matérielle d'un ordinateur (1945)
§ instructions numérotées :
§ arithmétiques
§ de transfert de données
§ de rupture de séquence (goto) wikipedia
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 8
Exemple : programme d’addition
Pré-conditions
§ B et C sont des variables contenant des entiers positifs
§ on ne sait faire que +1 et -1
Post-conditions
§ A vaut B + C
§ C vaut 0 et B inchangée
organigramme
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 9
Pré-conditions et post-conditions
Pré-conditions
§ conditions qui doivent être vérifiées avant le traitement
Post-conditions
§ conditions qui doivent être garanties après le traitement
Invariants
§ conditions toujours vraies
Il faut :
§ les expliciter (documentation)
§ si possible les vérifier dans les fonctions
§ au moins en phase de développement
§ pour détecter les erreurs
organigramme
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 10
Programmation structurée
Théorème de Boehm et Jacopini (en substance)
§ toute fonction calculable peut être calculée en combinant des sous-programmes
via trois structures de contrôle :
§ séquencement
§ tests (if-then)
§ itérations (boucles)
Programmation structurée
§ dérivée de Boehm et Jacopini
§ tout programme peut s'écrire en n'utilisant que while et if-then (donc sans goto)
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 11
Programmation structurée
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 12
Paradigme fonctionnel
Origine
§ dérivé de la théorie du λ-calcul (Church, années 30)
§ langage Lisp (J. McCarthy, années 50)
Principe
§ repose sur l'évaluation de fonctions
§ pas d'effets de bord (en fonctionnel "pur")
§ repose largement sur la récursivité (pas de boucles !)
Factorielle en Lisp et en C
(notation préfixe en Lisp, infixe en C)
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 13
Lisp
Programme = donnée
§ fonctions de "première classe"
(peuvent être un argument)
§ une fonction est une donnée
(c'est une liste)
Lambda = fonction anonyme
§ notée (λx .x + 1)
dans la théorie du λ-calcul
§ cette notion :
§ a été reprise dans les langages courants (C++, Java, Python ...)
§ où elle est liée à la capture de variables
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 14
Lisp
Tout s'exprime sous forme de listes
§ Listes chaînées composées de doublets
§ (cons x y) crée un doublet
§ (car d) renvoie la composante gauche
§ (cdr d) renvoie la composante droite
§ nil ou () est la liste vide
§ (null x) est vrai si x est vide
§ Un programme est une liste !
Gestion mémoire automatique
§ le programmeur n'a pas à gérér la mémoire !
§ ramasse-miettes (garbage collector)
§ idée reprise dans Java, Python, etc.
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 15
Lisp
Reflexivité
§ Lisp est écrit en Lisp (en théorie)
§ Lisp est réflexif
Reflexion : deux notions
§ 1) Introspection : un programme peut examiner son état (ou ses classes)
§ notion la plus courante
§ métaclasses de Java, C#, Python, JavaScript ...
§ ex : class Class de Java
§ 2) Code auto-modifiant : un programme peut modifier son comportement
§ Lisp peut redéfinir print() ou eval() en cours d'exécution
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 16
Paradigme fonctionnel
Lisp a été source d'inspiration
§ de langages fonctionnels plus récents (Scheme, Caml, Erlang, F# ...)
§ dans le monde académique mais aussi l'industrie (Erlang = Ericson language)
§ des langages courants :
§ C++, Java, C#, Python, etc.
§ récursivité, ramasse-miette, lambdas, réflexion, etc.
Avantages / inconvénients du fonctionnel
§ plus robuste, plus facile à vérifier et à maintenir
§ du fait de l'absence d'états / d'effets de bord
§ généralement moins performant que l'impératif
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 17
Paradigme logique
Programmation logique
§ issue de la démonstration automatique
§ repose sur :
§ une base de faits
§ une base de règles logiques
§ un moteur d'inférence
§ forme de programmation déclarative
Prolog
§ Colmerauer, années 1970, Marseille
§ basé sur les clauses de Horn
Clause Prolog :
signifie :
(clause de Horn)
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 18
Prolog
atomes terme composé
Faits : variables
Règles :
Buts (queries) :
tester chercher
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 19
Prolog
Méthode de résolution SLDNF
(Selection, Linear, Definite, Negation as failure)
§ Unification
g( f(X, Y), Z, 2, U) et g( f(1, 3), Y, T, V)
§ trouver les valeurs pour que
deux termes soient identiques => X = 1, Y = Z = 3, T = 2, U = V
§ Résolution d'un but p(a,b) avec une clause p(x,y) :- q1(...), ..., qn(...).
§ unifier p(a,b) avec p(x,y)
§ si succès, résoudre q1(...), etc. but : parent(X, camille)
dans l'environnement résultant
§ et ainsi de suite, récursivement
§ Négation par l'échec
§ ce qui n'est pas vrai est faux
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 20
Prolog
En pratique
§ la combinatoire sous-jacente peut rendre le temps excessif
§ => opérateur de cut qui détruit une branche de recherche
§ l'ordre des clauses compte !
§ peut vite devenir assez complexe ...
Utilisation, évolutions
§ utilisé principalement en IA et traitement linguistique
§ diverses extensions (équations, arbres infinis, contraintes, etc.)
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 21
Paradigme déclaratif
Principe
§ on décrit le "quoi" plutôt que le "comment"
§ paradigme "transversal" (combiné avec d'autres)
Exemples
§ programmation logique ou par contraintes
§ ex Prolog : base de faits et de règles
§ programmation fonctionnelle pure (sans boucles ni affectations)
§ ex Lisp : évaluation de fonctions / formules
§ langages descriptifs
§ ex HTML : décrit une page Web (pas comment la construire)
§ contre-exemple : programme Javascript / DOM qui crée une page Web
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 22
Paradigme objet
Historique
§ origine : Smalltalk, programmation structurée
§ fort développement dans les années 80
§ devient dominant dans les années 90
§ ex : C++, Eiffel, Java, C#, Python, Swift ...
Principe
§ modélise des interactions entre des entités
appelées objets
§ les objets sont des instances des classes
— exception : langages de prototypes :
§ pas de classes mais des objets
qui servent de modèles
§ ex : Javascript (initialement)
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 23
Paradigme objet
Point de vue
§ modèle "social" d'interaction entre acteurs
STP envoie moi
le rapport
Alice (manager)
§ ne fait pas le rapport (ce n'est pas son rôle)
§ ne "farfouille" pas dans les affaires de Bob !
Bob (ingé thermique)
§ est responsable du rapport thermique (c'est sa spécialité)
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 24
Paradigme objet
L'orienté objet c'est pareil !
bob.performReport()
L'objet Alice
§ ne fait pas le rapport => envoie un message
§ ne "farfouille" pas => les données de Bob sont privées
L'objet Bob
§ est responsable du rapport => décide des actions à exécuter
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 25
Paradigme objet
L'orienté objet c'est pareil !
bob.performReport()
principes de l'OO
L'objet Alice qu'on verra plus loin
§ ne fait pas le rapport => envoie un message appel de méthode
§ ne "farfouille" pas => les données de Bob sont privées attributs
encapsulation
droits d'accès
L'objet Bob
encapsulation
§ est responsable => décide des actions à exécuter abstraction
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 26
Paradigme objet
Polymorphisme d'héritage
bob.performReport()
mallory.performReport()
Même message, effet différent !
§ Bob = expert thermique
=> fait le rapport thermique
§ Mallory = expert électricité
=> fait le rapport électrique
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 27
Paradigme objet
Polymorphisme d'héritage classe Employé
classe Ingénieur
performReport()
classe IngeThermique classe IngeElectrique
performReport() performReport()
Polymorphisme: même message, effet différent
§ Bob = instance de IngeThermique => performReport() fait le rapport thermique
§ Mallory = instance de IngeElectrique => performReport() fait le rapport électrique
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 28
Compléments, outils
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 29
Types
Type
§ Définit ce qu'une variable peut faire
Typage dynamique
§ type déterminé à l'exécution
§ il peut changer Python affiche toto
Typage statique
int i = 1; Java, C++
§ type déterminé à la compilation
i = "toto"; ne compile pas !
§ il peut ne peut pas changer
Inférence de type
a = 1: Python
§ type déterminé automatiquement
auto i = 1; C++
§ dynamiquement (Python) ou statiquement (C++, Java) var i = 1; Java
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 30
Typage dynamique vs. statique
Avantages / inconvénients
§ typage dynamique : plus pratique, facilite l'écriture
§ typage statique : moins d'erreurs à l'exécution, moins de déboguage
=> c'est à la fois un des principaux avantages et inconvénients de Python !
Python
ne détecte pas d'erreur et pourtant ...
OK
Erreur à l'exécution !
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 31
Polymorphisme
Polymorphisme = plusieurs formes
§ même interface pour différents types
Polymorphisme d'héritage
§ la même méthode a un effet différent suivant la sous-classe (cf. prédédemment)
=> abstraction, spécialisation
§ souvent appelé "polymorphisme" (sans préciser "d'héritage")
Polymorphisme paramétré
§ les types sont des paramètres d'autres types
§ ex : Generics de Java, Templates de C++
var table = new ArrayList<String>(); Generics Java
auto table = new vector<string>(); Templates C++
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 32
Interprétation vs compilation
Code interprété
§ décodé et exécuté au fil de l'eau
=> pratique (résultat visible immédiatement)
=> performance —
interpréteur Python
§ Python (en apparence)
Code compilé
§ traduit en un éxécutable par un compilateur
§ éxécutable = code machine
§ propre à un type de machine
=> non portable
=> performance +++
§ C, C++
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 33
Interprétation vs compilation
Bytecode
§ Approche mixte :
§ 1) le programme est compilé en bytecode
§ 2) le bytecode est interprété par une machine virtuelle
=> portable
=> performance +
§ Java + JVM (Java Virtual Machine)
§ Python (en réalité)
Compilation JIT (juste-à-temps)
§ une partie du bytecode est compilé en code machine pendant l'exécution
=> performance ++
§ Java, JavaScript
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 34
Compilation séparée
myprog.cpp Car.cpp Truck.cpp
#include "Car.h" #include "Car.h" #include "Truck.h"
#include "Truck.h"
void Car::start() { void Truck::start(){
int main() { .... ....
.... } }
Compilation
myprog.o Car.o Truck.o Bibliothèques
binaires de
Editions de liens fonctions compilées
exécutable
§ les fichiers sources sont compilés indépendamment
§ l'éditeur de liens (linker) :
§ resout les symboles des fichiers générés
§ les lie aux bibliothèques
§ génère un exécutable
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 35
Librairies statiques et dynamiques
myprog.cpp Car.cpp Truck.cpp
#include "Car.h" #include "Car.h" #include "Truck.h"
#include "Truck.h"
void Car::start() { void Truck::start(){
int main() { .... ....
.... } }
Compilation
myprog.o Car.o Truck.o Bibliothèques
binaires de
Editions de liens fonctions compilées
exécutable
§ Bibliothèques statiques
§ leur code binaire est inclus dans l'exécutable
§ Bibliothèques dynamiques
§ les liens sont faits à l'exécution
§ avantage : programmes (beaucoup) moins gros et plus performants
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 36
Performance
Critères
§ 1. temps d'exécution
§ 2. consommation énergétique
§ 3. occupation mémoire
§ 4. (éventuellement) temps de compilation
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 37
Performance
Ranking Programming
Languages
by Energy Efficiency
Rui Pereiraa et al.
in Science of Computer
Programming, Elsevier
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 38
Performance
Conséquences
§ ne pas négliger l'impact énergétique (et le CO2 induit !)
§ utiliser / combiner au mieux les langages
§ ex : du Python qui appelle des routines C/C++
§ optimiser l'exécutable
§ cf. mode "Debug" vs. "Release"
§ optimiser le code source
o jamais "au juger" => inefficace et source de bugs
o utiliser des outils de profilage
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 39
Optimiser l'exécutable
Mode développement (Debug) § les options dépendent
des compilateurs
§ exécutable non optimisé
§ les modes des IDEs
§ options de compilation (g++) : affectent ces options
§ -g : pour utiliser un débogueur
Mode déploiement (Release)
§ exécutable optimisé
§ options :
§ -O2 : optimisé en vitesse
void foo(int i) {
§ -O4 / -Ofast : super-optimisé (parfois faux!) assert(i > 0);
§ -Os / -Oz : optimisé en taille
#ifdef XYZ
.....
Notes #endif
§ -DXYZ : pour tests / messages de mise au point }
§ -DNDEBUG : ignore assert()
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 40
Optimiser le code
Profileurs
§ affichent le temps passé dans chaque fonction : indispensables pour optimiser !
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 41
Deboguage
Debogueurs
§ exécution pas à pas
§ points d'arrêt
§ contexte en cas
de plantage
Notes
§ compiler avec option –g (ou équivalent)
§ exécutable plus gros !
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 42
Deboguage
Analyseurs statiques
§ détectent des erreurs formelles de programmation ou de conception
Eric Lecolinet - Télécom ParisTech - Programmation orientée objet et autres concepts illustrés en C++11 43
Popularité
Sept
2024
https://www.tiobe.com/tiobe-index/ 44