2010-07-22 9 views
5

Ragazzi ... Ragazze, sto lavorando a un progetto che ritengo possa essere migliorato implementando un linguaggio specifico di dominio per definire un insieme di regole e/o condizioni per un certo tipo di flusso di lavoro.Primi passi con DSL su Java?

Voglio avere una solida conoscenza dell'argomento, i fondamenti, le migliori pratiche, ecc. Specialmente come implementarli in qualche modo con Java.

Che cosa suggerisci?

+2

Suggerimento serio: implementarlo utilizzando Groovy, Scala o Clojure. – Mike

+0

Ciò dipende totalmente dalla complessità con cui vorresti che fosse la DSL. – NawaMan

+0

+1 per non utilizzare Java per questo. Se mai, userei Ruby (o JRuby). – cletus

risposta

8

Prima Mi raccomando di leggere il capitolo 9 (Notation) di The Practice of Programming da Kernighan e Pike.

Quando hai finito, torna qui con domande specifiche su come mappare i concetti in quel capitolo a progetti specifici per i problemi che vuoi risolvere.

Lo schema di base è scrivere un interprete che ha passato un argomento 'comando', ed eventualmente un argomento 'ambiente' ed esegue il comando (nell'ambiente). Hai quindi la possibilità di scrivere un parser, che accetta una stringa 'script' e la converte in un oggetto 'comando' valido (ad esempio un DSL esterno); oppure fornisci una libreria per aiutare gli utenti a costruire esplicitamente l'oggetto 'comando' nella stessa lingua che stai usando (internal-DSL).

Kernighan e Pike fanno un buon lavoro nel mostrare quanto sia banale e complesso un interprete. Se si desidera una maggiore profondità, suggerirei di leggere The Essentials of Programming Languages di Daniel Friedman et al. Che crea almeno un interprete diverso per capitolo e dimostra come implementare funzionalità come variabili, funzioni, ambiti, oggetti, classi, tipizzazione statica e continuazioni.

Tuttavia, suggerirei di provare prima una semplice DSL, altrimenti è solo una teoria - un libro è molto più interessante quando è reso pertinente e pratico dalla tua precedente esperienza.

+0

Nel caso in cui non fossi chiaro, il mio suggerimento è: 1. Leggi il capitolo 9 di The Practice of Programming. 2. Provare a implementare un semplice DSL 3. Porre domande specifiche quando si incontrano problemi 4. Leggere gli elementi essenziali dei linguaggi di programmazione quando si inizia a voler includere funzionalità nel DSL che sono più "programmabili come", vale a dire . variabili, funzioni, ambiti, ecc ... – Recurse

+0

Divertente, ho aperto la pag. 216 di quel libro, e ho pensato di fare una ricerca su google per "notazione" e i nomi dell'autore e questo è venuto fuori. Sono molto entusiasta di leggere questo capitolo (e ho ottenuto solo il libro per $ 8 hehe!) – Rob

+0

Wow, ho suonato con il regex e (per me) c'è un piccolo errore a pag. 225 e non vedo nella loro errata. Nel caso lo stiate facendo: la chiamata a grep dovrebbe essere se (grep (argv [1], f, argc> 2? Argv [i]: NULL)> 0)/* NON argc> 3 */ – Rob

3

Come altri hanno commentato, Java in realtà non è una grande scelta per la creazione di una DSL. Scala, Clojure, Groovy, Ruby/JRuby sarebbero tutte scelte grandiose. Tuttavia, considerando che stavi pensando di usare Java, penso che Groovy o Scala sembrino le scelte più naturali. La curva di apprendimento per gli sviluppatori java è abbastanza graduale per entrambe le lingue. Ecco alcuni link che vi consentiranno di iniziare:

+0

Darei un'occhiata a Scala e Groovy :) –

0

Una volta ho utilizzato openArchitectureware per definire e utilizzare un DSL. oAW è un plug-in per eclissi e ora fa parte del framework di modellazione di eclissi, ma ovviamente può essere utilizzato anche all'esterno di EMF.

Mi è piaciuto perché era abbastanza semplice definire un DSL e oAW genererà automaticamente un editor con evidenziazione syntacx e controllo degli errori per il DSL.

E fornisce un motore di template che è piuttosto comodo se si intende utilizzare i documenti scritti nel DSL per generare automaticamente Java, XML o altri file.

(ho collegato il vecchio URL ÖAW perché la pagina fornisce ancora alcuni dettagli e tutti i link alle pagine del progetto Eclipse)

0

solo un'aggiunta al @Recurse.In realtà sto facendo l'esempio espressione regolare nel capitolo 9 si riferiva ad e non ha funzionato fino a quando ho cambiato una riga nella funzione principale:

  if (grep(argv[1], f, argc>3 ? argv[i] : NULL) > 0) 

in realtà dovrebbe essere:

  if (grep(argv[1], f, argc>2 ? argv[i] : NULL) > 0) 

preavviso il argc> 2. Ha funzionato per me dopo. Non era sull'errata dei libri (che non è sorprendente data la sua età).

Sì, questo è un libro denso ma ricco di tesori, quindi devo dire che sono d'accordo con @Recurse. Onestamente, si tratta di un libro sensibile al tempo per lo studente (probabilmente un paio di anni fa sarei stato confuso).