# Langage dédié

Un langage dédié (en anglais, domain-specific language ou DSL) est un langage de programmation dont les spécifications sont conçues pour répondre aux contraintes d’un domaine d'application précis. Il s'oppose conceptuellement aux langages de programmation classiques (ou généralistes) comme Java ou C, qui tendent à traiter un ensemble de domaines. Néanmoins, aucun consensus ne définit précisément ce qu'est un langage dédié. Ce manque de définition précise sur la nature d'un langage dédié rend délicate la tâche d'établir un historique clair sur l'origine du concept.
En informatique, les langages dédiés traitent divers domaines informatiques (pilotes informatiques, le calcul scientifique, les bases de données) ou traitent de différents autres domaines où intervient l'informatique (médecine, aéronautique). L'utilisation d'un langage dédié n'est pas propre à l'informatique, il existe des langages dédiés aux domaines de la médecine, de la cuisine, etc..
La construction des langages dédiés diffère fondamentalement de celle d'un langage classique. Le processus de développement peut s’avérer très complexe. Sa conception nécessite une double compétence sur le domaine à traiter et en développement informatique. Qu'il soit langage dédié interne ou externe, la mise en œuvre de ce type de langage requiert l'utilisation de patron de conception. Il existe des patrons de conceptions décrivant l’implémentation comme le décrit Spinellis et décrivant plutôt les phases de développement du langage. Ces deux approches, bien qu'étant fondées sur des idées différentes, se complètent l'une et l'autre.
L'utilisation de langages dédiés présente des avantages et des inconvénients par rapport à l'utilisation de langages généralistes. La justification de l'utilisation de langages dédiés peut se faire en fonction de considérations d'ordre technologique, ou d'ordre financier. D'autre part, les avantages et les inconvénients ne sont pas les mêmes qu'il s'agisse d'un langage dédié interne ou externe.

## Tour d'horizon
### Notion pluridisciplinaire

Il existe des langages dédiés dans d'autres domaines que l'informatique. Les plus connus sont notamment :
* le langage dédié des polices d'assurances ;
* le langage dédié du code civil.
Nous pouvons aussi retrouver des dictionnaires dédiés au langage de la médecine, de la cuisine, de la philosophie, etc..

### Définitions

Un langage dédié à un domaine (en anglais : domain-specific language» ou DSL) fournit une notation orientée à ce domaine d'application. Il est basé sur les concepts et les fonctionnalités du domaine en question. En tant que tel, un langage dédié est un moyen efficace de décrire et de générer des programmes dans un domaine spécifique.
Selon Gilles Muller, un langage dédié est un langage de programmation spécifique à une famille de problèmes donnés appelée « domaine ». Il permet au programmeur de s'assurer de construire un langage approprié et que ce langage réponde aux exigences spécifiques du domaine ciblé$^,$.
Une définition complémentaire est donnée par Deursen, Klint et Visser. Un langage dédié est un langage de programmation ou un langage de spécification exécutable qui offre, à travers des notations appropriées et des abstractions, une puissance expressive axée sur, et généralement limitée à, un domaine spécifique$^,$.

### Langages dédiés internes et externes

Il existe deux types de langages dédiés : les langages dédiés internes, aussi appelés langages enchâssés, ou langages embarqués (en anglais : domain-specific embedded language ou DSEL) et les langages dédiés externes.
Les premiers sont destinés à être utilisés au sein du code source d'un programme, exprimé par ailleurs dans un autre langage qualifié de langage hôte. Les langages qui se prêtent bien à l’accueil d’un langage embarqué sont par exemple : Lisp, Haskell, Tcl…
Les seconds ne sont pas destinés à l'expression supplémentaire au sein d'un autre langage. Les codes sources des programmes qu'ils permettent d'implémenter sont autonomes et indépendants de tout autre langage de programmation$^,$$^,$.
Selon Watt le langage dédié doit avoir certains critères :
* Il doit être universel (c'est-à-dire qu'il doit résoudre tous les problèmes auxquels il est dédié).
* Il doit être implémenté et réalisé sur un ordinateur.
* Il doit avoir une logique naturelle pour résoudre les problèmes.
Un langage dédié peut évoluer en fonction de l'évolution même du domaine d'application. Il arrive aussi qu'un langage dédié évolue pour devenir un langage de programmation généraliste.

## Exemples de langages dédiés à des domaines particuliers

Les domaines d'applications des langages dédiés sont très variés. Ces langages sont néanmoins créés pour effectuer une tâche précise. Les exemples d'usages ci-dessous ne sont qu'une partie très infime des domaines d'applications des langages dédiés.

