Qu'est-ce qu'une langue spécifique à un domaine? Quelqu'un l'utilise? Et de quelle manière?


107

Je suppose que je cherche une sorte d'intro et que je vois si quelqu'un l'a utilisée. Y a-t-il des avantages particuliers à l'utiliser?

Wikipédia:

Le langage spécifique au domaine (DSL) est un langage de programmation ou un langage de spécification dédié à un domaine de problème particulier, à une technique de représentation de problème particulière et / ou à une technique de solution particulière.

Quelqu'un peut-il donner des exemples spécifiques de la façon dont vous l'avez mis en œuvre ou comment il peut être utile dans un scénario donné?


En fait, le langage spécifique au domaine est un terme avec une signification bien définie dans la programmation - consultez l'article wikipedia
1800 INFORMATIONS

Comme indiqué ci-dessous, DSL n'est pas une langue, mais le nom de toute une classe de langues à usage spécial.
dmckee --- ex-moderator chaton

Alors, puis-je dire que R est un DSL?
Srikar Doddi

2
Sur le bord, mais je ne le ferais pas. R a toutes les structures à usage général et est utilisé pour une large gamme de calculs; les calculs numériques et les statistiques ne sont pas un domaine très restreint. C'est cependant un bon test de la définition.
Charlie Martin

Réponses:


114

Un langage spécifique à un domaine est un langage écrit pour traiter un domaine ou un ensemble de préoccupations spécifiques. Il y en a beaucoup, comme make, ant et rake pour décrire les versions de logiciels, ou lexx et yacc pour la construction de langage. Ces dernières années, ils sont devenus populaires car certaines choses se sont combinées pour les rendre plus faciles à construire. La popularité croissante de Ruby, qui possède plusieurs fonctionnalités qui facilitent la création de nouveaux DSL, est l'une de ces choses.

Martin Fowler est un grand partisan de l'idée, comme ici .


4
Quelles sont les fonctionnalités de Ruby qui facilitent la création d'un nouveau DSL?
Lernkurve

2
@Lernkurve - Ruby avait une métaprogrammation, ce qui aide. rubylearning.com/blog/2010/11/23/…
James Black

@CharlieMartin pourriez-vous s'il vous plaît me faire part de "groovy"? de quel type de langage s'agit-il exactement? Je veux savoir s'il vous plaît aider ici ..
G dangi

2
Groovy est un langage de script qui s'exécute dans une JVM. Il est essentiellement destiné à être une réponse Java à Ruby. C'est un langage à usage général, mais il peut être utilisé pour écrire des DSL. docs.groovy-lang.org/docs/latest/html/documentation/…
Charlie Martin

1
Je voudrais ajouter le groovy de Gradle. Si je ne me trompe pas, ils ont leur propre langage décrivant une construction.
Neon Warge

67

Vous pouvez considérer les DSL comme des arguments trop complexes pour des fonctions écrites dans un langage de programmation plus général. Le vrai langage de programmation analyse le code DSL et fait quelque chose avec lui, généralement, le code DSL se concentre uniquement sur ce que vous voulez faire, et le plus grand système comprend comment .

Les exemples de DSL incluent tous les langages de requête (SQL, XPath, ...), tous les langages de modèle (Django, Smarty, ...), les scripts shell, en particulier des éléments comme le twill, un navigateur Web piloté par les commandes (principalement utilisé pour les tests automatisés ), les langages de stockage et d'échange de données (XML, YAML, ...) et les langages de document comme LaTex, HTML ou CSS.

Certains langages avec une syntaxe très flexible comme TCL et Lisp construisent leur DSL directement dans le langage ... lorsque cela est possible. La majorité des langues utilisent des chaînes, généralement chargées à partir de fichiers externes.

Y a-t-il des avantages particuliers à les utiliser? Les utiliser aux fins prévues est très avantageux au point que vous vous tournerez vers eux sans le savoir, tout comme vous avez utilisé (je présume) SQL ou HTML sans les considérer comme des DSL.

J'oserai dire qu'il existe suffisamment de DSL pour tout type d'application dont vous pourriez avoir besoin; vous n'avez presque certainement pas besoin d'apprendre à écrire le vôtre.


