Предметно-орієнтована мова програмування

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Предметно-орієнтована мова програмування (англ. Domain-specific language, DSL) — мова програмування, призначена для вирішення задач конкретної предметної галузі, яка дає особливе уявлення про проблему або специфічні методи її вирішення. Протилежністю предметно-орієнтованих мов є мови програмування загального призначення. Комп'ютерні мови спеціального призначення завжди існували в комп'ютерну епоху, але термін «предметно-орієнтована мова програмування», став більш популярним у зв'язку з розвитком моделювання у певних предметних галузях. Простіші предметно-орієнтовані мови програмування, особливо ті, що використовуються однією програмою, іноді неофіційно називають міні-мовами.

Використання[ред. | ред. код]

Розробка та використання відповідних предметно-орієнтованих мов програмування є ключовою частиною інженерії деяких галузей, де використання таких мов, придатних для відповідного типу задач може бути найоптимальнішим розв'язком проблеми. Мовно-орієнтоване програмування розглядає створення мов спеціального призначення для вираження проблем як стандартну частину процесу вирішення проблеми. Створення мови, спеціально для певного завдання (з програмним забезпеченням для її підтримки), замість повторного використання існуючої мови, може бути доцільним, якщо мова дозволяє чіткіше виразити певний тип проблеми чи рішення, ніж це дозволяє існуюча мова, і тип проблеми, про яку йдеться, з'являється досить часто. З прагматичної точки зору, предметно-орієнтована мова програмування може бути спеціалізованою для певної проблемної області, для конкретного способу подання проблеми, для конкретної техніки вирішення задачі або інших аспектів предметної області.

Загальний огляд[ред. | ред. код]

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

Межа між мовами загального призначення та мовами, специфічними для конкретних завдань, не завжди чітка, оскільки мова може мати спеціалізовані функції для певної задачі, але може бути застосована ширше, або навпаки, в принципі, може мати широке застосування, але на практиці використовується переважно для конкретних задач. Наприклад, спочатку Perl був розроблений як мова обробки тексту, але пізніше переважно використовувалася як мова програмування загального призначення. Навпаки, PostScript — це повна мова Тюрінга[en], і в принципі може використовуватися для будь-якого завдання, але на практиці вузько використовується як мова опису сторінки.

Предметно-орієнтована мова програмування є десь між маленькими мовами програмування та скриптовими мовами програмування, і часто використовується подібно до бібліотек мов програмування. Межі між цими поняттями досить розмиті, так само, як межі між скриптовими мовами та мовами загального призначення.

Деякі предметно-орієнтовані мови програмування з часом розширюються і включають повнофункціональні інструменти мови програмування, що ще більше ускладнює питання про те, чи є мова предметно-орієнтованою чи ні. Хорошим прикладом є функціональна мова XSLT, спеціально розроблена для перетворення одного графіку XML в інший, який був розширений з моменту його створення, щоб дозволити (особливо у версії 2.0) різні форми взаємодії з файловою системою, маніпулювання рядками та датами, введення даних.

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

Прикладами предметно-орієнтованих мов є мови виразів і макросів в електронних таблицях, мова регулярних виразів, мова граматики Yacc генератора парсерів тощо.

Порівняно з мовами програмування загального призначення, DSL близька до описових мов, як-от HTML, XML. Вона має специфічні особливості порівняно з мовами загального призначення, а саме:

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

Приклади[ред. | ред. код]

Приклади предметно-орієнтованих мов включають HTML для створення макету сайту, Logo для олівцеподібного малювання, мови опису апаратних засобів Verilog та VHDL, MATLAB та GNU Octave для виконання математичних розрахунків, Mathematica, Maple та Maxima для проведення аналітичних[2] та числових обчислень і побудови графіків, Specification and Description Language[en] для реактивних та розподільних систем, формул та макросів електронних таблиць, SQL для запитів до реляційних баз даних, YACC для створення синтаксичного аналізу, регулярних виразів для лексичного аналізу, Generic Eclipse Modeling System[en] для створення мов діаграм, Csound для синтезу звуку та музики, мови введення GraphViz та GrGen, програмне забезпечення пакетів, що використовуються для компонування та переписування графіків,  мова конфігурацій Hashicorp, яка використовується для Terraform[3] та інших інструментів Hashiсorp[en] .

