Język specyficzny dla domeny - Domain-specific language

Język dziedzinowy ( DSL ) to język programowania specjalizuje się do konkretnej aplikacji domenie . Jest to w przeciwieństwie do języka ogólnego przeznaczenia (GPL), który ma szerokie zastosowanie w różnych domenach. Istnieje wiele różnych DSL, od powszechnie używanych języków dla popularnych domen, takich jak HTML dla stron internetowych, po języki używane tylko przez jeden lub kilka programów, takich jak miękki kod MUSH . DSL mogą być dalej podzielone według rodzaju języka i obejmują języki znaczników specyficzne dla domeny , języki modelowania specyficzne dla domeny (ogólniej, języki specyfikacji ) i języki programowania specyficzne dla domeny . Języki komputerowe specjalnego przeznaczenia zawsze istniały w erze komputerów, ale termin „język specyficzny dla domeny” stał się bardziej popularny ze względu na rozwój modelowania specyficznego dla domeny . Prostsze łącza DSL, szczególnie te używane przez pojedynczą aplikację, są czasami nieformalnie nazywane minijęzykami .

Granica między językami ogólnego przeznaczenia a językami dziedzinowymi nie zawsze jest ostra, ponieważ język może mieć cechy wyspecjalizowane dla określonej dziedziny, ale może mieć szersze zastosowanie, lub odwrotnie, może zasadniczo nadawać się do szerokiego zastosowania, ale w praktyce jest używany głównie do konkretna domena. Na przykład Perl został pierwotnie opracowany jako język do przetwarzania tekstu i klejenia, dla tej samej domeny, co AWK i skrypty powłoki , ale później był używany głównie jako język programowania ogólnego przeznaczenia. Dla kontrastu, PostScript jest kompletnym językiem Turinga iw zasadzie może być używany do dowolnego zadania, ale w praktyce jest wąsko używany jako język opisu strony .

Posługiwać się

Projektowanie i używanie odpowiednich DSL jest kluczową częścią inżynierii domeny , poprzez użycie języka odpowiedniego dla danej domeny – może to polegać na wykorzystaniu istniejącego DSL lub GPL, albo opracowaniu nowego DSL. Programowanie zorientowane na język traktuje tworzenie języków specjalnego przeznaczenia do wyrażania problemów jako standardową część procesu rozwiązywania problemów. Tworzenie języka specyficznego dla domeny (z oprogramowaniem do jego obsługi), zamiast ponownego wykorzystywania istniejącego języka, może być opłacalne, jeśli język pozwala na wyraźniejsze wyrażenie określonego rodzaju problemu lub rozwiązania, niż pozwala na to istniejący język, a rodzaj omawiany problem pojawia się wystarczająco często. Pragmatycznie, DSL może być wyspecjalizowane w określonej domenie problemu, określonej technice reprezentacji problemu, określonej technice rozwiązywania lub innych aspektach domeny.

Przegląd

Język specyficzny dla domeny jest tworzony specjalnie w celu rozwiązywania problemów w określonej domenie i nie jest przeznaczony do rozwiązywania problemów poza nią (chociaż może to być technicznie możliwe). Natomiast języki ogólnego przeznaczenia są tworzone w celu rozwiązywania problemów w wielu dziedzinach. Domena może być również obszarem biznesowym. Oto kilka przykładów obszarów biznesowych:

  • polisy na życie (opracowane wewnętrznie przez duży zakład ubezpieczeń)
  • symulacja walki
  • naliczanie wynagrodzenia
  • dane do faktury

Język specyficzny dla domeny znajduje się gdzieś pomiędzy małym językiem programowania a językiem skryptowym i jest często używany w sposób analogiczny do biblioteki programowania . Granice między tymi koncepcjami są dość niewyraźne, podobnie jak granica między językami skryptowymi a językami ogólnego przeznaczenia.

W projektowaniu i realizacji

