Что такое язык предметной области? Кто-нибудь этим пользуется? И каким образом?


108

Думаю, я ищу какое-то вступление и смотрю, использовал ли кто-нибудь его. Есть ли какие-то особые преимущества от его использования?

Википедия:

предметно-ориентированный язык (DSL) - это язык программирования или язык спецификаций, предназначенный для конкретной проблемной области, конкретной техники представления проблемы и / или конкретной техники решения.

Может ли кто-нибудь привести конкретные примеры того, как вы это реализовали или как это может быть полезно в данном сценарии?


На самом деле предметно-ориентированный язык - это термин с четко определенным значением в программировании - проверьте статью в Википедии
ИНФОРМАЦИЯ 1800

Как отмечено ниже, DSL - это не один язык, а название целого класса языков специального назначения.
dmckee --- котенок экс-модератора

Итак, могу ли я сказать, что R - это DSL?
Шрикар Додди,

2
На грани этого, но я бы не стал. R имеет все структуры общего назначения и используется для широкого круга вычислений; числовые вычисления и статистика - не очень простая область. Тем не менее, это хорошая проверка определения.
Чарли Мартин

Ответы:


115

Специфичный для предметной области язык - это язык, который написан для решения конкретной предметной области или набора проблем. Их много, например make, ant и rake для описания сборок программного обеспечения или lexx и yacc для создания языков. В последние годы они стали популярными, поскольку некоторые элементы объединились, чтобы упростить их сборку. Большой среди этих вещей был рост популярности Ruby, который имеет несколько функций, которые упрощают создание новых DSL.

Мартин Фаулер, как и здесь, является большим сторонником этой идеи .


4
Какие функции Ruby упрощают создание нового DSL?
Lernkurve

2
@Lernkurve - У Ruby было метапрограммирование, которое помогает. rubylearning.com/blog/2010/11/23/…
Джеймс Блэк

@CharlieMartin, не могли бы вы рассказать мне о "отличном"? какой именно тип языка? Я хочу знать, пожалуйста, помогите здесь ..
G dangi

2
Groovy - это язык сценариев, который работает в JVM. По сути, он призван стать ответом Java на Ruby. Это язык общего назначения, но его можно использовать для написания DSL. docs.groovy-lang.org/docs/latest/html/documentation/…
Чарли Мартин

1
Хочу добавить классного Gradle. Если не ошибаюсь, у них есть свой язык описания сборки.
Neon Warge

68

Вы можете думать о DSL как о чрезмерно сложных аргументах для функций, написанных на более общем языке программирования. Настоящий язык программирования анализирует код DSL и что-то с ним делает, обычно код DSL фокусируется только на том, что вы хотите сделать, а большая система выясняет, как .

Примеры DSL включают все языки запросов (SQL, XPath, ...), все языки шаблонов (Django, Smarty, ...), сценарии оболочки, особенно включая такие вещи, как twill, веб-браузер, управляемый командами (в основном используется для автоматического тестирования ), языки хранения и обмена данными (XML, YAML, ...), а также языки документов, такие как LaTex, HTML или CSS.

Некоторые языки с очень гибким синтаксисом, такие как TCL и Lisp, встраивают свой DSL прямо в язык ... когда это возможно. В большинстве языков используются строки, обычно загружаемые из внешних файлов.

Есть ли какие-то особые преимущества в их использовании? Использование их по прямому назначению очень выгодно, поскольку вы будете обращаться к ним, не зная, точно так же, как вы использовали (я полагаю) SQL или HTML, не думая о них как о DSL.

Осмелюсь сказать, что существует достаточно DSL для любого вида приложений, которые могут вам понадобиться; вам почти наверняка не нужно учиться писать свой собственный.


1
Достаточно
забавно

12

(обращаясь к сути вопроса)

Думаю, когда я впервые где-то увидел DSL и его определение как «язык предметной области», я также подумал, что это особый, конкретный язык, о котором я просто не слышал - но, нет, это общий термин для языков, которые адаптированы к конкретной области применения.

По иронии судьбы, если бы вы только что услышали о TCL как о «языке команд инструментов», вы могли бы подумать, как и о DSL, что для различных инструментов будет много TCL, но нет, это конкретное имя конкретного языка сценариев.


10

Я думаю, что это язык, подходящий для решения проблем в определенной области. Это может быть какой-то язык обработки правил или язык описания услуг.

Противоположностью предметно-ориентированному языку (DSL) является язык общего назначения .


10

Все DSL ...

Ассемблер: MOV от R1 до R2
Компиляторы: Операторы присваивания - A = A + 1, Условные выражения - IF (TRUE) ..., Branch - RETURN
HTML: ... описывают вложенную структуру
TCP / IP: описывают к / от адреса
PDF: описание размещения текста / изображения на бумаге
Шрифты: описание символов

