Paradigmes de programmation – quelques liens pertinents

Quelques raccourcis :

Quelques grandes familles de langages de programmation, ou même de paradigmes de programmation, (le terme étant pris au sens large) sont décrites ci-dessous. Pour une liste plus exhaustive voir http://en.wikipedia.org/wiki/Programming_paradigm

Métaprogrammation

À venir...

Métaprogrammation avec C++ :

Métaprogrammation avec D :

Métaprogrammation avec Julia :

Nim (autrefois Nimrod) et la métaprogrammation :

Métaprogrammation avec Perl :

Métaprogrammation avec Python :

Métaprogrammation avec Ruby :

Métaprogrammation statique en Scala : http://scalamacros.org/

Comparatifs :

Multiprogrammation et systèmes répartis

À venir...

Pour des liens sur la multiprogrammation, voir Multiprogrammation--Liens.html

Programmation concaténative

À venir...

http://concatenative.org/wiki/view/Front%20Page

À propos de l'importance de la programmation concaténative, texte de Jon Purdy en 2012 : http://evincarofautumn.blogspot.mx/2012/02/why-concatenative-programming-matters.html

La concaténation serait une composition : http://concatenative.org/wiki/view/Concatenative%20language/Concatenation%20is%20composition

Programmation déclarative

À venir...

Introduction à la programmation déclarative, par Michael R. Bernstein en 2013 : http://michaelrbernste.in/2013/06/20/what-is-declarative-programming.html

Les risques de certaines caractéristiques impures de Prolog : http://okmij.org/ftp/Prolog/index.html#impure

Huit faussetés à propos de la programmation déclarative, énoncées par Erik Meijer et rapportées par John D. Cook en 2012 : http://www.johndcook.com/blog/2012/11/30/eight-fallacies-of-declarative-computing/

Ce qu'est la programmation déclarative (un terme confus), de l'avis de Robert Harper en 2013 : http://existentialtype.wordpress.com/2013/07/18/what-if-anything-is-a-declarative-language/

Programmation dynamique

Bien qu'il existe une stratégie d'optimisation du même nom, connue surtout dans le monde des mathématiques, les informaticiennes et les informaticiens utilisent typiquement le terme programmation dynamique en informatique en lien avec des langages dynamiques, qui demandent aux programmeuses et aux programmeurs d'expliquer moins de choses à leur outil de développement, cherchant à deviner des choses telles que les types de données impliqués dans les expressions. La frontière entre langages dynamiques et langages de scripts est mince.

Programmation évolutive

On entend par programmation évolutive une approche par laquelle un programme évolue au cours de son existence de quelque chose de simple à quelque chose de plus riche. Ceci peut impliquer une évolution de son système de types, de sa robustesse, de l'applicabilité de ses interfaces, de la réflexivité, etc. On peut faire des liens entre la programmation évolutive et plusieurs autres types de programmation (programmation génétique, programmation par Scripting, programmation orientée objet, métaprogrammation, etc.).

Un descriptif général du concept, par J. Heitkötter et D. Beasley, qui donne même une perspective Darwinienne à cette approche : http://www.aip.de/~ast/EvolCompFAQ/Q1_2.htm

Programmation évolutive avec JavaScript, un texte de Lars T. Hansen en 2007 : http://www.ecmascript.org/es4/spec/evolutionary-programming-tutorial.pdf

Programmation fonctionnelle