Języki specyficzne dla domeny to języki (lub często zadeklarowane składnie lub gramatyki) z bardzo określonymi celami w projektowaniu i implementacji. Język specyficzny dla domeny może być jednym z języków diagramów wizualnych, takich jak języki utworzone przez Generic Eclipse Modeling System , abstrakcje programistyczne, takie jak Eclipse Modeling Framework , lub języki tekstowe. Na przykład narzędzie wiersza poleceń grep ma składnię wyrażeń regularnych, która dopasowuje wzorce w wierszach tekstu. Narzędzie sed definiuje składnię do dopasowywania i zastępowania wyrażeń regularnych. Często te małe języki mogą być używane razem w powłoce do wykonywania bardziej złożonych zadań programistycznych.

Granica między językami specyficznymi dla domeny a językami skryptowymi jest nieco zamazana, ale językom specyficznym dla domeny często brakuje funkcji niskiego poziomu dla dostępu do systemu plików, kontroli międzyprocesowej i innych funkcji, które charakteryzują w pełni funkcjonalne języki programowania, skrypty lub inne. Wiele języków specyficznych dla domeny nie kompiluje się do kodu bajtowego lub kodu wykonywalnego, ale do różnych rodzajów obiektów multimedialnych: GraphViz eksportuje do PostScript , GIF , JPEG , itp., gdzie Csound kompiluje się do plików audio i domeny ray tracingu. specyficzny język, taki jak kompilacja POV do plików graficznych. Język komputerowy, taki jak SQL, przedstawia interesujący przypadek: można go uznać za język specyficzny dla domeny, ponieważ jest specyficzny dla określonej domeny (w przypadku SQL dostęp do relacyjnych baz danych i zarządzanie nimi) i często jest wywoływany z innej aplikacji, ale SQL ma więcej słów kluczowych i funkcji niż wiele języków skryptowych i jest często uważany za język sam w sobie, być może ze względu na powszechność manipulacji bazami danych w programowaniu i stopień opanowania wymaganego do bycia ekspertem w tym języku.

Dalsze zacieranie tej linii, wiele języków specyficznych dla domeny ma ujawnione interfejsy API i można uzyskać do nich dostęp z innych języków programowania bez przerywania przepływu wykonywania lub wywoływania oddzielnego procesu, a zatem mogą działać jako biblioteki programistyczne.

Narzędzia programistyczne

Niektóre języki specyficzne dla domeny rozszerzają się z czasem, obejmując w pełni funkcjonalne narzędzia programistyczne, co dodatkowo komplikuje pytanie, czy język jest specyficzny dla domeny, czy nie. Dobrym przykładem jest język funkcjonalny XSLT , zaprojektowany specjalnie do przekształcania jednego wykresu XML w inny, który od samego początku był rozszerzany, aby umożliwić (szczególnie w wersji 2.0) różne formy interakcji z systemem plików, manipulację ciągami i datami oraz wpisywanie danych .

W inżynierii opartej na modelach można znaleźć wiele przykładów języków specyficznych dla domeny, takich jak OCL , język do dekorowania modeli za pomocą asercji lub QVT , język transformacji specyficznej dla domeny. Jednak języki takie jak UML są zazwyczaj językami modelowania ogólnego przeznaczenia.

Podsumowując, przydatna może być analogia: bardzo mały język jest jak nóż, którego można używać na tysiące różnych sposobów, od ścinania jedzenia po ścinanie drzew. Język specyficzny dla danej domeny jest jak wiertarka elektryczna: jest potężnym narzędziem o wielu różnych zastosowaniach, ale w określonym kontekście, a mianowicie do dziurkowania rzeczy. Język ogólnego przeznaczenia to kompletny stół warsztatowy, z różnymi narzędziami przeznaczonymi do wykonywania różnych zadań. Języki specyficzne dla domeny powinny być używane przez programistów, którzy patrząc na swoje obecne środowisko pracy, zdają sobie sprawę, że potrzebują lepszego drążenia i stwierdzają, że konkretny język specyficzny dla domeny zapewnia dokładnie to.

Tematy językowe specyficzne dla domeny

Języki specyficzne dla domeny zewnętrznej i wbudowanej