Любой язык, который мы используем для описания конкретного процесса, - это DSL. К сожалению, не хватает языков, специфичных для предметной области, для описания даже самых основных процессов, поэтому мы используем несколько языков, которые у нас есть, для описания всего, что мы делаем. «Заархивировать все html-файлы на моем веб-сайте» требует для заполнения 300 строк на 3 или 4 разных языках.

Чтобы построить DSL, определите минимальное количество символов, необходимых для описания процесса, который вы можете запомнить и который не требует документации. Помните, что скорость и простота использования - главные критерии дизайна. Синтаксический анализ настолько быстр, что любой синтаксис, который вы используете, в порядке, в большинстве случаев я предпочитаю естественный язык в качестве синтаксиса: «Оплата работникам в первое число месяца», но для конкретного домена вы определяете синтаксис, который лучше всего соответствует проблеме.

Я бы не стал использовать другие решения, которые могут быть удобными, но не подходят для данной проблемы, например HTML, который использовался для определения данных (XML). CSV очень полезен, он подходит для большинства задач. JSON не подходит для простоты использования, это излишество, которое добавляет ненужных сложностей, когда CSV работает для большинства проблем. Мы часто используем EXCEL для DSL, он отлично подходит для описания небольших проблем, от 65 тыс. До 1 млн строк, таких как древовидные структуры или меню, столбец A - уровень, другие столбцы - значки, цвета, метки и т. Д. (EXCEL - это редактируемый CSV).

Я обнаружил, что HTML на самом деле не решает проблему макета страницы, поэтому я избавился от него и определил DSL, который мне подходит. Я определил 6 областей на странице: ЗАГОЛОВОК, ТЕЛО, ФУТЕР, ЛЕВОЕ / ПРАВОЕ ПОЛЯ и ЛЕВОЕ / ПРАВОЕ ПОЛНОЕ ПОЛЯ. Затем я мог бы сказать генератору страниц добавить СТРОКУ НАЗВАНИЯ, СТРОКУ СОСТОЯНИЯ, МЕНЮ, ТАБЛИЦУ, ФОРМЫ, ... в определенные ячейки. Каждая из этих ячеек может быть разделена на строки и столбцы любой глубины. Макет страницы занимает секунды для любого стиля.

BODY содержит таблицу моих сотрудников.
HEADER содержит заголовок строки заголовка "Hello World" с входом в Collins Software.

DSL меню не соответствует DSL макета страницы, поэтому я создал уникальный DSL для меню.

Ресурс Мое главное меню
* определить: меню, м, уровень, метка, значок, действие;
м, 0, файл;
m, 1, open, open.gif, диалог открытия файла;

Каждая проблема уникальна, компьютер может использовать любой формат, DSL предназначены для человека, поэтому сделайте его понятным для людей, что-то, что они могут напечатать, и сделайте язык из реальных слов; ибо мы описываем реальных людей, места и вещи.


8

DSL - хороший способ разработать язык, который будет использоваться непрограммистами. Например, если у вас есть DSL для финансовых специалистов в компании, то вместо программирования в соответствии с их спецификацией вы можете просто позволить им написать программу, которую они хотят. Затем, если он слишком медленный, вы можете взять то, что они написали, что работает так, как они хотят, написать это на скомпилированном языке, чтобы ускорить его.


6

Хорошо! много вещей уже объяснено выше. Я постараюсь объяснить это гораздо проще, чтобы кто-нибудь вроде меня понял.

Поскольку языки общего назначения используются для обширных целей, DSL предназначен только для определенного домена. Как HTML или CSS.

Вы можете сказать, написали ли вы инструкции к бумаге, которую может понять только кто-то или ваш единственный лучший друг, и никто другой. Тогда это может быть DSL. Но если вы написали инструкцию в таких терминах, которые могли бы понять многие люди и могли бы им следовать, то это не DSL.

Я создал плату коммутатора для пользователя, которой можно было управлять через последовательный порт компьютера, и пользователю нужна программа для этой платы, которая могла бы выполняться на этой плате, и переключатели реле будут соответственно включаться и выключаться. Я написал несколько инструкций и посоветовал пользователю запрограммировать плату в соответствии с этими инструкциями. Это пример DSL. Я не изобрел новый язык, а просто создал кучу строк, которые микроконтроллер мог читать из EEPROM, обрабатывать соответствующим образом и выполнять конкретную задачу.


4

Я написал краткое сообщение в блоге, в котором обсуждает, почему мне нравится использовать DSL:

Я бы хотел, чтобы мы использовали доменные языки (DSL) Подробнее

В нем я определяю DSL как:

Небольшой язык программирования, специально разработанный для передачи решений для конкретной области проблем.

С точки зрения использования, если вы когда-либо использовали Ant, язык структурированных запросов (SQL) или каскадные таблицы стилей (CSS), вы использовали DSL.

