Creazione di una DSL: script in cima a un linguaggio generico o autonomo?


10

Sto discutendo della progettazione di un linguaggio specifico di dominio per semplificare un dato modello di programmazione oscuro. Parte del dibattito è se costruirlo (come uno script) su un linguaggio / runtime esistente (es. Java) o renderlo autonomo (proprio compilatore, ecc.).

Quelli di voi con esperienza di progettazione DSL, avete pro / contro e o una risposta sicura all'approccio appropriato?


chi è il consumatore di questo DSL? e quali sono i potenziali host (hai menzionato Java, stai considerando altre possibilità)?
Mauricio Scheffer,

Considero qualsiasi possibilità per gli host. Il consumatore sarà chi scrive programmi asincroni (messaggi con destinazioni).
Jé Queue,

Risposte:


9

Consiglio di creare il tuo DSL su una lingua esistente (DSL interno). L'ho fatto alcune volte con Python, creando sistemi in cui il consumatore del DSL scrive un file Python che viene utilizzato come file di configurazione per il sistema. Il file di configurazione utilizza costrutti (classi, funzioni) che ho definito. Questi costrutti formano il DSL.

IMO, un linguaggio come Python (IronPython o Jython se il sistema host è .NET o Java) o Ruby (IronRuby, JRuby) è migliore per basare il tuo DSL rispetto a Java o C #.

Nel mio caso anche i sistemi host sono stati (C) Python, quindi scegliere Python per DSL è stata la cosa naturale.

Alcuni professionisti:

  • Minori costi di costruzione. C'è molto meno da implementare. È possibile concentrarsi sul problema attuale invece di dedicare tempo all'implementazione di un parser / compilatore / interprete.
  • Accesso alla lingua host: la tua lingua avrà accesso a tutta la potenza della lingua / piattaforma esistente.

Sono un linguaggio agnostico, ma perché pensi che le incarnazioni di Python siano più adatte?
Jé Queue,

1
Più adatto di cosa? Immagino che Ruby e Python abbiano molti degli stessi vantaggi, Ruby è forse ancora più adatto per DSL interno a causa della sua sintassi più flessibile. Per quanto riguarda Java e C #, ho visto molte interfacce fluide in quei linguaggi (e ci sono costrutti nelle versioni più recenti che rendono più semplice la creazione / l'uso di DSL interni, come la sintassi dell'inizializzatore di oggetti) - ma IMO le lingue "low cerimonia" sono leggermente più adatto delle lingue "alta cerimonia".
codeape

1
Ho scelto C # per implementare un DSL interno proprio per sfruttare il controllo del tipo statico "libero" in fase di compilazione. I DSL in linguaggio dinamico non offrono troppi vantaggi rispetto ai DSL esterni.
Den

@Den è esattamente quello che mi ha deluso quando ho provato a fare iDSL in Python. In Java il tuo iDSL sembra ricevere un supporto immediato dall'IDE. Non ho trovato un IDE che lo farà per Python.
candied_orange,

2

Guarda Xtext (http://www.eclipse.org/Xtext/) e Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). Se gli utenti non sono programmatori, non credo che dovresti basare il tuo DSL su un linguaggio di programmazione esistente. Sarà troppo complicato per loro. Un DSL "pulito" può essere molto efficiente se fatto correttamente.


2

Piuttosto che raccomandare un approccio particolare, consentitemi di raccomandare le lingue specifiche del dominio di Martin Fowler come una risorsa eccellente per prendere la decisione. Ha un esame approfondito e stimolante dei meriti relativi dei DSL interni ed esterni.


1

C'è una terza opzione: creare un DSL come compilatore in cima a un linguaggio generico. Qualsiasi linguaggio con un ragionevole grado di capacità di metaprogrammazione farà il suo lavoro, inclusa anche una cosa di basso livello come C ++. Preferisco Lisp e linguaggi simili per questo tipo di cose, ma Template Haskell o Nemerle potrebbero fornire lo stesso livello di flessibilità.


1

Nel suo libro "Lingue specifiche del dominio", Martin Folwer descrive DSL interne ed esterne .
Internal DSL= è un sottoinsieme del linguaggio di programmazione esistente, ad esempio Ruby / Java, ecc.
External DSL= si definisce una sintassi e un vocabolario.
Un DSL esterno può essere molto più espressivo, ma può richiedere un analisi esterna e generazione di codice.
Mentre un DSL interno non richiede un'ulteriore elaborazione, ma a volte è difficile da capire per gli esperti di dominio non programmatori (ad esempio analisti aziendali, tester).

Quando si sceglie il tipo di DSL, è importante analizzare chi sono i suoi utenti. Se sono per lo più persone non tecniche, una DSL esterna può essere una scelta migliore. Per un piccolo team di programmatori esperti può essere scelto un DSL interno, se il linguaggio di programmazione che usano è abbastanza espressivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.