DSL zaimplementowane za pomocą niezależnego interpretera lub kompilatora są znane jako języki specyficzne dla domeny zewnętrznej . Dobrze znane przykłady to LaTeX lub AWK. Oddzielna kategoria, znana jako osadzone (lub wewnętrzne) języki specyficzne dla domeny, jest zwykle implementowana w języku hosta jako biblioteka i zwykle jest ograniczona do składni języka hosta, chociaż zależy to od możliwości języka hosta.

Wzorce użytkowania

Istnieje kilka wzorców użycia dla języków specyficznych dla domeny:

  • Przetwarzanie za pomocą samodzielnych narzędzi, wywoływanych przez bezpośrednią operację użytkownika, często z wiersza poleceń lub z pliku Makefile (np. grep do dopasowywania wyrażeń regularnych, sed, lex, yacc, zestaw narzędzi GraphViz itp.)
  • Języki specyficzne dla domeny, które są implementowane przy użyciu systemów makr języka programowania i które są konwertowane lub rozszerzane na język ogólnego przeznaczenia hosta w czasie kompilacji lub w czasie rzeczywistym
  • wbudowany język specyficzny dla domeny ( eDSL ), zaimplementowany jako biblioteki, które wykorzystują składnię języka ogólnego przeznaczenia hosta lub jego podzbioru, dodając elementy języka specyficzne dla domeny (typy danych, procedury, metody, makra itp.). (np. jQuery , React , Embedded SQL , LINQ )
  • Języki specyficzne dla domeny, które są wywoływane (w czasie wykonywania) z programów napisanych w językach ogólnego przeznaczenia, takich jak C lub Perl , w celu wykonania określonej funkcji, często zwracając wyniki operacji do języka programowania „hosta” w celu dalszego przetwarzania; ogólnie rzecz biorąc, interpreter lub maszyna wirtualna dla języka specyficznego dla domeny jest osadzona w aplikacji hosta (np. ciągi formatu , silnik wyrażeń regularnych )
  • Języki specyficzne dla domeny, które są osadzone w aplikacjach użytkownika (np. języki makr w arkuszach kalkulacyjnych) i które są (1) używane do wykonywania kodu napisanego przez użytkowników aplikacji, (2) dynamicznie generowanego przez aplikację lub (3) Zarówno.

Wiele języków specyficznych dla domeny może być używanych na więcej niż jeden sposób. Kod DSL osadzony w języku hosta może mieć specjalną obsługę składni, taką jak wyrażenia regularne w sed, AWK, Perl lub JavaScript, lub może być przekazywany jako ciągi.

Cele projektowe

Przyjęcie specyficznego dla domeny podejścia do inżynierii oprogramowania wiąże się zarówno z ryzykiem, jak i możliwościami. Dobrze zaprojektowany język specyficzny dla domeny udaje się znaleźć odpowiednią równowagę między nimi.

Języki specyficzne dla domeny mają ważne cele projektowe, które kontrastują z językami ogólnego przeznaczenia:

  • Języki specyficzne dla domeny są mniej wszechstronne.
  • Języki specyficzne dla domeny są znacznie bardziej wyraziste w swojej domenie.
  • Języki specyficzne dla domeny powinny wykazywać minimalną nadmiarowość .

Frazeologia

W programowaniu idiomy to metody narzucane przez programistów do obsługi typowych zadań programistycznych, np.:

  • Upewnij się, że dane zostały zapisane przed zamknięciem okna.
  • Edytuj kod za każdym razem, gdy zmieniają się parametry wiersza polecenia, ponieważ wpływają one na zachowanie programu.

Języki programowania ogólnego przeznaczenia rzadko obsługują takie idiomy, ale języki specyficzne dla domeny mogą je opisywać, np.:

  • Skrypt może automatycznie zapisywać dane.
  • Język specyficzny dla domeny może sparametryzować dane wejściowe wiersza polecenia.

Przykłady

