Paradigmes de programmation
Se connecter pour s'inscrireVotre progression
Syllabus
-
-
Objectifs
-
Validations de compétences
-
Public cible
Aucun public cible spécifié pour ce module.
-
Besoins techniques
-
Prérequis
- Aucun prérequis
-
Niveau
-
Historique du module
Aucune action enregistrée
Informations générales
-
Public cible
- Étudiants en informatique (niveau débutant à intermédiaire).
- Développeurs souhaitant élargir leurs connaissances.
- Professionnels en reconversion dans le domaine de la programmation.
-
Prérequis
- Notions de base en informatique (savoir utiliser un ordinateur).
- Connaissance élémentaire d'au moins un langage de programmation est un plus, mais pas obligatoire.
-
Durée estimée
- ~ 12 à 15 heures.
-
Objectifs pédagogiques
- Comprendre ce qu'est un paradigme de programmation.
- Explorer les principaux paradigmes et leur évolution historique.
- Maîtriser les concepts clés de chaque paradigme.
- Appliquer les paradigmes à des exemples concrets pour résoudre des problèmes.
Modules
-
Introduction à la programmation et aux paradigmes
-
Histoire et évolution de la programmation
-
Origines de la programmation
- Premières machines programmables et leurs limitations.
- Emergence des premiers langages (ex. : Fortran, Lisp).
-
Evolution vers des langages modernes
- Passage des langages de bas niveau aux langages de haut niveau.
- Impact des avancées matérielles et des besoins logiciels.
-
-
Importance des paradigmes
-
Pourquoi les paradigmes existent-ils ?
- Réponse à des problématiques spécifiques.
- Optimisation de la maintenabilité, réutilisabilité et lisibilité du code.
-
Impact des paradigmes sur les pratiques de développement.
- Introduction
-
-
Compréhension des langages de programmation
-
Définition
Outil pour transmettre des instructions à une machine.
-
Catégorisation des langages de programmation
Les langages de programmation peuvent être classifiés selon plusieurs critères, en fonction de leurs caractéristiques, leur mode d'exécution, ou leur paradigme principal.
Voici les principales catégories :
-
Par paradigme
- Impératifs :Reposent sur des séquences d'instructions qui modifient l'état du programme (ex. : C, Python).
- Déclaratifs :Spécifient ce que le programme doit faire, sans indiquer comment (ex. : SQL, HTML).
- Fonctionnels : Basés sur l'évaluation de fonctions pures (ex. : Haskell, Lisp).
- Orientés objet : Organisation autour des objets, encapsulant données et comportements (ex. : Java, C#).
- Logiques : Résolution de problèmes via des règles et faits (ex. : Prolog).
- Événementiels : Axés sur la gestion des événements utilisateur ou système (ex. : JavaScript, Visual Basic).
-
Par méthode d'exécution
-
Compilés
- Convertis en code machine avant leur exécution pour une performance optimale (ex. : C, C++).
- Nécessitent un compilateur.
-
Interprétés
- Exécutés directement par un interpréteur sans compilation préalable (ex. : Python, Ruby).
-
Hybrides
- Combinaison des deux approches (ex. : Java, avec son bytecode interprété par la JVM).
-
-
Par niveau d'abstraction
-
Langages de très bas niveau
- Langages directement manipulables par le matériel, écrits en langage machine (binaire) compréhensible uniquement par le processeur.
- Exemple : Code binaire natif exécuté directement par le CPU.
-
Langages de bas niveau
- Offrent une légère abstraction au-dessus du langage machine, mais nécessitent toujours une bonne connaissance de l'architecture matérielle. Ils permettent un contrôle précis du matériel.
- Exemple :Assembleur (x86, ARM).
-
Langages de haut niveau
- Fournissent une abstraction importante par rapport au matériel, permettant aux développeurs de se concentrer sur la logique du programme. Ces langages sont souvent portables entre différentes architectures.
- Exemples : C, Java, Python.
-
Langages de très haut niveau
- Conçus pour des tâches ou des domaines spécifiques, avec une syntaxe encore plus abstraite, souvent orientée vers une utilisation simplifiée.
- Exemples : MATLAB (calcul scientifique), SQL (bases de données), Scratch (éducation).
-
-
Par domaine d'application
-
Généralistes
Adaptés à différents domaines (ex. : Python, Java).
-
Spécifiques
Conçus pour des tâches précises (ex. : R pour la statistique, Verilog pour la conception matérielle).
-
-
Par type de typage
-
Typage statique
Les types de données sont vérifiés au moment de la compilation (ex. : C, Java).
-
Typage dynamique
Les types de données sont déterminés au moment de l'exécution (ex. : Python, JavaScript).
-
-
Par gestion de la mémoire
-
Manuelle
Le programmeur gère explicitement l'allocation et la libération de mémoire (ex. : C).
-
Automatique (Garbage Collection)
La gestion de la mémoire est prise en charge par l'environnement d'exécution (ex. : Java, Python).
-
-
Par support des paradigmes multiples
-
Monoparadigme
Conçus pour un seul paradigme (ex. : Haskell pour le fonctionnel).
-
Multiparadigme
Prise en charge de plusieurs paradigmes (ex. : Python, JavaScript).
-
-
Par génération de langage
-
Première génération
Langage machine, utilisé directement par les processeurs.
-
Deuxième génération
Assembleur, traduction des instructions machine en mnémotechniques.
-
Troisième génération
Langages procéduraux, proches du langage humain (ex. : C, Fortran).
-
Quatrième génération
Langages de haut niveau pour des domaines spécifiques (ex. : SQL).
-
Cinquième génération
Basés sur la logique ou les contraintes (ex. : Prolog).
-
Ces critères de catégorisation permettent de comprendre comment et pourquoi certains langages sont adaptés à des contextes spécifiques. Ce cadre aide également à choisir le langage le mieux adapté pour un projet ou une problématique donnée.
-
-
Rôle des langages dans la construction de logiciels modernes
- Introduction
-
-
-
Aperçu des paradigmes et leur évolution
-
Aperçu des principaux paradigmes
-
Présentation des styles de programmation
-
Impératif
- 1940-1950 : Fondement des premiers langages de programmation, comme Assembly et Fortran.
- Approche basée sur des instructions séquentielles pour contrôler le flux du programme.
-
Déclaratif
- 1950-1960 : Introduite avec des langages comme Lisp (fonctionnelle) et des concepts liés aux bases de données (non procédural).
- Spécification des résultats attendus.
- Décrit ce que faire sans spécifier comment faire.
-
Procédural
- 1950-1960 : Basée sur l'impératif, elle structure le code en routines ou sous-programmes.
- Utilisation de sous-programmes.
- Langages : Fortran, ALGOL.
-
Fonctionnel
- 1958 : Apparue avec Lisp, fondée sur les travaux théoriques des lambda-calculs par Alonzo Church (1930-1940).
- Se concentre sur l'utilisation de fonctions pures et l'immutabilité.
- Approche déclarative avec fonctions pures.
-
Logique
- 1972 : Popularisée avec Prolog. Basée sur la formalisation mathématique des règles logiques.
- Résolution de problèmes via des règles et faits.
-
Structuré
- 1960-1970 : Popularisée par des travaux comme ceux d’Edsger Dijkstra. Introduit des structures de contrôle (boucles, conditionnelles).
- Langages : ALGOL 60, Pascal, C.
- Organisation logique et hiérarchisée du code.
-
Programmation modulaire
- Années 1970 : Introduit pour améliorer la maintenabilité et l'organisation des logiciels.
- Concepts influencés par David Parnas (1972). Langages : Modula, Pascal.
-
Orienté objet (POO)
- 1967 : Introduite avec Simula 67. Gagne en popularité dans les années 1980 avec Smalltalk, puis C++ et Java.
- Programmation basée sur des objets.
-
Événementiel
- Années 1980 : Émerge avec les interfaces graphiques et les besoins de programmation réactive.
- Langages : Visual Basic, JavaScript (1995).
- Réactions aux événements utilisateur.
-
Programmation concurrente
- 1960-1980 : Introduite avec les besoins de gestion des processus parallèles dans des systèmes multiprocesseurs.
- Langages influents : Erlang, Java (avec ses bibliothèques de threads).
-
Programmation orientée aspect
- Années 1990 : Développée pour gérer les préoccupations transversales (journalisation, sécurité).
- Langages : AspectJ.
-
Programmation orientée composants
- Années 1990-2000 : Popularisée avec des frameworks comme COM, CORBA, et .NET.
-
Programmation réactive
- Années 2000 : Apparue pour répondre aux besoins des interfaces utilisateur modernes et des systèmes réactifs.
- Langages influents : ReactiveX, Scala (via Akka).
-
-
Points de vigilance
- Certains paradigmes (ex. : déclaratif, logique, fonctionnel) apparaissent tôt mais connaissent un développement et une popularité à des moments différents.
- Des chevauchements existent : par exemple, la programmation structurée et procédurale coexistent dans les années 1960-1970.
-
-
Histoire et évolution des paradigmes
- Chronologie et innovations clés (voir détail dans chaque paradigme).
- Fusion et émergence des paradigmes hybrides dans les langages modernes.
-
-
Concepts détaillés des paradigmes
-
Programmation Impérative
Qu'est-ce que c'est ? : La programmation impérative se concentre sur la manière d'accomplir une tâche en spécifiant de manière détaillée les étapes à suivre pour y parvenir. Les programmes impératifs sont composés d'une séquence d'instructions qui modifient l'état du programme.
Caractéristiques :
- Utilisation de variables mutables
- boucles
- instructions conditionnelles
- effets de bord (modification de l'état du programme ou de l'environnement)
Exemple : Les langages de programmation tels que :
- C/C++
- Java
- Python
-
Programmation Procédurale
Qu'est-ce que c'est ? : La programmation procédurale est un sous-ensemble de la programmation impérative qui se concentre sur la structuration du code en utilisant des procédures (ou fonctions) pour diviser le programme en unités réutilisables.
Caractéristiques :
- Utilisation de procédures
- de fonctions
- et de bibliothèques
Exemple : Les langages tels que C, Pascal et Fortran sont souvent utilisés pour la programmation procédurale, où le code est organisé en procédures ou fonctions.
-
Paradigme structuré
- Code organisé en blocs logiques (boucles, conditions).
- Langages : Pascal, Python.
- Exercice : Écrire un programme de tri.
-
Programmation modulaire
Années 1970 : Met l'accent sur l'organisation en modules pour une meilleure maintenabilité (Modula, Pascal, C).
Programmation Fonctionnelle
Qu'est-ce que c'est ? : La programmation fonctionnelle se base sur le concept de fonctions mathématiques pures. Les programmes fonctionnels sont composés de fonctions qui prennnent des arguments et renvoient des résultats sans avoir d'effets de bord.
Caractéristiques :
- Utilisation de fonctions immuables
- fonctions de première classe
- fonctions d'ordre supérieur
- et évitement des effets de bord
Exemple : Les langages comme Haskell, Lisp et certaines fonctionnalités de langages comme Python (lorsqu'ils sont utilisés de manière fonctionnelle) et JavaScript (avec ES6) adoptent des aspects de la programmation fonctionnelle.
-
Paradigme orienté objet
- Encapsulation, héritage, polymorphisme.
- Langages : Java, Python, C++.
- Exercice : Créer une classe pour gérer une bibliothèque.
-
Paradigme logique
- Résolution de problèmes via règles et faits.
- Langages : Prolog.
- Exercice : Résoudre un puzzle logique.
-
Paradigme événementiel
- Programmation basée sur des événements externes.
- Langages : JavaScript.
- Exercice : Créer une application réactive.
-
Programmation logique
Années 1970 avec Prolog, axée sur les règles logiques pour résoudre des problèmes.
-
Programmation événementielle
Années 1980 : Émerge avec les interfaces utilisateur graphiques, notamment via Visual Basic et JavaScript (1995).
-
-
Comparaison des Paradigmes de Programmation
Modification de l'état
- Impératif : Modifie l'état en utilisant des variables mutables.
- Déclaratif : Ne modifie généralement pas l'état, se concentre sur la description.
- Procédural : Modifie l'état de manière impérative, mais organise le code en procédures.
- Fonctionnel : Évite la modification de l'état, utilise des fonctions pures.
Structure du code
- Impératif : Les programmes sont structurés autour de séquences d'instructions.
- Déclaratif : Les programmes décrivent les relations et les objectifs.
- Procédural : Les programmes sont structurés en utilisant des procédures ou fonctions.
- Fonctionnel : Les programmes sont basés sur la composition de fonctions.
Itération
- Impératif : Utilise des boucles explicites pour l'itération.
- Déclaratif : Utilise des structures de haut niveau pour l'itération (par exemple, SQL).
- Procédural : Utilise des boucles, généralement dans le contexte de procédures.
- Fonctionnel : Utilise la récursivité ou des fonctions de transformation pour l'itération.
Effets de bord
- Impératif : Souvent associé à des effets de bord.
- Déclaratif : Peut avoir des effets de bord, mais ils sont généralement gérés de manière transparente.
- Procédural : Peut avoir des effets de bord, mais les procédures définissent clairement le contexte.
- Fonctionnel : Évite les effets de bord.
Tableau comparatif
Paradigme Caractéristiques principales Exemples de langages Impératif - Spécifie des étapes détaillées pour accomplir une tâche
- Utilise des variables mutables, boucles et effets de bordC, C++, Java, Python (lorsqu'il est utilisé de manière impérative) Déclaratif - Se concentre sur la description de ce que vous voulez obtenir plutôt que sur la manière de l'obtenir
- Définit des relations, des contraintes et des objectifsSQL, HTML, CSS, LaTeX Procédural - Sous-ensemble de la programmation impérative qui organise le code en utilisant des procédures (ou fonctions) C, Pascal, Fortran Fonctionnel - Basé sur des fonctions mathématiques pures
- Utilise des fonctions immuables, de première classe, des fonctions d'ordre supérieur et évite les effets de bordHaskell, Lisp, Python (avec des aspects fonctionnels), JavaScript (avec ES6)
Exercices, examens et projets
Comparaison de paradigmes
Réécrire un même problème selon plusieurs paradigmes.
Obligatoire ConsulterExamen paradigmes
Évaluer impératif, orienté objet, fonctionnel et déclaratif.
Obligatoire ConsulterProjet paradigmes
Choisir un paradigme et justifier les Trade-offs.
Livrables :
- Code
- Analyse