Paradigme de programmation
Les paradigmes de programmation sont un moyen de classer les langages de programmation en fonction de leurs fonctionnalités. Les langues peuvent être classées en plusieurs paradigmes.
Certains paradigmes s’intéressent principalement aux implications pour le modèle d’exécution du langage, comme autoriser les effets secondaires ou si la séquence des opérations est définie par le modèle d’exécution. D’autres paradigmes concernent principalement la manière dont le code est organisé, comme le regroupement d’un code en unités avec l’état modifié par le code. D’autres encore s’intéressent principalement au style de syntaxe et de grammaire.
Les paradigmes de programmation courants incluent : [1] [2] [3]
- impératif dans lequel le programmeur indique à la machine comment changer son état,
- procédural qui regroupe les instructions en procédures,
- orienté objet qui regroupe les instructions avec la partie de l’état sur laquelle elles opèrent,
- déclaratif dans lequel le programmeur déclare simplement les propriétés du résultat souhaité, mais pas comment le calculer
- fonctionnelle dans laquelle le résultat souhaité est déclaré comme la valeur d’une série d’applications de fonctions,
- logique dans laquelle le résultat souhaité est déclaré comme la réponse à une question sur un système de faits et de règles,
- Mathématique dans laquelle le résultat souhaité est déclaré comme étant la solution d’un problème d’optimisation
- réactif dans lequel le résultat souhaité est déclaré avec des flux de données et la propagation du changement
Les techniques symboliques telles que la réflexion , qui permettent au programme de se référer à lui-même, pourraient également être considérées comme un paradigme de programmation. Cependant, cela est compatible avec les grands paradigmes et n’est donc pas un vrai paradigme à part entière.
Par exemple, les langages qui tombent dans le paradigme impératif ont deux caractéristiques principales : ils indiquent l’ordre dans lequel les opérations se produisent, avec des constructions qui contrôlent explicitement cet ordre, et ils permettent des effets secondaires, dans lesquels l’état peut être modifié à un moment donné, dans une unité de code, puis lu plus tard à un moment différent dans une unité de code différente. La communication entre les unités de code n’est pas explicite. Pendant ce temps, dans la programmation orientée objet, le code est organisé en objets qui contiennent un état qui n’est modifié que par le code faisant partie de l’objet. La plupart des langages orientés objet sont également des langages impératifs. En revanche, les langages qui correspondent au paradigme déclaratifn’indiquez pas l’ordre dans lequel exécuter les opérations. Au lieu de cela, ils fournissent un certain nombre d’opérations disponibles dans le système, ainsi que les conditions dans lesquelles chacune est autorisée à s’exécuter. [4] L’implémentation du modèle d’exécution du langage suit quelles opérations sont libres d’exécuter et choisit l’ordre indépendamment. Plus d’informations sur Comparaison des langages de programmation multi-paradigmes .
Aperçu
Tour d’horizon des différents paradigmes de programmation selon Peter Van Roy [5] : 5 [6]
Tout comme le génie logiciel (en tant que processus) est défini par des méthodologies différentes , les langages de programmation (en tant que modèles de calcul) sont définis par des paradigmes différents . Certains langages sont conçus pour prendre en charge un paradigme ( Smalltalk prend en charge la programmation orientée objet, Haskell prend en charge la programmation fonctionnelle), tandis que d’autres langages de programmation prennent en charge plusieurs paradigmes (tels que Object Pascal , C++ , Java , JavaScript , C# , Scala , Visual Basic , Common Lisp , Schéma, Perl , PHP , Python , Ruby , Oz et F# ). Par exemple, les programmes écrits en C++, Object Pascal ou PHP peuvent être purement procéduraux , purement orientés objet , ou peuvent contenir des éléments des deux ou d’autres paradigmes. Les concepteurs de logiciels et les programmeurs décident comment utiliser ces éléments de paradigme.
Dans la programmation orientée objet, les programmes sont traités comme un ensemble d’objets en interaction. Dans la programmation fonctionnelle , les programmes sont traités comme une séquence d’évaluations de fonctions sans état. Lors de la programmation d’ordinateurs ou de systèmes avec de nombreux processeurs, dans la programmation orientée processus , les programmes sont traités comme des ensembles de processus concurrents qui agissent sur une structure de données partagée logique .
De nombreux paradigmes de programmation sont aussi bien connus pour les techniques qu’ils interdisent que pour celles qu’ils permettent . Par exemple, la programmation fonctionnelle pure interdit l’utilisation des effets secondaires , tandis que la programmation structurée interdit l’utilisation de l’ instruction goto . En partie pour cette raison, les nouveaux paradigmes sont souvent considérés comme doctrinaires ou trop rigides par ceux qui sont habitués aux styles antérieurs. [7] Pourtant, éviter certaines techniques peut faciliter la compréhension du comportement du programme et prouver les théorèmes sur l’exactitude du programme.
Les paradigmes de programmation peuvent également être comparés aux modèles de programmation , ce qui permet d’invoquer un modèle d’exécution en utilisant uniquement une API. Les modèles de programmation peuvent également être classés en paradigmes basés sur les caractéristiques du modèle d’exécution.
Pour le calcul parallèle , l’utilisation d’un modèle de programmation au lieu d’un langage est courante. La raison en est que les détails du matériel parallèle fuient dans les abstractions utilisées pour programmer le matériel. Cela oblige le programmeur à mapper des modèles dans l’algorithme sur des modèles dans le modèle d’exécution (qui ont été insérés en raison d’une fuite de matériel dans l’abstraction). Par conséquent, aucun langage de programmation parallèle ne correspond bien à tous les problèmes de calcul. Ainsi, il est plus pratique d’utiliser un langage séquentiel de base et d’insérer des appels API vers des modèles d’exécution parallèles via un modèle de programmation. De tels modèles de programmation parallèle peuvent être classés selon des abstractions qui reflètent le matériel, telles que la mémoire partagée , la mémoire distribuée avecpassage de messages , notions de lieu visibles dans le code, etc. Ceux-ci peuvent être considérés comme des types de paradigme de programmation qui s’appliquent uniquement aux langages parallèles et aux modèles de programmation.
Critique
Certains chercheurs en langage de programmation critiquent la notion de paradigmes comme une classification des langages de programmation, par exemple Harper, [8] et Krishnamurthi. [9] Ils soutiennent que de nombreux langages de programmation ne peuvent pas être strictement classés dans un paradigme, mais incluent plutôt des fonctionnalités de plusieurs paradigmes. Voir Comparaison des langages de programmation multi-paradigmes .
Histoire
Différentes approches de la programmation se sont développées au fil du temps, étant identifiées comme telles soit à l’époque, soit rétrospectivement. Une première approche consciemment identifiée comme telle est la programmation structurée , prônée depuis le milieu des années 1960. Le concept de « paradigme de programmation » en tant que tel date au moins de 1978, dans la conférence Turing Award de Robert W. Floyd , intitulée The Paradigms of Programming , qui cite la notion de paradigme telle qu’utilisée par Thomas Kuhn dans son The Structure of Scientific Révolutions (1962). [dix]
Langage machine
Les paradigmes de programmation de niveau le plus bas sont le code machine , qui représente directement les instructions (le contenu de la mémoire du programme) sous la forme d’une séquence de nombres, et le langage d’assemblage où les instructions machine sont représentées par des mnémoniques et les adresses mémoire peuvent recevoir des étiquettes symboliques. Celles-ci sont parfois appelées langues de première et de deuxième génération .
Dans les années 1960, les langages d’assemblage ont été développés pour prendre en charge la bibliothèque COPY et des capacités de génération et de prétraitement de macros conditionnelles assez sophistiquées, CALL to ( subroutines ), variables externes et sections communes (globales), permettant une réutilisation significative du code et une isolation des spécificités matérielles via le utilisation d’opérateurs logiques tels que READ/WRITE/GET/PUT. L’ assemblage était, et est toujours, utilisé pour les systèmes à temps critique et souvent dans les systèmes embarqués car il donne le contrôle le plus direct de ce que fait la machine.
Langages procéduraux
L’avancée suivante a été le développement des langages procéduraux . Ces langages de troisième génération (les premiers qualifiés de langages de haut niveau ) utilisent un vocabulaire lié au problème à résoudre. Par example,
- COmmon Business Oriented Language ( COBOL ) – utilise des termes tels que file , move et copy .
- FORmula TRANslation ( Fortran ) – utilisant la terminologie du langage Mathématique , il a été développé principalement pour des problèmes scientifiques et d’ingénierie.
- Langage ALGOrithmique ( ALGOL ) – axé sur le fait d’être un langage approprié pour définir des algorithmes , tout en utilisant la terminologie du langage Mathématique, ciblant les problèmes scientifiques et d’ingénierie, tout comme Fortran.
- Programming Language One ( PL / I ) – un langage hybride commercial-scientifique à usage général prenant en charge les pointeurs .
- Code d’instruction symbolique polyvalent pour débutants ( BASIC ) – il a été développé pour permettre à plus de personnes d’écrire des programmes.
- C – un langage de programmation à usage général, initialement développé par Dennis Ritchie entre 1969 et 1973 chez AT&T Bell Labs .
Tous ces langages suivent le paradigme procédural. C’est-à-dire qu’ils décrivent, étape par étape, exactement la procédure qui devrait, selon le programmeur particulier au moins, être suivie pour résoudre un problème spécifique. L’ efficacité et l’efficience d’une telle solution sont donc à la fois entièrement subjectives et fortement dépendantes de l’expérience, de l’inventivité et de la capacité de ce programmeur.
Programmation orientée objet
Suite à l’utilisation généralisée des langages procéduraux, des langages de programmation orientés objet (POO) ont été créés, tels que Simula , Smalltalk , C++ , Eiffel , Python , PHP , Java et C# . Dans ces langages, les données et les méthodes pour les manipuler sont conservées comme une seule unité appelée objet . Avec une encapsulation parfaite , l’une des caractéristiques distinctives de la POO, la seule façon pour un autre objet ou utilisateur d’accéder aux données est via les méthodes de l’objet. Ainsi, le fonctionnement interne d’un objet peut être modifié sans affecter le code qui utilise l’objet. Il existe encore une controverse soulevée par Alexander Stepanov , Richard Stallman [11] et d’autres programmeurs, concernant l’efficacité du paradigme POO par rapport au paradigme procédural. La nécessité pour chaque objet d’avoir des méthodes associatives conduit certains sceptiques à associer la POO au gonflement logiciel ; une tentative pour résoudre ce dilemme est venue par le polymorphisme .
Comme la programmation orientée objet est considérée comme un paradigme et non comme un langage, il est même possible de créer un langage assembleur orienté objet. L’assemblage de haut niveau (HLA) en est un exemple qui prend entièrement en charge les types de données avancés et la programmation en langage d’assemblage orienté objet, malgré ses origines précoces. Ainsi, différents paradigmes de programmation peuvent être vus plutôt comme des mèmes de motivation de leurs défenseurs, plutôt que représentant nécessairement des progrès d’un niveau à l’autre [ citation nécessaire ]. Les comparaisons précises de l’efficacité des paradigmes concurrents sont souvent rendues plus difficiles en raison de la terminologie nouvelle et différente appliquée à des entités et des processus similaires ainsi que de nombreuses distinctions de mise en œuvre entre les langues.
Autres paradigmes
La programmation littéraire , en tant que forme de programmation impérative , structure les programmes comme un Web centré sur l’humain, comme dans un essai hypertexte : la documentation fait partie intégrante du programme, et le programme est structuré selon la logique de l’exposition en prose, plutôt que selon la commodité du compilateur.
Indépendamment de la branche impérative, des paradigmes de programmation déclarative ont été développés. Dans ces langages, on dit à l’ordinateur quel est le problème, pas comment résoudre le problème – le programme est structuré comme un ensemble de propriétés à trouver dans le résultat attendu, pas comme une procédure à suivre. Étant donné une base de données ou un ensemble de règles, l’ordinateur essaie de trouver une solution correspondant à toutes les propriétés souhaitées. Un archétype d’un langage déclaratif est le langage SQL de quatrième génération , et la famille des langages fonctionnels et de programmation logique.
La programmation fonctionnelle est un sous-ensemble de la programmation déclarative. Les programmes écrits à l’aide de ce paradigme utilisent des fonctions , des blocs de code destinés à se comporter comme des fonctions mathématiques . Les langages fonctionnels découragent les modifications de la valeur des variables par le biais de l ‘ affectation , faisant à la place une grande utilisation de la récursivité .
Le paradigme de la programmation logique considère le calcul comme un raisonnement automatisé sur un ensemble de connaissances. Les faits concernant le domaine du problème sont exprimés sous forme de formules logiques et les programmes sont exécutés en appliquant des règles d’inférence jusqu’à ce qu’une réponse au problème soit trouvée ou que l’ensemble de formules se révèle incohérent.
La programmation symbolique est un paradigme qui décrit les programmes capables de manipuler des formules et des composants de programme comme des données. [3] Les programmes peuvent ainsi se modifier efficacement et sembler “apprendre”, ce qui les rend adaptés à des applications telles que l’intelligence artificielle , les systèmes experts , le Traitement du langage naturel et les jeux informatiques. Les langages qui prennent en charge ce paradigme incluent Lisp et Prolog . [12]
La programmation différenciable structure les programmes de manière à ce qu’ils puissent être différenciés d’un bout à l’autre, généralement via une différenciation automatique . [13] [14]
Prise en charge de plusieurs paradigmes
La plupart des langages de programmation prennent en charge plusieurs paradigmes de programmation pour permettre aux programmeurs d’utiliser le style de programmation le plus approprié et les constructions de langage associées pour un travail donné. [15]
Voir également
- Portail de programmation informatique
- Comparaison des paradigmes de programmation
- Langage spécifique au domaine
- Langage de modélisation
- Domaine de programmation
- Complétude de Turing
- Langages de programmation Von Neumann
Références
- ^ Normark, Kurt. Vue d’ensemble des quatre principaux paradigmes de programmation . Université d’Aalborg, 9 mai 2011. Récupéré le 22 septembre 2012.
- ^ Frans Coenen (1999-10-11). “Caractéristiques des langages de programmation déclaratifs” . cgi.csc.liv.ac.uk . Récupéré le 20/02/2014 .
- ^ un b Michael A. Covington (2010-08-23). “CSCI / ARTI 4540/6540: Première conférence sur la programmation symbolique et LISP” (PDF) . Université de Géorgie. Archivé de l’original (PDF) le 2012-03-07 . Récupéré le 20/11/2013 .
- ^ “Paradigmes de programmation : quels sont les principes de la programmation ?” . Guide numérique IONOS . Récupéré le 03/05/2022 .
- ^ Peter Van Roy (2009-05-12). « Paradigmes de programmation : ce que tout programmeur devrait savoir » (PDF) . info.ucl.ac.be . Récupéré le 27/01/2014 .
- ^ Peter Van-Roy; Seif Haridi (2004). Concepts, techniques et modèles de programmation informatique . Presse du MIT. ISBN 978-0-262-22069-9.
- ^ Frank Rubin (mars 1987). ” ‘GOTO Considered Harmful’ Considered Harmful” (PDF) . Communications of the ACM . 30 (3): 195–196. doi : 10.1145/214748.315722 . S2CID 6853038 . Archivé de l’original (PDF) le 20 mars 2009.
- ^ Harper, Robert (1er mai 2017). “Qu’est-ce, le cas échéant, qu’un paradigme de programmation ?” . Quinze Quatre -vingt Quatre . La presse de l’Universite de Cambridge.
- ^ Krishnamurthi, Shriram (novembre 2008). “Enseigner les langages de programmation à une époque post-linnéenne” . Sigplan . ACM. 43 (11): 81–83. doi : 10.1145/1480828.1480846 . S2CID 35714982 . Pas. 43, 11. .
- ^ Floyd, RW (1979). “Les paradigmes de la programmation” . Communications de l’ACM . 22 (8): 455–460. doi : 10.1145/359138.359140 .
- ^ “Héritage de mode, clonage, crochets et OOP (Google Groups Discussion)” .
- ^ “Glossaire d’affaires : Définition de programmation symbolique” . allbusiness.com . Récupéré le 30/07/2014 .
- ^ Wang, Fei; Decker, James; Wu, Xilun ; Essertel, Grégoire; Rompf, Tiark (2018), Bengio, S.; Wallach, H.; Larochelle, H.; Grauman, K. (eds.), “Backpropagation with Callbacks: Foundations for Efficient and Expressive Differentiable Programming” (PDF) , Advances in Neural Information Processing Systems 31 , Curran Associates, Inc., pp. 10201–10212 , récupéré 2019-02 -13
- ^ Innes, Mike (2018). “Sur l’apprentissage automatique et les langages de programmation” (PDF) . Conférence SysML 2018 . Archivé de l’original (PDF) le 2018-09-20 . Récupéré le 13/02/2019 .
- ^ “Langage de programmation multi-paradigmes” . développeur.mozilla.org . Fondation Mozilla . Archivé de l’original le 21 août 2013.
Liens externes
Wikimedia Commons a des médias liés au langage de programmation par paradigme . |
- Classification des principaux paradigmes de programmation
- Comment les paradigmes de programmation évoluent et sont adoptés ?