Коли API вважається вбудованим DSL?


10

Яка різниця між API та вбудованою доменною мовою (DSL)?

Це просто синтаксис?

Розглянемо такий API, як OpenGL. Чим це відрізняється від графічного DSL?

Іншими словами, якщо API достатньо складний, чи можна його вважати вбудованим DSL?


1
Сенс DSL полягає в тому, щоб зробити речі простішими. Чи не запитуєте вас, чи може досить простим API вважати DSL?
Doval

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

1
Питання в чому різниця між API та вбудованим DSL ?
proskor

Відповіді:


8

Розрізнити важко, і це залежить від мови, що використовується. Він також суб'єктивний.

Крім цього, ви можете визначити API, схожі на DSL. Для прикладу, іконка дозволяє генерувати HTML:

(html [:span {:class "foo"} "bar"])

Це можна розглядати як DSL з синтаксисом lisp. Те, що htmlможе бути макросом, дає йому такий самий обсяг сили, як якщо б ви писали HTML-шаблону lib з s-виразами (див. Sxml )

У python той самий API може виглядати так:

html(["span", {"class" : "foo"}, "bar"])

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

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

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


4

API та DSL - це зовсім різні поняття, і є лише деякі сфери, де можна сказати, що вони перетинаються.

Всі DSL - це комп'ютерні мови . Вони можуть бути інтерпретовані, компільовані, розмітки, мови запитів (наприклад, SQL) або (наприклад, JSON або деякі види використання XML), які можуть використовуватися у повідомленнях, що передаються через API, але вони повинні бути мовами . Термін описує природу , а не мету.

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

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


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

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

2
Підмовою все ще є мова. Не обов’язково мати свій "власний" синтаксис, він може "запозичити" його з мови хоста.
proskor

Тож чи не всі проекти власні DSL, коли вони майже закінчені (тобто загальні мови програмування зрештою є DSL)? Континуум сортів від загального до доменного.
Phyllostachys

4

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

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

Виняток становлять мови, які надають виняткові можливості перекривляти синтаксис через бібліотеку (оператор перевантажує на зразок C ++, вигадує нові оператори, як Scala, або навіть попередньо визначає зовсім інший синтаксис читання, як Perl, з джерельними фільтрами). Якщо ви користуєтеся такою мовою і повністю використовуєте гнучкість, яку вони пропонують, результат може бути схожим на нову мову спеціального призначення (але семантика часто буде тонко відрізнятися від тієї, яку ви очікували, якби мова була справді винайдена. від землі вгору, щоб служити вашим кінцям).


Тому, можливо, можна зробити річ, яка розбирає рядок (DSL), яка виконує функції простої обгортки для великого API. Я припускаю, що відокремлення DSL від того, що аналізує DSL, є диференціацією.
Phyllostachys

3
Так, це називається шаблон дизайну "Інтерпретатор", і це вважається хорошою практикою: ви пишете код перекладача один раз, і з цього моменту ви зможете виразити вміст, що стосується домену, набагато простіше.
Кіліан Фот

"винаходити нових операторів, як Groovy" Можливо, ви мали на увазі Scala; у Groovy набір операторів виправлений, але його можна перевантажувати, як у C ++.
Vorg van Geir

@VorgvanGeir Вибачте, виправлено.
Кіліан Фот

2

Тут, від DslBoundary Мартіна Фаулера

Зі статті, моє розуміння - це в основному вбудовані DSL, а API не настільки різниться. Але тут є трохи різниця.

  1. API робить акцент на наданні нового об'єкту.
  2. DSL не просто надає вам новий інструмент, але й надає вам новий синтаксис та новий спосіб кодування.

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


1

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

Чому API можна вважати вбудованим DSL? Перш за все, вона формує мову: вона має примітивні елементи (типи та операції), які можна комбінувати (за допомогою мови перебування) для формування абстракцій та вирішення складних задач. Наприклад, API OpenGL може використовуватися для візуалізації 3D-сцен у режимі реального часу. API колекцій може бути використаний для створення алгоритмів, які працюють над наборами об'єктів тощо. По-друге, це, очевидно, домен; наприклад, домен API Collections обробляє набори об’єктів, а домен API OpenGL - 3D-рендерінг. Отже API є мовою, що залежить від домену.

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


це просто ваша думка, чи ви можете якось це підкріпити?
гнат

@gnat я продовжив свою відповідь, щоб далі пояснити свою думку.
proskor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.