Що таке доменна мова? Хтось ним користується? І яким чином?


107

Я здогадуюсь, я шукаю якийсь вступ і бачу, чи хтось ним користувався. Чи є якісь переваги його використання?

Вікіпедія:

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

Чи може хтось навести конкретні приклади того, як ви його реалізували чи як він може бути корисним у визначеному сценарії?


Насправді конкретна доменна мова - це термін із чітко визначеним значенням у програмуванні - перегляньте статтю у Вікіпедії
1800 р. ІНФОРМАЦІЯ

Як зазначалося нижче, DSL - це не одна мова, а назва цілого класу мов спеціального призначення.
dmckee --- кошеня колишнього модератора

Тож чи можу я сказати, що R - це DSL?
Шрікар Додді

2
На краю, але я не хотів би. R має всі структури загального призначення і використовується для широкого спектру обчислень; числові обчислення та статистика - це не дуже велика область. Хоча це хороший тест на визначення.
Чарлі Мартін

Відповіді:


114

Мова, визначена для домену, - це мова, написана для вирішення конкретного домену або набору проблем. Їх багато, як make, ant, and rake для опису складання програмного забезпечення, або lexx та yacc для побудови мови. В останні роки вони набули популярності, оскільки деякі речі поєднуються, щоб зробити їх легше будувати. Серед цих речей велика популярність Ruby, яка має кілька функцій, що полегшують створення нових DSL.

Мартін Фаулер є великим прихильником ідеї, як тут .


3
Які функції має Ruby, які спрощують створення нового DSL?
Лернкурве

2
@Lernkurve - у Рубі було метапрограмування, що допомагає. rubylearning.com/blog/2010/11/23/…
Джеймс Блек

@CharlieMartin чи не могли б ви повідомити мене про "groovy"? для якого типу мови це саме? Я хочу знати, будь ласка,
допоможіть

2
Groovy - це сценарна мова, яка працює в JVM. Це, в основному, відповідь Java на Рубі. Це мова загального призначення, але її можна використовувати для запису DSL. docs.groovy-lang.org/docs/latest/html/documentation/…
Чарлі Мартін

1
Я хотів би додати бадьорість Gradle. Якщо я не помиляюся, у них є своя мова, що описує збірку.
Неонова варте

67

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

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

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

Чи є якісь переваги їх використання? Використовувати їх за призначенням дуже вигідно до того моменту, коли ви звернетесь до них, не знаючи, як ви використовували (я припускаю) SQL або HTML, не думаючи про них як про DSL.

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


1
Досить смішно, один із прикладів, які ви не перерахували, є першим, про який я думаю: regex
CoffeeTableEspresso

12

(вирішення суті питання)

Я думаю, що вперше я побачив DSL десь і його визначення як "доменної мови", я також подумав, що це конкретна, конкретна мова, про яку я просто не чув - але, ні, це загальний термін для мов, які є з урахуванням конкретної області застосування.

За іронією долі, якби ви щойно чули про TCL як про "командну мову інструмента", ви могли б подумати, як DSL, що TCL для різних інструментів буде багато - але, ні, це конкретна назва конкретної мови сценаріїв.


10

Я думаю, що це мова, яка підходить для вирішення проблем для певного домену. Це може бути деяка мова обробки правил або мова опису послуги.

Протилежністю до доменної мови (DSL) є мова загального призначення .


10

Все це DSL ...

Асемблер:
Компілятори MOV R1 до R2 : Виписки про призначення - A = A + 1, Умови - ЯКЩО (ІСТИНА) ..., Відділення - ПОВЕРНЕННЯ
HTML: ... опишіть вкладену структуру
TCP / IP: опишіть до / з адреси
PDF: опису розміщення тексту / зображення на папері
Шрифти: описуйте символи

Будь-яка мова, яку ми використовуємо для опису конкретного процесу, - це DSL. На жаль, не вистачає доменних мов, щоб описати навіть наші основні процеси, тому ми використовуємо кілька мов, які ми маємо, щоб описати все, що ми робимо. "Зіпсувати всі HTML-файли на моєму веб-сайті" потрібно 300 рядків з 3 або 4 різних мов.

