Co to jest język specyficzny dla domeny? Czy ktoś go używa? W jaki sposób?


107

Chyba szukam jakiegoś intro i zobaczę, czy ktoś go użył. Czy są jakieś szczególne zalety jej używania?

Wikipedia:

język specyficzny dla domeny (DSL) to język programowania lub język specyfikacji poświęcony określonej dziedzinie problemu, konkretnej technice reprezentacji problemu i / lub określonej technice rozwiązywania.

Czy ktoś może podać konkretne przykłady tego, jak go wdrożyłeś lub jak może się to przydać w danym scenariuszu?


Właściwie język specyficzny dla domeny to termin o dobrze zdefiniowanym znaczeniu w programowaniu - sprawdź artykuł na Wikipedii
1800 INFORMACJE

Jak zauważono poniżej, DSL nie jest jednym językiem, ale nazwą całej klasy języków specjalnego przeznaczenia.
dmckee --- ex-moderator kitten

Czy mogę więc powiedzieć, że R to DSL?
Srikar Doddi

2
Na skraju, ale nie zrobiłbym tego. R ma wszystkie struktury ogólnego przeznaczenia i jest używany do szerokiego zakresu obliczeń; obliczenia numeryczne i statystyki nie są domeną nrrow. Jest to jednak dobry test definicji.
Charlie Martin

Odpowiedzi:


114

Język specyficzny dla domeny to język napisany w celu rozwiązania określonej domeny lub zestawu problemów. Jest ich wiele, takich jak make, ant i rake do opisywania kompilacji oprogramowania lub lexx i yacc do budowy języka. W ostatnich latach stały się popularne, ponieważ niektóre elementy zostały połączone, aby ułatwić ich tworzenie. Jedną z najważniejszych rzeczy jest rosnąca popularność Rubiego, który ma kilka funkcji ułatwiających tworzenie nowych DSL.

Martin Fowler jest wielkim zwolennikiem tego pomysłu, tak jak tutaj .


4
Jakie funkcje ma Ruby, które ułatwiają tworzenie nowego DSL?
Lernkurve

2
@Lernkurve - Ruby miał metaprogramowanie, co pomaga. rubylearning.com/blog/2010/11/23/…
James Black

@CharlieMartin, czy mógłbyś mi powiedzieć o „groovy”? jaki to rodzaj języka? Chcę wiedzieć, proszę Pomóż tutaj ..
G dangi

2
Groovy to język skryptowy działający w JVM. Zasadniczo ma być odpowiedzią Java na Rubiego. Jest to język ogólnego przeznaczenia, ale można go używać do pisania DSL. docs.groovy-lang.org/docs/latest/html/documentation/…
Charlie Martin

1
Chciałbym dodać groovy Gradle'a. Jeśli się nie mylę, mają własny język opisujący kompilację.
Neon Warge,

67

Możesz myśleć o DSL jako o zbyt skomplikowanych argumentach dla funkcji napisanych w bardziej ogólnym języku programowania. Prawdziwy język programowania analizuje kod DSL i coś z nim robi. Zazwyczaj kod DSL koncentruje się tylko na tym, co chcesz zrobić, a większy system wyjaśnia, jak to zrobić .

Przykłady DSL obejmują wszystkie języki zapytań (SQL, XPath, ...), wszystkie języki szablonów (Django, Smarty, ...), skrypty powłoki, zwłaszcza takie, jak twill, przeglądarka internetowa sterowana poleceniami (używana głównie do testów automatycznych ), języki przechowywania i wymiany danych (XML, YAML, ...) oraz języki dokumentów, takie jak LaTex, HTML lub CSS.

Niektóre języki z bardzo elastyczną składnią, takie jak TCL i Lisp, budują swoje DSL bezpośrednio w języku ... jeśli to możliwe. Większość języków używa łańcuchów, zwykle ładowanych z plików zewnętrznych.

Czy są jakieś szczególne zalety ich używania? Używanie ich zgodnie z ich przeznaczeniem jest bardzo korzystne do tego stopnia, że ​​zwrócisz się do nich nie wiedząc, tak jak używasz (zakładam) języka SQL lub HTML, nie myśląc o nich jako o DSL.

