Яка різниця між API та вбудованою доменною мовою (DSL)?
Це просто синтаксис?
Розглянемо такий API, як OpenGL. Чим це відрізняється від графічного DSL?
Іншими словами, якщо API достатньо складний, чи можна його вважати вбудованим DSL?
Яка різниця між API та вбудованою доменною мовою (DSL)?
Це просто синтаксис?
Розглянемо такий API, як OpenGL. Чим це відрізняється від графічного DSL?
Іншими словами, якщо API достатньо складний, чи можна його вважати вбудованим DSL?
Відповіді:
Розрізнити важко, і це залежить від мови, що використовується. Він також суб'єктивний.
Крім цього, ви можете визначити 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, але деякі з них погано розроблені :-)
API та DSL - це зовсім різні поняття, і є лише деякі сфери, де можна сказати, що вони перетинаються.
Всі DSL - це комп'ютерні мови . Вони можуть бути інтерпретовані, компільовані, розмітки, мови запитів (наприклад, SQL) або (наприклад, JSON або деякі види використання XML), які можуть використовуватися у повідомленнях, що передаються через API, але вони повинні бути мовами . Термін описує природу , а не мету.
API - це інтерфейси, які дозволяють використовувати один компонент програмного забезпечення іншими компонентами. Термін описує мету , а не природу. API може бути набором об'єктних методів, наприклад - це не DSL. Веб - API може використовувати DSL (або, якщо це заспокійливе, ви могли б стверджувати , що це DSL) , але загальний домен конкретного мови не є частиною визначення. Драйвер програмного забезпечення для пристрою може бути записаний на С, API, розподілений у вигляді складеної бібліотеки, протокол повністю бінарний і будь-яка мова, яка може використовувати бібліотеку, може використовуватися для створення клієнта. Ніщо в цьому API не може бути названо DSL (список символьних імен для функцій API не скорочує його).
Я трохи розгублений, чому ви можете бачити лише подібність, враховуючи визначення.
Загалом, ні. DSL навмисно робиться не загальним, щоб зробити деякі операції більш зручними. Такі речі, як HTML чи логотип, спочатку були мовами, що залежать від домену.
Загалом, ви не можете вбудувати DSL на іншу мову навіть із найпотужнішим API; все, що ви програмуєте проти цього API, все одно буде виглядати як серія виразів на мові хоста і не буде настільки зручним, як використання мови спеціального призначення.
Виняток становлять мови, які надають виняткові можливості перекривляти синтаксис через бібліотеку (оператор перевантажує на зразок C ++, вигадує нові оператори, як Scala, або навіть попередньо визначає зовсім інший синтаксис читання, як Perl, з джерельними фільтрами). Якщо ви користуєтеся такою мовою і повністю використовуєте гнучкість, яку вони пропонують, результат може бути схожим на нову мову спеціального призначення (але семантика часто буде тонко відрізнятися від тієї, яку ви очікували, якби мова була справді винайдена. від землі вгору, щоб служити вашим кінцям).
Тут, від DslBoundary Мартіна Фаулера
Зі статті, моє розуміння - це в основному вбудовані DSL, а API не настільки різниться. Але тут є трохи різниця.
Але якщо говорити про зовнішній DSL, це буде інша історія. Зовнішній DSL - це як маленька мова програмування, але, безумовно, це не мова загального призначення, що означає, що він не може вирішити всі проблеми, а конкретну проблему.
Я думаю, що кожен API - це вбудований DSL, але навпаки це неправда: не кожен вбудований DSL - це API. Тільки коли мова використовується як засіб інтеграції компонентів, її можна назвати API.
Чому API можна вважати вбудованим DSL? Перш за все, вона формує мову: вона має примітивні елементи (типи та операції), які можна комбінувати (за допомогою мови перебування) для формування абстракцій та вирішення складних задач. Наприклад, API OpenGL може використовуватися для візуалізації 3D-сцен у режимі реального часу. API колекцій може бути використаний для створення алгоритмів, які працюють над наборами об'єктів тощо. По-друге, це, очевидно, домен; наприклад, домен API Collections обробляє набори об’єктів, а домен API OpenGL - 3D-рендерінг. Отже API є мовою, що залежить від домену.
Але не кожен DSL - це API. Наприклад, деякі DSL не повинні бути реалізовані визначеним компонентом. Усі системи визначають деякі абстракції, а абстракції, які мають справу з певним конкретним доменом, можна вважати DSL, але це не означає, що реалізація цих абстракцій повинна бути "заміною", іншими словами, вони не повинні формувати API . Вони могли, але це не завжди потрібно. Однак у випадках, коли реалізація є "компонентною" (вибачте за відсутність кращого терміну), DSL дійсно стає API.