Même si la terminologie est loin d'être normalisée, une façon courante de classer les principaux paradigmes de programmation en
- De procédure
- Fonctionnel
- Logique
- Orienté objet
- Générique
Vous semblez déjà savoir à quoi ressemble la programmation procédurale.
Dans les langages fonctionnels , les fonctions sont traitées comme des objets de première classe. En d'autres termes, vous pouvez passer une fonction en tant qu'argument à une autre fonction, ou une fonction peut renvoyer une autre fonction. Le paradigme fonctionnel est basé sur le calcul lambda, et des exemples de langages fonctionnels sont LISP, Scheme et Haskel. Fait intéressant, JavaScript prend également en charge la programmation fonctionnelle.
Dans la programmation logique , vous définissez des prédicats qui décrivent les relations entre les entités, telles que president(Obama, USA)
ou president(Medvedev, Russia)
. Ces prédicats peuvent devenir très compliqués et impliquer des variables, pas seulement des valeurs littérales. Une fois que vous avez spécifié tous vos prédicats, vous pouvez poser des questions à votre système et obtenir des réponses logiquement cohérentes.
La grande idée de la programmation logique est qu'au lieu de dire à l'ordinateur comment calculer les choses, vous lui dites ce que sont les choses. Exemple: PROLOG.
Le paradigme orienté objet est à certains égards une extension de la programmation procédurale. Dans la programmation procédurale, vous avez vos données, qui peuvent être des types primitifs, comme des entiers et des flottants, des types composés, comme des tableaux ou des listes, et des types définis par l'utilisateur, comme des structures. Vous avez également vos procédures, qui opèrent sur les données. En revanche, dans OO, vous avez des objets, qui incluent à la fois des données et des procédures. Cela vous permet d'avoir de belles choses comme l'encapsulation, l'héritage et le polymorphisme. Exemples: Smalltalk, C ++, Java, C #.
La programmation générique a été introduite pour la première fois dans Ada en 1983 et s'est généralisée après l'introduction de modèles en C ++. C'est l'idée que vous pouvez écrire du code sans spécifier les types de données réels sur lesquels il opère et demander au compilateur de le comprendre. Par exemple au lieu d'écrire
void swap(int, int);
void swap(float, float);
....
tu écrirais
void swap(T, T);
une fois, et que le compilateur génère du code spécifique pour tout ce qui T
pourrait être, quand swap()
est réellement utilisé dans le code.
La programmation générique est prise en charge à des degrés divers par C ++, Java et C #.
Il est important de noter que de nombreux langages, tels que C ++, prennent en charge plusieurs paradigmes. Il est également vrai que même lorsqu'un langage est censé prendre en charge un paradigme particulier, il peut ne pas prendre en charge toutes les fonctionnalités du paradigme. Sans oublier qu'il y a beaucoup de désaccords quant aux fonctionnalités requises pour un paradigme particulier.