Что такое предметно-ориентированный язык? Кто-нибудь использует это? И каким образом? - PullRequest
94 голосов
/ 01 мая 2009

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

Википедия:

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

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

Ответы [ 13 ]

101 голосов
/ 01 мая 2009

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

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

53 голосов
/ 01 мая 2009

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

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

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

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

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

12 голосов
/ 01 мая 2009

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

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

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

9 голосов
/ 01 мая 2009

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

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

8 голосов
/ 30 августа 2014

Все это DSL ...

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

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

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

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

Я обнаружил, что HTML на самом деле не решает проблему разметки страницы, поэтому я избавился от нее и определил подходящий DSL. Я определил 6 областей на странице: заголовок, тело, нижний колонтитул, левые / правые поля и левые / правые поля. Затем я мог бы сказать генератору страниц добавить TITLE BAR, STATUS BAR, MENUS, TABLE, FORMS, ..., к определенным ячейкам. Каждая из этих ячеек может быть разделена на ряды и столбцы на любую глубину. Макет страницы занимает секунды для любого стиля.

ТЕЛО содержит таблицу моих сотрудников
Заголовок содержит заголовок строки заголовка «Hello World» с логином в Collins Software

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

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

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

8 голосов
/ 01 мая 2009

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

4 голосов
/ 06 октября 2017

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

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

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

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

3 голосов
/ 12 сентября 2015

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

3 голосов
/ 27 июля 2015

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

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

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

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

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

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

3 голосов
/ 19 марта 2015

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

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

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

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

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

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

...