### Pilote informatique
#### Bossa

    Le langage Bossa est un langage dédié à l'implantation d'ordonnanceurs de systèmes. Bossa facilite l'intégration de nouveaux ordonnanceurs dans des systèmes généralistes (Windows, Linux) et dans le noyau de système d'exploitation.

#### Devil

    Devil (DEVice Interface Language) est un langage dédié à la définition d'interfaces matérielles. Cette approche améliore la robustesse des pilotes de périphériques. À la différence d'un langage généraliste, Devil dispose d'un compilateur qui contrôle automatiquement la cohérence d'une spécification et produit des talons qui incluent des vérifications lors de l'exécution.

### Web
#### HTML

    HTML (HyperText Markup Language) est un langage de balisage destiné à l'écriture de documents contenant des liens hypertextes. Il a été créé au début des années 1990 par Tim Berners-Lee qui en a fait l'annonce sur usenet dans Qualifiers on Hypertext links le 2 août 1991. HTML est soutenu par différents organismes qui en font, en 2011, le langage de référence pour la création de page web.

#### PHP

    Le langage de scripts PHP (Hypertext Preprocessor) est destiné à la production des pages web et à la gestion de bases de données, initialement MySQL. Il a été créé en 1994 par Rasmus Lerdorf. L'apport principal de PHP, par rapport au langage HTML, est de permettre la création de pages web dynamiques.
Exemple de génération de page web avec HTML et PHP:

#### Ruby

    Ruby est un langage dédié interne pour des applications Web. D'après Martin Fowler, Ruby est mis en œuvre comme un langage dédié interne car il a été développé sous Emacs qui lui-même s'appuie sur le langage Emacs Lisp. Le langage Emacs Lisp est donc considéré comme le langage hôte de Ruby. L'intérêt récent de Ruby est de reprendre techniquement la méta-programmation dans les langages dédiés internes.

### Base de données
#### SQL

    Le langage SQL (Structured query language) c'est-à-dire « langage d'interrogation structuré » est à l'origine un langage dédié externe avec Embedded SQL. Il est destiné à interroger ou à manipuler une base de données relationnelle. Il a été développé chez IBM dans les années 1970 par Donald D. Chamberlin et Raymond F. Boyce. Ce langage était initialement nommé SEQUEL.
Exemple de requête SQL dans PHP.

### Calcul scientifique
#### Fortran

    Le Fortran est initialement un langage dédié au calcul scientifique mis au point durant les années 1954-1957 par une équipe d'IBM dirigée par John Backus, prix Turing 1977. Il est le premier langage de programmation de haut niveau et il continue d'évoluer. Depuis la norme Fortran 2003 (ISO/IEC 1539-1:2004), le langage supporte la programmation orientée objet. La norme Fortran 2003 normalise également l'interfaçage avec le langage C, assuré par le module interne ISO_C_BINDING, ce qui permet à un programme Fortran d’accéder facilement aux bibliothèques du langage C et réciproquement au C d'utiliser des bibliothèques Fortran. Et cette interopérabilité a été améliorée avec la norme Fortran 2018 (ISO/CEI 1539-1:2018). Fortran, de langage dédié, évolue donc et tend à devenir un langage généraliste. Ce langage évolue également dans son domaine dédié avec la prise en charge du calcul vectoriel depuis Fortran 95 (ISO/CEI 1539-1:1997) et du parallélisme depuis Fortran 2008 (ISO/CEI 1539-1:2010), afin de s'adapter aux architectures matérielles actuelles.

## Historique et évolution

Il n'y a pas vraiment d'historique sur les langages dédiés car il n'existe pas de réel consensus sur une définition exacte.
Les premiers langages de programmation (Cobol, Lisp, Fortran) sont eux-mêmes considérés comme des langages dédiés bien qu'ils ne soient pas nommés en tant que tel. Ces premiers langages de programmation étaient, de fait, dédiés à un domaine d'application. Avec le développement des possibilités d'applications, les langages ont eu tendance à se généraliser. Parallèlement, la nécessité de langages spécialisés pour résoudre des besoins spécifiques a continué de se faire sentir. Plusieurs solutions ont été trouvées :
* Les bibliothèques spécifiques (librairies) fournissent des sous-routines spécialisées pour un domaine d'application donné.
* Les frameworks orientés objet, dont l'objectif est le même que les bibliothèques spécifiques, sont adaptés à la programmation orientée objet.
* Les langages dédiés à un domaine, qui offrent la possibilité de permettre l'expression dans le domaine d'application ciblé.
Le terme de « langage dédié » serait apparu pour la première fois en septembre 1984, dans une publication de J.M Neighbors. On retrouve ensuite l'idée de langage dédié sous différents noms, notamment « petit langage » (Little language) ou encore « micro langage » en 1986$^,$.En 1996, une conceptualisation du langage dédié est mise en œuvre. Les auteurs y discutent notamment sur le point de vue à adopter entre l'approche « domaine comme un monde réel » (domain as a real world) ou l'approche du « domaine comme un ensemble de systèmes » (domain as a set of systems) pour modéliser un langage dédié.