1
Assez drôle, le seul exemple que vous n'avez pas énuméré est le premier auquel je pense: regex
CoffeeTableEspresso

12

(abordant le nœud de la question)

Je pense que la première fois que j'ai vu DSL quelque part et sa définition en tant que "langage spécifique à un domaine", j'ai aussi pensé que c'était un langage particulier et concret dont je n'avais tout simplement pas entendu parler - mais non, c'est un terme général pour les langues qui sont adapté à un domaine d'application particulier.

Ironiquement, si vous aviez entendu parler de TCL comme "langage de commande d'outil", vous pourriez penser, comme les DSL, qu'il y aurait beaucoup de TCL pour divers outils - mais non, c'est le nom spécifique d'un langage de script particulier.


10

Je pense que c'est un langage adapté pour résoudre des problèmes pour un domaine spécifique. Il peut s'agir d'un langage de traitement de règles ou d'un langage de description de service.

Un contraire à un langage spécifique à un domaine (DSL) est un langage à usage général .


10

Tout est un DSL ...

Assembleur: MOV R1 à R2
Compilateurs: instructions d'assignation - A = A + 1, conditionnelles - IF (TRUE) ..., Branch - RETURN
HTML: ... décrire une structure imbriquée
TCP / IP: décrire vers / depuis adresses
PDF: décrire le placement du texte / de l'image sur le papier
Polices: décrire les caractères

Tout langage que nous utilisons pour décrire un processus spécifique est un DSL. Malheureusement, il y a un manque de langages spécifiques au domaine pour décrire même nos processus les plus basiques, nous utilisons donc les quelques langages dont nous disposons pour décrire tout ce que nous faisons. "Compresser tous les fichiers html de mon site Web" nécessite 300 lignes de 3 ou 4 langues différentes pour compléter.

Pour créer un DSL, déterminez le nombre minimum de caractères nécessaires pour décrire un processus dont vous pouvez vous souvenir et qui ne nécessite pas de documentation. N'oubliez pas que la rapidité et la facilité d'utilisation sont les principaux critères de conception. L'analyse est si rapide que toute syntaxe que vous utilisez est correcte, je préfère le langage naturel comme syntaxe dans la plupart des cas, "Payer les employés au premier du mois", mais le domaine spécifique est juste que, spécifique au domaine, vous déterminez la syntaxe qui convient le mieux correspond au problème.

Je resterais loin d'utiliser d'autres solutions qui pourraient être pratiques mais qui ne correspondent pas au problème, comme le HTML qui a été utilisé pour définir les données (XML). CSV est très utile, il convient à la plupart des problèmes. JSON ne correspond pas à la facilité d'utilisation, c'est exagéré qui ajoute des complications inutiles si CSV fonctionne pour la plupart des problèmes. Nous utilisons beaucoup EXCEL pour DSL, cela fonctionne très bien pour décrire de petits problèmes, sous 65K à 1M lignes, comme une arborescence ou des menus, la colonne A est le niveau, les autres colonnes sont des icônes, des couleurs, des étiquettes et autres (EXCEL est un CSV modifiable).

J'ai trouvé que HTML ne résolvait pas vraiment le problème de la mise en page, alors je m'en suis débarrassé et j'ai défini un DSL qui convient. J'ai défini 6 régions sur la page, EN-TÊTE, CORPS, PIED DE PIED, MARGES GAUCHE / DROITE et MARGES PLEINES GAUCHE / DROITE. Je pourrais alors dire au générateur de page d'ajouter une BARRE DE TITRE, UNE BARRE D'ÉTAT, DES MENUS, UN TABLEAU, DES FORMULAIRES, ..., à des cellules spécifiques. Chacune de ces cellules pourrait ensuite être divisée en lignes et colonnes à n'importe quelle profondeur. La mise en page prend quelques secondes pour n'importe quel style.

BODY contient une table de mes employés
HEADER contient une légende de la barre de titre «Hello World» avec connexion à Collins Software