Мне нравится использовать DSL, потому что они сосредоточены на содействии передаче решений для конкретных проблемных областей, и делают это таким образом, чтобы способствовать привлечению экспертов в предметной области.


3

Одним из простых примеров предметно-ориентированного языка (DSL) является HTML, который используется для конкретной области, называемой веб-приложениями.


3

Я только что слышал DSL, но нашел действительно полезный пример: LUNA (бывший lunascript).

Это индивидуальный язык программирования / фреймворк, созданный командой Asana для их собственной платформы.

Как я обнаружил, многие компании создают свои собственные фреймворки и языки, чтобы создать надлежащее конкурентное преимущество, вот некоторые примеры:

  • SAP с AbAp
  • PeopleSoft с PeopleCode
  • Apple с Objective-C
  • В Facebook есть такие вещи, как FBML и FQL

Они зависят от домена, потому что вы будете использовать их почти исключительно для работы на этих платформах.

Надеюсь, этот ответ поможет вам прояснить концепцию.


3
Objective-C не является предметно-ориентированным языком
boraseoksoon

Это также не было сделано (и для) Apple.
Александр Росса

2

Примером DSL, используемого в машинном обучении, является patsy в python: https://patsy.readthedocs.io/en/latest/formulas.html#

который основан на формуле DSL из R: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

и у Хэдли есть хороший раздел своей продвинутой книги по R, в которой описывается, как построить DSL с R: http://adv-r.had.co.nz/dsl.html

Как только область глубокого обучения несколько стабилизируется (или даже сейчас), мне бы хотелось увидеть нечто подобное в проекте Apache MXnet. Однако я еще не видел никаких предложений по этому поводу на странице предложений .


1

Языки, специфичные для предметной области, выражают процессы и знания в вашей предметной области на языке, который напрямую использует концепции и логику из вашей конкретной области.

Сообщество определенно растет, но все еще не на уровне других «мейнстримных» технологий.

В большинстве случаев DSL создаются для повышения производительности внутри компаний, поэтому они не раскрывают информацию и не делятся своими результатами / идеями.

Вот конференция, на которой докладчик приводит несколько примеров DSL с использованием JetBrains MPS и технологии проекционного редактирования: https://vimeo.com/197381453


1

DSL - предметно-ориентированный язык. Начнем с того, что такое домен - домен - это некоторая определенная область, область действия. Этот домен может быть похож на веб-сайт, и у вас есть для него CSS, а второй домен может быть структурой веб-сайта, а здесь у вас есть HTML.

Но домен также может быть приложением компании X. И в рамках этой области может быть создан какой-то язык. Язык не означает - полностью приправленная вещь с собственной граммой, синтаксисом, компилятором или средой выполнения. DSL может быть просто списком инструментов, решающих проблемы предметной области.

Давайте рассмотрим ООП и его модель для представления объектов предметной области классами и методами как поведения этих объектов. Если мы создадим такую ​​структуру и дадим этим объектам поведение, тогда мы сможем написать код, используя эти концепции. Рассмотрим этот пример псевдокода:

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

Насколько из вышесказанного является GPL (язык общего назначения), а насколько - это терминология и инструменты конкретной предметной области. Это смесь двух, но все команды здесь специфичны для домена. Тем не менее, мы можем сказать, что выше написано на DSL, где домен - это какое-то приложение x.

Продвигаясь вперед с этим примером, я могу создать еще более абстрактные инструменты и в основном выполнять поток управления этими инструментами, учтите (это больше FP, но надеюсь, вы понимаете, что я имею в виду):

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

Как видите, я смог довольно много абстрагироваться и использовать эту абстракцию для выполнения потока управления. И все основано на GPL и работает в рамках GPL.

По правде говоря, мы все пишем DSL, каждая абстракция для конкретной предметной области, которую вы можете использовать, является доброй. Но большинство этих абстракций не являются законченными решениями, поэтому мы стараемся не использовать это слово слишком часто. Но если у вас есть набор инструментов, функций, которые абстрагируют ваш домен, они образуют своего рода DSL.

Что такое DSL, многие вещи, например, любая структура, которая предоставляет набор правил, - это DSL. Если вы видите, что кто-то утверждает, что он разработчик React, значит, вы знаете, что он разработчик, специфичный для домена, поскольку React - это именно DSL, который является альтернативой использованию собственной веб-платформы. Если вы можете составить функциональность из существующих инструментов, специфичных для предметной области, тогда вы пишете с использованием DSL. Если углубиться в React, извините, ребята, не из этого DSL: D, вы можете создать набор компонентов и составить их как строительные блоки, и ура !, теперь вы сделали DSL поверх DSL.

Да, здесь слишком много раз повторяется DSL, извините.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.