web-dev-qa-db-fra.com

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

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

Wikipédia:

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é?

97
Srikar Doddi

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

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

105
Charlie Martin

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 le quoi que vous voulez faire, et le plus grand système comprend le comment =.

Les exemples de DSL incluent tous les langages de requête (SQL, XPath, ...), tous les langages de modèles (Django, Smarty, ...), les scripts Shell, notamment des trucs comme twill, un navigateur Web commandé par commande (principalement utilisé pour les tests automatisés ), les langages de stockage et d'échange de données (XML, YAML, ...) et les langages de documents comme LaTex, HTML ou CSS.

Certaines langues avec une syntaxe très flexible comme TCL et LISP construisent leur DSL directement dans la langue ... 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 y a suffisamment de DSL pour toute sorte d'application dont vous pourriez avoir besoin; vous n'avez presque certainement pas besoin d'apprendre à écrire le vôtre.

56
rgz

(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 comme "langage spécifique au domaine" , je pensais aussi que c'était un particulier, langage 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ées à un domaine d'application particulier.

Ironiquement, si vous veniez d'entendre 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.

12
rndmcnlly

Tout est une DSL ...

Assembleur: MOV R1 à R2
Compilateurs: déclarations d'affectation - A = A + 1, conditions - SI (VRAI) ..., branche - RETOUR
HTML: ... décrire une structure imbriquée
TCP/IP: décrire vers/depuis les adresses
PDF: décrire le placement du texte/de l'image sur 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 élémentaires, nous utilisons donc les quelques langues dont nous disposons pour décrire tout ce que nous faisons. "Zip tous les fichiers html dans mon site web" nécessite 300 lignes de 3 ou 4 langues différentes pour terminer.

Pour créer une DSL, déterminez le nombre minimum de caractères nécessaires pour décrire un processus dont vous vous souvenez et qui ne nécessite pas de documentation. N'oubliez pas que la vitesse et la facilité d'utilisation sont les principaux critères de conception. L'analyse est si rapide que toute syntaxe que vous utilisez est très bien, je préfère le langage naturel comme ma syntaxe dans la plupart des cas, "Payer les employés le 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 ne voudrais pas utiliser d'autres solutions qui pourraient être pratiques mais qui ne conviennent pas au problème, comme le HTML 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 portion de facilité d'utilisation, c'est une surpuissance 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 les 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 une DSL qui convient. J'ai défini 6 régions sur la page, HEADER, BODY, FOOTER, LEFT/RIGHT MARGINS et LEFT/RIGHT FULL MARGINS. Je pourrais alors dire au générateur de pages d'ajouter une BARRE DE TITRE, UNE BARRE D'ETAT, 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 taper et faire le langage avec de vrais mots; car ce sont de vraies personnes, des lieux et des choses que nous décrivons.

9
Clif

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 opposé à un langage spécifique au domaine (DSL) est un langage à usage général.

9
Michael Damatov

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 gens des finances dans 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, si c'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.

8
James Black

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

J'aimerais que nous utilisions des langages spécifiques au domaine (DSL) Plus

Dans ce document, je définis une 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é une DSL.

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

4
AdamJonR

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

Étant donné que les langages à usage général sont utilisés à de nombreuses fins, la DSL n'est conçue que pour un domaine spécifique. Comme HTML ou CSS.

Vous pouvez dire si vous avez écrit des instructions sur un document que seule une personne ou votre seul meilleur ami peut comprendre et que personne d'autre ne pourrait comprendre. Il peut alors s'agir d'une DSL. Mais si vous avez écrit des instructions dans de tels termes que beaucoup de gens pourraient comprendre et suivre, 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 souhaite 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 demandé à l'utilisateur de programmer cette carte conformément à ces instructions. Ceci est un exemple de DSL. Je n'ai pas inventé un nouveau langage plutôt que de créer un tas de chaînes que le micro-contrôleur pouvait lire depuis l'EEPROM et pouvait analyser en conséquence et effectuer une tâche spécifique.

4
Abdul Rehman

Un exemple simple pour le langage spécifique au domaine (DSL) est le HTML qui est utilisé pour le domaine particulier appelé applications Web.

3
Anil Kumar

J'ai récemment entendu parler de DSL, mais je trouve un exemple très utile: LUNA (ancien lunascript).

C'est un langage/framework de programmation sur mesure créé par l'équipe Asana pour leur 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 plateformes.

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

3
Abraham Romero

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 profond se stabilise quelque peu (ou même maintenant), j'aimerais voir quelque chose de similaire se produire dans le projet Apache MXnet. Cependant, je n'ai vu aucune proposition à ce sujet sur la page de proposition pour l'instant cependant.

2
Lucas Roberts

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

La communauté est certes en croissance, mais toujours pas au niveau des autres technologies "grand public".

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

Voici une conférence où le conférencier donne quelques exemples de DSL utilisant JetBrains MPS , avec la technologie d'édition de projection: https://vimeo.com/19738145

1
Oscar Rodriguez

DSL - DomainSpecificLanguage

DSL est un langage informatique qui vise un type de problème particulier, plutôt qu'un langage à usage général qui vise tout type de problème logiciel.

Où: configurations (TravisCI .yaml), construire des scripts ( gradle ), décrit une version d'une bibliothèque Pod ( Podspec ), programmation UI ( Anko =) etc.

DSL est une programmation déclarative - Que faire à la place comment faire

Les DSL externes ont leur propre syntaxe personnalisée et vous écrivez un analyseur complet pour les traiter (par exemple XML, RegExp, SQL, HTML, CSS, UML).

Les DSL internes sont des façons particulières d'utiliser un langage hôte pour donner au langage hôte la sensation d'un langage particulier (par exemple LISP, Ruby, Java annotations, macros).

En savoir plus ici , ici

0
yoAlex5