Przykłady języków specyficznych dla domeny obejmują HTML , Logo do rysowania ołówkiem, języki opisu sprzętu Verilog i VHDL , MATLAB i GNU Octave do programowania macierzowego, Mathematica , Maple i Maxima do matematyki symbolicznej , język specyfikacji i opisu dla systemów reaktywnych i rozproszonych, formuły i makra arkuszy kalkulacyjnych , SQL do zapytań do relacyjnych baz danych , gramatyki YACC do tworzenia parserów , wyrażenia regularne do określania lekserów , Generic Eclipse Modeling System do tworzenia języków diagramów, Csound do syntezy dźwięku i muzyki oraz języki wejściowe GraphViz i GrGen , oprogramowanie pakiety używane do układania i przepisywania wykresów , język konfiguracyjny Hashicorp używany do Terraform i innych narzędzi Hashicorp , Puppet ma również swój własny język konfiguracyjny .

Język GameMakera

Język skryptowy GML używany przez GameMaker Studio to język specyficzny dla domeny, przeznaczony dla początkujących programistów, aby mogli łatwo nauczyć się programowania. Chociaż język służy jako mieszanka wielu języków, w tym Delphi , C++ i BASIC , brakuje struktur, typów danych i innych cech pełnoprawnego języka programowania. Wiele wbudowanych funkcji jest piaskowanych w celu ułatwienia przenoszenia. Język służy przede wszystkim ułatwieniu każdemu nauczenia się języka i stworzenia gry.

Język znaczników ColdFusion

Powiązany język skryptowy ColdFusion jest kolejnym przykładem języka specyficznego dla domeny dla witryn internetowych opartych na danych. Ten język skryptowy służy do łączenia języków i usług, takich jak Java, .NET, C++, SMS, e-mail, serwery poczty e-mail, http, ftp, wymiana, usługi katalogowe i systemy plików do użytku w witrynach internetowych.

Język ColdFusion Markup Language (CFML) zawiera zestaw znaczników, których można używać na stronach ColdFusion do interakcji ze źródłami danych, manipulowania danymi i wyświetlania danych wyjściowych. Składnia tagów CFML jest podobna do składni elementów HTML.

Erlang OTP

Platforma Erlang Open Telecom została pierwotnie zaprojektowana do użytku w firmie Ericsson jako język specyficzny dla domeny. Sam język oferuje platformę bibliotek do tworzenia skończonych maszyn stanowych, ogólnych serwerów i menedżerów zdarzeń, które pozwalają inżynierowi szybko wdrażać aplikacje lub obsługiwać biblioteki, które zostały pokazane w branżowych testach porównawczych, aby przewyższyć inne języki przeznaczone dla mieszanego zestawu domen , takich jak C i C++. Język jest teraz oficjalnie open source i można go pobrać z ich strony internetowej.

FilterMeister

FilterMeister to środowisko programistyczne z językiem programowania opartym na C, przeznaczonym do tworzenia wtyczek filtrów przetwarzania obrazu zgodnych z programem Photoshop ; FilterMeister sam działa jako wtyczka programu Photoshop i może ładować i wykonywać skrypty lub kompilować i eksportować je jako niezależne wtyczki. Chociaż język FilterMeister odtwarza znaczną część języka i biblioteki funkcji C, zawiera tylko te funkcje, które mogą być używane w kontekście wtyczek programu Photoshop i dodaje szereg specyficznych funkcji przydatnych tylko w tej konkretnej domenie.

Szablony MediaWiki

Szablon cechą MediaWiki jest wbudowany język dziedzinowy, której podstawowym celem jest wspieranie tworzenia szablonów stron i transkluzja (Włączenie przez odniesienie) MediaWiki stron do innych stron MediaWiki.

Zastosowania inżynierii oprogramowania

Istnieje duże zainteresowanie językami specyficznymi dla domeny w celu poprawy wydajności i jakości inżynierii oprogramowania . Język specyficzny dla domeny mógłby prawdopodobnie zapewnić solidny zestaw narzędzi do wydajnej inżynierii oprogramowania. Takie narzędzia zaczynają pojawiać się w rozwoju krytycznych systemów oprogramowania.

