Domänspecifikt språk ( eng. domänspecifikt språk , DSL - " domänspecifikt språk ") - ett datorspråk specialiserat för ett specifikt applikationsområde (till skillnad från ett allmänt språk som är tillämpligt på ett brett spektrum av områden och inte tar hänsyn till egenskaperna hos specifika kunskapsområden). Konstruktionen av ett sådant språk och/eller dess datastruktur återspeglar särdragen för de uppgifter som lösts med dess hjälp [1] . Det är ett nyckelbegrepp för språkorienterad programmering .
Strängt taget är uppdelningen av programmeringsspråk i allmänna och domänspecifika språk väldigt godtycklig, särskilt när man betänker att formellt vilket protokoll eller filformat som helst är ett . Det finns många allmänna språk som används som domänspecifika språk för vissa uppgifter, och vice versa, domänspecifika språk som används som allmänna språk. Så ML-språket , som gav upphov till en hel familj av allmänna språk (inklusive Haskell ), utvecklades ursprungligen som en DSL för LCF -satsbevissystemet . Ett exempel som visar klassificeringens villkor är BNF- språket (och kompilatorn från det Lex / Yacc ): å ena sidan är detta ett levande exempel på ett metaspråk , å andra sidan är det designat för en specifik uppgift.
De enklaste domänspecifika språken som används i en viss applikation kallas ofta för "minispråk" [2] .
Martin Ward [ 3] använde i sitt arbete "Language Oriented Programming" [4] (som anses vara utgångspunkten för utvecklingen av LOP ), termerna " problemorienterad " och " domänorienterad ", men i den engelsktalande vetenskapliga gemenskapen termen " domänspecifikt ", dessutom är det " domänspecifikt språk ", och inte " domänspecifikt programmeringsspråk ". I den ryska litteraturen om programmering finns det alternativ " domänspecifik ", " problemorienterad ", " domänorienterad ".
Fowler [5] och Dmitriev [6] definierar konceptet DSL som " ett avskalat programmeringsspråk (oftast Turing ofullständigt ) ".
Ledande forskare inom språkorienterad programmering (Martin Ward, Paul Hudak , Walid Taha och andra) citerar följande exempel på domänspecifika språk som klassiska [4] [7] [8] :
Enligt Walid Tahi, ur LOPs synvinkel , är Microsoft Excel kanske det mest använda programmeringsspråket i världen [8] .
Andra exempel på domänspecifika språk är databashanteringsspråk (utöver SQL här kan till exempel FoxPro- språket kallas ), operativsystems kommandospråk (interaktiva kommandoskalsspråk, främst Unix Shell , batch jobbspråk som JCL , etc. .) [9] , Turing ofullständiga datastruktureringsspråk ( XML , .ini , .conf), wikimarkeringsspråk , modelleringsspråk ( UML , GPSS ), Erlang för flera -användarservrar som fungerar i oavbrutet läge.
Det finns programmeringsspråk inbyggda i företagets resurshanteringssystem (ABAP-språk i SAP / R3, språken i Galaktika, Parus, 1C, Info-Accountant-system) och används för att komplettera dem med organisationsspecifika moduler. Användningen av ett inbäddat språk förenklar programmeringen av specifika uppgifter, eftersom språket initialt innehåller ämnesområdets begrepp. Några[ vad? ] geografiska informationssystem och CAD har också inbyggda programmeringsspråk.
Andra exempel:
Ibland implementeras datorspråk på ett beroende sätt, det vill säga "inuti" ett översatt språk, utan vilket dessa språk inte bara inte kan köras, utan ofta inte bildar ett sammanhängande symbolsystem och inte har Turing fullständighet . Sådana språk kallas " inbäddade domänspecifika språk " ( eng. embedded DSL , EDSL ; ibland DSEL ) eller helt enkelt " inbäddade språk " ( inbäddade språk ) [7] [10] samt "språk implementerade på överst på eller baserat på detta språk".
Förutom den traditionella uppdelningen av språk i tolkade och kompilerade språk, introducerar inbäddade språk flera fler typer av språkimplementering:
Å andra sidan kan en implementering av ett inbäddningsbart språk ses som en " översättningslös implementering ", vilket innebär att DSL kommer att vara en syntaktisk och semantisk delmängd av språket som det är inbäddat i [11] .
Ett språk som används som basspråk för implementering av ett annat kallas ofta för ett metaspråk .
Det finns tre huvudsakliga skäl till att utveckla inbäddade textspråk:
De vanligaste exemplen på språk i den första gruppen är implementeringar av objektorienterade funktioner i funktionella [12] eller processuella [13] språk, och CLOS är ett klassiskt exempel . Det bör noteras att termen "språk" inte alltid används här - ibland talar de bara om " implementering av nya funktioner i språket " eller om " utvidgning av språket med ett delsystem som syftar till att lösa vissa uppgifter ", och det finns ingen strikt uppdelning i " bibliotek " och "inbäddade språk" ", eftersom formellt alla API , protokoll eller datastrukturer kan betraktas som ett språk [14] . Så till exempel är en integrerad del av Lisp-språket ett inbyggt icke-Turing komplett S-uttrycksspråk .
Den andra gruppen av inbäddningsbara språk är mest representerad i Haskell -språkgemenskapen , och därför kallas Haskell själv ibland för " DSL för denotationssemantik " [7] . Exempel är Elm och andra språk som representerar det funktionella reaktiva paradigmet , samt Curry- språket . Ibland finns det också ett liknande uttryck i förhållande till Lisp : " Lisp är inte ett språk, utan ett ramverk för att utveckla språk ." Ett exempel på ett språk som implementerats ovanpå Lisp är Qi . Många inbäddningsbara minispråk implementeras i OCaml -språket genom kompilatormodulen CamlpX . Rebol -språket designades också för programmering genom tung implementering av inbäddningsbara minispråk . Scheme - dialekten av Lisp implementerar det icke-Turing kompletta språket SXML med hjälp av S-uttrycksspråket , som implementerar XML - protokollet på ett inbäddningsbart sätt.
Ett inbäddningsbart språk kan ha en självförsörjande Turing-komplett semantik, men ändå, istället för en oberoende implementering , återanvända komponenter i basspråket (den tredje gruppen, en blandning av de två första). Ett slående exempel är språket Schelog [15] , som implementerar semantiken för Prolog inuti Lisp-dialektschemat genom fortsättningar och förvandlar Prolog från ett "fristående" språk till ett inbäddningsbart. Den traditionella utbildnings- eller "idrottsuppgiften" för många funktionella språk är implementeringen av något annat språk utöver det aktuella språket, oftast språket för första ordningens predikatlogik [16] .
I samband med metaspråk kallas fristående språk ibland "förstklassiga språk" (liknar förstklassiga enheter i språk), och inbäddade språk kallas ibland "objektspråk".
I de allra flesta fall har inbäddade språk bara en stödd implementering, och skillnader i den resulterande maskinrepresentationen av koden i dem beror bara på vilken basspråköversättare som används. Det finns dock undantag - till exempel har språket Concurrent ML (CML), som utökar Standard ML med konstruktioner för explicit parallellism , två fundamentalt olika implementeringar.
Ett av språken (bas eller inbäddat) kan vara visuellt , vilket ofta används i användarprogrammering ( slutanvändarutveckling ) . Typiska exempel på sådana par är AutoLisp- AutoCAD och VBA - Microsoft Excel . Sådana par bildar ett komplett interaktivt system, och det är omöjligt (och inte nödvändigt) att avgöra från användarens synvinkel om de visuella verktygen är ett tillägg som efterliknar kommandona i det inbyggda textspråket, eller om texten språket styr de visuella verktygen. De faktiska relationerna i dessa par är upp till utvecklaren.
I ett par Emacs - Emacs Lisp är förhållandet mer definierat. Lisp klassificeras traditionellt som ett metaspråk , och i det här fallet byggs en textredigerare ovanpå den som en visuell DSL, vilket gör det senare föränderligt och utbyggbart.
I fallet när båda språken är visuella, kallas inbäddade språk vanligtvis av andra termer - plugins , filter etc., och använder inte terminologin för språkorienterad programmering. Formellt kan vi till exempel säga att det finns många inbäddningsbara visuella minispråk för det visuella metaspråket för grafikbearbetning Adobe Photoshop (se Photoshop-plugin ).
Funktionella och logiska programmeringsspråk ser onaturliga ut i en visuell miljö, eftersom funktionell programmering och ren logisk programmering förbjuder biverkningar, och för GUI- interaktion ; deras konceptuella integritet måste kränkas. Ur en pedagogisk synvinkel anses det vara önskvärt att lära ut programmering med hjälp av konsolverktyg för att fokusera elevernas uppmärksamhet på grunderna i algoritmisering, och inte på ergonomi, och ännu mindre på procedurkunskaper vid användning av vissa IDE:er [17] .
Fördelarna och nackdelarna med att använda ett specifikt DSL istället för ett allmänt språk i en viss uppgift är mycket tydligare än fördelarna och nackdelarna med att använda ett allmänt språk istället för ett annat: i de flesta fall visar sig en redan utvecklad DSL vara vara begreppsmässigt otillämplig för vissa uppgifter och ger en obestridlig fördel i de flesta kvalitetsindikatorer i andra, och vissa deluppgifter förblir i allmänhet olösta fram till utvecklingen av DSL [4] .
Därför är frågan om fördelar och nackdelar mer korrekt att ta upp i ljuset av användningen av en språkorienterad metod i stället för någon annan i den initiala avsaknaden av en färdig DSL, och jämför den potentiella vinsten av dess användning med kostnaderna för dess utveckling och underhåll.