DSL vs DSML: czym są języki dziedzinowe i języki modelowania dziedzinowego?

Z pojęciem języków dziedzinowych (ang. DSL – Domain-Specific Languages) spotkałem się już dość dawno i znaczenie tego pojęcia było dla mnie w miarę zrozumiałe. Chodzi po prostu o języki zaprojektowane do użycia w konkretnych dziedzinach i dostosowane do nich swoją składnią oraz semantyką.

Kiedy jednak pewnego razu natknąłem się na skrót DSML, rozwijany jako Domain-Specific Modeling Languages (języki modelowania dziedzinowego) i okazało się, że bynajmniej nie jest to to samo – nieco zgłupiałem. Postanowiłem więc rozwiać wszelkie wątpliwości i wyjaśnić tę kwestię.

DSL

Z programistycznego punktu widzenia koncepcja języków domenowych jest dość prosta do zrozumienia. Od strony technicznej są to bowiem zwyczajne języki programowania, tyle że powstałe z myślą o wykorzystaniu ich w określonych dziedzinach. Na ogół nie są też tak rozbudowane jak języki ogólnego przeznaczenia.

Przykłady? Proszę bardzo!

  • PostScript – język opisu strony, który pozwala opisać rozmieszczenie na niej tekstu i grafiki (umożliwia nie tylko wstawianie obrazów, ale też rysowanie obiektów zadanych algorytmem).
  • make – służy do zarządzania zależnościami plików źródłowych, wymaganymi do kompilacji.
  • TeX (i jego pochodne, takie jak LaTeX czy BibTeX) – język przeznaczony do składu tekstu.
  • Verilog – język opisu sprzętu, używany do projektowania układów logicznych.
  • Wyrażenia regularne – pozwalające na dopasowywanie wzorców do tekstu.

Warto zauważyć, że języki dziedzinowe niekoniecznie służą do tego, by być bezpośrednio przekształcane w wykonywalny program. Rezultatem działania translatora DSL może być chociażby plik multimedialny, konfiguracja albo inny język wysokiego poziomu.

Wyrażenia regularne to przykład języka dziedzinowego

Little Languages

Wśród dziedzinowych języków programowania niekiedy wyróżniana jest grupa małych języków (ang. Little Languages)[3], charakteryzujących się zastosowaniem w bardzo konkretnej, wąskiej domenie.

Nierzadko ich składnia jest dość enigmatyczna i mało zrozumiała dla osób niezaznajomionych z danym językiem (tak jest np. w przypadku sed lub awk). Trzeba mieć na uwadze, że przynależność języków do tej kategorii jest jednak dosyć płynna.

eDSL

Inną, o wiele istotniejszą kategoryzacją języków domenowych jest podział na dwa rodzaje:

  • języki niezależne (zewnętrzne) – funkcjonują jako zupełnie samodzielne języki programowania, a ich implementacja wymaga zaprojektowania osobnych kompilatorów lub interpreterów.
  • języki wbudowane (eDSL – Embedded Domain-Specific Languages), zwane też wewnętrznymi – są zbudowane na bazie innych języków, najczęściej ogólnego przeznaczenia (C++, Haskell, Perl itd.), i dzięki np. odpowiednim bibliotekom rozszerzają ich funkcjonalności, pozwalając tworzyć kod na wyższym (bliższym danej dziedzinie) poziomie abstrakcji.

Stworzenie eDSL jest na ogół prostszym zadaniem niż zaprojektowanie zupełnie nowego zewnętrznego języka dziedzinowego. Często bowiem język wbudowany dziedziczy ze swojego „języka bazowego” wszelkie niezbędne do pisania algorytmów konstrukty, takie jak pętle, instrukcje warunkowe, przypisania, funkcje itd.

Nie jest to jednak jedyne podejście do eDSL. Języki wewnętrzne mogą też być zbudowane w oparciu o makra albo łańcuchy znaków, których zawartość jest odpowiednio interpretowana. Na przykład pozwolenie użytkownikowi języka na stosowanie jakiejś formy wyrażeń regularnych wewnątrz stringów może być rozpatrywane właśnie jako przykład eDSL.

Z kolei w C++ do tworzenia języków wbudowanych niekiedy używa się też szablonów. Jeśli jednak miałeś kiedyś do czynienia w metaprogramowaniem w tym języku, to zapewne wiesz, że taki sposób to raczej dość hardcorowe rozwiązanie, a enigmatyczne błędy kompilatora zdecydowanie nie ułatwiają developmentu niczego, co jest oparte na szablonach. Z tego też względu powstało kilka narzędzi, ułatwiających generowanie eDSL wewnątrz C++, z których warto wymienić potężną bibliotekę Boost.Proto.

DSML

Czym jednak są języki modelowania dziedzinowego i jak mają się do języków dziedzinowych? Przejrzałem sporo publikacji, poszukując jasnych i precyzyjnych definicji. Okazało się też, że podobne do moich wątpliwości pojawiły się chociażby u jednego z użytkowników StackOverflow.