Ośmielę się powiedzieć, że jest wystarczająco dużo DSL dla dowolnego rodzaju aplikacji, której możesz potrzebować; prawie na pewno nie musisz uczyć się pisać własnego.


1
Co zabawne, jeden przykład, którego nie
wymieniłeś,

12

(odnosząc się do sedna pytania)

Myślę, że kiedy po raz pierwszy zobaczyłem gdzieś DSL i jego definicję jako „język specyficzny dla domeny” , pomyślałem również, że jest to szczególny, konkretny język, o którym właśnie nie słyszałem - ale nie, jest to ogólne określenie języków, które są dostosowane do konkretnego obszaru zastosowania.

Jak na ironię, gdybyś właśnie usłyszał o TCL jako „języku poleceń narzędziowych”, mógłbyś pomyśleć, podobnie jak DSL, że byłoby wiele TCL dla różnych narzędzi - ale nie, to jest specyficzna nazwa konkretnego języka skryptowego.


10

Myślę, że jest to język odpowiedni do rozwiązywania problemów w określonej dziedzinie. Może to być język przetwarzania reguł lub język opisu usługi.

Przeciwieństwem języka specyficznego dla domeny (DSL) jest język ogólnego przeznaczenia .


10

Wszystko to DSL ...

Asembler: MOV R1 do R2
Kompilatory: Instrukcje przypisania - A = A + 1, Warunki - IF (TRUE) ..., Branch - RETURN
HTML: ... opisz zagnieżdżoną strukturę
TCP / IP: opisz do / z adresy
PDF: opisz rozmieszczenie tekstu / obrazu na papierze
Czcionki: opisz znaki

Każdy język, którego używamy do opisania określonego procesu, to DSL. Niestety brakuje języków specyficznych dla domeny, aby opisać nawet nasze najbardziej podstawowe procesy, więc używamy kilku języków, które mamy, aby opisać wszystko, co robimy. Spakowanie wszystkich plików html w mojej witrynie internetowej wymaga do wykonania 300 wierszy w 3 lub 4 różnych językach.

Aby zbudować DSL, określ minimalną liczbę znaków potrzebną do opisania procesu, który możesz zapamiętać i który nie wymaga dokumentacji. Pamiętaj, że szybkość i łatwość obsługi to podstawowe kryteria projektowe. Przetwarzanie jest tak szybkie, że każda składnia, której używasz, jest w porządku. W większości przypadków wolę język naturalny jako moją składnię: „Płać pracownikom pierwszego dnia miesiąca”, ale specyficzna dla domeny jest tylko to, specyficzna dla domeny, składnię określasz najlepiej pasuje do problemu.

Trzymałbym się z daleka od stosowania innych rozwiązań, które mogą być wygodne, ale nie pasują do problemu, takich jak HTML, który został użyty do zdefiniowania danych (XML). CSV jest bardzo przydatny, pasuje do większości problemów. JSON nie pasuje do części związanej z łatwością użycia, jest to przesada, która dodaje niepotrzebnych komplikacji, gdy CSV działa dla większości problemów. Używamy EXCEL często do DSL, świetnie sprawdza się przy opisywaniu małych problemów, poniżej 65K do 1M wierszy, takich jak struktury drzewiaste lub menu, kolumna A to poziom, inne kolumny to ikony, kolory, etykiety i tym podobne (EXCEL to edytowalny CSV).

Odkryłem, że HTML nie rozwiązał tak naprawdę problemu układu strony, więc pozbyłem się go i zdefiniowałem DSL, który pasuje. Zdefiniowałem 6 regionów na stronie: NAGŁÓWEK, CIAŁO, STOPKA, LEWE / PRAWE MARGINESY i LEWY / PRAWY PEŁNY MARGINES. Mógłbym wtedy powiedzieć generatorowi stron, aby dodał PASEK TYTUŁU, PASEK STATUSU, MENU, TABELA, FORMULARZE ... do określonych komórek. Każdą z tych komórek można następnie podzielić na wiersze i kolumny na dowolną głębokość. Układ strony w każdym stylu zajmuje kilka sekund.

BODY zawiera tabelę moich pracowników
NAGŁÓWEK zawiera napis „Hello World” na pasku tytułu z loginem do oprogramowania Collins

Menu DSL nie pasuje do układu strony DSL, więc stworzyłem unikalny DSL dla menu.

