La programmation fonctionnelle avec Scala
L'approche fonctionnelle
Pour mieux présenter le paradigme fonctionnel nous commencerons par un rappel sur le paradigme impératif. C'est le paradigme des premiers langages informatiques. Il reste le paradigme le plus courant aujourd'hui et est présent dans de nombreux langages : C/C++, C#, Pascal, Java, perl…
Rappel sur la programmation impérative
La programmation impérative s'appuie sur le modèle des machines à états. Chaque opération est décomposée en séquences d'instructions exécutées par l'ordinateur pour modifier l'état de la mémoire.
Modifier la mémoire revient à modifier «la machine programme».
La logique impérative établie souvent une correspondance entre le code haut niveau et les instructions processeurs ou le matériel.
Ainsi on observe les correspondances suivantes :
- variables modifiables => cellules mémoires
- assignation => instructions d'enregistrement
- structure de contrôle => jump
Cette correspondance tend à limiter nos abstractions en structures conceptielles qui puissent être décomposées instruction par instruction.
Des 1978 John Backus, créateur du Fortran, regrette ces limitations et dit : «Can programmaing be liberated from the von Neumann Style»
Remarque : Le paradigme objet est souvent abordé en suivant l'angle de fonctionnement du paradigme impératif. Mais il est tout autant compatible avec l'approche fonctionnelle.
Historique
Si le paradigme fonctionnel est un monde nouveau pour beaucoup de développeurs son histoire a presque un siècle.
Toute la théorie repose sur celle du lambda-calcul inventée en 1930 par Alonzo Church. Le lambda-calcul est un système formel qui fonde les concepts de fonction et d'application. Pour le lambda calcul «tout est fonction». L'opération de base est une application : on applique une fonction à des valeurs. Puisque tout est fonctions ces valeurs sont elles même des fonctions.
Partant de cette théorie de nombreux langages fonctionnels sont créés, dont:
- 1959 Lisp le premier langage fonctionnel
- 1990 Erlang créé par la société Erikson, et Haskell langage purement fonctionnel
- 2000 OCaml langage français multiparadigme
- 2003 Scala le sujet de ce site
- 2005 F# reprise d'OCaml par Microsoft pour l'inclure à .Net
Avantages
Nous l'avons vue dans ce bref historique la programmation fonctionnelle a intéressé des grands noms de l'industrie. Grâce à ses nombreux avantages que nous allons aborder ici.
Le paradigme fonctionnel a pour caractéristique : l'absence de «variables» au sens propres. Il existe des valeurs, ou identifiant, correspondant aux constantes des langages impératifs mais aucune variable modifiable. Cette caractéristique induit plusieurs avantages :
- Diminuer le risque d'avoir des effets de bords. Les effets de bords sont les anomalies ou comportements indésirés d'un programme. Ils arrivent généralement quand un code s'exécute alors que la mémoire (et donc les variables) sont dans un état imprévu par le développeur du dit code.
- Simplifier la programmation concurrente en supprimant la problématique des variables partagées et des dead lock s'y rattachant.
- Simplifier pour la même raison la mise à l'échelle d'un même programme sur plusieurs machines.
- «L'évaluation retardée» que nous aborderons plus tard.
Par ailleurs la programmation fonctionnelle permet une écriture souvent concise et élégante.
Enfin c'est une autre approche. Connaître plusieurs paradigmes aide à avoir ou garder un esprit souple capable d'envisager une problématique sous plusieurs angles.
Remarque : Scala étant multi-paradigme il existe des variables modifiables et non modifiables dites mutables et immutables.
Les variables mutables sont déclarées avec le mots clef var, les immutables avec le mot clef val.
Inconvénients
Un bon dessin valant mieux qu'un long discours cette image représente bien l'inconvénient majeur de la programmation fonctionnelle: c'est une approche nouvelle parfois bizarre et «peu naturelle».
Si la programmation fonctionnelle permet d'écrire de manière concise cela ouvre la porte à l'écriture absconde car trop concise.