Construire une DSL: Scripté au-dessus d'un langage à usage général ou autonome?

10

Je discute de la conception d'un langage spécifique au domaine pour simplifier un modèle de programmation obscur donné. Une partie du débat est de savoir si le construire (sous forme de script) sur un langage / runtime existant (par exemple Java) ou le rendre autonome (propre compilateur, etc.).

Ceux d'entre vous qui ont une expérience de conception DSL, avez-vous des avantages / inconvénients et / ou une réponse sûre à l'approche appropriée?

Jé Queue
la source
qui est le consommateur de cette DSL? et quels sont les hôtes potentiels (vous avez mentionné Java, envisagez-vous d'autres possibilités)?
Mauricio Scheffer
Je considère toute possibilité pour les hôtes. Le consommateur sera celui qui écrit des programmes asynchrones (messages avec destinations).
Jé Queue

Réponses:

9

Je recommanderais de créer votre DSL au-dessus d'une langue existante (DSL interne). Je l'ai fait plusieurs fois avec Python, créant des systèmes où le consommateur de la DSL écrit un fichier python qui est utilisé comme fichier de configuration pour le système. Le fichier de configuration utilise des constructions (classes, fonctions) que j'ai définies. Ces constructions forment la DSL.

IMO, un langage comme Python (IronPython ou Jython si le système hôte est .NET ou Java) ou Ruby (IronRuby, JRuby) est préférable pour baser votre DSL que Java ou C #.

Dans mon cas, les systèmes hôtes ont également été (C) Python, donc choisir Python pour la DSL a été la chose naturelle.

Quelques pros:

  • Coût de construction inférieur. Il y a beaucoup moins à mettre en œuvre. Vous pouvez vous concentrer sur le problème actuel au lieu de passer du temps à implémenter un analyseur / compilateur / interprète.
  • Accès à la langue hôte: votre langue aura accès à toute la puissance de la langue / plateforme existante.
codeape
la source
Je suis assez indépendant du langage, mais pourquoi pensez-vous que les incarnations de Python sont mieux adaptées?
Jé Queue
1
Mieux adapté que quoi? Je suppose que Ruby et Python ont beaucoup des mêmes avantages, Ruby est peut-être encore mieux adapté à DSL interne en raison de sa syntaxe plus flexible. En ce qui concerne Java et C #, j'ai vu beaucoup d'interfaces fluides dans ces langages (et il y a des constructions dans des versions plus récentes qui facilitent la création / utilisation DSL interne, comme la syntaxe d'initialisation d'objet) - mais IMO, les langages de "cérémonie basse" sont un peu mieux adapté que les langues "haute cérémonie".
codeape
1
J'ai choisi C # pour implémenter une DSL interne précisément pour tirer parti de la vérification de type statique à la compilation "gratuite". Les DSL en langage dynamique ne donnent pas trop d'avantages par rapport aux DSL externes.
Den
@Den, c'est exactement ce qui m'a déçu quand j'ai essayé de faire des iDSL en Python. En Java, votre iDSL a l'impression de bénéficier d'un support instantané de l'IDE. Je n'ai pas trouvé d'IDE qui le fera pour Python.
candied_orange
2

Regardez Xtext (http://www.eclipse.org/Xtext/) et Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). Si les utilisateurs ne sont pas des programmeurs, je ne pense pas que vous devriez baser votre DSL sur un langage de programmation existant. Ce sera trop compliqué pour eux. Une DSL "propre" peut être très efficace si elle est faite correctement.

Henrik
la source
2

Plutôt que de recommander une approche particulière, permettez-moi de recommander les langages spécifiques au domaine de Martin Fowler comme une excellente ressource pour prendre la décision. Il propose un examen approfondi et stimulant des mérites relatifs des DSL internes et externes.

eggyntax
la source
1

Il existe une troisième option - construire un DSL en tant que compilateur au sommet d'un langage à usage général. Tout langage avec un certain degré raisonnable de capacités de métaprogrammation fera le travail, y compris même une chose de bas niveau comme C ++. Je préfère Lisp et des langages similaires pour ce genre de choses, mais Template Haskell ou Nemerle pourrait également offrir le même niveau de flexibilité.

SK-logic
la source
1

Dans son livre "Domain-Specific Languages", Martin Folwer décrit les DSL internes et externes .
Internal DSL= est un sous-ensemble du langage de programmation existant, par exemple Ruby / Java etc.
External DSL= vous définissez une syntaxe et un vocabulaire.
Un DSL externe peut être beaucoup plus expressif, mais peut nécessiter une analyse et une génération de code externes.
Bien qu'un DSL interne ne nécessite pas de traitement supplémentaire, mais est parfois difficile à comprendre pour les experts du domaine hors programmation (par exemple, analystes commerciaux, testeurs).

Lors du choix de votre type de DSL, il est important d'analyser qui sont ses utilisateurs. S'il s'agit principalement de personnes non techniques, une DSL externe peut être un meilleur choix. Pour une petite équipe de programmeurs expérimentés, un DSL interne peut être choisi, si le langage de programmation qu'ils utilisent est suffisamment expressif.

Olha Pavliuk
la source