Domain-specific language ( angl. domain-specific language , DSL - “ domain -specific language ”) - počítačový jazyk specializovaný pro konkrétní aplikační oblast (na rozdíl od univerzálního jazyka použitelného v širokém spektru oblastí, který nebere zohledňovat charakteristiky znalostí konkrétních oblastí). Konstrukce takového jazyka a/nebo jeho datová struktura odráží specifika úloh řešených s jeho pomocí [1] . Je to klíčový koncept jazykově orientovaného programování .
Přísně vzato, rozdělení programovacích jazyků na univerzální a doménově specifické jazyky je velmi libovolné, zvláště když uvážíte, že formálně jakýkoli protokol nebo formát souboru je . Existuje mnoho univerzálních jazyků používaných jako doménově specifické jazyky pro určité úkoly a naopak, doménově specifických jazyků používaných jako univerzální jazyky. Jazyk ML , který dal vzniknout celé rodině univerzálních jazyků (včetně Haskellu ), byl původně vyvinut jako DSL pro systém prokazování teorémů LCF . Příkladem ukazujícím podmíněnost klasifikace je jazyk BNF (a jeho kompilátor Lex / Yacc ): na jedné straně je to názorný příklad metajazyka , na druhé straně je určen pro jeden konkrétní úkol.
Nejjednodušší jazyky specifické pro doménu používané v jedné konkrétní aplikaci se často označují jako „mini-jazyky“ [2] .
Martin Ward [ 3] ve své práci „Language Oriented Programming“ [4] (která je považována za výchozí bod pro vývoj LOP ), použil termíny „ problem oriented “ a „ domain oriented “, ale v anglicky mluvících vědeckých komunitě termín „ doménově specifický “, navíc se jedná o „ doménově specifický jazyk “, nikoli „ doménově specifický programovací jazyk “. V ruské literatuře o programování existují možnosti „ doménově specifické “, „ problémově orientované “, „ doméně orientované “.
Fowler [5] a Dmitriev [6] definují koncept DSL jako „ ořezaný programovací jazyk (většinou Turing neúplný ) “.
Přední výzkumníci jazykově orientovaného programování (Martin Ward, Paul Hudak , Walid Taha a další) uvádějí následující příklady doménově specifických jazyků jako klasické [4] [7] [8] :
Podle Walida Tahiho je z pohledu LOP Microsoft Excel snad nejrozšířenějším programovacím jazykem na světě [8] .
Dalšími příklady doménově specifických jazyků jsou jazyky pro správu databází (kromě SQL zde lze nazvat například jazyk FoxPro ), příkazové jazyky operačního systému (interaktivní jazyky příkazového shellu, především Unix Shell , dávkové pracovní jazyky, jako je JCL atd..) [9] , Turingovy neúplné jazyky strukturující data ( XML , .ini , .conf ), značkovací jazyk wiki , modelovací jazyky ( UML , GPSS ), Erlang pro více -uživatelské servery fungující v nepřetržitém režimu.
V systému řízení podnikových zdrojů jsou zabudovány programovací jazyky (jazyk ABAP v SAP / R3, jazyky Galaktika, Parus, 1C, systémy Info-Accountant) a slouží k jejich doplnění o moduly specifické pro organizaci. Použití vestavěného jazyka zjednodušuje programování specifických úloh, protože jazyk zpočátku obsahuje pojmy z oblasti předmětu. Nějaký[ co? ] geografické informační systémy a CAD mají také vestavěné programovací jazyky.
Další příklady:
Občas jsou počítačové jazyky implementovány závislým způsobem, tedy „uvnitř“ přeloženého jazyka, bez kterého tyto jazyky nejenže nelze spustit, ale často netvoří koherentní systém symbolů a nemají Turing úplnost . Takové jazyky se nazývají „ embedded domain-specific languages “ ( anglicky embedded DSL , EDSL ; někdy DSEL ) nebo jednoduše „ embedded languages “ ( embedded language ) [7] [10] a také „jazyky implementované na na začátek nebo na základě tohoto jazyka“.
Kromě tradičního rozdělení jazyků na interpretované a kompilované jazyky zavádějí vkládací jazyky několik dalších typů jazykové implementace:
Na druhé straně lze implementaci vnořitelného jazyka považovat za „ implementaci bez překladu “, což znamená, že DSL bude syntaktickou a sémantickou podmnožinou jazyka, do kterého je zabudován [11] .
Jazyk používaný jako základní jazyk pro implementaci jiného je často označován jako metajazyk .
Existují tři hlavní důvody pro vývoj vložených textových jazyků:
Nejběžnějšími příklady jazyků první skupiny jsou implementace objektově orientovaných funkcí ve funkčních [12] nebo procedurálních [13] jazycích a klasickým příkladem je CLOS . Je třeba poznamenat, že termín „jazyk“ se zde nepoužívá vždy - někdy se mluví pouze o „ implementaci nových funkcí v jazyce “ nebo o „ rozšíření jazyka o subsystém zaměřený na řešení určitých úkolů “ a existuje žádné striktní rozdělení na „ knihovny “ a „embedded jazyky“, protože formálně lze za jazyk považovat jakékoli API , protokol nebo datovou strukturu [14] . Takže například nedílnou součástí jazyka Lisp je vestavěný úplný jazyk S-expression , který není Turingem .
Druhá skupina vnořitelných jazyků je nejvíce zastoupena v jazykové komunitě Haskell , a proto je samotný Haskell někdy označován jako „ DSL pro denotační sémantiku “ [7] . Příkladem je Elm a další jazyky, které představují funkční reaktivní paradigma , stejně jako jazyk Curry . Občas se také vyskytuje podobný výraz ve vztahu k Lisp : " Lisp není jazyk, ale rámec pro vývoj jazyků ." Příkladem jazyka implementovaného nad Lisp je Qi . Mnoho vložitelných minijazyků je implementováno v jazyce OCaml prostřednictvím modulu kompilátoru CamlpX . Jazyk Rebol byl také navržen pro programování prostřednictvím náročné implementace vložitelných mini-jazyků. Dialekt Scheme jazyka Lisp implementuje úplný jazyk SXML , který není Turingem, pomocí jazyka S-expression , který implementuje protokol XML způsobem, který lze vložit.
Zabudovatelný jazyk může mít soběstačnou Turingovu úplnou sémantiku, ale přesto místo nezávislé implementace znovu používá komponenty základního jazyka (třetí skupina, směs prvních dvou). Pozoruhodným příkladem je jazyk Schelog [15] , který implementuje sémantiku Prologu uvnitř Lisp dialektového schématu prostřednictvím pokračování a promění Prolog ze „samostatného“ jazyka na vložitelný. Tradičním vzdělávacím nebo „sportovním“ úkolem pro mnoho funkčních jazyků je implementace nějakého dalšího jazyka nad uvažovaný jazyk, nejčastěji jazyka predikátové logiky prvního řádu [16] .
V kontextu metajazyků se samostatné jazyky někdy nazývají „jazyky první třídy“ (podobně jako prvotřídní entity v jazycích) a vložené jazyky se někdy nazývají „jazyky objektů“.
V drtivé většině případů mají embedded jazyky pouze jednu podporovanou implementaci a rozdíly ve výsledné strojové reprezentaci kódu v nich závisí pouze na použitém překladači základního jazyka. Existují však výjimky - například jazyk Concurrent ML (CML), který rozšiřuje standardní ML o konstrukce pro explicitní paralelismus , má dvě zásadně odlišné implementace.
Jeden z jazyků (základní nebo vestavěný) může být vizuální , který se často používá v uživatelském programování ( vývoj pro koncového uživatele ) . Typickými příklady takových dvojic jsou AutoLisp - AutoCAD a VBA - Microsoft Excel . Takové dvojice tvoří ucelený interaktivní systém a je nemožné (a není nutné) z pohledu uživatele určit, zda jsou vizuální nástroje doplňkem, který napodobuje příkazy vestavěného textového jazyka, nebo zda text jazyk ovládá vizuální nástroje. Skutečné vztahy v těchto párech jsou na vývojáři.
V páru Emacs - Emacs Lisp je vztah více definovaný. Lisp je tradičně klasifikován jako metajazyk a v tomto případě je nad ním postaven textový editor jako vizuální DSL, díky čemuž je DSL proměnlivý a rozšiřitelný.
V případě, že jsou oba jazyky vizuální, embedded jazyky se obvykle nazývají jinými termíny - plug- iny , filtry atd., a nepoužívají terminologii jazykově orientovaného programování. Formálně můžeme například říci, že existuje mnoho vložitelných vizuálních minijazyků pro vizuální metajazyk grafického zpracování Adobe Photoshop (viz Photoshop plugin ).
Funkční a logické programovací jazyky vypadají ve vizuálním prostředí nepřirozeně, protože funkční programování a čisté logické programování zakazují vedlejší efekty a pro interakci s GUI ; jejich pojmová integrita musí být narušena. Z pedagogického hlediska se považuje za žádoucí učit programování pomocí konzolových nástrojů, aby se pozornost studentů zaměřila na základy algoritmizace, nikoli na ergonomii, a ještě méně na procedurální dovednosti při používání určitých IDE [17] .
Výhody a nevýhody použití specifického DSL místo univerzálního jazyka v konkrétní úloze jsou mnohem jasnější než výhody a nevýhody použití jednoho univerzálního jazyka místo jiného: ve většině případů se ukáže, že již vyvinuté DSL být koncepčně nepoužitelný pro některé úkoly a poskytuje nespornou výhodu ve většině ukazatelů kvality v jiných a některé dílčí úkoly obecně zůstávají nevyřešené až do rozvoje DSL [4] .
Otázku výhod a nevýhod je tedy správnější vznést ve světle použití jazykově orientované metodologie namísto jakékoli jiné při počáteční absenci hotového DSL, srovnávajícího potenciální zisk z jeho použití s náklady na jeho vývoj a údržbu.