Un menu DSL ne correspond pas à la mise en page DSL, j'ai donc créé un DSL unique pour les menus.

Ressource Mon menu principal
* définir: menu, m, niveau, étiquette, icône, action;
m, 0, fichier;
m, 1, open, open.gif, Dialog Open File;

Chaque problème est unique, l'ordinateur peut utiliser n'importe quel format, c'est l'humain pour lequel les DSL sont conçus, alors rendez-le compréhensible par les humains, quelque chose qu'ils peuvent saisir, et faire le langage de vrais mots; car ce sont de vraies personnes, des lieux et des choses que nous décrivons.


8

Un DSL est un bon moyen de développer un langage à utiliser par des non-programmeurs. Par exemple, si vous avez un DSL pour les financiers d'une entreprise, alors plutôt que de programmer selon leurs spécifications, vous pouvez simplement les laisser écrire le programme qu'ils veulent faire. Ensuite, s'il est trop lent, vous pouvez prendre ce qu'ils ont écrit qui fonctionne comme ils le souhaitent, l'écrire dans un langage compilé pour l'accélérer.


5

Bien! il y a beaucoup de choses expliquées ci-dessus. J'essaierai d'expliquer cela d'une manière beaucoup plus simple comme quelqu'un comme moi le comprendra.

Comme les langages à usage général sont utilisés à des fins vastes, le DSL n'est conçu que pour un domaine spécifique. Comme HTML ou CSS.

Vous pouvez dire si vous avez écrit des instructions sur un papier que seule une personne ou votre seul meilleur ami peut comprendre et personne d'autre ne le peut. Ensuite, il peut s'agir d'un DSL. Mais si vous avez écrit des instructions dans des termes que beaucoup de gens pourraient comprendre et pourraient suivre, alors ce n'est pas DSL.

J'ai créé une carte de commutation pour l'utilisateur qui pourrait être exploitée via le port série d'un ordinateur et l'utilisateur veut un programme pour cette carte qui pourrait être exécuté sur cette carte et les commutateurs de relais seront activés et désactivés en conséquence. J'ai donc écrit quelques instructions et ai dit à l'utilisateur de programmer cette carte selon ces instructions. Ceci est un exemple de DSL. Je n'ai pas inventé un nouveau langage plutôt que j'ai juste créé un tas de chaînes que le microcontrôleur pouvait lire à partir de l'EEPROM et pourrait analyser en conséquence et pourrait effectuer une tâche spécifique.


4

J'ai écrit un bref article de blog expliquant pourquoi j'aime utiliser les DSL:

Je souhaite que nous utilisions des langages spécifiques au domaine (DSL) Plus

Dans celui-ci, je définis un DSL comme:

Un petit langage de programmation spécialement conçu pour communiquer des solutions pour un domaine particulier de problèmes.

En termes d'utilisation, si vous avez déjà utilisé Ant, Structured Query Language (SQL) ou Cascading Style Sheets (CSS), vous avez utilisé un DSL.

J'aime utiliser les DSL parce qu'ils se concentrent sur la facilitation de la communication de solutions à des espaces de problèmes spécifiques, et ils le font d'une manière qui favorise l'inclusion d'experts du domaine.


3

Un exemple simple de langage DSL (Domain Specific Language) est le HTML qui est utilisé pour le domaine particulier appelé applications Web.


3

J'ai récemment entendu DSL mais trouve un exemple vraiment utile: LUNA (ancien lunascript).

C'est un langage / cadre de programmation sur mesure créé par l'équipe Asana pour sa propre plate-forme.

Comme je le constate en outre, de nombreuses entreprises créent leurs propres cadres et langages afin de créer un avantage concurrentiel approprié, voici quelques exemples:

  • SAP avec AbAp
  • PeopleSoft avec PeopleCode
  • Apple avec Objective-C
  • Facebook a des choses comme FBML et FQL

Ce sont des domaines spécifiques car vous les utiliserez presque exclusivement pour travailler sur ces plates-formes.

J'espère que cette réponse vous aidera à clarifier le concept.


3
Objective-C n'est pas un langage spécifique à un domaine
boraseoksoon

