É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.
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
(lorsqu'ils sont utilisés de manière impérative).
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
pour organiser le code et le rendre modulaire.
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 bord
C, 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 objectifs
SQL, 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 bord
Haskell, Lisp, Python (avec des aspects fonctionnels), JavaScript (avec ES6)
Publié le 25/09/2026
🍪 Gestion des Cookies
Nous utilisons des cookies pour améliorer votre expérience. Certains sont essentiels au fonctionnement du site, d'autres nous aident à analyser l'utilisation et à personnaliser le contenu.