GameMaker Language[ред. | ред. код]

Скриптова мова GML, яка використовується ігровим рушієм GameMaker Studio[4] — це предметно-орієнтована мова програмування, яка орієнтована на програмістів початківців, для полегшення вивчення програмування. Хоча ця мова є сумішшю кількох мов, включаючи Delphi, C++ та BASIC, існує недолік структур, типів даних та інших функцій, які наявні у повноцінної мови програмування. Багато вбудованих функцій є «пісочницею»[5] для зручності перенесення. Мова в першу чергу допомагає будь-кому легко її засвоїти та розробити гру.

Мова розмітки ColdFusion[ред. | ред. код]

Скриптова мова ColdFusion — це ще один приклад предметно-орієнтованої мови для вебсайтів, які працюють на основі баз даних. Ця скриптова мова використовується для об'єднання таких мов та послуг, як Java, .NET, C++, SMS, електронна пошта, сервери електронної пошти, http, ftp, служби каталогів та файлові системи для використання на вебсайтах.

Мова розмітки ColdFusion (CFML) містить набір тегів, які можна використовувати на сторінках ColdFusion для взаємодії з джерелами даних, маніпулювання даними та відображення результатів. Синтаксис тегів CFML подібний до синтаксису елементів HTML.

Erlang OTP[ред. | ред. код]

Erlang Open Telecom Platform спочатку була розроблена для використання всередині Ericsson як предметно-орієнтована мова. Сама мова пропонує платформу бібліотек для створення кінцевих автоматів, загальних серверів та менеджерів подій, які швидко дозволяють інженерам розгортати програми або підтримувати бібліотеки, які, як було показано в галузевих тестах, перевершують інші мови, призначених для різних предметних областей, такі як C та C++. Зараз мова офіційно відкрита і її можна завантажити з їхнього вебсайту.

FilterMeister[ред. | ред. код]

FilterMeister[6] — це середовище програмування з мовою програмування, засноване на C, з конкретною метою створення плагінів фільтра обробки зображень, сумісних із Photoshop. FilterMeister працює як плагін Photoshop, і він може завантажувати та виконувати скрипти або компілювати та експортувати їх як незалежні плагіни. Хоча мова FilterMeister відтворює значну частину мови C, вона містить лише ті функції, які можна використовувати в контексті плагінів Photoshop, і додає ряд специфічних функцій, корисних лише у цій конкретній галузі.

Використання в програмній інженерії[ред. | ред. код]

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

Прикладом цього є Software Cost Reduction Toolkit[7]. Набір інструментів — це набір утиліт, включаючи редактор специфікацій для створення специфікації вимог, браузер діаграми для відображення змінних залежностей, перевірка узгодженості для виявлення відсутніх випадків у добре сформованих формулах у специфікаціях, перевірка моделі та автоматизований доказ теорем для перевірки властивості програми відповідно до специфікацій та генератор інваріантів, який автоматично будує інваріанти на основі конкретних вимог.

Новішою розробкою є мовно-орієнтоване програмування[en], інтегрована методологія інженерного програмного забезпечення, заснована переважно на створенні, оптимізації та використанні предметно-орієнтованих мов.

Метакомпілятори[ред. | ред. код]

Доповнення до мовно-орієнтованого програмування, як і до всіх інших форм предметно-орієнтованих мов, є клас засобів написання компіляторів, які називаються метакомпіляторами[en]. Метакомпілятор не тільки корисний для генерації синтаксичних аналізів та генераторів коду для предметно-орієнтованих мов, але сам метакомпілятор компілює предметно-орієнтовану метамову, спеціально розроблену для області метапрограмування.

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

Метакомпілятори, які зіграли значну роль як в інформатиці, так і в комп'ютерній промисловості, включають Meta-II[8] та його нащадка TreeMeta[9].

Unreal Engine до 4-ї версії та інші ігри[ред. | ред. код]

Unreal і Unreal Tournament представили мову під назвою UnrealScript. Це дозволило швидко розвивати модифікації порівняно з конкурентом Quake (який використовує двигун Id Tech 2). Двигун Id Tech використовував стандартний код C, це означає, що C потрібно вивчити та належним чином застосувати, тоді як UnrealScript був оптимізований для зручності використання та ефективності. Подібним чином, при розробці новітніх ігор з'явилися власні орієнтовані мови. Ще одним поширеним прикладом є Lua для створення скриптів.