Il n'a pas non plus été fabriqué par (et pour) Apple.
Alexander Rossa

2

Un exemple de DSL utilisé dans le Machine Learning est patsy en python: https://patsy.readthedocs.io/en/latest/formulas.html#

qui est basé sur la formule DSL de R: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

et Hadley a une belle section de son livre R avancé qui décrit comment construire un DSL avec R: http://adv-r.had.co.nz/dsl.html

Une fois que le domaine de l'apprentissage en profondeur se sera quelque peu stabilisé (ou même maintenant), j'aimerais voir quelque chose de similaire se produire dans le projet Apache MXnet. Cependant, je n'ai encore vu aucune proposition à ce sujet sur la page de proposition .


1

Les langages spécifiques à un domaine expriment vos processus et connaissances de domaine dans un langage qui utilise directement les concepts et la logique de votre domaine particulier.

La communauté est en pleine croissance, mais toujours pas au niveau des autres technologies «grand public».

La plupart du temps, les DSL sont conçus pour améliorer la productivité au sein des entreprises, afin qu'ils restent privés et ne partagent pas leurs résultats / perspectives.

Voici une conférence où l'orateur donne quelques exemples de DSL utilisant JetBrains MPS , avec la technologie d'édition Projectional: https://vimeo.com/197381453


1

DSL - langage spécifique au domaine. Commençons par le domaine - le domaine est une zone définie, une portée. Ce domaine peut être une apparence de site Web, et vous avez pour cela CSS et le second domaine peut être une structure de site Web, et ici vous avez HTML.

Mais, le domaine peut également être l'application Company X. Et dans le cadre de ce domaine, un langage peut être créé. Le langage ne veut pas dire - chose entièrement parfumée avec son propre gramma, syntaxe, compilateur ou runtime. DSL peut être juste une liste d'outils qui résolvent les problèmes de domaine.

Considérons la POO et son modèle pour représenter les objets de domaine par des classes et des méthodes comme ces comportements d'objets. Si nous créons une telle structure et donnons des comportements à ces objets, nous pouvons alors écrire un code en utilisant ces concepts. Considérez cet exemple de pseudo-code:

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

Dans quelle mesure la GPL (langage à usage général) et la terminologie et les outils spécifiques au domaine sont-elles. C'est un mélange de deux, mais toutes les commandes sont ici spécifiques au domaine. Cela dit, nous pouvons dire que ci-dessus est écrit en DSL où le domaine est une application x.

À l'avenir avec cet exemple, je peux créer des outils encore plus abstraits, et effectuer principalement le flux de contrôle par ces outils, considérez (c'est plus de FP, mais j'espère que vous comprenez ce que je veux dire):

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

Comme vous pouvez le voir, j'ai pu faire beaucoup d'abstraits et utiliser cette abstraction pour effectuer le flux de contrôle. Et tout est basé sur GPL et fonctionne dans le cadre de la GPL.

Pour révéler la vérité, nous écrivons tous DSL, chaque abstraction spécifique à un domaine que vous pouvez utiliser est gentille. Mais la plupart de ces abstractions ne sont pas des solutions complètes, c'est pourquoi nous tentons de ne pas utiliser ce mot trop souvent. Mais si vous avez un ensemble d'outils, de fonctions qui abstraits votre domaine, ils forment un peu DSL.

Ce qui est aussi DSL, beaucoup de choses, par exemple tout cadre qui fournit un ensemble de règles est DSL. Si vous voyez que quelqu'un prétend être un développeur React, vous savez qu'il est un développeur spécifique au domaine, car React est exactement DSL, ce qui est une alternative à l'utilisation de la plate-forme Web native. Si vous pouvez composer des fonctionnalités à partir d'outils spécifiques au domaine existants, vous écrivez à l'aide de DSL. En allant plus loin dans React, désolé tous les gens qui ne sont pas de ce DSL: D, vous pouvez créer un ensemble de composants et les composer comme des blocs de construction, et hurra !, maintenant vous avez créé DSL au-dessus de DSL.

Oui répété DSL trop de fois ici, désolé.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.