A doménspecifikus nyelv (DSL) egy adott alkalmazástartományra szakosodott számítógépes nyelv. Ez ellentétben áll az általános célú nyelvvel (GPL), amely széles körben alkalmazható az összes területen. A DSL-ek széles skálája létezik, a széles körben használt nyelvektől kezdve az általános területeken használt nyelvekig, mint például a HTML a weboldalakhoz, egészen a csak egy vagy néhány szoftver által használt nyelvekig, mint például a MUSH soft code. Magukban foglalják a doménspecifikus jelölőnyelveket, a doménspecifikus modellező nyelveket (általánosabban a specifikációs nyelveket) és a doménspecifikus programozási nyelveket. Speciális célú számítógépes nyelvek mindig is léteztek a számítógépes korszakban, de a „doménspecifikus nyelv” kifejezés a doménspecifikus modellezés térhódítása miatt vált népszerűbbé. Az egyszerűbb DSL-eket, különösen az egyetlen alkalmazás által használtakat, néha informálisan mininyelveknek nevezik.
Az általános célú nyelvek és a doménspecifikus nyelvek közötti határvonal nem mindig éles, mivel egy nyelv rendelkezhet egy adott doménre specializált jellemzőkkel, de szélesebb körben is alkalmazható, vagy fordítva, elvileg széles körben alkalmazható, de a gyakorlatban elsősorban egy adott doménen használják. Például a Perl-t eredetileg szövegfeldolgozó és ragasztó nyelvként fejlesztették ki, ugyanarra a területre, mint az AWK-t és a shell szkripteket, de később főként általános célú programozási nyelvként használták. Ezzel szemben a PostScript egy Turing-teljes nyelv, és elvileg bármilyen feladatra használható, de a gyakorlatban szűk körben oldalleíró nyelvként használják.
Használata A megfelelő DSL-ek megtervezése és használata a domain engineering kulcsfontosságú része, az adott területnek megfelelő nyelv használatával - ez lehet egy meglévő DSL vagy GPL használata, vagy egy új DSL kifejlesztése. A nyelvközpontú programozás a problémák kifejezésére szolgáló speciális célú nyelvek létrehozását a problémamegoldási folyamat standard részének tekinti. Egy doménspecifikus nyelv létrehozása (az azt támogató szoftverrel együtt) egy meglévő nyelv újrafelhasználása helyett akkor lehet kifizetődő, ha a nyelv lehetővé teszi egy adott típusú probléma vagy megoldás egyértelműbb kifejezését, mint azt egy meglévő nyelv lehetővé tenné, és a kérdéses problématípus kellően gyakran fordul elő. Pragmatikusan egy DSL specializálódhat egy adott problématerületre, egy adott probléma reprezentációs technikára, egy adott megoldási technikára vagy a terület egyéb aspektusaira.
Áttekintés A doménspecifikus nyelvek kifejezetten egy adott domén problémáinak megoldására készülnek, és nem arra szolgálnak, hogy azon kívül is képesek legyenek problémákat megoldani (bár ez technikailag lehetséges). Ezzel szemben az általános célú nyelvek számos terület problémáinak megoldására készülnek. A tartomány lehet egy üzleti terület is. Néhány példa az üzleti területekre:
életbiztosítási kötvények (egy nagy biztosítótársaság belső fejlesztése) harci szimuláció bérszámítás számlázás
A doménspecifikus nyelv valahol egy apró programozási nyelv és egy szkriptnyelv között helyezkedik el, és gyakran egy programkönyvtárhoz hasonlóan használják. E fogalmak közötti határok meglehetősen elmosódottak, hasonlóan a szkriptnyelvek és az általános célú nyelvek közötti határvonalhoz.
Tervezésben és kivitelezésben A doménspecifikus nyelvek olyan nyelvek (vagy gyakran deklarált szintaxisok vagy nyelvtanok), amelyek tervezése és megvalósítása nagyon specifikus célokat szolgál. A tartományspecifikus nyelv lehet vizuális diagramkészítő nyelv, mint például a Generic Eclipse Modeling System által létrehozott nyelvek, programozási absztrakciók, mint például az Eclipse Modeling Framework, vagy szöveges nyelvek. Például a grep parancssori segédprogramnak van egy reguláris kifejezés szintaxisa, amely a szövegsorokban található mintákra illeszkedik. A sed segédprogram meghatározza a reguláris kifejezések illesztésére és helyettesítésére szolgáló szintaxist. Gyakran ezek az apró nyelvek együttesen használhatók egy shellen belül összetettebb programozási feladatok elvégzésére.
A doménspecifikus nyelvek és a szkriptnyelvek közötti határvonal némileg elmosódik, de a doménspecifikus nyelvek gyakran nem tartalmaznak alacsony szintű funkciókat a fájlrendszerhez való hozzáféréshez, a folyamatok közötti vezérléshez és más funkciókhoz, amelyek a teljes értékű programozási nyelveket, a szkriptnyelveket vagy más nyelveket jellemzik. Sok doménspecifikus nyelv nem bájtkóddá vagy végrehajtható kóddá, hanem különféle médiaobjektumokká fordítható: A GraphViz PostScript, GIF, JPEG stb. formátumba exportál, a Csound hangfájlokba, a sugárkövetéses tartományspecifikus nyelv, mint például a POV pedig grafikus fájlokba. Egy olyan számítógépes nyelv, mint az SQL, érdekes esetet mutat: terület-specifikus nyelvnek tekinthető, mivel egy adott területre (az SQL esetében a relációs adatbázisok elérésére és kezelésére) specializálódott, és gyakran egy másik alkalmazásból hívják, de az SQL-nek több kulcsszava és funkciója van, mint sok szkriptnyelvnek, és gyakran önálló nyelvnek tekintik, talán azért, mert a programozásban az adatbázis-manipuláció elterjedt, és a nyelv szakértőjéhez szükséges elsajátítás mértéke miatt.
Ezt a vonalat tovább homályosítja, hogy sok doménspecifikus nyelv rendelkezik nyílt API-kkal, és más programozási nyelvekből is elérhetők anélkül, hogy megszakadna a végrehajtás folyamata, vagy külön folyamat meghívása nélkül, és így programozási könyvtárként működhetnek.
Programozási eszközök Egyes doménspecifikus nyelvek idővel teljes értékű programozási eszközökkel bővülnek, ami tovább bonyolítja a kérdést, hogy egy nyelv doménspecifikus-e vagy sem. Jó példa erre az XSLT funkcionális nyelv, amelyet kifejezetten az egyik XML-gráfnak egy másikba való átalakítására terveztek, és amelyet a kezdetek óta kibővítettek, hogy (különösen a 2.0-s verzióban) lehetővé tegye a fájlrendszerrel való interakció különböző formáit, a karakterlánc- és dátummanipulációt, valamint az adattípusok tipizálását.
A modellvezérelt tervezésben számos példa található a doménspecifikus nyelvekre, mint például az OCL, amely a modellek állításokkal való díszítésére szolgáló nyelv, vagy a QVT, amely egy doménspecifikus transzformációs nyelv. Az olyan nyelvek azonban, mint az UML, jellemzően általános célú modellező nyelvek.
Összefoglalva, egy hasonlat hasznos lehet: egy nagyon kis nyelv olyan, mint egy kés, amelyet ezerféleképpen lehet használni, az ételvágástól a fák kivágásáig. Egy doménspecifikus nyelv olyan, mint egy elektromos fúrógép: egy nagy teljesítményű eszköz, amely sokféleképpen használható, de csak egy meghatározott kontextusban, nevezetesen a dolgok kilyukasztására. Egy általános célú nyelv egy teljes munkapad, különféle eszközökkel, amelyek különféle feladatok elvégzésére szolgálnak. A doménspecifikus nyelveket olyan programozóknak kell használniuk, akik a jelenlegi munkapadjukat áttekintve rájönnek, hogy szükségük van egy jobb fúróra, és úgy találják, hogy egy adott doménspecifikus nyelv pontosan ezt nyújtja.
Doménspecifikus nyelvi témák
Külső és beágyazott doménspecifikus nyelvek A független fordítóprogrammal vagy fordítóprogrammal megvalósított DSL-eket külső tartományspecifikus nyelveknek nevezzük. Jól ismert példák erre a LaTeX vagy az AWK. A beágyazott (vagy belső) doménspecifikus nyelvek külön kategóriája jellemzően egy gazdanyelven belül, könyvtárként valósul meg, és általában a gazdanyelv szintaxisára korlátozódik, bár ez a gazdanyelv képességeitől függ.
Felhasználási minták A doménspecifikus nyelveknek többféle használati mintája van:
Feldolgozás önálló eszközökkel, amelyeket közvetlen felhasználói művelettel, gyakran a parancssorból vagy egy Makefile-ból hívunk elő (pl. grep a reguláris kifejezések egyeztetéséhez, sed, lex, yacc, a GraphViz eszközkészlet stb.). olyan tartományspecifikus nyelvek, amelyeket programozási nyelvi makrorendszerek segítségével valósítanak meg, és amelyeket fordítási időben vagy valós időben konvertálnak vagy bővítenek egy általános célú fogadó nyelvvé. beágyazott doménspecifikus nyelvek (eDSL), amelyeket olyan könyvtárak formájában valósítanak meg, amelyek kihasználják a befogadó általános célú nyelv vagy annak egy részhalmazának szintaxisát, miközben hozzáadnak doménspecifikus nyelvi elemeket (adattípusok, rutinok, módszerek, makrók stb.). (pl. jQuery, React, Embedded SQL, LINQ). Tartományspecifikus nyelvek, amelyeket (futásidőben) általános célú nyelveken, például C vagy Perl nyelven írt programokból hívnak meg egy adott funkció elvégzésére, gyakran a művelet eredményét további feldolgozásra visszaadva a "gazdaprogramozási nyelvnek"; általában a tartományspecifikus nyelv értelmezője vagy virtuális gépe be van ágyazva a gazdaalkalmazásba (pl. formázó karakterláncok, reguláris kifejezések motorja). A felhasználói alkalmazásokba beágyazott tartományspecifikus nyelvek (pl. a táblázatkezelőben lévő makrónyelvek), amelyeket 1) az alkalmazás felhasználói által írt kódok végrehajtására, 2) az alkalmazás által dinamikusan generált kódok végrehajtására vagy 3) mindkettőre használnak.
Sok doménspecifikus nyelv többféleképpen is használható. A DSL kódja a gazdanyelvbe ágyazva rendelkezhet speciális szintaxis támogatással, mint például a sed, AWK, Perl vagy JavaScript regexek, vagy átadható karakterláncokként.
Tervezési célok A doménspecifikus nyelvi megközelítés alkalmazása a szoftverfejlesztésben kockázatokat és lehetőségeket egyaránt rejt magában. A jól megtervezett doménspecifikus nyelv képes megtalálni a megfelelő egyensúlyt ezek között.
A doménspecifikus nyelveknek fontos tervezési céljaik vannak, amelyek eltérnek az általános célú nyelvek céljaitól:
A tartományspecifikus nyelvek kevésbé átfogóak. A tartományspecifikus nyelvek sokkal kifejezőbbek a saját tartományukban. A tartományspecifikus nyelvek minimális redundanciát mutatnak.
Idiómák A programozásban az idiómák a programozók által a gyakori fejlesztési feladatok kezelésére alkalmazott módszerek, pl.:
Biztosítsa az adatok mentését az ablak bezárása előtt. Szerkessze a kódot, amikor a parancssori paraméterek megváltoznak, mert ezek befolyásolják a program viselkedését.
Az általános célú programozási nyelvek ritkán támogatják az ilyen idiómákat, de a doménspecifikus nyelvek képesek leírni őket, például:
Egy szkript automatikusan menthet adatokat. Egy doménspecifikus nyelv paraméterezheti a parancssori bevitelt.
Példák A doménspecifikus nyelvek közé tartozik például a HTML, a Logo a ceruzaszerű rajzoláshoz, a Verilog és a VHDL hardverleíró nyelvek, a MATLAB és a GNU Octave a mátrixprogramozáshoz, a Mathematica, a Maple és a Maxima a szimbolikus matematikához, a Specification and Description Language a reaktív és elosztott rendszerekhez, a táblázatkezelő formulák és makrók, az SQL a relációs adatbázis-lekérdezésekhez, a YACC nyelvtanok a parserek létrehozásához, reguláris kifejezések a lexerek megadásához, a Generic Eclipse Modeling System a diagramkészítő nyelvek létrehozásához, Csound a hang- és zeneszintézishez, valamint a GraphViz és a GrGen bemeneti nyelvei, a gráfok elrendezéséhez és gráfok újraírásához használt szoftvercsomagok, a Terraform és más Hashicorp eszközökhöz használt Hashicorp Configuration Language, a Puppetnek is van saját konfigurációs nyelve.
GameMaker nyelv A GameMaker Studio által használt GML szkriptnyelv egy doménspecifikus nyelv, amely a kezdő programozókat célozza meg, hogy könnyen megtanulhassák a programozást. Bár a nyelv több nyelv, köztük a Delphi, a C++ és a BASIC keverékeként szolgál, hiányoznak belőle a struktúrák, adattípusok és egy teljes értékű programozási nyelv egyéb jellemzői. A beépített függvények közül sok a könnyű hordozhatóság érdekében sandboxolt. A nyelv elsősorban azt a célt szolgálja, hogy bárki könnyen felvehesse a nyelvet és játékot fejlesszen.
ColdFusion Markup Language