Pour rappel, le seul langage compris par la machine est l'assembleur et cela entraîne des problèmes pour le programmeur :
Les programmeurs ont alors pensé à créer des langages dit de haut niveau, l'idée est de s'éloigner des contraintes du matériel pour écrire un programme de façon "universelle". Il y a des gradations dans ce "haut niveau", par exemple le langage C qui a ses débuts était considéré de haut niveau est maintenant considéré comme étant de bas niveau (en effet on doit gérer la mémoire de façon manuelle). Au final il faut traduire le programme en assembleur, cela se fait soit par compilation (tout d'un coup) soit de manière interprétée (à la volée).
Il existe énormément de langages différents, ils sont souvent spécialisés à certaines taches (Scratch pour la pédagogie, C pour la performance pure, C++ pour les jeux...). Les langages différent par la syntaxe mais aussi le paradigme c'est à dire la façon de penser la programmation. le tableu suivant présente des exemples de paradigme.
Paradigme | Idée | Exemples |
---|---|---|
Impératif | Utiliser des variables, en Python l'instruction a = a + 2 est typiquement de style impératif. on envisage le programme comme une succession d'état mémoire | Pratiquement tous les "vieux" langages C, C++, Java, Python. |
Structuré | Eviter des sauts dans le programmes (comme le jaz de Cardiac, mais sur les vieux langages il existe des commandes goto ou lbl), on peut utiliser pour cela des instructions for ou While ou faire de la récurrence. Quand on utilise trop le goto on fait de la programmation spaghetti. | Pratiquement tous les langages courants actuels C, C++, Java, Python, dans les années 80 le langage Basic était très utilisé par les amateurs et utilisait le goto . |
Procédural | Séparer le programme en petit morceaux (fonctions), la lecture est simple (si vous donnez des bons noms aux fonctions), le code est court, la maintenance pratique et on peut regrouper des fonctions dans des modules ou bibliothéque) pour réutiliser le travail plus tard (programmation modulaire) | Pratiquement tous les langages courants actuels. |
Objet | Evolution de la programmation procédurale, pour simplifier on associe aux objets les fonctions qui sont associées. Voir plus loin. | Pratiquement tous les langages modernes. |
Fonctionnel | A ne pas confondre avec le fait de créer des fonctions dans un programme, en programmation fonctionnelle on cherche à éviter les "effet de bord" et pour ça on évite les variables (a = a+1 n'a pas de sens en programmation fonctionnelle ou alors c'est un test) | Beaucoup des "nouveaux" langages. Ocaml, Haskell, F#, Rust |
Certains paradigmes se marient bien (la programmation impérative et procédurale par exemple) d'autres sont contraires (impérative et fonctionnelles par exemple).
Enfin certains langages sont volontairement adaptés à certains paradigmes, Ocaml est fait pour la programmation fonctionnelle par exemple, y faire de l'impératif est compliqué.
Python autorise de nombreux paradigmes et on peut très bien faire une partie d'un programme en programmation fonctionnelle et une autre en impérative par exemple (mais bon mélanger les styles peut nullifier les avantages des paradigmes).
Tous les paradigmes permettent à la fin de faire les mêmes choses (n’oubliez pas que tous les programmes sont convertis en Assembleur, donc dans un langage bas niveau, impératif et non structuré) cependant ils peuvent simplifier le travail, permettre une meilleure maintenance, permettre une réutilisation aisée, simplifier le travail en groupe, éviter certaines erreurs...
La programmation fonctionnelle est la programmation à la "mode", un des ses atouts est d'éliminer les effets de bords (modifications du contenu d'une variable) qui amènent souvent des erreurs difficiles à corriger.
Programmer en fonctionnelle est assez différents de la programmation impérative classique, il faut "réapprendre" à programmer.
En programmation fonctionnelle on utilise souvent la récursivité, mais on peut aussi utiliser la récursivité en programmation impérative, en programmation fonctionnelle il n'y a pas de 'variables', on peut placer des valeurs dans des conteneurs constants (a = 2) mais on n'a pas la possibilité de la modifier (a = a + 1 n'existe pas de la programmation fonctionnelle).
Comme déjà mentionné, on peut faire les mêmes choses dans tous les langages de programmations, le résultat peut être plus ou moins compliqué ou plus ou moins rapide à l’exécution, ou plus ou moins consommateur d'énergie ou de mémoire mais au final le résultat sera le même. Par exemple voici le tri par insertion et par sélection en programmation fonctionnelle (attention c'est personnel et peu optimisé).
La programmation fonctionnelle fait aussi un gros usage des fonctions, que l'on peut utiliser comme variable dans une autre fonction et même comme retour d'une fonction, par exemple la fonction suivante prend une fonction en entrée et retourne la même fonction en affichant le temps d’exécution en plus.
Les instructions map, filter et reduce sont très utilisées en programmation fonctionnelle, cela dit en python la construction par compréhension est très pratique.