Language Oriented Programming
La programmation orientée langage
Présentation
La notion de programmation orientée langage a été introduite par Donald E. Knuth dans The Computer Journal (May 1984), dans un article nommé "Literate programming". Le terme quant à lui a environ 10 ans et c´est à M. Ward qu´on le doit, dans son ouvrage du même nom : "Language Oriented Programming".
Toute l´idée repose sur le fait que transposer les idées en notions du langage (boucles, classes, méthodes, conditions) est compliqué. Ainsi, la programmation orientée langage (LOP) cherche à simplifier la programmation en permettant la manipulation de notions du problème que l’on souhaite résoudre, et plus en mettant à disposition de l´utilisateur des notions et des concepts propres à l´ordinateur et à son mode de fonctionnement.
En quelques mots, la LOP c´est :
- Une façon de penser objet, car la LOP propose de manipuler des objets, mais cette fois ce ne sont pas de simples outils qui, assemblés, permettront d´approcher un concept réel, mais bien une idée, un concept qui existe et qui a un rapport avec le problème à traiter.
- La réutilisation, qui est une grande force de la LOP. Même si, comme on le verra plus loin, il peut être lourd de mettre en place un Domain Specific Language, la puissance et la spécificité accrue de ceux-ci permet de les réutiliser pour chaque problème de même domaine que l´on souhaite résoudre.
En quelques mots, la LOP ce n’est pas :
- La solution à tout, car la LOP s´emploie dans un cadre très précis, dans un domaine particulier. C´est pourquoi de nombreux problèmes plus généraux ne pourront trouver de solution avec la LOP.
- Un langage de programmation, mais plutôt une technique de programmation. La LOP propose une façon de concevoir un logiciel qui passe par la création d´un langage de programmation spécific, le DSL. Il n´existe donc pas une implémentation de LOP, mais c´est au programmeur de créer ce dont il a besoin pour s´adapter au domaine dans lequel se situe le problème à résoudre.
En pratique
Habituellement, la programmation s´inscrit dans le schéma suivant :

L´idée
Tout d´abord, un besoin génère une tâche à réaliser. Ce besoin peut être une demande d´un client ou une nécessité d´accomplir une tâche complémentaire en vue d´en réaliser une plus globale.
Penser
Une fois que le programmeur sait ce qu´il doit faire, il réalise dans son esprit un modèle conceptuel. Ce modèle correspond à sa représentation du problème mais aussi de la solution qui l´accompagne. Etant purement mentale, cette solution ne tient pas compte de spécificités et limitations inhérentes à quelque contrainte technique que ce soit. A ce stade, la solution que le programmeur envisage peut être expliquée à un autre programmeur en utilisant le langage haut niveau dont nous disposons. Pour exprimer ses idées, le développeur peut utiliser des concepts et des idées liés au problème.
Choisir
A présent, le développeur peut choisir un langage de programmation afin de mettre en oeuvre la solution qu´il a imaginé. Le choix se porte souvent sur un GPL, qui offre de nombreuses possibilités. Comme nous l´avons vu précédemment, la diversité des possibilités est également ce qui freine et complique le développement.
Réaliser
Enfin vient la phase de réalisation. Le programmeur va devoir tenter de faire correspondre ses idées, simples à manipuler pour lui, en opérations qui n´ont aucun rapport avec son problème ou sa solution, mais que l´ordinateur pourra appréhender. Il est difficile de faire correspondre le modèle conceptuel, exprimé à l’aide d’idées et de concepts réels, en données compréhensibles par la machine, puisqu’on ne pense pas de la même façon.
Le réel problème est donc bien dans cette phase de réalisation, et c´est cette partie du processus que la LOP propose d´alléger. Avec la LOP, un développement se déroule de la façon suivante :

