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?
language-design
scripting
dsl
runtime
Jé Queue
la source
la source
Réponses:
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:
la source
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.
la source
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.
la source
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é.
la source
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.
la source