Paradigmes de programmation – quelques liens pertinents
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
- Si vous êtes curieuse ou curieux de savoir ce qu'il est possible de
faire d'étrange avec un langage de programmation, voici
quelques exemples.
- Voici aussi quelques
trucs particuliers que permettent de faire divers langages.
- Un texte sur les langages Perlis, au sens du célèbre informaticien
Alan
Perlis, soit (selon l'auteur) des langages qui modifient la manière
de penser de ceux qui les utilisent : http://blog.fogus.me/2011/08/14/perlis-languages/
- Un réflexion sur les types génériques covariants,
par Chung-Chieh Shan en 2011 : http://conway.rutgers.edu/~ccshan/wiki/blog/posts/Unsoundness/
(aussi, par Rob Simmons en 2011, voir http://requestforlogic.blogspot.com/2011/10/incomplete-by-design-thought-on-dart.html)
- Un design visuel « live » décrivant des types
de langages de programmation, par Arthur Ventura en 2011 :
http://www.surf-the-edge.com/2011/11/16/live-sketching/
- Les principaux paradigmes de programmation, regroupés dans un schéma :
http://www.info.ucl.ac.be/~pvr/paradigmsDIAGRAMeng.pdf
- Catégoriser les langages en fonction d'un paradigme ou de l'autre, une
tâche difficile selon Laurence Tratt en 2013 :
http://tratt.net/laurie/blog/entries/relative_and_absolute_levels
- En 2013, Greg Jorgensen propose ce qu'il nomme
la « programmation orientée abject » (Abject-Oriented Programming), une
satire sur les pratiques de programmation malsaines :
http://typicalprogrammer.com/abject-oriented/
- Survol des quatre principaux paradigmes de programmation (selon l'auteur
du texte en question), soit la programmation impérative,
la programmation fonctionnelle,
la programmation logique et la programmation orientée
objet
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...
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.
- http://www.haskell.org/haskellwiki/Functional_programming
- Comprendre ce qui distingue l'approche fonctionnelle de l'approche
impérative :
http://stackoverflow.com/questions/5226055/truly-understanding-the-difference-between-procedural-and-functional/5280719#5280719
- Penser de manière fonctionnelle avec Haskell, par Paul; Callaghan en
2012 :
http://pragprog.com/magazines/2012-09/thinking-functionally-with-haskell
- principes de programmation fonctionnelle avec
Scala, par
Heather Miller et Martin Odersky
en 2012 :
http://docs.scala-lang.org/news/functional-programming-principles-in-scala-impressions-and-statistics.html
- Une cartographie de l'influence de divers langages de programmation sur
l'approche fonctionnelle, tracée par Michael Fogus en
2012 : http://blog.fogus.me/2012/05/02/a-functional-programming-influence-graph/
- Que signifie « programmation fonctionnelle »?
- C'est le temps de se remettre à la programmation fonctionnelle :
http://www.drdobbs.com/tools/212201710
- Pourquoi la programmation fonctionnelle est quelque chose d'important :
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf
- Cela dit, il est clair que ce n'est pas tout le monde qui s'y connaît :
http://research.microsoft.com/apps/pubs/default.aspx?id=141506
- Programmation fonctionnelle pour débutant(e)s :
- Quelques perles de programmation fonctionnelle :
http://www.haskell.org/haskellwiki/Research_papers/Functional_pearls
- Quand un programme fonctionnel n'en est pas un : http://citeseer.ist.psu.edu/cache/papers/cs/11680/ftp:zSzzSzftp.dcs.ed.ac.ukzSzpubzSzjrlzSzwhenfun.pdf/longley99when.pdf
- Programmation fonctionnelle réactive : http://conal.net/papers/push-pull-frp/
- Historique de la programmation objet-fonctionnelle, portant surtout sur
Scala :
http://www.artima.com/weblogs/viewpost.jsp?thread=275983
- Explication concise de l'immuabilité et de l'approche fonctionnelle :
http://itmmetelko.com/blog/2008/02/23/functional-programming-immutable-objects-explained-irc-style/
- Sémantique des programmes et programmation fonctionnelle : http://homepages.cwi.nl/~jve/cs/
-
Refactoriser ou réécrire? http://blog.objectmentor.com/articles/2009/08/05/functional-refactoring-and-you-cant-get-there-from-here
- Représenter des valeurs par des types en Haskell :
http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf
- Libérer la programmation fonctionnelle du paradigme des machines
de type VonNeumann : http://conal.net/blog/posts/can-functional-programming-be-liberated-from-the-von-neumann-paradigm/
- Programmation fonctionnelle dans un langage orienté-objet :
http://www.harukizaemon.com/2010/03/functional-programming-in-object-oriented-languages.html
- Un outil pour transformer des programmes fonctionnels, semblables à
ceux écrits en Haskell,
en métaprogrammes C++ :
http://gergo.erdi.hu/projects/metafun/
- Espèces d'entités dans un programme fonctionnel : http://www.cis.upenn.edu/~byorgey/papers/species-pearl.pdf
- La réputation des langages fonctionnels est surfaite? http://www.benrady.com/2010/06/a-bit-of-heresy-functional-languages-are-overrated.html
- Étudier les langages fonctionnels pour ne pas être ignorant(e)?
http://benhutchison.wordpress.com/2009/06/02/study-functional-programming-or-be-ignorant/
- Archéologie des langages fonctionnels : http://prog21.dadgum.com/14.html
- Expliquer la programmation fonctionnelle à un enfant : http://prog21.dadgum.com/73.html
- Adapter un Framework OO
pour utilisation par un langage fonctionnel réactif : http://www.cs.brown.edu/~sk/Publications/Papers/Published/ick-adapt-oo-fwk-frp/paper.pdf
- Une série très mathématisée sur la programmation
fonctionnelle en C++ :
http://cpp-next.com/archive/2010/07/algebraic-data-types/
- à propos de la thèse de Church
et de la programmation fonctionnelle :http://www.cs.kent.ac.uk/people/staff/dat/miranda/ctfp.pdf
- Au sujet des structures de données Topless, ou sans fin
mais dans une seule direction : http://conal.net/blog/posts/topless-data/
- Vérifier la pureté fonctionnelle en Java :
http://www.cs.berkeley.edu/~daw/papers/pure-ccs08.pdf
- Programmer de manière fonctionnelle en Java,
par Cyrille Martaire en 2011 : http://cyrille.martraire.com/2011/03/thinking-functional-programming-with-map-and-fold-in-your-everyday-java/
- Texte à saveur pédagogogique : http://devlicio.us/blogs/christopher_bennage/archive/2010/09/06/what-is-functional-programming.aspx
(et les suites, car il y en a plusieurs)
- La programmation fonctionnelle serait à la mode : http://prog21.dadgum.com/31.html
- Programmation fonctionnelle, de Java
à Scala :
http://www.artima.com/weblogs/viewpost.jsp?thread=306337
- Programmation fonctionnelle en Scala
pour le commun des mortels, un texte de 2011 :
http://www.tikalk.com/incubator/blog/functional-programming-scala-rest-us
- Programmation fonctionnelle et design matériel : http://www.jucs.org/doi?doi=10.3217/jucs-011-07-1135
- Réflexivité (au sens OO)
et programmation fonctionnelle : http://gbracha.blogspot.com/2010/12/reflecting-on-functional-programming.html
- Passer du modèle OO
au modèle fonctionnel : http://squirrel.pl/blog/2011/03/14/two-worlds-learning-functional-thinking-after-oo/
- Certaines approches fonctionnelles, pour être naturelles, exigent
(aux yeux de certains, du moins) l'immuabilité : http://algorithm.com.au/blog/files/immutability-blocks-lambdas-closures.php#unique-entry-id-613
- Enseigner la programmation fonctionnelle : http://existentialtype.wordpress.com/2011/04/17/some-advice-on-teaching-fp/
- La programmation fonctionnelle est difficile... et tant mieux, selon Dave
Fayram en 2011 : http://dave.fayr.am/posts/2011-08-19-lets-go-shopping.html
- La paresse :
- Blogue sur les schémas de conception en programmation fonctionnelle :
http://patternsinfp.wordpress.com/
- Penser fonctionnel :
- Comparer la programmation impérative
et la programmation fonctionnelle :
- La « programmation fonctionnelle totale », pour rapprocher
la programmation fonctionnelle des mathématiques :
- Types de données algébriques, ou ADT :
- À propos des compréhensions de listes, un texte de Jeremy
Gibbons en 2012 : http://patternsinfp.wordpress.com/2012/01/19/comprehensions/
- Distinguer les applications partielles comme on en voit en C#
du Currying :
- Schémas
de conception en programmation fonctionnelle, un texte de Neal Ford en
2012 : http://www.ibm.com/developerworks/java/library/j-ft10/index.html?ca=drs-
- Intégrer les approches OO
et fonctionnelle, un texte de Michael Feathers en
2012 : http://michaelfeathers.typepad.com/michael_feathers_blog/2012/03/tell-above-and-ask-below-hybridizing-oo-and-functional-design.html
- En 2012,
Bartosz Milewski explique qu'à
son avis, la multiprogrammation
a sonné le glas de la programmation
impérative, et que la programmation fonctionnelle est maintenant
le chemin à emprunter : http://fpcomplete.com/the-downfall-of-imperative-programming/
- Selon Jessica Kerr, en 2012, la programmation
fonctionnelle clarifie notre pensée : http://blog.jessitron.com/2012/06/why-functional-matters-your-white-board.html
- La pensée fonctionnelle avec Haskell,
par Paul Callaghan en 2012 : http://pragprog.com/magazines/2012-08/thinking-functionally-with-haskell
- Correspondance fonctionnelle entre les évaluateurs et les machines
abstraites, par Mads Sid Ager, Dariusz Biernacki, Olivier Danvy et Jan Midtgaard
en 2003 : http://www.brics.dk/RS/03/13/BRICS-RS-03-13.pdf
- Une technique fonctionnelle pour optimiser certaines tâches, par Andy
Gill et Graham Sutton en 2009 : http://www.cs.nott.ac.uk/~gmh/wrapper.pdf
- Implémenter des générateurs, par Oleg Kiselyov en
2011 : http://okmij.org/ftp/continuations/generators.html
- L'opérateur amb de Lisp,
proposé par John
McCarthy et qui permet (si une implémentation l'implémente,
ce qui – à ce que je sache – n'est jamais arrivé)
de réaliser un choix non-déterministe entre plusieurs expressions :
http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-16.html#node_chap_14
- Mise en garde de David J. Pearce, auteur du langage
Whiley,
proposée en 2012 et destinée à ceux qui
confondent programmation fonctionnelle et style fonctionnel :
http://whiley.org/2012/09/06/a-misconception-of-functional-programming/
- Dans ce texte de 2012, Michael O. Church nous
invite à programmer de manière impérative lorsque c'est nécessaire, tout en
préférant une approche fonctionnelle en général :
http://michaelochurch.wordpress.com/2012/12/06/functional-programs-rarely-rot/
- Réaliser un Church Encoding en
JavaScript,
par Matt Might en 2013 :
http://matt.might.net/articles/js-church/
- Le code écrit selon une approche fonctionnelle tend à être plus court que
son équivalent selon d'autres approches... Mais pourquoi? L'opinion de Paul Chiusano en
2013 :
http://pchiusano.blogspot.ca/2013/02/why-functional-code-is-shorter.html
- En 2013, James Hague explique comment la programmation fonctionnelle peut
même servir de métaphore à l'apprentissage de Photoshop :
http://prog21.dadgum.com/180.html
- La programmation fonctionnelle « totale », texte de D. A. Turner en
2004 :
http://www.jucs.org/jucs_10_7/total_functional_programming/jucs_10_07_0751_0768_turner.pdf
- Propriétés « universelles » des opérations Map, Fold et Filter, texte de Jeremy Kun en
2013 :
http://jeremykun.com/2013/09/30/the-universal-properties-of-map-fold-and-filter/
- Style de programmation par composition de « flèches », un texte de John Hughes
(qui semble avoir été publié en 2004 si je me fie
sur les références) :
http://www.cse.chalmers.se/~rjmh/afp-arrows.pdf
- Texte de 2014 par Tony DaSilva, qui décrit ce que son auteur
considère un « changement de régime », au sens où selon lui, la programmation
fonctionnelle prend graduellement le dessus sur l'approche dominante
(l'approche
OO) au moment où le texte
a été écrit :
http://bulldozer00.com/2014/11/12/regime-change/
- En 2015, réflexion de Dennis McWherter sur le
« lent glissement » de plusieurs langages vers le paradigme fonctionnel :
http://deathbytape.com/post/122385153704/slow-shift-to-functional
- Les fonctions d'ordre supérieur (High Order), par Mark Galea en
2016 :
http://cloudmark.github.io/Higher-Order-Functions/
Les lentilles (lenses) :
Comparatifs :
- L'influence de la pensée fonctionnelle sur la saine pensée
OO, par Simon Harris en
2010 :
http://www.harukizaemon.com/blog/2010/03/01/functional-programming-in-object-oriented-languages/
- La migration d'une pensée
OO à une pensée
fonctionnelle, texte de Hadi Hariri en 2013 :
http://hadihariri.com/2013/11/24/refactoring-to-functionalwhy-class/
- Selon John D. Cook en 2010, la
POO et la programmation
fonctionnelle aident toutes deux, chacune à sa façon, à la compréhension du
code :
http://www.johndcook.com/blog/2010/11/03/object-oriented-vs-functional-programming/
- Dans ce texte de 2014,
Erik Meijer explique
qu'à son avis, la programmation « presque fonctionnelle », comme le mettent
de l'avant des langages comme
C# ou
C++, est
un cul de sac :
http://queue.acm.org/detail.cfm?ref=rss&id=2611829
- Selon Erkki Lindpere en 2013, le débat entre
les tenants de la pensée fonctionnelle et ceux de la pensée
OO en est un qui porte
surtout sur la composition :
http://zeroturnaround.com/rebellabs/why-the-debate-on-object-oriented-vs-functional-programming-is-all-about-composition/
- Texte de
Robert C. Martin en 2012 expliquant
la programmation fonctionnelle aux programmeuses et aux programmeurs
OO :
http://blog.8thlight.com/uncle-bob/2012/08/24/functional-programming-for-the-object-oriented-programmer.html
- Le glissement de l'approche
OO vers l'approche
fonctionnelle passe en particulier par l'immuabilité,
selon ce texte de 2014 :
http://valve.github.io/blog/2014/07/04/from-object-to-functional-immutability/
- Traverser le pont entre l'approche
OO et l'approche
fonctionnelle, par
Dave
Thomas en 2009 :
http://www.jot.fm/issues/issue_2009_07/column4/
- En 2014,
Robert C. Martin compare la
programmation fonctionnelle à la programmation
OO :
http://blog.cleancoder.com/uncle-bob/2014/11/24/FPvsOO.html
- Dans ce texte de 2015, Yevgeniy Brikman explique sa
perception à l'effet de laquelle les paradigmes contemporains dominants lui semblent
tendre vers le typage statique et la programmation fonctionnelle :
http://brikis98.blogspot.ca/2015/02/are-static-typing-and-functional.html
Critiques :
- Est-ce raisonnable de se limiter au modèle fonctionnel? Texte de
James Hague en 2009 : http://prog21.dadgum.com/54.html
- Dans le même ordre d'idées, la pureté mise de l'avant
par le modèle fonctionnel mène-t-elle nécessairement
à des implémentations efficaces? Texte de James Hague en
2009 : http://prog21.dadgum.com/41.html?0
- En 2012, Larry O'Brien laisse entendre que le
problème avec la programmation fonctionnelle est qu'elle sous-tend
un discours prétentieux, ou plutôt suffisant : http://www.sdtimes.com/content/article.aspx?ArticleID=36534
- Dans ce texte de 2012, Judah Johns émet
l'opinion que la programmation fonctionnelle, si pertinente soit-elle, est
un ghetto : http://blog.jelastic.com/2012/07/24/functional-programming-is-a-ghetto/
- Qu'est-ce qui nous fait penser que la programmation fonctionnelle mène
à des programmes fondamentalement lents (en comparaison avec des équivalents
écrits en C,
par exemple)? Une réflexion de John Harrop en
2012 : http://flyingfrogblog.blogspot.co.uk/2012/06/are-functional-languages-inherently.html
- Dans ce texte de 2013, Elliotte Rusty Arnold
prétend que la programmation fonctionnelle avec
Java ¸(ou, sur
la base de son argumentaire, avec tout langage n'offrant pas le support propre
aux idiomes de la programmation fonctionnelle, par exemple la
récursivité –
au moins par Tail Call Optimization – au même prix que l'itération, et
l'évaluation paresseuse des valeurs) est
dangereuse :
http://cafe.elharo.com/programming/java-programming/why-functional-programming-in-java-is-dangerous/
- Parfois, permettre quelques effets de bord peut être avantageux, de l'avis
de Yin Wang en 2013 :
https://yinwang0.wordpress.com/2013/11/09/oop-fp/
- En 2014, James Hague met en relief que, selon
lui, la simulation est un « pire cas » pour la programmation fonctionnelle :
http://prog21.dadgum.com/189.html
- Définir un type « mutable » dans un langage où les données sont
typiquement immuables, un texte de 2014 par Joseph Abrahamson :
Programmation fonctionnelle par langage
Programmation fonctionnelle en Ada :
Programmation fonctionnelle avec
C :
Programmation fonctionnelle avec
C# :
Programmation fonctionnelle avec
C++ :
- Une série très mathématisée sur la
programmation
fonctionnelle en
C++ : http://cpp-next.com/archive/2010/07/algebraic-data-types/
-
Programmation
fonctionnelle avec
C++, un texte de
John
Carmack en 2012 : http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/
- Un texte de
John
Carmack en 2012 :
http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/
- Texte d'Alfons Haffmans en 2013 :
http://pragprog.com/magazines/2013-07/living-with-lambdas
- Analyse d'Eric Niebler en complément d'une proposition de
Bartosz Milewski, en
2013 :
http://ericniebler.com/2013/07/16/f-algebras-and-c/
- Définir des types-classes comme avec
Haskell, par
exemple des monoïdes, un texte de 2013 :
http://functionalcpp.wordpress.com/2013/08/16/type-classes/
- Présentation d'Andrew Weiss en 2013 :
http://de.slideshare.net/andreweissflog3/quovadis2013-cpp-ontheweb
- Quelques textes de
Bartosz Milewski :
- Le Monadic Lifting en
C++, par Joaquín M López Muñoz
en 2014 :
http://bannalia.blogspot.ca/2014/03/monadic-lifting-in-c.html
- Selon Christoph Kohlhepp en 2014, l'évolution de
C++ depuis
C++ 11,
et à plus forte partie depuis
C++ 14,
le rapproche
conceptuellement de langages fonctionnels tels que
Lisp :
- En 2014,
Bartosz Milewski propose des
techniques d'évaluation paresseuse en
C++ pour
gérer les séquences infinies :
http://bartoszmilewski.com/2014/04/21/getting-lazy-with-c/
- Présentation de la programmation fonctionnelle avec
C++, par
David Sankel en 2014 :
https://github.com/boostcon/cppnow_presentations_2014/raw/master/files/intro-to-functional-programming-in-cpp.pdf
- Structures de données fonctionnelles avec
C++, par
Bartosz Milewski en 2014 :
https://github.com/boostcon/cppnow_presentations_2014/raw/master/files/functional-data-structures.pdf
- La programmation fonctionnelle pour résoudre des problèmes de télémétrie,
par Bartosz Milewski en 2014 :
http://bartoszmilewski.com/2014/11/12/formula-1-go-functional/
- Série d'articles sur la théorie des catégories expliquée aux
programmeurs, par par
Bartosz Milewski :
- Texte de Victor Laskin en 2015 sur la
programmation par pipeline d'opérations, une approche très fonctionnelle :
http://vitiy.info/functional-pipeline-in-c11/
- Les projections, analogues à une forme de Currying, par Scott
Prager en 2015 :
http://yapb-soc.blogspot.ca/2015/02/common-algorithm-patterns.html
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 :
- La projection d'une opération dans le contexte d'une monade, ou map
- La transformation de la valeur retournée en valeur potentielle, ou
return
- La transformation d'une possibilité de possibilité en possibilité plus
simple (d'un optional<optional<T>> en optional<T>, à titre d'exemple), ou
join
D'autres se limiteront à un couple d'opérations :
- Le bind, qui correspond à une fonction prenant deux paramètres,
soit un optional<Src> et une fonction
transformant un optional<Src> en
optional<Dest>, et
- Le return, qui s'apparente au constructeur d'un
optional<T> résultant du calcul réalisé par une fonction
Quelques textes sur le sujet :
- http://en.wikipedia.org/wiki/Monad_%28functional_programming%29
- Définition compacte mais pour gens avec un solide bagage mathématique,
commentée par John D. Cook :
https://plus.google.com/u/0/+JohnCook/posts/chbNpyhve1d
- Introduction aux monades, par Philip Wadler en
2006 :
http://homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf
- Introduction aux monades sous
Haskell :
http://www.haskell.org/tutorial/monads.html
- Lois des monades avec
Haskell :
http://www.haskell.org/haskellwiki/Monad_laws
- Présentation pour comprendre les monades :
http://marakana.com/static/courseware/scala/presentation/comprehending-monads.html#slide-0
- Les monades expliquées avec
Haskell par Stephen Diehl :
http://www.stephendiehl.com/posts/monads.html
- Monades pour débutants, texte de Stephan Boyer en
2014 :
http://www.stephanboyer.com/post/83/monads-for-dummies
- Programmation par contraintes à l'aide de monades :
http://homepages.inf.ed.ac.uk/wadler/topics/monads.html
- Les monades ne sont pas des métaphores :
http://www.codecommit.com/blog/ruby/monads-are-not-metaphors
- La monade d'entrée/ sortie a eu 45 ans
en 2010 :
http://www.haskell.org/pipermail/haskell-cafe/2010-December/087788.html
- Une description des monades « pour programmeurs curieux » :
- Comprendre les monades avec
JavaScript :
http://igstan.ro/posts/2011-05-02-understanding-monads-with-javascript.html
- ML et les
monades :
http://existentialtype.wordpress.com/2011/05/01/of-course-ml-has-monads/
- Explications relativement claires du concept de monade en programmation
fonctionnelle, par Stephan Boyer :
- Les monades avec
Scheme :
http://okmij.org/ftp/Scheme/monad-in-Scheme.html
- Quelques monades connues :
- En 2012, Paul Callaghan nous rappelle qu'il
y eut un temps avant les monades :
http://www.free-variable.org/2012/08/i-remember-the-time-before-monads/
- Texte de 2012 expliquant les
monades, pas à pas :
http://tailcalled.wordpress.com/2012/12/31/on-types-functional-programming-and-monads/
- Les monades avec
C# :
- Les monades avec
C++ :
- Les monades avec
Haskell :
- Les monades avec
Java 8 :
- Les monades avec
Rust :
- Les monades avec
Swift :
- Les monades illustrées, par vouditya Bhargava en 2013 :
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
- En 2006, Dan Piponi explique que vous avez
peut-être déjà inventé les monades vous-mêmes, sans vous en apercevoir :
http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html
- Monoïdes libres et constructions universelles, texte de
Bartosz Milewski en 2013 :
http://bartoszmilewski.com/2013/12/21/understanding-free-monoids-and-universal-constructions/
- Une critique des tutoriels portant sur les monades, par Brent Yorgey
en 2009 :
http://byorgey.wordpress.com/2009/01/12/abstraction-intuition-and-the-monad-tutorial-fallacy/
- La monade « liste », selon
Bartosz Milewski en
2014 :
https://www.fpcomplete.com/user/bartosz/basics-of-haskell/13-the-list-monad
- Les monades en tant que
schéma de
conception, par Amit Dev en 2014 :
http://amitdev.github.io/coding/2014/07/28/A-Functional-Design-Pattern/
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) :
- Site décrivant la norme
UML;
- Petit dictionnaire
UML (notez que les
définitions données conviennent à la norme
UML, mais peuvent ne pas être acceptées de manière
universelle dans le monde orienté objet).
Aussi :
Comparatifs :
Programmation orientée objets par langage
Programmation orientée objet avec
C :
Programmation orientée objet avec
Go :
Programmation par passage de messages
Détails à venir.
- Textes de 2013 par Steve Bate, présentant la programmation par passage de messages comme un modèle de programmation à part entière et l'opposant à la
programmation orientée objet :
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 :
-
les aficionados des langages portables sur le plan des sources (par exemple C++) et ceux des langages portables au niveau des binaires (langages de scripts,
Java,
C#)
-
les aficionados des langages surtout
fonctionnels (Haskell,
Lisp,
JavaScript, etc.) et les amants des langages surtout
OO (C++,
Java,
C#)
-
les aficionados des langages surtout
dynamiques (Ruby,
Python, plusieurs
langages fonctionnels) et ceux qui privilégient les langages statiques (C,
C++,
Java,
C#)
-
les aficionados de dialectes (langages à accolades, langages à parenthèses, langages semblables à ceux de
Niklaus Wirth)
-
les aficionados des langages
OO à héritage simple seulement (Java,
C#), ceux qui préfèrent l'option de l'héritage multiple (C++,
Eiffel) et ceux qui expriment l'héritage comme un idiome de programmation (JavaScript,
Lisp)
-
les aficionados de langages à
collecte automatique d'ordures
et ceux qui privilégient les comportements plus déterministes
-
les aficionados de langages riches et mots clés et en objets déjà faits (C#,
Java, et en général les langages qui viennent avec un
Framework) et ceux des langages qui privilégient moins de mots clés, plus d'expressivité et les bibliothèques (C et
C++); etc.
Pourtant, le monde de l'informatique a besoin de plusieurs outils parce que ses défis sont nombreux et diversifiés. En effet :
-
quand le problème exige vitesse et clarté ou quand il sort des sentiers battus, nous sommes heureux d'avoir accès à
C++ et à la
métaprogrammation;
-
quand le problème demande une solution réalisée rapidement et s'exécutant à une vitesse raisonnable, ou quand il ressemble à des problèmes types, les langages à Framework comme
Java et
C# permettent de relever le défi à pied levé;
-
quand un problème demande principalement de la souplesse et du dynamisme, les langages dynamiques et les langages de scripts sont fréquemment la solution la plus pertinente.
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