Programmation déclarative : lorsque l’objectif est plus important que le déroulement

Lors de la programmation d’une application, d’un logiciel IdO ou d’un jeu vidéo, avant même l’écriture des premières lignes de code, les développeurs doivent sélectionner le langage de programmation qu’ils souhaitent utiliser. Plusieurs choix s’offrent à eux. Avec du recul, on se rend toutefois compte que tous ces langages sont répartis en deux paradigmes de programmation de base : la programmation déclarative et la programmation impérative.

Qu’est-ce que la programmation déclarative ?

Bien que ce paradigme ne soit pas clairement défini, toutes les définitions s’accordent sur un point : la caractéristique des langages de programmation déclarative est qu’ils décrivent toujours le résultat final souhaité, plutôt que d’énoncer les différentes étapes à mettre en œuvre. Dans le cadre de la programmation déclarative, pour atteindre l’objectif énoncé, les étapes de résolution sont déterminées de manière automatique. Cela fonctionne bien dès lors que les spécifications du résultat final sont clairement définies et qu’il existe une procédure d’exécution adaptée. Le cas échéant, la programmation déclarative est des plus efficaces.

Dans la mesure où la programmation déclarative ne définit pas clairement le « déroulement », mais fonctionne à un niveau d’abstraction très élevé, le paradigme de programmation laisse en outre une marge d’optimisation. Si un meilleur procédé d’exécution est mis au point à l’avenir, l’algorithme intégré le découvrira et l’appliquera. Ce paradigme est ainsi très évolutif : lors de l’écriture du code, la marche à suivre pour atteindre le résultat n’est pas définie de manière fixe.

Les langages de programmation déclarative les plus connus sont :

  • Prolog
  • Lisp
  • Haskell
  • Miranda
  • Erlang
  • SQL (au sens large)

Les différents langages de programmation peuvent encore être répartis en deux paradigmes : les langages de programmation fonctionnelle et les langages de programmation logique.

Au quotidien, les limites entre ces langages sont bien souvent floues. Tant les éléments de programmation impérative et leurs sous-catégories de programmation procédurale, modulaire et structurée, que ceux de programmation déclarative peuvent être appliqués à la résolution de problèmes.

Comparaison entre les programmations impérative et déclarative

Le paradigme de programmation impérative (paradigme axé sur les commandes) est le paradigme de base le plus ancien des deux. À l’inverse de la programmation déclarative, le développeur définit ici précisément, dans le code source, chacune des étapes à exécuter par l’ordinateur pour aboutir au résultat. Le « déroulement » prime. Cette approche se retrouve, par exemple, dans les langages de programmation Java, Pascal ou C. La programmation déclarative, au contraire, se concentre directement sur l’« objectif » à atteindre.

Voici un exemple d’application dans le domaine du montage de meubles : alors que la programmation impérative s’apparente à une notice de montage, la programmation déclarative donne pour modèle une image du meuble fini.

Plutôt que de laisser une marge d’exécution par l’utilisation de différentes fonctions, la programmation impérative utilise des variables qui sont transformées en durée d’exécution. Le code est plus long, mais aussi plus facile à comprendre que la forme abrégée et très abstraite du style déclaratif.

Exemple de programmation déclarative

Une force de la programmation déclarative est sa capacité à décrire les problèmes de manière plus abrégée et synthétique que les langages impératifs.

Pour obtenir une liste de prénoms, la programmation déclarative, comme le montre l’exemple, peut, dans le PHP, décrire en une seule ligne de code ce que la procédure impérative décrirait en cinq lignes.

Programmation impérative

$Listeparticipants = [1 => 'Pierre', 2 => 'Paul', 3 => 'Sarah'];
$prénom = [];
foreach ($Listeparticipants as $id => $nom) {
    $prénom[] = $nom;
}

Programmation déclarative

$prénom = array_values($Listeparticipants);

Avantages et inconvénients des langages de programmation déclarative

De nos jours, la programmation déclarative est utilisée dans un grand nombre de cas, même si elle n’est alors pas toujours employée dans sa forme la plus pure. Cependant, cette approche n’est pas adaptée à toutes les utilisations.

Le code déclaratif se distingue par un niveau d’abstraction élevé. Les développeurs peuvent ainsi écrire des programmes complexes sous forme synthétique. Le cas échéant, plus l’application est volumineuse, plus le code risque d’être imbriqué au point de ne plus être lisible que par son développeur d’origine. Pour les entreprises gérant et souhaitant poursuivre le développement d’applications de manière indépendante, cette situation représente un danger. Les développeurs tiers doivent en effet déployer de gros efforts pour déchiffrer le code déclaratif, en comprendre la structure et résoudre les problèmes.

Cela dit, le niveau d’abstraction de la programmation déclarative présente également des avantages. L’exécution étant clairement séparée du système par un algorithme, la maintenance peut être exécutée indépendamment du développement de l’application. Au quotidien, les perturbations d’exploitation sont réduites au minimum. Dans le même temps, l’optimisation du code est plus simple, car l’algorithme utilisé est suffisamment ouvert pour permettre le recours à de nouvelles méthodes. L’inconvénient de l’utilisation d’un algorithme : dans certaines circonstances, une solution formelle peut n’aborder que partiellement des caractéristiques spécifiques de différents cas d’application.

Cela ne représente pas forcément un inconvénient en tant que tel, mais s’impose comme un défi dans le modèle de pensée de la programmation déclarative. Penser en termes de solution va à l’encontre du processus de pensée humaine naturelle. Les hommes ont tendance à réfléchir aux étapes de processus menant à un objectif, plutôt qu’à partir de l’objectif pour remonter jusqu’à la situation initiale. Les développeurs doivent ici changer leur mode de pensée, ce qui, dans un premier temps, peut ralentir la résolution de problèmes. Mais une fois cette nouvelle approche acquise, il est enfin possible d’exploiter au maximum les atouts de l’approche déclarative.

Le développement d’une solution à partir de la description d’un problème présente également l’avantage de permettre aux équipes d’esquisser assez rapidement des modèles de solution. La programmation concrète de l’exécution peut en outre avoir lieu à une étape ultérieure. Le style déclaratif est particulièrement adapté au prototypage dans le cadre du développement de logiciels agiles.

Avantages Inconvénients
Code plus court et plus efficace Parfois difficile à comprendre par des tiers
Exécutable par des méthodes encore inconnues au moment de la programmation Se fonde sur un modèle de pensée inhabituel pour l’homme (état de la solution)
Optimisation facile, grâce à la gestion de l’exécution par algorithme Les caractéristiques de différents cas d’application ne peuvent que difficilement être prises en considération dans la programmation
Maintenance possible indépendamment du développement de l’application  

Au jour le jour, on utilise souvent des combinaisons de ces paradigmes, les langages de programmation déclarative étant alors généralement complétés par des méthodes impératives. Cela peut toutefois augmenter la probabilité d’erreur et affecter la lisibilité du code.