Creazione di DSL in Java, parte 1: cos'è un linguaggio specifico del dominio?

Se hai mai scritto un makefile o progettato una pagina Web con CSS, hai già incontrato un DSL o un linguaggio specifico del dominio. I DSL sono linguaggi di programmazione piccoli ed espressivi progettati su misura per compiti specifici. In questa serie in quattro parti, Venkat Subramaniam introduce il concetto di DSL e alla fine mostra come costruirli utilizzando Java. In questo primo articolo, Venkat spiega cos'è un DSL e definisce la differenza tra un DSL esterno e uno interno. Quindi indica alcuni DSL che probabilmente usi da anni, forse senza nemmeno rendertene conto.

Se sei stato coinvolto nella scrittura o anche solo nell'utilizzo di applicazioni, è probabile che tu abbia già incontrato linguaggi specifici del dominio o DSL, anche se non te ne rendevi conto in quel momento. Un file di input di parole chiave per un'applicazione che riceve i dati di input è un DSL. Un file di configurazione è un DSL. Un makefile è un DSL utilizzato per specificare regole e dipendenze per la creazione di un'applicazione. Se hai scritto qualcuno di questi, hai già fatto i primi passi per creare lingue specifiche per il dominio.

La parola lingua nella frase può indurre ad aspettarsi che un DSL utilizzi la sintassi per esprimere determinate semantiche. A differenza di un linguaggio generico come Java, un DSL è piuttosto limitato in termini di portata e capacità; come suggerisce il nome, i DSL sono fortemente focalizzati su un certo tipo di problema o dominio e sull'espressione di una serie ristretta di soluzioni nel contesto di tale ambito limitato. E questa è una buona cosa: i DSL sono semplici e concisi.

Va bene, è L; che mi dici di D e S?

La parola dominio in DSL si riferisce a "un'area o una sfera di conoscenza, influenza o attività". (Per ulteriori informazioni, fare riferimento a Domain-Driven Design di Eric Evans.) Concentrarsi su un dominio fornisce un contesto : un framework logico all'interno del quale è possibile evolvere i modelli per un'applicazione.

La parola specifica in DSL ti dà il contesto limitato. Ti aiuta a mantenere le cose pertinenti, concentrate, concise ed espressive.

La semplicità è fondamentale per il successo di un DSL. Una persona che ha familiarità con il dominio della lingua deve capirlo facilmente. Ad esempio, se stai creando un DSL che gli attuari utilizzeranno per esprimere le regole aziendali nel dominio delle assicurazioni, non vuoi che passino molto tempo ad imparare una lingua difficile e complicata. Vuoi che si concentrino sull'espressione dei dettagli associati ai rischi assicurativi in ​​un modo che possano facilmente comprendere, discutere, evolvere e mantenere. Il DSL che crei per loro deve essere costruito sul loro vocabolario, i termini che usano ogni giorno per comunicare con i loro coetanei. Vuoi che usino la sintassi che fornisci, ma dovrebbe sembrare loro che stiano semplicemente specificando alcune regole discrete.E dovrebbero essere in grado di farlo senza avere l'impressione che stiano davvero programmando o addirittura utilizzando un qualche tipo di linguaggio.

Creare un buon DSL è come cucinare un pasto nutriente; proprio come vuoi che i bambini mangino le verdure senza rendersene conto e preoccuparsi di loro, vuoi che i clienti usino il tuo DSL senza preoccuparsi della sua sintassi.

La concisione è un'altra parte della scrittura di un buon DSL, il che significa scegliere una sintassi che sia concisa ed espressiva. La concisione entro limiti ragionevoli rende il codice più facile da leggere e mantenere. L'espressività aiuta a promuovere la comunicazione, la comprensione e la velocità. Ad esempio, per qualcuno che capisce la moltiplicazione di matrici, matrixA.multiply(matrixB);è meno espressivo e conciso di matrixA * matrixB. Il primo implica la chiamata di funzioni e l'uso di parentesi e include un punto e virgola intimidatorio. Quest'ultima è già un'espressione che risulterà abbastanza familiare.