Comme le nom l'indique, cette approche se concentre sur le concept de fonction. On y trouve fréquemment des fonctions qui reçoivent en paramètre des fonctions ou qui retournent des fonctions. La plupart font ce qu'on nomme des évaluations paresseuses des expressions, ne procédant à une évaluation qu'au moment où cela s'avère nécessaire (ce qui permet par exemple de représenter des concepts abstraits comme l'infini potentiel).

L'approche fonctionnelle pure est telle que les fonctions n'ont pas d'effets secondaires : elles ne modifient pas d'états globaux (en fait, ses objets sont typiquement immuables), et ne conservent pas d'états internes d'une invocation à l'autre, ce qui les rend réentrantes et place l'approche fonctionnelle en excellente position pour attaquer de front les problèmes nouveaux du parallélisme. L'absence d'effets secondaires complique en retour certaines tâches de la vie courante, comme les entrées/ sorties (pour lesquelles on trouve tout de même des solutions, telles que les monades en Haskell, concept qu'on aime ou qu'on déteste).

Parmi les langages fonctionnels les plus connus, on trouve Lisp, Scheme, Haskell et JavaScript.

Certains langages impératifs comme C (voir http://conal.net/blog/posts/the-c-language-is-purely-functional/) ou C++ permettent en partie d'appliquer une approche fonctionnelle; la métaprogrammation à l'aide de templates, en particulier, est en fait une approche fonctionnelle pure.

Les lentilles (lenses) :

Comparatifs :

Critiques :

Programmation fonctionnelle par langage

Programmation fonctionnelle en Ada :

Programmation fonctionnelle avec C :

Programmation fonctionnelle avec C# :

Programmation fonctionnelle avec C++ :

Programmation fonctionnelle avec D :

Programmation fonctionnelle avec Java :

Programmation fonctionnelle avec Kotlin :

Programmation fonctionnelle avec OCaml :

Programmation fonctionnelle en Python :

Programmation fonctionnelle avec Ruby :

Programmation fonctionnelle avec Rust :

Programmation fonctionnelle avec Scala :

Programmation fonctionnelle avec Swift :

Monades

Les monades sont une particularité importante des langages fonctionnels contemporains, particularité qui fait son chemin vers plusieurs autres paradigmes de programmation. Techniquement, une monade représente formellement une étape dans une séquence de calculs, et constitue un jalon dans plusieurs efforts de composition de calculs. Pour y arriver, les monades transigent non pas des valeurs mais bien la possibilité d'une valeur (optional<T> en C++, Maybe en Haskell).

Certains diront que les monades s'expriment par un triplet d'opérations fondamentales :

D'autres se limiteront à un couple d'opérations :

Quelques textes sur le sujet :

Programmation graphique

À venir...

Réflexion de Philip C. Monk en 2013 : http://pcmonk.wordpress.com/2013/10/14/graphical-programming-i-really-hope-this-is-the-future/

Variante proposée par Sean McDirmid en 2013 et nommée Usable Live Programming : http://research.microsoft.com/en-us/people/smcdirm/liveprogramming.aspx

Programmation générative

La programmation générative se veut une approche par laquelle certaines tâches de programmation manuelle sont automatisées, incluant la production et l'assemblage de composants logiciels. Les idées derrière cette façon de faire sont véhiculées en partie par Krzysztof Czarnecki dans sa dissertation de 1998 et depuis celle-ci.

Quelques définitions de cette approche sont proposées sur http://www.program-transformation.org/Transform/GenerativeProgramming et, de manière générale, le Wiki http://www.program-transformation.org/Transform/GenerativeProgrammingWiki s'y consacre.

Une présentation de la programmation générative et de ses applications, exprimées par la voie de la métaprogrammation, peut être consultée sur http://www.slideshare.net/ysb33r/generative-programming-in-the-large-applied-c-metaprogramming

Texte de Chris Sells en 2001 exprimant la programmation générative à partir d'exemples concrets : http://msdn.microsoft.com/en-us/magazine/cc301675.aspx

Site sur la programmation générative et ses vertus, par Anders Hoff : http://inconvergent.net/

Programmation générique

Dans les mots d'Alexander Stepanov lui-même, tels que rapportés par son interviewer du moment, John Lakos, dans une entrevue de 2015, la programmation générique est la recherche d'algorithmes tels que « an algorithm in one domain can be applied in another similar domain ».

Texte explicatif à venir.

Liens et différences entre généricité et héritage, par Bertrand Meyer en 1986 : http://se.ethz.ch/~meyer/publications/acm/geninh.pdf

Texte expliquant ce qu'est la programmation générique, prise au sens large mais avec un accent sur les templates de C++, par Gabriel Dos Reis et Jaakko Järvi en 2005 : http://lcsd05.cs.tamu.edu/papers/dos_reis_et_al.pdf

Quelques textes de votre humble serviteur (avec inspirations diverses, indiquées à même le texte) à propos de la programmation générique en C++ :

Programmation générique avec Haskell : http://people.cs.uu.nl/johanj/publications/ComparingGP.pdf

Un livre en ligne sur les templates de D, par Philippe Sigaud en 2012 : https://docs.google.com/viewer?url=https://github.com/PhilippeSigaud/D-templates-tutorial/blob/master/dtemplates.pdf?raw%3Dtrue&pli=1

Comparatif (malheureusement, superficiel et un peu mince) des mécanismes de généricité en C#, Java et C++, par Kosta Hristov en 2013 : http://www.developingthefuture.net/difference-between-generics-in-c-java-and-c/

Programmation générique avec Swift, une explication de ce qui s'annonce, par Douglas Gregor en 2016 : http://article.gmane.org/gmane.comp.lang.swift.evolution/8484

Programmation génétique

À venir...

Série d'articles sur le sujet, proposée par Alan Zucconi en 2016 :

Programmation impérative (procédurale)

À venir...

Comparer la programmation impérative et la programmation fonctionnelle :

Programmation intentionnelle

Par programmation intentionnelle, on entend un modèle de programmation cherchant à faire en sorte que le code source rejoigne précisément l'intention de la programmeuse ou du programmeur. L'idée d'origine vient, à ma connaissance, des travaux de Charles Simonyi et Gregor Kiczales.

Le Wiki décrivant l'idée derrière cette approche est http://en.wikipedia.org/wiki/Intentional_programming

Pour un texte de Martin Fowler sur le sujet, voir http://martinfowler.com/bliki/IntentionalSoftware.html

Programmation logique

À venir...

Programmation orientée aspect (POA)

À venir...

Comparer l'injection de dépendance et la POA :

Selon les langages

La POA avec C++ :

Programmation orientée caractéristiques (Feature-Oriented Programming, FOP)

À venir...

Programmation orientée objet (POO)

Cette section est très incomplète pour le moment (le temps me manque).

Au sujet du Unified Modeling Language (UML) :

Aussi :

Comparatifs :

Programmation orientée objets par langage

Programmation orientée objet avec C :

Programmation orientée objet avec Go :

Pour diverses techniques OO en C++, voir ../Sujets/Divers--cplusplus/index.html (et, de manière générale, l'ensemble du site h-deb)

Programmation par passage de messages

Détails à venir.

Programmation probabiliste

Détails à venir.

Programmation réactive

Détails à venir

Utiliser Kotlin sur Android dans une optique de programmation réactive, textes de Cédric Beust en 2015 :

 

Programmation relativiste

Détails à venir.

Explication sommaire du paradigme :http://wiki.cs.pdx.edu/rp/

Programmation par Scripting

Il existe plusieurs guerres de clochers d'un point de vue philosophique comme d'un point de vue technique entre des tenants dogmatiques de diverses approches de programmation :

Pourtant, le monde de l'informatique a besoin de plusieurs outils parce que ses défis sont nombreux et diversifiés. En effet :

Même dans une situation où le souci de performance est omniprésent (simulation, réalité virtuelle, jeu vidéo, systèmes en temps réel), on voudra souvent combiner plus d'une approche pour arriver à nos fins. La trame narrative d'un jeu s'exprime bien avec un langage de scripts alors que le moteur se prête à de la programmation C++ très serrée. Un service Web construit en VB.NET se développe sans peine et peut cacher à la fois un composant C++ pour les calculs les plus exigeants et un relais vers une application Java interfaçant avec des technologies pour lesquelles VB.NET est moins utile (tout ce qui sort du monde Windows).

N'adhérons donc pas aux dogmes et aux chicanes de basse-cour et explorons brièvement les langages de scripts qui permettent de dynamiser (principalement) la partie cliente (souvent dans un fureteur) des applications Web.

Les langages de scripts sont nombreux. Parmi les plus populaires, on trouve PHP, Perl, Python, Ruby, JavaScript, Tcl/Tk et bien d'autres (Adobe Flash, dans une certaine mesure, avec ActionScript). Chacun a sa raison d'être et ses adhérent(e)s.

On associe souvent la programmation par Scripting à la programmation dynamique. Typiquement, les langages de scripts sont axés sur la souplesse et la facilité d'exprimer les idées plutôt que sur la performance à l'exécution : avec des scripts, le programmeur est plus rapide, même si les programmes sont typiquement plus lents. Les langages de scripts servent fréquemment à produire des extensions à des moteurs existants, par exemple pour les fureteurs ou dans le monde du jeu vidéo (pour le développement d'intelligences artificielles simples).

Comparatifs :

Programmation transformative

Programmer en connectant les sorties de certains modules aux entrées de certains modules, créant par le fait-même des flots transformatifs de données.

Typestate-Oriented Programming

Détails à venir

Texte de 2009 par Jonathan Aldrich, Joshua Sunshine, Darpan Saini et Zachary Sparks : http://www.cs.cmu.edu/~aldrich/papers/onward2009-state.pdf


Valid XHTML 1.0 Transitional

CSS Valide !