Przykładem tego jest Software Cost Reduction Toolkit. Pakiet to zestaw narzędzi, w tym edytor specyfikacji do tworzenia specyfikacji wymagań , przeglądarki wykres zależność wyświetlać zmienne zależne, sprawdzania spójności , aby nadrobić brakujące przypadki formuł w opisie, modelu sprawdzania oraz twierdzenie Prover do sprawdzanie właściwości programu pod kątem specyfikacji oraz generatora niezmienników, który automatycznie konstruuje niezmienniki na podstawie wymagań.

Nowszym rozwojem jest programowanie zorientowane na język , zintegrowana metodologia inżynierii oprogramowania oparta głównie na tworzeniu, optymalizacji i korzystaniu z języków specyficznych dla domeny.

Metakompilatory

Uzupełnieniem programowania językowego , jak również wszystkich innych form języków specyficznych dla domeny, jest klasa narzędzi do pisania kompilatorów zwanych metakompilatorami . Metakompilator jest przydatny nie tylko do generowania parserów i generatorów kodu dla języków specyficznych dla domeny, ale sam metakompilator kompiluje metajęzyk specyficzny dla domeny specjalnie zaprojektowany dla domeny metaprogramowania .

Oprócz analizowania języków specyficznych dla domeny, metakompilatory są przydatne do generowania szerokiej gamy narzędzi inżynierii oprogramowania i narzędzi analitycznych. Metodologia meta-kompilatora jest często spotykana w systemach transformacji programów .

Metakompilatory, które odegrały znaczącą rolę zarówno w informatyce, jak i przemyśle komputerowym, to Meta-II i jego potomek TreeMeta .

Unreal Engine przed wersją 4 i innymi grami

Unreal i Unreal Tournament zaprezentowały język o nazwie UnrealScript . Pozwoliło to na szybki rozwój modyfikacji w stosunku do konkurencyjnego Quake'a (z wykorzystaniem silnika Id Tech 2 ). Silnik Id Tech używał standardowego kodu C, co oznaczało, że C trzeba było nauczyć się i odpowiednio zastosować, podczas gdy UnrealScript został zoptymalizowany pod kątem łatwości użycia i wydajności. Podobnie rozwój nowszych gier wprowadził ich własne specyficzne języki, jeszcze jednym częstszym przykładem jest Lua do tworzenia skryptów.

Mechanizmy reguł do automatyzacji polityk

Opracowano różne silniki reguł biznesowych w celu automatyzacji zasad i reguł biznesowych stosowanych zarówno w sektorze rządowym, jak i prywatnym. ILOG , Oracle Policy Automation , DTRules , Drools i inni zapewniają wsparcie dla DSL zmierzających do wspierania różnych domen problemowych. DTRules posuwa się tak daleko, że definiuje interfejs do korzystania z wielu łączy DSL w ramach zestawu reguł.

Celem silników reguł biznesowych jest zdefiniowanie reprezentacji logiki biznesowej w sposób możliwie najbardziej czytelny dla człowieka. Pozwala to zarówno ekspertom merytorycznym, jak i programistom pracować i rozumieć tę samą reprezentację logiki biznesowej. Większość aparatów reguł zapewnia zarówno podejście do uproszczenia struktur kontroli logiki biznesowej (na przykład użycie reguł deklaratywnych lub tabel decyzyjnych ), jak i alternatywy dla składni programowania na rzecz DSL.

Języki modelowania statystycznego

Modele statystyczne opracowali języki specyficzne dla domeny, takie jak R (implementacja języka S ), Bugs , Jags i Stan . Języki te dostarczają składni opisującej model bayesowski i generują metodę rozwiązywania go za pomocą symulacji.

Generuj model i usługi w wielu językach programowania

Generuj obsługę obiektów i usługi w oparciu o język opisu interfejsu dla języka specyficznego dla domeny, takiego jak JavaScript dla aplikacji internetowych, HTML dla dokumentacji, C++ dla kodu o wysokiej wydajności itp. Odbywa się to za pomocą platform międzyjęzykowych, takich jak Apache Thrift lub Bufory protokołów Google .

Korniszon