Zasób Moje menu główne
* zdefiniuj: menu, m, poziom, etykieta, ikona, akcja;
m, 0, plik;
m, 1, otwórz, otwórz.gif, okno dialogowe Otwórz plik;

Każdy problem jest wyjątkowy, komputer może używać dowolnego formatu, DSL jest przeznaczony dla człowieka, więc uczyń go zrozumiałym dla ludzi, czymś, co mogą wpisać, i uczyń język z prawdziwych słów; bo opisujemy prawdziwych ludzi, miejsca i rzeczy.


8

DSL to dobry sposób na opracowanie języka, który będzie używany przez osoby nie będące programistami. Na przykład, jeśli masz DSL dla finansistów w firmie, zamiast programowania według ich specyfikacji możesz po prostu pozwolić im napisać program, który chcą zrobić. Następnie, jeśli jest zbyt wolne, możesz wziąć to, co napisali, które działa tak, jak chcą, napisać to w skompilowanym języku, aby przyspieszyć.


5

Dobrze! jest wiele rzeczy wyjaśnionych powyżej. Spróbuję to wyjaśnić w dużo prostszy sposób, ponieważ ktoś taki jak ja zrozumie.

Ponieważ języki ogólnego przeznaczenia są używane do wielu celów, DSL jest przeznaczony tylko dla określonej domeny. Jak HTML lub CSS.

Możesz powiedzieć, że napisałeś instrukcje do gazety, którą tylko jakaś osoba lub twój jedyny najlepszy przyjaciel może zrozumieć i nikt inny nie może. Wtedy może to być DSL. Ale jeśli napisałeś instrukcję w taki sposób, który wielu ludzi może zrozumieć i może przestrzegać, to nie jest DSL.

Stworzyłem tablicę rozdzielczą dla użytkownika, która może być obsługiwana przez port szeregowy komputera, a użytkownik chce mieć program dla tej płyty, który mógłby być wykonywany na tej płycie, a przełączniki przekaźnikowe będą odpowiednio włączane i wyłączane. Napisałem więc kilka instrukcji i powiedziałem użytkownikowi, aby zaprogramował tę płytkę zgodnie z tymi instrukcjami. To jest przykład DSL. Nie wymyśliłem nowego języka, a po prostu stworzyłem grupę ciągów, które mikrokontroler mógł odczytać z EEPROM i mógł odpowiednio przeanalizować i mógł wykonać określone zadanie.


4

Napisałem krótki post na blogu omawiający, dlaczego lubię używać DSL:

Chciałbym, żebyśmy więcej używali języków specyficznych dla domeny (DSL)

W nim definiuję DSL jako:

Mały język programowania zaprojektowany specjalnie do komunikowania rozwiązań dla określonej dziedziny problemów.

Jeśli chodzi o użytkowanie, jeśli kiedykolwiek korzystałeś z Ant, Structured Query Language (SQL) lub Cascading Style Sheets (CSS), używałeś DSL.

Lubię używać DSL, ponieważ koncentrują się na ułatwianiu komunikacji rozwiązań dla określonych przestrzeni problemowych i robią to w sposób, który promuje włączenie ekspertów dziedzinowych.


3

Prostym przykładem języka specyficznego dla domeny (DSL) jest HTML, który jest używany dla określonej domeny zwanej aplikacjami internetowymi.


3

Niedawno słyszałem DSL, ale znalazłem naprawdę pomocny przykład: LUNA (dawny lunascript).

Jest to niestandardowy język programowania / framework stworzony przez zespół Asana dla ich własnej platformy.

Jak dalej stwierdzam, wiele firm tworzy własne ramy i języki, aby stworzyć odpowiednią przewagę konkurencyjną, kilka przykładów:

  • SAP z AbAp
  • PeopleSoft z PeopleCode
  • Apple z celem-C
  • Facebook ma takie rzeczy jak FBML i FQL

Są one specyficzne dla domeny, ponieważ będziesz ich używać prawie wyłącznie do pracy na tych platformach.

Mam nadzieję, że ta odpowiedź pomoże Ci wyjaśnić tę koncepcję.


3
Cel-C nie jest językiem specyficznym dla domeny
boraseoksoon

Nie został również stworzony przez (i dla) Apple.
Alexander Rossa,

