Si vous passez du temps à lire les tendances de programmation sur Internet, vous aurez entendu parler de la programmation fonctionnelle. Le terme revient assez souvent, mais qu'est-ce que cela signifie ?
Même si vous savez ce qu'est la programmation fonctionnelle, vous ne savez peut-être pas quels langages lui conviennent le mieux. Après tout, tous les langages de programmation ne sont pas créés égaux. Bien que vous puissiez appliquer des paradigmes de programmation fonctionnelle dans de nombreux langages, il y en a encore certains où vous vous sentirez beaucoup plus à l'aise.
Si vous avez une formation en mathématiques, vous avez une longueur d'avance sur la programmation fonctionnelle. En effet, le paradigme de la programmation fonctionnelle traite l'informatique comme des fonctions mathématiques. Si vous n'avez pas de formation en mathématiques, cela pourrait vous laisser perplexe.
Fondamentalement, la programmation fonctionnelle traite les fonctions et les données comme immuables. Vous transmettez des données dans une fonction, et elle renvoie généralement ces données transformées ou un autre type de données. En programmation fonctionnelle, la fonction ne doit jamais modifier les données d'origine ou l'état du programme.
Il y a une similitude avec la philosophie Unix selon laquelle chaque programme doit bien faire une chose. Une fonction ne doit pas toucher différentes parties de votre programme. Au lieu de cela, il devrait prendre son entrée et vous donner une sortie.
Idéalement, les fonctions devraient être pures autant que possible dans la programmation fonctionnelle. Cela signifie qu'étant donné la même entrée, la sortie de la fonction restera toujours la même.
C'est un changement radical par rapport à quelque chose comme la programmation orientée objet. Dans la programmation orientée objet, vous avez souvent un objet de base avec diverses méthodes dédiées à la modification des données ou de l'état qui font partie de cet objet. Une méthode peut même modifier des données ou un état si elle n'est pas explicitement indiquée.
Dans les programmes pratiques, cela a parfois du sens. Cela dit, cela peut rendre les programmes plus difficiles à maintenir, car il n'est pas toujours clair ce qui modifie l'état ou les données. La programmation fonctionnelle était à l'origine utilisée dans les environnements universitaires, mais peut également aider à prévenir ce genre de problèmes.
Certains langages de programmation permettent la programmation fonctionnelle tandis que d'autres l'encouragent ou même l'imposent. JavaScript appartient à la première catégorie. Bien que vous puissiez utiliser des paradigmes de programmation fonctionnelle dans le langage, vous pouvez tout aussi facilement utiliser une approche orientée objet.
Cela dit, il existe de nombreux paradigmes de programmation fonctionnelle intégrés à JavaScript. Prenons, par exemple, les fonctions d'ordre supérieur. Ce sont des fonctions qui peuvent prendre d'autres fonctions comme arguments.
JavaScript a plusieurs fonctions qui fonctionnent avec des tableaux comme
map()
,
réduire()
,
filter()
, et d'autres, qui sont toutes des fonctions d'ordre supérieur. Cela vous permet de les enchaîner pour faire rapidement toutes sortes de choses avec un tableau.
Alors que les premiers JavaScript avaient quelques problèmes de mutabilité, les nouvelles versions de la norme ECMAScript fournissent des correctifs. Au lieu du fourre-tout
var
mot-clé pour définir des variables, vous avez maintenant
const
et
let
. Le premier vous permet de définir des constantes, comme son nom l'indique. La seconde,
let
, limite la portée d'une variable à la fonction dans laquelle elle est déclarée.
Comme JavaScript, Python est un langage généralisé avec lequel vous pouvez utiliser n'importe quel nombre de paradigmes de programmation. Python peut avoir ses inconvénients, mais la programmation fonctionnelle n'en fait pas partie. Il y a même une introduction à la programmation fonctionnelle dans la documentation officielle de Python.
Pour commencer, vous trouverez plusieurs des mêmes
map()
,
filter()
,
réduire()
, et les fonctions similaires mentionnées ci-dessus intégrées. Comme avec JavaScript, ce sont des fonctions d'ordre supérieur car elles prennent d'autres fonctions comme arguments. En Python, la programmation fonctionnelle a un avantage sous la forme de
lambda
mot-clé.
Vous pouvez utiliser les expressions lambda de plusieurs manières. Une façon de l'utiliser est comme un raccourci pour des fonctions simples. Lorsqu'elles sont affectées à une variable, vous pouvez appeler des expressions lambda exactement comme vous le feriez pour une fonction Python standard. Le véritable avantage des expressions lambda vient lorsque vous les utilisez comme fonctions anonymes.
Les fonctions anonymes fonctionnent également en JavaScript et dans d'autres langages de cette liste. Ils sont particulièrement utiles lorsqu'ils sont utilisés avec des fonctions d'ordre supérieur, car vous pouvez les définir sur place. Sans fonctions anonymes, vous devriez prédéfinir même des ajouts simples en tant que fonctions sur mesure.
Contrairement à JavaScript et Python, Clojure n'est peut-être pas exactement un nom familier, même parmi les programmeurs. Au cas où vous ne seriez pas familier, Clojure est un dialecte du langage de programmation Lisp, qui remonte à la fin des années 1950. Cela s'accompagne d'une façon très spécifique de faire les choses qui se trouve être parfaite pour la programmation fonctionnelle.
Comme les autres dialectes Lisp, Clojure traite le code comme des données. Cela signifie que le code peut effectivement se modifier lui-même. Contrairement aux autres dialectes Lisp, Clojure s'exécute sur la plate-forme Java et est compilé en bytecode JVM. Cela signifie qu'il peut fonctionner avec les bibliothèques Java, qu'elles aient été écrites en Clojure ou non.
Contrairement aux langages précédents de cette liste, Clojure est un langage de programmation fonctionnel à partir de zéro. Cela signifie qu'il préconise l'immuabilité dans la mesure du possible, en particulier dans les structures de données.
Clojure ne s'attend pas à ce que tous les programmes soient mathématiquement "prouvables", mais encourage l'utilisation de fonctions pures dans la mesure du possible.
L'un des langages les plus récents de cette liste, Elm est un langage purement fonctionnel initialement conçu par Evan Czaplicki en 2012. Le langage a gagné en popularité parmi les développeurs Web, en particulier pour la création d'interfaces utilisateur.
Contrairement à toutes les entrées précédentes de cette liste, Elm utilise une vérification de type statique. Cela permet de garantir l'absence d'exceptions d'exécution, les erreurs étant plutôt interceptées au moment de la compilation. Cela signifie moins d'erreurs visibles pour les utilisateurs, ce qui est un avantage majeur.
Le compilateur Elm cible HTML, CSS et JavaScript. De la même manière que vous pouvez utiliser Clojure pour écrire des programmes qui s'exécutent sur Java, vous pouvez écrire des applications qui utilisent des bibliothèques JavaScript dans Elm.
Une différence majeure entre Elm et les autres langues ici est que vous ne trouverez pas de générique
filter()
,
map()
, et des fonctions similaires. Au lieu de cela, ceux-ci sont définis par type de données comme
List.map
ou
Dict.map
.
Haskell est un autre langage purement fonctionnel typé statiquement. Contrairement à Elm, Haskell existe depuis un certain temps. La première version du langage a été conçue en 1990. La dernière norme est Haskell 2010, tandis que la prochaine version est prévue pour 2020.
Comme nous l'avons déjà exploré, la nature purement fonctionnelle de Haskell signifie que par conception, les fonctions ne devraient pas avoir d'effets secondaires. Cela le rend bien adapté à la résolution de problèmes du monde réel malgré les racines de la programmation fonctionnelle dans le milieu universitaire.
Malgré son manque de popularité auprès du grand public, Haskell a été employé dans certains projets largement utilisés. Le gestionnaire de fenêtres Xmonad est entièrement écrit en Haskell. Pandoc, qui convertit différents types de balisage vers et depuis d'autres formats, utilise également le langage.
La norme
map()
,
filter()
,
réduire()
, et d'autres fonctions d'ordre supérieur sont présentes, ce qui devrait vous permettre de transférer des concepts de JavaScript ou Python vers Haskell. Si vous souhaitez en savoir plus sur la langue, Learn You a Haskell for Great Good est un point de départ populaire.
Certains des termes et langages ci-dessus peuvent sembler quelque peu ésotériques si vous n'êtes pas encore un codeur chevronné. C'est bien, car savoir ce que vous ne savez pas est l'une des premières étapes pour devenir un meilleur apprenant.
Certaines des langues énumérées ci-dessus conviennent mieux aux débutants que d'autres. Jetez un œil à notre liste des meilleurs langages de programmation pour débutants. Vous remarquerez qu'il y a un croisement entre les deux listes.
Et si vous êtes intéressé, consultez notre guide pour créer un site Web PHP simple.