Domain-specifikus nyelv ( eng. domain-specific language , DSL - " domain -specific language ") - egy adott alkalmazási területre specializálódott számítógépes nyelv (ellentétben egy általános célú nyelvvel , amely számos területen alkalmazható, és nem veszi figyelembe figyelembe véve az adott területek ismereteinek jellemzőit). Egy ilyen nyelv felépítése és/vagy adatszerkezete tükrözi a segítségével megoldott feladatok sajátosságait [1] . Ez a nyelvorientált programozás kulcsfogalma .
Szigorúan véve a programozási nyelvek felosztása általános célú és tartományspecifikus nyelvekre nagyon önkényes, különösen, ha figyelembe vesszük, hogy formálisan bármely protokoll vagy fájlformátum egy . Számos általános célú nyelvet használnak tartományspecifikus nyelvként bizonyos feladatokhoz, és fordítva, tartományspecifikus nyelveket általános célú nyelvként használnak. Tehát az ML nyelvet , amely az általános célú nyelvek egész családját hozta létre (beleértve a Haskellt is), eredetileg DSL-ként fejlesztették ki az LCF tételbizonyító rendszerhez . Az osztályozás feltételességét mutató példa a BNF nyelv (és a belőle származó fordító Lex / Yacc ): ez egyrészt szemléletes példája a metanyelvnek , másrészt egy konkrét feladatra készült.
Az egy adott alkalmazásban használt legegyszerűbb tartományspecifikus nyelveket gyakran "mininyelveknek" nevezik [2] .
Martin Ward [ 3] "Language Oriented Programming" [4] című munkájában (amelyet a LOP fejlesztésének kiindulópontjának tartanak ) használta a " problémaorientált " és a " tartományorientált " kifejezéseket, de az angol nyelvű tudományos közösségben a „ domain-specifikus ” kifejezést, ráadásul ez „ domain-specifikus nyelv ”, és nem „ tartomány-specifikus programozási nyelv ”. A programozásról szóló orosz szakirodalomban vannak „ tartomány-specifikus ”, „ problémaorientált ”, „ tartomány-orientált ” lehetőségek.
Fowler [5] és Dmitriev [6] a DSL fogalmát " lecsupaszított programozási nyelvként (többnyire Turing hiányos ) " határozza meg.
A nyelvorientált programozás vezető kutatói (Martin Ward, Paul Hudak , Walid Taha és mások) a következő példákat idézik a tartomány-specifikus nyelvekre, mint klasszikusokra [4] [7] [8] :
Walid Tahi szerint a LOP szempontjából a Microsoft Excel talán a legszélesebb körben használt programozási nyelv a világon [8] .
További példák a tartományspecifikus nyelvekre az adatbázis-kezelő nyelvek (az SQL mellett itt például a FoxPro nyelv is nevezhető ), az operációs rendszer parancsnyelvei (interaktív parancshéjnyelvek, elsősorban Unix Shell , köteg). munkanyelvek, például JCL , stb.) [9] , Turing hiányos adatstrukturáló nyelvek ( XML , .ini , .conf), wiki jelölőnyelvek , modellező nyelvek ( UML , GPSS ), Erlang multihoz -megszakítás nélkül működő felhasználói szerverek.
A vállalati erőforrás-menedzsment rendszerbe programozási nyelvek vannak beépítve (ABAP nyelv SAP / R3-ban, Galaktika, Parus, 1C, Info-Accountant rendszerek nyelvei) , és kiegészítették őket szervezet-specifikus modulokkal. A beágyazott nyelv használata leegyszerűsíti a konkrét feladatok programozását, mivel a nyelv kezdetben a tárgykör fogalmait tartalmazza. Néhány[ mi? ] a földrajzi információs rendszerek és a CAD is rendelkezik beépített programozási nyelvekkel.
Egyéb példák:
A számítógépes nyelveket időnként függő módon, azaz egy lefordított nyelven „belül” valósítják meg, amely nélkül ezek a nyelvek nemcsak hogy nem hajthatók végre, de gyakran nem alkotnak koherens szimbólumrendszert, és nem rendelkeznek Turing -rendszerrel. teljesség . Az ilyen nyelveket " beágyazott tartományspecifikus nyelveknek " ( eng. beágyazott DSL , EDSL ; néha DSEL ) vagy egyszerűen " beágyazott nyelveknek " ( beágyazott nyelv ) [7] [10] , valamint "a nyelveken implementált nyelveknek" nevezik . tetején vagy ezen a nyelven alapul ".
A nyelvek hagyományos értelmezett és összeállított nyelvekre való felosztása mellett a beágyazható nyelvek számos további nyelvi megvalósítási módot is bevezetnek:
Másrészt egy beágyazható nyelv megvalósítása " fordítás nélküli megvalósításnak " tekinthető, ami azt jelenti, hogy a DSL annak a nyelvnek a szintaktikai és szemantikai részhalmaza lesz, amelybe be van ágyazva [11] .
Egy másik nyelv megvalósításához alapnyelvként használt nyelvet gyakran metanyelvnek nevezik .
Három fő oka van a beágyazott szövegnyelvek fejlesztésének:
Az első csoport nyelveinek leggyakoribb példái az objektum-orientált funkciók funkcionális [12] vagy procedurális [13] nyelveken való megvalósítása, a CLOS pedig egy klasszikus példa . Meg kell jegyezni, hogy a „nyelv” kifejezést itt nem mindig használják - néha csak „ új funkciók bevezetéséről a nyelvben ” vagy „ a nyelv kiterjesztéséről egy alrendszerrel, amelynek célja bizonyos feladatok megoldása ” beszélnek. nincs szigorú felosztás „ könyvtárak ” és „beágyazott nyelvek” között, mivel formálisan bármely API , protokoll vagy adatstruktúra nyelvnek tekinthető [14] . Így például a Lisp nyelv szerves része egy beépített, nem Turing teljes S-kifejezési nyelv .
A beágyazható nyelvek második csoportja a legteljesebben a Haskell nyelvi közösségben képviselteti magát , ezért magát a Haskellt is időnként „ a denotációs szemantika DSL-jeként ” emlegetik [7] . Ilyen például az Elm és más nyelvek, amelyek a funkcionális reaktív paradigmát képviselik , valamint a Curry nyelv . Időnként a Lisp kapcsán is előfordul egy hasonló kifejezés : " A Lisp nem egy nyelv, hanem egy keret a nyelvek fejlesztéséhez ." A Lisp tetején implementált nyelv például a Qi [ . A CamlpX fordítómodulon keresztül sok beágyazható mini-nyelv van megvalósítva az OCaml nyelven. A Rebol nyelvet programozásra is tervezték, beágyazható mini-nyelvek erőteljes implementációjával. A Lisp Scheme dialektusa a nem Turing teljes SXML nyelvet valósítja meg az S-kifejezési nyelv segítségével, amely beágyazható módon valósítja meg az XML protokollt .
Egy beágyazható nyelvnek lehet önellátó Turing-teljes szemantikája, de ennek ellenére a független implementáció helyett használja újra az alapnyelv komponenseit (a harmadik csoport, az első kettő keveréke). Meglepő példa erre a Schelog [15] nyelv, amely a Prolog szemantikáját a Lisp dialect Scheme -en belül valósítja meg folytatásokon keresztül , és a Prolog-ot "önálló" nyelvből beágyazható nyelvvé alakítja. A hagyományos oktatási vagy „sport” feladat számos funkcionális nyelv esetében egy másik nyelv megvalósítása a vizsgált nyelv mellett, leggyakrabban az elsőrendű predikátumlogika nyelve [16] .
A metanyelvekkel összefüggésben az önálló nyelveket néha "első osztályú nyelveknek" nevezik (hasonlóan a nyelvek első osztályú entitásaihoz ), a beágyazott nyelveket pedig néha "objektumnyelveknek".
Az esetek túlnyomó többségében a beágyazott nyelveknek csak egy támogatott megvalósítása van, és a kódok gépi megjelenítésének különbségei csak a használt alapnyelvi fordítótól függenek. Vannak azonban kivételek – például a Concurrent ML (CML) nyelvnek, amely kiterjeszti a Standard ML -t az explicit párhuzamosság konstrukcióival , két alapvetően eltérő megvalósítása van.
Az egyik nyelv (alap vagy beágyazott) lehet vizuális , amelyet gyakran használnak a felhasználói programozásban ( végfelhasználói fejlesztés ) . Az ilyen párok tipikus példái az AutoLisp - AutoCAD és a VBA - Microsoft Excel . Az ilyen párok egy teljes interaktív rendszert alkotnak, és a felhasználó szemszögéből lehetetlen (és nem is szükséges) megállapítani, hogy a vizuális eszközök a beépített szövegnyelv parancsait utánzó kiegészítők-e, vagy a szöveg a nyelv vezérli a vizuális eszközöket. A tényleges kapcsolatok ezekben a párokban a fejlesztőn múlik.
Az Emacs - Emacs Lisp párban a kapcsolat határozottabb. A Lisp-et hagyományosan a metanyelvek közé sorolják , és ebben az esetben egy szövegszerkesztőt építenek rá, mint vizuális DSL-t, ami ez utóbbit változtathatóvá és bővíthetővé teszi.
Abban az esetben, ha mindkét nyelv vizuális, a beágyazott nyelveket általában más kifejezésekkel nevezik - beépülő modulok , szűrők stb., és nem használják a nyelvorientált programozás terminológiáját. Formálisan például azt mondhatjuk, hogy sok beágyazható vizuális mini-nyelv létezik az Adobe Photoshop grafikus feldolgozásának vizuális meta-nyelvéhez (lásd a Photoshop bővítményt ).
A funkcionális és logikai programozási nyelvek természetellenesnek tűnnek vizuális környezetben, mivel a funkcionális programozás és a tiszta logikai programozás tiltja a mellékhatásokat és a grafikus felület interakcióját ; fogalmi integritásukat meg kell sérteni. Pedagógiai szempontból kívánatosnak tartják a programozást konzoleszközökkel tanítani annak érdekében, hogy a hallgatók figyelme az algoritmizálás alapjaira összpontosuljon, és ne az ergonómiára, és még kevésbé az egyes IDE -k használatának procedurális készségeire [17] .
Egy adott feladatban egy általános célú nyelv helyett egy adott DSL használatának előnyei és hátrányai sokkal világosabbak, mint egy általános célú nyelv használatának előnyei és hátrányai egy másik helyett: a legtöbb esetben egy már kifejlesztett DSL egyes feladatokra fogalmilag nem alkalmazható, másoknál pedig vitathatatlan előnyt biztosít a legtöbb minőségi mutatóban , és egyes részfeladatok általában megoldatlanok maradnak a DSL kifejlesztéséig [4] .
Így az előnyök és hátrányok kérdését a kész DSL kezdeti hiányában helyesebb egy nyelvorientált módszertan használatának tükrében feltenni, összehasonlítva a használatból származó potenciális hasznot a fejlesztésének és karbantartásának költségeit.