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

StackOverflow https://stackoverflow.com/questions/809574

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Википедия:

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Всё по DSL...

Ассемблер:ДВИЖЕНИЕ 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, он отлично подходит для описания небольших проблем, от 65 тыс. до 1 млн строк, таких как древовидные структуры или меню, столбец A — это уровень, другие столбцы — значки, цвета, метки и т. д. (EXCEL — это редактируемый CSV).

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

BODY содержит таблицу моих сотрудников.
ЗАГОЛОВОК содержит заголовок «Hello World» с надписью «Hello World» для входа в Collins Software.

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

Ресурс Мое главное меню
*define:меню,m,Уровень,Метка,Значок,Действие;
м,0,файл;
m,1,open,open.gif,Диалоговое окно «Открыть файл»;

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

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

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

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

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

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

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

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

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

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

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

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

Я совсем недавно услышал о DSL, но нашел действительно полезный пример:ЛУНА (бывший лунаскрипт).

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

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

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

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

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

Примером 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.Однако я не видел никаких предложений по этому поводу на страница предложения еще хотя.

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

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

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

Вот конференция, на которой докладчик приводит несколько примеров использования DSL. ДжетБрэйнс МПС, с технологией Проекционного монтажа: https://vimeo.com/197381453

DSL — DomainSpecificLanguage

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

Где:конфигурации(TravisCI .yaml), сценарии сборки(Градл), зависимости целей (стручок), программирование пользовательского интерфейса(Анко) и т. д.

DSL — это декларативное программирование. Что вместо этого делать как делать

Внешние DSL имеют свой собственный синтаксис, и вы пишете полный синтаксический анализатор для их обработки (например,XML, RegExp, SQL, HTML, CSS, UML).

Внутренние DSL Это особые способы использования основного языка, чтобы придать ему ощущение определенного языка (например,Lisp, Ruby, аннотации Java, макросы).

Читать далее здесь, здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top