Gherkin to język zaprojektowany do definiowania przypadków testowych w celu sprawdzenia zachowania oprogramowania, bez określania sposobu implementacji tego zachowania. Jest przeznaczony do czytania i używania przez użytkowników nietechnicznych, używających składni języka naturalnego i projektu zorientowanego na linie . Testy zdefiniowane za pomocą Gherkin muszą być następnie zaimplementowane w ogólnym języku programowania. Następnie kroki w programie Gherkin działają jako składnia wywoływania metod dostępnych dla osób niebędących programistami.

Inne przykłady

Inne znaczące przykłady języków specyficznych dla domeny obejmują:

Zalety i wady

Niektóre zalety:

  • Języki dziedzinowe umożliwiają wyrażanie rozwiązań w idiomie i na poziomie abstrakcji dziedziny problemowej. Pomysł polega na tym, że sami eksperci dziedzinowi mogą rozumieć, weryfikować, modyfikować, a często nawet opracowywać programy językowe specyficzne dla danej domeny. Jednak rzadko tak się dzieje.
  • Języki specyficzne dla domeny umożliwiają walidację na poziomie domeny. Dopóki konstrukcje językowe są bezpieczne, każde zdanie napisane za ich pomocą można uznać za bezpieczne.
  • Języki specyficzne dla domeny mogą pomóc w przeniesieniu rozwoju systemów informacji biznesowej z tradycyjnych programistów do zwykle większej grupy ekspertów dziedzinowych, którzy (pomimo mniejszej wiedzy technicznej) mają głębszą wiedzę w tej dziedzinie.
  • Języki specyficzne dla domeny są łatwiejsze do nauczenia, biorąc pod uwagę ich ograniczony zakres.

Niektóre wady:

  • Koszt nauki nowego języka a jego ograniczone zastosowanie
  • Koszt zaprojektowania, wdrożenia i utrzymania języka specyficznego dla domeny oraz narzędzi wymaganych do rozwoju z nim ( IDE )
  • Znajdowanie, ustalanie i utrzymywanie właściwego zakresu.
  • Trudność w równoważeniu kompromisów między specyficznością domeny a konstrukcjami języka programowania ogólnego przeznaczenia.
  • Potencjalna utrata wydajności procesora w porównaniu z ręcznie pisanym oprogramowaniem.
  • Rozprzestrzenianie się podobnych niestandardowych języków specyficznych dla domeny, na przykład DSL używanego w jednej firmie ubezpieczeniowej w porównaniu z DSL używanej w innej firmie ubezpieczeniowej.
  • Nietechnicznym ekspertom w dziedzinie domen może być trudno samodzielnie pisać lub modyfikować programy DSL.
  • Zwiększona trudność integracji DSL z innymi komponentami systemu informatycznego (w porównaniu z integracją z językiem ogólnego przeznaczenia).
  • Niska podaż ekspertów w danym DSL powoduje wzrost kosztów pracy.
  • Trudniej znaleźć przykłady kodu.

Narzędzia do projektowania języków specyficznych dla domeny

  • JetBrains MPS to narzędzie do projektowania języków specyficznych dla domeny. Wykorzystuje edycję projekcyjną, która pozwala na pokonanie ograniczeń parserów językowych i budowanie edytorów DSL, takich jak tabele i diagramy. Implementuje programowanie zorientowane na język. MPS łączy środowisko do definiowania języka, środowisko pracy języka oraz zintegrowane środowisko programistyczne (IDE) dla takich języków.
  • Xtext to platforma oprogramowania typu open source do opracowywania języków programowania i języków specyficznych dla domeny (DSL). W przeciwieństwie do standardowych generatorów parserów, Xtext generuje nie tylko parser, ale także model klasy dla abstrakcyjnego drzewa składni. Ponadto zapewnia w pełni funkcjonalne, konfigurowalne środowisko IDE oparte na środowisku Eclipse.
  • Racket to wieloplatformowy łańcuch narzędzi językowych, w tym kompilator, kompilator JIT, IDE i narzędzia wiersza poleceń zaprojektowane tak, aby umożliwić tworzenie zarówno języków specyficznych dla domeny, jak i zupełnie nowych języków.

Zobacz też

Bibliografia

Dalsza lektura

Zewnętrzne linki

Artykuły