2

Przykładem DSL używanym w uczeniu maszynowym jest patsy w Pythonie: https://patsy.readthedocs.io/en/latest/formulas.html#

która jest oparta na wzorze DSL z 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

a Hadley ma fajną sekcję swojej zaawansowanej książki R, która opisuje, jak zbudować DSL w / R: http://adv-r.had.co.nz/dsl.html

Gdy pole głębokiego uczenia się nieco ustabilizuje (lub nawet teraz), chciałbym zobaczyć coś podobnego w projekcie Apache MXnet. Jednak nie widziałem jeszcze żadnej propozycji na stronie propozycji .


1

Języki specyficzne dla domeny wyrażają procesy domeny i wiedzę w języku, który bezpośrednio wykorzystuje koncepcje i logikę z danej dziedziny.

Społeczność zdecydowanie rośnie, ale wciąż nie jest na poziomie innych "mainstreamowych" technologii.

W większości przypadków DSL ma na celu poprawę produktywności wewnątrz firm, więc zachowują ją prywatnie i nie udostępniają swoich wyników / spostrzeżeń.

Oto konferencja, na której prelegent podaje kilka przykładów DSL z wykorzystaniem JetBrains MPS , z technologią edycji Projectional: https://vimeo.com/197381453


1

DSL - język specyficzny dla domeny. Zacznijmy co to jest domena - domena to jakiś określony obszar, zakres. Ta domena może wyglądać na stronę internetową i masz do tego CSS, a druga domena może być strukturą strony internetowej, a tutaj masz HTML.

Ale domeną może być również aplikacja firmy X. W ramach tej domeny można stworzyć jakiś język. Język nie oznacza - w pełni doprawiona rzecz z własną gramatyką, składnią, kompilatorem lub uruchomieniem. DSL może być po prostu listą narzędzi, które rozwiązują problemy domeny.

Rozważmy OOP i jego model do reprezentowania obiektów domeny za pomocą klas i metod, jak te zachowania obiektów. Jeśli stworzymy taką strukturę i nadamy tym obiektom zachowania, wtedy możemy napisać kod używając tych pojęć. Rozważ ten przykład pseudokodu:

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")
}

Ile z góry wynosi GPL (język ogólnego przeznaczenia), a ile konkretna terminologia i narzędzia domeny. To jest połączenie dwóch, ale wszystkie polecenia są tutaj specyficzne dla domeny. To powiedziawszy, możemy powiedzieć, że powyżej jest napisane w DSL, gdzie domena jest aplikacją x.

Idąc dalej z tym przykładem, mogę stworzyć jeszcze bardziej abstrakcyjne narzędzia i przeważnie wykonać przepływ sterowania za pomocą tych narzędzi, rozważ (to jest więcej FP, ale mam nadzieję, że rozumiesz, o co mi chodzi):

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

Jak widać, udało mi się dość dużo streścić i użyć tej abstrakcji do wykonania przepływu sterowania. A wszystko na licencji GPL i działa w ramach GPL.

Aby ujawnić prawdę, wszyscy piszemy DSL, każda specyficzna dla domeny abstrakcja, której możesz użyć, jest taka. Ale większość z tych abstrakcji nie jest kompletnymi rozwiązaniami, dlatego nie używamy tego słowa zbyt często. Ale jeśli masz zestaw narzędzi, funkcji abstrakcyjnych dla Twojej domeny, tworzą one rodzaj DSL.

Co to jest także DSL, wiele rzeczy, na przykład każdy framework, który dostarcza zestaw reguł, to DSL. Jeśli zobaczysz, że ktoś twierdzi, że jest programistą React, to wiesz, że jest programistą specyficznym dla domeny, ponieważ React to dokładnie DSL, który jest alternatywą dla używania natywnej platformy internetowej. Jeśli możesz komponować funkcje z istniejących narzędzi specyficznych dla domeny, piszesz przy użyciu DSL. Idąc głębiej w React, przepraszam wszystkich ludzi nie z tego DSL: D, możecie stworzyć zestaw komponentów i skomponować je jako bloki konstrukcyjne, i hurra !, teraz stworzyliście DSL na szczycie DSL.

Tak, powtórzyłem DSL zbyt wiele razy, przepraszam.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.