Мови статистичного моделювання[ред. | ред. код]

Статистичне моделювання розробило предметно-орієнтовані мови, такі як R (реалізація мови S), Bugs[en], Jags[en] та Stan[en]. Ці мови забезпечують синтаксис для опису байєсової моделі та генерують метод її вирішення за допомогою моделювання.

Gherkin[ред. | ред. код]

Gherkin[en][10] — це мова, призначена для визначення тестових випадків для перевірки поведінки програмного забезпечення, не вказуючи, як ця поведінка реалізована. Він призначений для читання та використання людьми, які не є кваліфікованими програмістами, з використанням синтаксису природної мови та лінійно-орієнтованого дизайну. Потім тести, визначені за допомогою Gherkin, повинні бути реалізовані загальною мовою програмування.

Інші приклади[ред. | ред. код]

Інші яскраві приклади предметно-орієнтованих мов програмування:

Переваги та недоліки[ред. | ред. код]

Переваги предметно-орієнтованих мов програмування[ред. | ред. код]

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

Недоліки предметно-орієнтованих мов програмування[ред. | ред. код]

  • Вартість вивчення нової мови порівняно з її обмеженим застосуванням.
  • Витрати на розробку, впровадження та підтримку конкретної мови, а також інструменти, необхідні для її розробки (IDE).
  • Пошук, встановлення та підтримка належного набору технологій з певної DSL.
  • Потенційна втрата ефективності процесора в порівнянні з програмним забезпеченням написаним вручну.
  • Поширення подібних нестандартних предметно-орієнтованих мов, наприклад, DSL, що використовується в одній страховій компанії, проти DSL, що використовується в іншій страховій компанії[12].
  • Нетехнічним експертам у певній галузі може бути важко самостійно писати або змінювати програми написані на DSL.
  • Програмістам, які не є експертами в певній галузі, в якій для написання програм використовується DSL, може бути важко самостійно писати або змінювати програми.
  • Підвищена складність інтеграції DSL з іншими компонентами ІТ-системи (порівняно з інтеграцією мов загального призначення).
  • Невелика кількість професіоналів, які знають конкретну предметно-орієнтовану мову програмування, робить оплату праці досить високою.
  • Важче знайти приклади коду.

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]

  1. 5.1.6. Генерувальне (порождувальне) програмування. Архів оригіналу за 23 лютого 2014. Процитовано 6 лютого 2014. 
  2. Аналітичні обчислення. StudFiles (рос.). Архів оригіналу за 9 листопада 2021. Процитовано 9 листопада 2021. 
  3. Что такое Terraform и почему это круто | Блоги | Компьютерное Обозрение. ko.com.ua (рос.). Архів оригіналу за 16 жовтня 2021. Процитовано 16 жовтня 2021. 
  4. GameMaker: Studio. docs.yoyogames.com. Архів оригіналу за 9 листопада 2021. Процитовано 9 листопада 2021. 
  5. Огляд пісочниці | рішення (укр.). Процитовано 16 жовтня 2021. 
  6. FilterMeister. members.chello.at. Архів оригіналу за 14 березня 2021. Процитовано 9 листопада 2021. 
  7. Software Cost Reduction (SCR). ptolemy.berkeley.edu. Архів оригіналу за 16 жовтня 2021. Процитовано 16 жовтня 2021. 
  8. МЕТА II • ru.knowledgr.com. ru.knowledgr.com. Архів оригіналу за 17 жовтня 2021. Процитовано 17 жовтня 2021. 
  9. About: TREE-META. dbpedia.org. Архів оригіналу за 17 жовтня 2021. Процитовано 17 жовтня 2021. 
  10. Преимущества использования языка Gherkin. Независимое тестирование программного обеспечения - a1qa (ru-RU). Архів оригіналу за 17 жовтня 2021. Процитовано 17 жовтня 2021. 
  11. Game Definition Language. games.stanford.edu. Архів оригіналу за 17 жовтня 2021. Процитовано 17 жовтня 2021. 
  12. Wayback Machine. web.archive.org. 24 липня 2011. Архів оригіналу за 24 липня 2011. Процитовано 9 листопада 2021.