Създаване на DSL в Java, Част 1: Какво е специфичен за домейн език?

Ако някога сте писали makefile или сте проектирали уеб страница с CSS, вече сте срещнали DSL или специфичен за домейна език. DSL са малки, изразителни езици за програмиране, създадени специално за конкретни задачи. В тази поредица от четири части Venkat Subramaniam представя концепцията за DSL и в крайна сметка ви показва как да ги изградите с помощта на Java. В тази първа статия Venkat обяснява какво е DSL и определя разликата между външен DSL и вътрешен. След това той посочва някои DSL, които вероятно използвате от години, може би дори без да го осъзнавате.

Ако сте участвали в писането или дори просто сте използвали приложения, има вероятност вече да сте се сблъскали с специфични за домейна езици или DSL - дори и да не сте го осъзнавали по това време. Файл за въвеждане на ключова дума към приложение, което получава входни данни, е DSL. Конфигурационният файл е DSL. Makefile е DSL, използван за определяне на правила и зависимости за изграждане на приложение. Ако сте написали някое от тях, вече сте направили първите си стъпки за създаване на специфични за домейна езици.

Думата език във фразата може да ви накара да очаквате, че DSL ще използва синтаксис, за да изрази определена семантика. За разлика от език с общо предназначение като Java, DSL е доста ограничен по обхват и възможности; както подсказва името, DSL са силно фокусирани върху определен тип проблем или домейн и върху изразяване на тесен набор от решения в контекста на този ограничен обхват. И това е хубаво - DSL са прости и кратки.

Добре, това е L; ами D и S?

Думата домейн в DSL се отнася до „област или сфера на знание, влияние или дейност“. (За повече информация вижте Дизайн, управляван от домейн от Ерик Еванс.) Фокусирането върху домейн ви дава контекст - логическа рамка, в която можете да развивате модели за приложение.

Думата специфична в DSL ви дава ограничен контекст. Помага ви да поддържате нещата подходящи, фокусирани, кратки и изразителни.

Простотата е от решаващо значение за успеха на DSL. Човек, запознат с домейна на езика, трябва лесно да го разбере. Например, ако създавате DSL, който актюерите ще използват, за да изразят бизнес правила в областта на застраховката, не искате да прекарват много време в изучаване на труден и сложен език. Искате те да се съсредоточат върху изразяването на детайлите, свързани със застрахователните рискове, по начин, който лесно да разберат, обсъдят, развият и поддържат. DSL, който създавате за тях, трябва да се гради върху техния речник, термините, които те използват всеки ден, за да общуват със своите връстници. Искате те да използват синтаксиса, който предоставяте, но трябва да им се струва, че те просто посочват някои дискретни правила.И те трябва да могат да го правят, без да получават впечатлението, че наистина програмират или дори използват някакъв език.

Създаването на добър DSL е като приготвяне на питателна храна; точно както искате децата да ядат зеленчуци, без да осъзнават и да се суетят около тях, вие искате клиентите да използват вашия DSL, без да се притесняват за неговия синтаксис.

Лаконичността е друга част от писането на добър DSL, което означава избор на синтаксис, който е едновременно кратък и изразителен. Лаконичността в рамките на разумното прави кода ви по-лесен за четене и поддръжка. Експресивността помага за насърчаване на комуникацията, разбирането и скоростта. Например, за някой, който разбира умножението на матрицата, matrixA.multiply(matrixB);е по-малко изразителен и кратък от matrixA * matrixB. Първият включва извикване на функции и използване на скоби и включва плашеща точка и запетая. Последното вече е израз, който ще бъде доста познат.