Для побудови DSL визначте мінімальну кількість символів, необхідну для опису процесу, який ви можете запам'ятати і не потребує документації. Пам'ятайте, що швидкість та простота використання - це основні критерії дизайну. Розбір проходить настільки швидко, що будь-який синтаксис, який ви використовуєте, прекрасний, я віддаю перевагу природній мові, як мій синтаксис, у більшості випадків "Оплачуйте працівників у першій місяці", але конкретний домен - це саме те, що стосується домену, ви визначаєте синтаксис, який найкраще підходить до проблеми.

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

Я виявив, що HTML насправді не вирішує проблему компонування сторінки, тому я позбувся її та визначив DSL, який справді підходить. Я визначив 6 регіонів на сторінці, HEADER, TODY, FOOTER, LEFT / Right MARGINS та LEFT / Right FULL MARGINS. Тоді я міг би сказати генератору сторінок, щоб додати заголовки заголовків, діалогове вікно СТАТУС, МЕНЮ, ТАБЛИЦЮ, ФОРМИ, ..., до певних комірок. Кожну з цих комірок потім можна розділити на рядки та стовпці на будь-яку глибину. Макет сторінки займає секунди для будь-якого стилю.

BODY містить таблицю моїх співробітників
HEADER містить підпис заголовка "Hello World" із входом до програмного забезпечення Collins

DSL меню не підходить для макета сторінки DSL, тому я створив унікальний DSL для меню.

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

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


8

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


5

Ну! є багато речей, пояснених вище. Я спробую пояснити це набагато простішим способом, оскільки хтось, як я, прийде, зрозуміє.

Оскільки мови широкого призначення використовуються для широких цілей, DSL створений лише для конкретного домену. Як HTML або CSS.

Ви можете сказати, якщо ви написали інструкції на папір, який може зрозуміти лише якась людина або ваш єдиний найкращий друг, і ніхто більше не міг. Тоді це може бути DSL. Але якщо ви написали інструкції такими термінами, які багато людей могли б зрозуміти і могли б слідувати, то це не DSL.

Я створив комутаційну плату для користувача, якою можна керувати через послідовний порт комп'ютера, і Користувач хоче, щоб програма для цієї плати, яка могла бути виконана на цій платі, і реле-перемикачі буде включено і вимкнено відповідно. Тому я написав кілька інструкцій і сказав користувачеві програмувати цю плату відповідно до цих інструкцій. Це приклад DSL. Я не винайшов нову мову, а тоді просто створив купу струн, які мікроконтролер міг прочитати з EEPROM і міг відповідно розібратися і міг виконати конкретне завдання.


4

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

Я б хотів, щоб ми використовували мови, що відповідають конкретним доменам (DSL)

У ньому я визначаю DSL як:

Невелика мова програмування, спеціально розроблена для передачі рішень для певної сфери проблем.

Що стосується використання, якщо ви коли-небудь використовували Ant, Structured Query Language (SQL) або Cascading Style Sheets (CSS), ви використовували DSL.

Мені подобається використовувати DSL, оскільки вони зосереджені на полегшенні комунікації рішень для конкретних проблемних просторів, і вони роблять це таким чином, що сприяє включенню експертів домену.


3

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


3

Я нещодавно чув DSL, але знайшов справді корисний приклад: LUNA (колишній лунаскрипт).

Це спеціальна мова програмування / рамки, створена командою Asana для власної платформи.

Надалі я знаходжу, що багато компаній створюють власні рамки та мови для створення належної конкурентної переваги. Ось кілька прикладів:

  • SAP з AbAp
  • PeopleSoft з PeopleCode
  • Яблуко з 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 w / 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 може бути лише переліком інструментів, які вирішують доменні проблеми.

Розглянемо OOP та його модель для представлення доменних об'єктів класами та методами як поведінку цих об'єктів. Якщо ми створимо таку структуру і надамо цим об'єктам поведінку, тоді ми можемо написати код, використовуючи ці поняття. Розглянемо цей приклад псевдокоду:

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.