## Constructions d'un langage dédié

La réalisation de langages dédiés diffère de manière fondamentale de celle des langages de programmation traditionnels. Le processus de développement peut s’avérer très complexe. Il requiert une expertise du domaine concerné, mais aussi une connaissance dans le domaine de la conception des langages de programmation.

### Construction

En pratique, le développement d’un langage dédié n’est pas un simple processus séquentiel mais un processus itératif. Pour que le langage soit le plus proche possible du domaine ciblé, la construction nécessite soit une double compétence (du domaine d'application et de la programmation de langage), soit une collaboration étroite entre l'équipe de programmeurs et les experts du domaine traité.
Diomidis Spinellis (en) et Anthony M Sloane proposent des patterns de conception de langages dédiés.

#### Caractéristique de construction d'un langage dédié

La méthode de caractérisation d'un langage dédié précise qu'il doit être décrit selon deux syntaxes :
* La syntaxe abstraite (Abstract Syntax).
* La syntaxe concrète (Concrete Syntax).
Il doit être construit grâce à ces deux parties, en commençant par l'arbre de la syntaxe abstraite, et compléter par une ou plusieurs branches de la syntaxe concrète.

### Les patterns
#### Les patterns de Spinellis

Les patterns de Spinellis sont principalement liés à l’implémentation des langages dédiés, à la différence des patterns de Sloane qui classifient les phases de développement et de construction d'un langage dédié. Spinellis propose huit design patterns pour les langages dédiés, classés en trois types :

##### Patterns structurels (langages embarqués (piggyback))

    Ces patterns s'intéressent aux interactions entre le langage dédié et les autres langages. Il propose un langage de programmation comme hôte au langage dédié.

##### Patterns comportementaux (pipeline)

    Ces patterns visent à la résolution des problèmes de composition des langage dédiés. Un système peut être décrit en utilisant une famille de langages dédiés en couche, le pipeline est plus précisément l'élément dans lequel l'exécution et le déroulement des instructions de cette famille de langages dédiés sont découpés.

##### Patterns créationnels

    Les langages dédiés sont donc de réels langages de programmation caractérisés par une syntaxe et une sémantique propres. La description de la syntaxe, de la conception, et de la mise en œuvre de ces langages correspond aux six patterns créationnels de Spinellis

   ##### Traitement lexical (Lexical processing)

       Ce modèle de traitement lexical créationnel offre un moyen efficace pour concevoir et mettre en œuvre la syntaxe des langages dédiés ;

   ##### Extension du langage (Langage extension)

       Ce pattern est utilisé pour ajouter de nouvelles fonctionnalités à un langage dédié existant. Souvent un langage existant peut servir efficacement à un besoin nouveau avec l'ajout de quelques nouvelles fonctionnalités à son noyau qui fait de lui un langage de base ;

   ##### Langage de spécialisation (Spécialisation linguistique)

       Ce pattern élimine ou modifie des caractéristiques d'un langage de base (ou généraliste) pour former un langage dédié ;

   ##### Transformation source à source (Source-to-source transformation)

       Le programme du langage dédié est traduit vers un programme équivalent dans un langage généraliste permettant ainsi de réutiliser tous les outils liés à ce langage sans avoir à les modifier ;

   ##### Représentation des structures de données (Data structure representation)

       Les structures complexes sont parfois difficile à exprimer, la conception d'un langage dédié est une solution intéressante pour représenter les données et les structures complexes ;

   ##### Système frontal (System front-end)

       Ce pattern gère la configuration et l'adaptation des fonctionnalités du système des langages dédiés afin de se limiter à celle nécessaire pour créer une application donnée.

#### Les Patterns de Sloane

La conception d’un langage dédié est une tâche difficile, il existe de nombreuses approches principalement liées aux contraintes du domaine. Plusieurs classifications ont été proposées afin de mieux comprendre les motivations et les limites de chacune de ces conceptions comme les patterns de Sloane qui sont classifiés suivant les phases de développement du langage. Les différentes phases de développement de Sloane sont les suivantes :
* Décision : Définir « pourquoi » mettre en place un langage dédié pour ce domaine est pertinent ;
* Analyse : Analyser le domaine et les besoins spécifiques à ce langage, ainsi que les choix technologiques ;
* Conception : Définir l'approche technique de la mise en œuvre du langage ;
* Implantation : Programmer le langage en lui-même ;
* Déploiement : Mettre à disposition le langage dédié ainsi conçu.

## Avantages et inconvénients

En dehors des spécificités des différents langages, l'utilisation de langage dédié par rapport à l'utilisation de langages généralistes présente des avantages et des inconvénients.
Voir Enjeux Économiques pour un complément concernant les implications économiques.

### Avantages

* Les langages dédiés montrent un potentiel intéressant, et non négligeable, en termes de productivité, de réutilisabilité et de fiabilité.
* Ils sont concis et auto-documentés dans une large mesure, et peuvent être réutilisés à des fins différentes.
* Les experts du domaine d'application peuvent plus facilement modifier un programme sans connaissances de programmation dans les langages généralistes.
Avantages des langages dédiés internes
* L'utilisation de langages dédiés internes offre un avantage majeur: cette approche permet de profiter de l’infrastructure et des outils de développement du langage hôte.
* Lors de la création du langage dédié, le développeur n’a pas à définir une grammaire complète, ni à créer les outils de support pour son langage dédié.
Avantage des langages dédiés externes
* Dans un langage dédié externe, la syntaxe du langage pourra représenter tout concept qu'il sera souhaitable d'utiliser avec le domaine ciblé, permettant d'exprimer pleinement ce dernier en utilisant les termes et symboles qui lui sont propres.
* Le langage n'étant pas lié à un langage hôte, il ne devrait pas souffrir de biais de mise en œuvre ou de compromis liés à l'environnement dans lequel il sera intégré, notamment au niveau de la syntaxe ou de la plateforme cible.

### Inconvénients

* Un langage dédié étant, par définition, destiné à être utilisé dans un domaine défini, il peut être moins facile de trouver des exemples de codes sources complétant la documentation que dans le cas de l'utilisation de langages généralistes.
* Le coût lié à la production du langage dédié, à sa maintenance, et à la formation des utilisateurs.
* La difficulté engendrée par le choix du ratio dans la construction entre langages dédiés et langages généralistes.
* Les personnes n'étant pas expertes dans le domaine d'application trouveront peut-être difficile la lecture ou la modification d'un programme écrit dans un langage dédié.
* L'utilisation de langages dédiés peut entrainer la prolifération de langages redondants et non standards, ce qui pose des problèmes de compatibilité et de portabilité.
* Au niveau de la performance, les programmes développés dans des langages dédiés utilisent habituellement moins efficacement le temps processeur par rapport aux langages généralistes disposant généralement de compilateurs optimisant l'exécution ou de machines virtuelles très performantes.

## Enjeux économiques

L'utilisation de langages dédiés à un domaine implique différents enjeux économiques, comme son coût d'apprentissage et son coût de maintenance.
Un des enjeux économiques concerne le temps d'apprentissage du langage. En effet, le coût d'apprentissage d'un langage généraliste peut être plus facilement amorti par la multiplication des domaines d'application traités. Dans le cas d'un langage dédié, le champ d'amortissement est plus réduit en fonction du domaine d'application. Il faut pouvoir mesurer le gain de productivité engendré par son utilisation, et déterminer à quel point ce gain compense le temps d'apprentissage.
D'autre part, l'utilisation des langages dédiés dans l'enseignement se discute également. Il est possible de proposer l'apprentissage d'un langage dédié, dont les étudiants pourraient se servir pour apprendre d'autres langages généralistes. Il est également possible de proposer l'apprentissage de plusieurs langages généralistes pour ensuite être capable d'utiliser des langages dédiés en fonction du domaine d'application.
L'utilisation d'un langage dédié implique son implémentation. Le coût initial de développement du langage est aussi à prendre en compte dans la mesure de l'impact économique. Paul Hudak (en) propose une approche permettant de limiter ce coût initial. Cette approche est fondée sur les langages dédiés enchâssés (internes). Le principe est de profiter de l'infrastructure et des outils de l'environnement de développement d'un langage généraliste.
Un des enjeux économiques est la maintenabilité des programmes produits, ainsi que la possibilité d'évolution du langage. Dans les faits, le coût d'entretien d'un langage dédié est inférieur à celui d'un langage généraliste.