Na podstawie wszystkich zebranych informacji, pokusiłbym się o następujące podsumowanie tematu DSML:

  • DSML są podgrupą należącą do DSL. Innymi słowy – wszystkie DSML to również DSL, zaś nie wszystkie DSL to także DSML.
  • Kiedy mowa o DSL, często ma się na myśli języki programowania – takie normalne, z tekstowym kodem źródłowym.
  • Z kolei DSML są przede wszystkim narzędziami graficznymi.

Przykładem języka modelowania, który na pewno znasz, jest UML. Jest graficzny, ale zaprojektowany został do ogólnego modelowania, a nie specyficznego dla jakiejś konkretnej dziedziny.

Modelowanie przy użyciu UML (źródło: Wiki)

Definicje

W artykule „Comparative Analysis of Workbenches to Support DSMLs: Discussion with Non-Trivial Model-Driven Development Needs” autorzy stwierdzają [8]:

Modelowanie domenowe jest często wyrażane przy użyciu języków modelowania domenowego (DSL). DSL to język dostosowany do określonego zestawu zadań, który
poprzez odpowiednie zapisy i abstrakcje (tekstowe lub graficzne) przedstawia koncepcje konkretnej domena problemowej.

W szczególności, języki modelowania dziedzinowego (DSML) jeszcze bardziej ją abstrahują, ponieważ koncepcje są przedstawiane głównie za pomocą notacji graficznej. Ponieważ nie istnieje ustalona konwencja, to za każdym razem gdy będziemy wspominali o DSML, będziemy mieli na mysli „DSL z graficzną notacją”.

 

Z kolei z publikacji „Domain-Specific Modeling Environment Based on UML Profiles” zawarta jest taka oto definicja [9]:

Język dziedzinowy (DSL) jest zazwyczaj formalnym, interpretowalnym językiem do opisu konkretnej domeny (lub części tej domeny), dla której system jest zaprojektowany. W tym artykule skupiamy się przede wszystkim na tworzeniu graficznych DSL zaprojektowanych do celów modelowania, które to języki nazywamy językami modelowania dziedzinowego (DSML).

 

Na koniec zaś fragment z artykułu „Improving End-User Productivity in Measurement Systems with a Domain-Specific (Modeling) Language Sequencer” [10]:

DSL są zazwyczaj tekstowe, jednak czasami takie języki specyfikacji mogą być nieodpowiednie się do konkretnej dziedziny problemowej. Z drugiej strony, rozwój DSML może zwiększyć ekspresyjność i łatwość obsługi, ponieważ programy (modele) są określone w sposób wizualny.

 

Jak widać, wszystkie trzy definicje uwypuklają fakt, że DSML to języki dziedzinowe, ale używające notacji graficznej.

Przykłady

Jeśli chodzi o przykłady języków modelowania domenowego, to niestety znalezienie ich jest znacznie trudniejsze niż w przypadku tekstowych DSM. Zapewne wynika to z faktu, że wiele DSML nie jest po prostu upublicznianych. Pomagają w modelowaniu bardzo konkretnych systemów komercyjnych, ale pozostają ukryte na wewnętrznych serwerach.  Parę dość ogólnych przykładów można jednak znaleźć np. na stronie MetaCase, producenta jednego ze środowisk do tworzenia DSML [11].

I tak oto do przykładowych dziedzin, w których DSML znajdują zastosowanie należą:

  • Aplikacje Internet of Things
  • Usługi finansowe
  • Systemy sterowania na kolei
  • Specyfikacja aplikacji mobilnych
  • PLC
Modelowanie urządzenia do separacji krwi przy użyciu DSML (źródło: [12])

Podsumowanie

Języki dziedzinowe to rozwiązanie pomocne w naprawdę wielu różnych domenach. Warto mieć świadomość istnienia DSL, by w razie potrzeby móc poszerzyć swój wachlarz umiejętności również o ich tworzenie. Ze względu na bogactwo narzędzi, zarówno tych do projektowania graficznych języków (DSML), jak i tekstowych, zbudowanie własnego języka dziedzinowego nie zawsze musi być trudne.

Jeśli zainteresował Cię ten temat, to polecam Ci też zerknąć na zgromadzone poniżej linki. Znajdziesz tam dodatkowe ciekawe informacje o domenowych językach programowania.

Źródła

  1. Lista języków dziedzinowych języków programowania.
  2. WikiWikiWeb: Domain Specific Language.
  3. WikiWikiWeb: Little Language.
  4. The complete guide to (external) Domain Specific Languages, F. Tomassetti.
  5. Building your own DSL does not have to be hard, Markus Eliasson.
  6. Quora: What is an embedded domain-specific language?
  7. DSLs In Action, D Ghosh.
  8. Comparative Analysis of Workbenches to Support DSMLs: Discussion with Non-Trivial Model-Driven Development Needs, A. Ribeiro et al.
  9. Domain-Specific Modeling Environment Based on UML Profiles, D. Silingas et al.
  10. Improving End-User Productivity in Measurement Systems with a Domain-Specific (Modeling) Language Sequencer, T. Kos et al.
  11. MetaCase: DSML Examples.
  12. Using domain-specific modeling languages for medical device development.
.