Langage dédié

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

Un langage dédié (Domain specific language) est un langage de programmation dont les spécifications sont dédiées à un domaine d'application précis. Il s'oppose conceptuellement aux langages de programmation classiques (ou généralistes) comme le java ou le 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[Note 1]) ou traite de différents autres domaines où intervient l'informatique (médecine, aéronautique[Note 1]). L'utilisation de 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[Note 2]...

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[modifier | modifier le code]

Notion pluridisciplinaire[modifier | modifier le code]

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[1] ;
  • le langage dédié du code civil[2].

Nous pouvons aussi retrouver des dictionnaires dédiés[3] au langage de la médecine, de la cuisine, de la philosophie, etc[Note 1].

Définitions[modifier | modifier le code]

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[4].

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é[5],[Note 3].

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[6],[Note 4].

Langages dédiés internes et externes[modifier | modifier le code]

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[7], [8], [9].


Langage dédié interne
Langage dédié externe


Selon Watt le langage dédié doit avoir certains critères [10] :

  • 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[11].

Exemples de langages dédiés à des domaines particuliers[modifier | modifier le code]

Les domaines d'applications des langages dédiés sont très variés. Ces langages sont néanmoins créés pour effectuer une tache 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[modifier | modifier le code]

Article principal : Pilote informatique.
Bossa 
Le langage Bossa[12] 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[5].
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[13].

Web[modifier | modifier le code]

Article principal : Web.
HTML 
L'HTML (HyperText Markup Language) est un langage de balisage dédié à 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. L'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[14]
PHP 
Le langage de scripts PHP (Hypertext Preprocessor) est dédié à la production des pages web et à la gestion de bases de données, initialement MySQL. Il a été créé en 1994 par Rasmus Lerdorf[15].

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:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>  
        /* entre les Balises <?php ?>, du code PHP inclut dans du code HTML */  <title><?php echo 'Hello World'; ?></title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 </head>
 <body>      /* entre les Balises <?php ?>, du code PHP inclut dans du code HTML */
  <p><?php echo 'Hello World'; ?></p>
 </body>
</html>


Ruby 
Le Ruby est un langage dédié interne pour des applications Web [16]. 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[17].

Base de données[modifier | modifier le code]

Article principal : 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 [18]. 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[19].

Exemple de requête SQL dans PHP.

<?php
// Requete SQL à l'intérieur d'une variable PHP
$query  = "SELECT id, name FROM products ORDER BY name ;";
// PostgreSQL
$result = pg_query($conn, $query);
// MySQL
$result = mysql_query($query);
?>

Calcul scientifique[modifier | modifier le code]

Fortran 
Le Fortran est initialement un langage dédié au calcul scientifique[20] créé en 1956 par une équipe dirigée par John Backus. Il est le premier langage de programmation et il continue encore d'évoluer. En 2003, avec la version Fortran 2003 (ISO/IEC 1539-1:2004), le langage supporte la programmation orientée objet. De plus, avec cette version, l'interfaçage avec le langage C est assurée par le module interne ISO_C_BINDING, ce qui lui permet d’accéder aux bibliothèques du langage C. Fortran, de langage dédié, évolue donc et tend à devenir un langage généraliste[21].

Historique et Evolution[modifier | modifier le code]

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[6].

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[11]. 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 à continuer à 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é[11].

Le terme de «langage dédié» serait apparu pour la première fois en septembre 1984, dans une publication de J.M Neighbors[22]. 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[11],[23].En 1996, une conceptualisation du langage dédié est mise en œuvre[24]. 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ème" (domain as a set of systems) pour modéliser un langage dédié[25].

Constructions d'un langage dédié[modifier | modifier le code]

La réalisation de langages dédiés diffère de manière fondamentale de celle des langages de programmation traditionnels[26]. 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[27].

Construction[modifier | modifier le code]

En pratique, le développement d’un langage dédié n’est pas un simple processus séquentiel mais un processus itératif[28]. 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é [29] 

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[modifier | modifier le code]

Article principal : Patron de conception.

Les patterns de Spinellis[modifier | modifier le code]

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[30], classés en trois types[30] :

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.
Relation entre les Patterns de Spinellis

Les Patterns de Sloane[modifier | modifier le code]

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[31] :

  • 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[modifier | modifier le code]

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 Économique pour un complément concernant les implications économiques.

Avantages[modifier | modifier le code]

  • Les langages dédiés montrent un potentiel intéressant, et non négligeable, en termes de productivité, de réutilisabilité et de fiabilité[32].
  • Ils sont concis et auto-documentés dans une large mesure, et peuvent être réutilisés à des fins différentes[33].
  • Les experts du domaine d'application peuvent plus facilement modifier un programme sans connaissances de programmation dans les langages généralistes[34].

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[7].
  • 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é[7].

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[8].
  • 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[8].

Inconvénients[modifier | modifier le code]

  • 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[11].
  • La difficulté engendrée par le choix du ratio dans la construction entre langages dédiés et langages généralistes[11].
  • 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é[35].
  • 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é[34].
  • 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[11].

Enjeux économiques[modifier | modifier le code]

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 économique 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[11].

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[36].

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[7].

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[4].

Notes[modifier | modifier le code]

  1. a, b et c Liste non exhaustive.
  2. . La diversité des langages dédiés correspond à celle de leurs domaines d'applications
  3. En anglais : A domain-specific language (DSL) is a programming language dedicated to a given family of problems, known as a domain
  4. En anglais : A domain-specific language (DSL) is a programming language or executable specification language that offers, through appropriate notations and abstractions, expressive power focused on, and usually restricted to, a particular problem domain.