L´idée
On retrouve la phase où la tâche à réaliser est identifiée.
Penser
Tout comme précédemment, cette étape, dans laquelle la machine ne joue aucun rôle, subsiste. Le programmeur trouve un modèle conceptuel qui lui permet de répondre au besoin énoncé.
Choisir ou créer
Ici se situe le premier changement. Alors qu´avant on choisissait un GPL pour réaliser le concept, il faut à présent soit choisir un DSL existant,
soit en créer un nouveau.
Dans le cas où on souhaiterait s´attaquer à un problème d´un domaine qui a déjà été traité, alors il suffit de réutiliser
le DSL mis en place précédemment; les concepts du domaine mis en place grâce à ce DSL pourront être de nouveau utilisés dans le cas présent.
En revanche si aucun DSL n´a encore été créé pour répondre à des besoins dans ce domaine, alors il convient d´en créer un nouveau. On peut avoir le
sentiment qu´on a uniquement déplacé la difficulté depuis la phase de réalisation vers cette phase de choix. Cependant ce n´est pas le cas puisque
même s´il est certain que créer un DSL n´est pas une tâche aisée, c´est très vite rentabilisé lors des utilisations ultérieures du DSL. De plus, une
fois mis en place, le DSL nous permet de gagner énormément de temps au cours de la phase de réalisation.
Réaliser
C´est cette phase qui profite de toute la puissance des DSL. La correspondance entre le modèle conceptuel et le DSL est relativement simple et rapide ! Il n´est plus question de s´encombrer de boucles et autres concepts d´ordinateur; on manipule des concepts similaires à ceux que l´on manipule dans notre esprit lorsqu´on pense au problème ou à la solution. Le programmeur peut ainsi facilement et rapidement créer le programme qui répond à son besoin, mais en plus permettre une relecture et une compréhension ultérieures aisées.
Créer un DSL semble difficile, mais on peut être grandement aidé par des outils. C´est pourquoi il est souvent intéressant de passer un peu de temps à concevoir l´outil qui pourra réduire et faciliter considérablement de développement.Quand l´utiliser ?
On l´a vu, la LOP ne peut pas être appliquée quelle que soit la situation. En effet, cette pratique répond à des besoins ciblés. Afin de déterminer s´il est ou non justifié d´utiliser cette façon de procéder, le programmeur peut se poser les questions suivantes :
Le programme concerne-t-il un problème en particulier ?
L´idée principale de la LOP est d´utiliser un langage précis pour répondre à un problème bien déterminé. Déterminer si le problème est bien ciblé ou non peut aider à choisir si la LOP peut être envisagée. Un programme qui doit répondre à plusieurs questions dans des domaines trop diversifiés peut parfois être réalisé à l´aide de plusieurs DSL, donc en utilisant la LOP. Cependant, on constate que lorsqu´une réponse à un problème est trop vague, peu précise, qu´elle ne s´applique pas à un domaine précis, la LOP n´est pas la meilleure solution. Il faut garder à l´esprit qu´avec la LOP, on ne cherche pas à résoudre des problèmes qui sortiraient d´un domaine bien particulier.
Le programme fera-t-il partie d’une suite ?
Une suite de logiciels est un ensemble de programme partageant tant de caractéristiques qu’il est possible de l’étudier comme un tout. Cet ensemble devient alors un domaine à part entière, et on peut envisager la LOP afin d´apporter une réponse aux problèmes concernant ce domaine. Par exemple, les drivers pour un certain type de périphériques; ils partagent tous les mêmes opérations, bien qu’ils varient suivant le matériel.
Avantages
Grande productivité de développement
Des concepts et processus très haut niveau et complexes peuvent être exprimés simplement avec le bon DSL. Cela permet de développer rapidement les concepts puisqu´ils correspondent facilement avec le langage que l´on utilise. Le temps entre le moment où on sait comment faire et où on le fait effectivement s´en voit considérablement réduit.
Cette aisance dans la manipulation du langage, basé sur des concepts facilement appréhendable, est amplifiée par la légèreté du langage. Puisque seules les fonctionnalités relatives au domaine ont besoin d’être mises en place, on n´encombre pas le programmeur d´artifices de programmation généraux qui ne concernent pas son problème et on n´entrave donc pas sa pensée et son développement.
Facilement maintenable
Ce qui affecte le plus la maintenance d´un code est sa taille. Puisque la LOP permet de manipuler des objets "réels" et des concepts concrets, la taille du code est largement réduite. La maintenance et la compréhension du code s´en voit grandement améliorée.
De plus, d´ordinaire, des décisions de design (représentation de données, structure de fichier, algorithmes…) sont éparpillées à travers le code. Il n´est pas rare de trouver un algorithme "cassé" en plusieurs classes, car chacune a une sous-responsabilité bien précise qui ne peut pas "conceptuellement" être accolée aux autres. Les impacts en cas de modification ou de bug sont difficilement déterminables, d´autant qu´un concept est ainsi difficile à suivre à travers les différents appels de méthodes... En LOP les décisions sont souvent localisées à un endroit du système car liées à un concept et d’implémentation très petite.
Extrêmement portable
A l’instar de Java, pour porter le langage vers un nouveau système il suffit de modifier l’outil qui le manipule, pas le langage ni le programme lui-même. Un DSL établit peut donc être utilisé dans toutes circonstances, que l´on modifie le code qui l´utilise, la plate-forme qui l´exécute...
Possibilité de réutilisation
Une fois un DSL établit, comme nous l´avons vu précédemment, il est possible de le réutiliser. Pourquoi réinventer la roue ? Si l´on dispose déjà d´un langage capable de manipuler et représenter des concepts haut niveau correspondant au domaine à manipuler, alors autant le réutiliser ! C´est le paradigme de l´informatique.
Système améliorable par l’utilisateur
Le programmeur est un expert dans son domaine. Il sait dialoguer avec l´ordinateur, et c´est ce qui manque généralement aux experts dans leur domaine qui souhaitent se faire comprendre d´une machine. Ces deux acteurs peuvent s´aider : grâce à ses compétences, le programmeur peut mettre à disposition de son collègue un langage afin de simplifier les traitements qu´il veut réaliser; quant à lui, l´expert peut faire utiliser ses connaissances pour répondre au problème initial en se servant de l´outil mis à disposition par le programmeur.
Mais la LOP va encore plus loin que cette entraide. Un système créé à partir de plusieurs DSL peut très bien être modifié par un expert dans le domaine qu’on étudie. Cet expert peut en effet disposer d´un DSL dont le but serait de permettre l´amélioration du DSL qu´il utilise régulièrement afin de le faire correspondre et évoluer en permanence avec le domaine dans lequel évoluent les problèmes qui lui sont posés. L´utilisateur est alors partie prenante de la solution qu´on lui propose, et il peut créer le produit qui l´aidera le mieux.
Inconvénients
Façonner correctement un DSL est difficile
Afin de créer un DSL efficace, il faut à la fois bien connaître le domaine, mais aussi posséder de solides compétences en programmation. C´est pourquoi il n´est pas aisé de créer un DSL et pourquoi il est parfois effrayant de penser à utiliser cette technique.
Nécessité de créer ses outils
Rappelons que le principe de la LOP est d´utiliser notre propre langage. Il faut donc créer les outils qui permettent de l’utiliser, le débugger et le rendre exécutable. C´est ici que réside la lourdeur et la difficulté de cette pratique, puisqu´il faut créer tout ce qui existe déjà pour les GPL. Néanmoins, il ne faut pas perdre de vue le fait que des outils existent afin d´aider à la création et à la modification de DSL.
Risque de s’éloigner des contraintes d’efficacité
La LOP permet de manipuler des idées, des concepts et des objets les plus proches de la pensée qui soient. Le problème avec une telle pratique c´est que plus on s´éloigne de la machine, moins on peut tenir compte de ses contraintes. Ainsi, s´il ne "coûte" rien à l´homme de manipuler un concept haut niveau dans son esprit, un traitement similaire par une machine peut être très coûteux en temps, car elle n´est pas conçue pour fonctionner avec des termes aussi évolués. C´est pourquoi l´un des gros risques de la LOP est de ne plus réussir à prendre en compte les contraintes d´efficacités liées à tout problème informatique. Trouver l´équilibre entre efficacité d´exécution et simplicité de mise en oeuvre est une tâche extrêmement ardue et il faut bien souvent sacrifier l´un des deux (en général l´efficacité) si l´on souhaite parvenir à une solution de LOP convenable.