Un langage dédié ( DSL ) est un langage informatique spécialisé dans un domaine d'application précis . Il se distingue des langages généralistes (GPL), largement applicables à divers domaines. Il existe une grande variété de DSL, allant des langages couramment utilisés pour des domaines communs, comme HTML pour les pages web, aux langages utilisés par un ou quelques logiciels seulement, comme le softcode MUSH . Les DSL peuvent être subdivisés selon leur type et comprennent les langages de balisage dédiés, les langages de modélisation dédiés (ou plus généralement, les langages de spécification ) et les langages de programmation dédiés. Les langages informatiques spécialisés ont toujours existé, mais l'expression « langage dédié » s'est popularisée avec l'essor de la modélisation dédiée . Les DSL les plus simples, notamment ceux utilisés par une seule application, sont parfois appelés, de manière informelle, mini-langages .
La frontière entre langages généralistes et langages de domaine n'est pas toujours nette. Un langage peut posséder des fonctionnalités spécifiques à un domaine donné, tout en étant applicable plus largement, ou inversement, être en principe largement applicable, mais en pratique principalement utilisé dans un domaine spécifique. Par exemple, Perl a été initialement développé comme langage de traitement de texte et d'interface, pour le même domaine qu'AWK et les scripts shell , mais a ensuite été principalement utilisé comme langage de programmation généraliste. À l'inverse, PostScript est un langage Turing-complet et peut en principe être utilisé pour n'importe quelle tâche, mais est en pratique principalement utilisé comme langage de description de pages .
Utiliser
La conception et l'utilisation de DSL appropriés constituent un élément clé de l'ingénierie de domaine , en utilisant un langage adapté au domaine concerné. Cela peut consister à utiliser un DSL ou une licence GPL existante, ou à développer un nouveau DSL. La programmation orientée langage considère la création de langages spécialisés pour exprimer les problèmes comme une étape standard du processus de résolution de problèmes. Créer un langage dédié à un domaine (avec un logiciel pour le prendre en charge), plutôt que de réutiliser un langage existant, peut s'avérer judicieux si ce langage permet d'exprimer un type de problème ou de solution spécifique plus clairement qu'un langage existant et si ce type de problème se rencontre fréquemment. Concrètement, un DSL peut être spécialisé pour un domaine problématique spécifique, une technique de représentation de problème spécifique, une technique de résolution spécifique ou d'autres aspects d'un domaine.
Aperçu
Un langage dédié est créé spécifiquement pour résoudre des problèmes dans un domaine particulier et n'est pas conçu pour résoudre des problèmes en dehors de ce domaine (bien que cela soit techniquement possible). À l'inverse, les langages généralistes sont créés pour résoudre des problèmes dans de nombreux domaines. Le domaine peut également correspondre à un secteur d'activité. Voici quelques exemples de secteurs d'activité :
- polices d'assurance-vie (développées en interne par une grande entreprise d'assurance)
- simulation de combat
- calcul de salaire
- facturation
Un langage dédié se situe entre un langage de programmation très restreint et un langage de script , et est souvent utilisé de manière analogue à une bibliothèque de programmation . La frontière entre ces concepts est assez floue, tout comme celle qui existe entre les langages de script et les langages généralistes.
En matière de conception et de mise en œuvre
Les langages de domaine sont des langages (ou plus souvent, des syntaxes ou grammaires déclarées) conçus et implémentés avec des objectifs très précis. Un langage de domaine peut être un langage de diagramme visuel, comme ceux créés par le Generic Eclipse Modeling System , une abstraction de programmation, comme l' Eclipse Modeling Framework , ou un langage textuel. Par exemple, l'utilitaire en ligne de commande grep possède une syntaxe d'expressions régulières permettant de rechercher des motifs dans des lignes de texte. L' utilitaire sed définit une syntaxe pour la recherche et le remplacement d'expressions régulières. Ces langages, souvent très simples, peuvent être utilisés conjointement dans un shell pour réaliser des tâches de programmation plus complexes.
La frontière entre les langages de domaine et les langages de script est parfois floue, mais les langages de domaine sont souvent dépourvus de fonctions de bas niveau pour l'accès au système de fichiers , le contrôle interprocessus et d'autres fonctions caractéristiques des langages de programmation complets, qu'ils soient de script ou non. De nombreux langages de domaine ne sont pas compilés en bytecode ou en code exécutable, mais en différents types d'objets multimédias : GraphViz exporte en PostScript , GIF , JPEG , etc., tandis que Csound est compilé en fichiers audio et qu'un langage de domaine de lancer de rayons comme POV-Ray est compilé en fichiers graphiques.
Langages de définition de données
Un langage de définition de données comme SQL présente un cas intéressant : il peut être considéré comme un langage spécifique à un domaine car il est spécifique à un domaine spécifique (dans le cas de SQL, l’accès et la gestion des bases de données relationnelles), et est souvent appelé depuis une autre application, mais SQL possède plus de mots-clés et de fonctions que de nombreux langages de script, et est souvent considéré comme un langage complet, en partie à cause de la prévalence de la manipulation de bases de données en programmation et du niveau de maîtrise nécessaire pour être expert dans ce langage.
Pour brouiller encore davantage cette frontière, de nombreux langages spécifiques à un domaine possèdent des API exposées, et peuvent être accessibles depuis d'autres langages de programmation sans interrompre le flux d'exécution ni appeler un processus séparé, et peuvent ainsi fonctionner comme des bibliothèques de programmation.
Outils de programmation
Certains langages dédiés à un domaine s'enrichissent au fil du temps d'outils de programmation complets, ce qui complexifie la question de leur nature spécifique ou non. Le langage fonctionnel XSLT (Extensible Stylesheet Language Transformation ), conçu initialement pour transformer un graphe XML en un autre, en est un bon exemple. Depuis sa création, il a été étendu pour permettre (notamment dans sa version 2.0) diverses interactions avec le système de fichiers, la manipulation de chaînes de caractères et de dates, ainsi que le typage des données.
En ingénierie dirigée par les modèles , on trouve de nombreux exemples de langages spécifiques à un domaine, comme OCL ( Object Constraint Language ), un langage permettant d'enrichir les modèles avec des assertions, ou QVT (Query/View/Transformation ), un langage de transformation spécifique à un domaine. En revanche, des langages comme UML ( Unified Modeling Language ) sont généralement des langages de modélisation généralistes.
En résumé, une analogie est utile : un langage très restreint est comme un couteau, qui peut servir de mille façons, de la préparation des aliments à l’autodéfense. Un langage dédié est comme une perceuse électrique : un outil puissant aux multiples usages, mais dans un contexte précis, à savoir percer des trous. Un langage généraliste est un établi complet, doté de divers outils pour réaliser diverses tâches. Les langages dédiés sont destinés aux programmeurs qui, face à leur établi actuel, constatent qu’ils ont besoin d’une meilleure perceuse et trouvent dans un langage dédié la solution idéale.
Sujets linguistiques spécifiques à un domaine
Langues spécifiques au domaine externes et intégrées
Les DSL implémentés via un interpréteur ou un compilateur indépendant sont appelés langages de domaine externes . TeX et AWK en sont des exemples bien connus. Une autre catégorie, appelée langages de domaine intégrés (ou internes), est généralement implémentée au sein d'un langage hôte sous forme de bibliothèque et tend à être limitée à la syntaxe de ce langage, bien que cela dépende des capacités de ce dernier.
Modèles d'utilisation
Il existe plusieurs modèles d'utilisation pour les langages spécifiques à un domaine :
- Traitement avec des outils autonomes, invoqués par une opération directe de l'utilisateur, souvent sur la ligne de commande ou à partir d'un Makefile (par exemple, grep pour la correspondance d'expressions régulières, sed, lex, yacc , l' ensemble d'outils GraphViz , etc.).
- Langages spécifiques à un domaine, implémentés à l'aide de systèmes de macros de langages de programmation, et qui sont convertis ou étendus en un langage hôte généraliste lors de la compilation ou en temps réel.
- Comme
Parmi les exemples de langages de programmation spécifiques à un domaine, on peut citer HTML , Logo pour le dessin de type crayon, les langages de description de matériel Verilog et VHDL , MATLAB et GNU Octave pour la programmation matricielle, Mathematica , Maple et Maxima pour les mathématiques symboliques , le langage de spécification et de description (SD-L) pour les systèmes réactifs et distribués, les formules et macros de tableur , SQL pour les requêtes de bases de données relationnelles , les grammaires Yacc pour la création d'analyseurs syntaxiques , les expressions régulières pour la spécification d'analyseurs lexicaux , le système de modélisation générique Eclipse (GEMS) pour la création de langages de diagrammes, Csound pour la synthèse sonore et musicale, et les langages d'entrée de GraphViz et GrGen , des logiciels utilisés pour la mise en page et la réécriture de graphes , le langage de configuration HashiCorp utilisé pour Terraform et d'autres outils HashiCorp, et Puppet qui possède également son propre Langage GameMaker