Références[modifier | modifier le code]

  1. site gouvernement du Quebec 2002, p. 1
  2. De Broglie 2004, p. 1
  3. Lexilogos 2000, p. 1
  4. a et b Mernik 2005, p. 317
  5. a et b Muller 2004, p. 437
  6. a et b Deursen 2000, p. 26
  7. a, b, c et d Hudak 1996, p. 1
  8. a, b et c Strembeck 2009, p. 1267
  9. Fowler 2009, p. 13
  10. Watt 1990, p. 9
  11. a, b, c, d, e, f, g et h Deursen 2000, p. 27
  12. Muller 2009, p. 1
  13. Reveillere 2000, p. 4
  14. w3c 2004, p. 1
  15. Lerdorf 2002, p. 11
  16. Jon Bentley 1986, p. 711
  17. Martin Flower 2005
  18. Zachary Smith 2011, p. 358
  19. Chamberlin 1970, p. 249-250
  20. Backus 1965, p. 2-3
  21. Standard Fortran 2003
  22. Neighbors 1984, p. 564-565
  23. Bentley 1986, p. 712
  24. Simos 2000, p. 28
  25. Deursen 2000, p. 29
  26. Spinellis 2001, p. 91
  27. Heering 2005, p. 316
  28. Mernik 2005, p. 316-319
  29. Langlois 2008, p. 2-3
  30. a et b Spinellis 2001, p. 93
  31. Mernik 2005, p. 320-335
  32. Tolvanen 2008, p. 448
  33. Ladd 1994, p. 169-178
  34. a et b vardanega 2009, p. 1
  35. Freudenthal 2010, p. 65
  36. Hill 2004, p. 224-225

Bibliographie[modifier | modifier le code]

Livres[modifier | modifier le code]

(en) Organization domain modelling : Technical Report STARS-VC-A025/001/00, Synquiry Technologies,‎ 1996, 509 p. (lire en ligne)

Articles scientifiques[modifier | modifier le code]

  • (en) Donald D. Chamberlin et Raymond F. Boyce, « SEQUEL: A STRUCTURED ENGLISH QUERY LANGUAGE », Document,‎ 1974, p. 249-264 (lire en ligne)
  • (en) Eric Tullio Vardanega et Eric Miotto, « On the integration of domain-specific and scientific bodies of knowledge in Model Driven Engineering », Adams project, vol. 1, no 1,‎ juin 2000, p. 1-7 (lire en ligne)
  • (en) Arie van Deursen, Paul Klint et Joost Visser, « Domain-specific languages: an annotated bibliography », SIGPLAN Not., vol. 35, no 6,‎ juin 2000, p. 26-36 (DOI 10.1145/352029.352035, lire en ligne)
  • (en) Rasmus Lerdorf et Kevin Tatroe, « Programming PHP », livre,‎ 2002, p. 11 (lire en ligne)
  • (en) Laurent Réveillère, Fabrice Mérillon, Charles Consel, Renaud Marlet et Gilles Muller, « The Devil Language », Document,‎ 2000, p. 1-14 (lire en ligne)
  • (en) J.M Neighbors, « The Draco approach to constructing software from reusable components », Software Engineering, IEEE Transactions on., vol. 10, no 5,‎ septembre 1984, p. 564-574 (DOI 10.1109/TSE.1984.5010280)
  • (en) Julia L. Lawall, Anne-Françoise Le Meur et Gilles Muller, « On Designing a Target-Independent DSL for Safe OS Process-Scheduling Components », .,‎ 2004, p. 436–455 (DOI 10.1007/b101929, lire en ligne)
  • (en) Martin Fowler, « A pedagogical framework for domain-specifie languages », International Journal of Software Engineering and Knowledge Engineering, vol. 26,‎ 2009, p. 13–14 (ISSN 0740-7459, lire en ligne)
  • (en) David Bruce, « What makes a good domain-specific language? APOSTLE, and its approach to parallel discrete event simulation », Journal of Systems and Software, vol. 56, no 1,‎ 1997, p. 91-99 (DOI 10.1.1.56.4176)
  • (en) Mark Strembeck et Uwe Zdun, « An approach for the systematic development of domain specifie languages », Software: Practice and Experience, vol. 39,‎ août 2009, p. 1235–1311 (ISSN 2153-1292, DOI 10.1002/spe.v39:15, lire en ligne)
  • (en) Martin Fowler, « Language Workbenches: The Killer-App for Domain Specific Languages? », SIGPLAN.,‎ juin 2005 (lire en ligne)
  • (en) John M. D. Hill et Kenneth L. Alford, « A Distributed Task Environment for Teaching Artificial Intelligence with Agents », journal SIGCSE,‎ 2004, p. 224-228 (lire en ligne)
  • (en) Marjan Mernik, Jan Heering et Anthony :M. Sloane, « When and how to develop domain-specific languages », SIGPLAN Not., vol. 37,‎ décembre 2005, p. 316–344 (DOI 10.1145/1118890.1118892, lire en ligne)
  • (en) D. A. Ladd et J. C. Ramming, « Two application languages in software production », USENIX Very HighLevel Languages Symposium Proceedings,‎ 1994, p. 169-178 (lire en ligne)

Sites webs de référence[modifier | modifier le code]

Liens externes[modifier | modifier le code]