Verkkotunnuskohtainen kieli ( eng. domain-specific language , DSL - " domain -specific language ") - tietokonekieli , joka on erikoistunut tiettyyn sovellusalueeseen (toisin kuin yleiskäyttöinen kieli , jota voidaan soveltaa useilla aloilla ja joka ei ota huomioon ottaa huomioon tiettyjen alojen tietämyksen ominaispiirteet). Tällaisen kielen rakentaminen ja/tai sen tietorakenne heijastavat sen avulla ratkaistujen tehtävien erityispiirteitä [1] . Se on kielisuuntautuneen ohjelmoinnin avainkäsite .
Tarkkaan ottaen ohjelmointikielten jako yleiskäyttöisiin ja verkkoaluekohtaisiin kieliin on hyvin mielivaltaista, varsinkin kun otetaan huomioon, että muodollisesti mikä tahansa protokolla tai tiedostomuoto on . On monia yleiskäyttöisiä kieliä, joita käytetään toimialuekohtaisina kielinä tiettyihin tehtäviin, ja päinvastoin, verkkoaluekohtaisia kieliä käytetään yleiskielinä. Joten ML-kieli , josta syntyi koko joukko yleiskäyttöisiä kieliä (mukaan lukien Haskell ), kehitettiin alun perin DSL: ksi LCF - lauseen todistamisjärjestelmälle . Esimerkki luokituksen ehdollisuuden osoittamisesta on BNF -kieli (ja sen kääntäjä Lex / Yacc ): toisaalta tämä on elävä esimerkki metakielestä , toisaalta se on suunniteltu tiettyyn tehtävään.
Yksinkertaisimpia verkkoaluekohtaisia kieliä, joita käytetään yhdessä tietyssä sovelluksessa, kutsutaan usein "minikieliksi" [2] .
Martin Ward [ 3] käytti työssään "Language Oriented Programming" [4] (jota pidetään LOP :n kehityksen lähtökohtana ) termejä " ongelmaoriented " ja " domain oriented " , mutta englanninkielisessä tieteellisessä kielessä. yhteisössä termi " verkkoaluekohtainen ", lisäksi se on " verkkoaluekohtainen kieli " eikä " verkkoaluekohtainen ohjelmointikieli ". Venäläisessä ohjelmointikirjallisuudessa on vaihtoehtoja " aluekohtainen ", " ongelmakeskeinen " , " aluekohtainen ".
Fowler [5] ja Dmitriev [6] määrittelevät DSL:n käsitteen " tyhjennetyksi ohjelmointikieleksi (useimmiten Turingin epätäydellinen ) ".
Kielisuuntautuneen ohjelmoinnin johtavat tutkijat (Martin Ward, Paul Hudak , Walid Taha ja muut) mainitsevat seuraavat esimerkit aluekohtaisista kielistä klassisina [4] [7] [8] :
Walid Tahin mukaan LOP:n näkökulmasta Microsoft Excel on ehkä eniten käytetty ohjelmointikieli maailmassa [8] .
Muita esimerkkejä verkkoaluekohtaisista kielistä ovat tietokannan hallintakielet ( SQL :n lisäksi täällä voidaan kutsua esimerkiksi FoxPro -kieliä ), käyttöjärjestelmän komentokielet (interaktiiviset komentokulkikielet, ensisijaisesti Unix Shell , erä työkielet, kuten JCL jne.) [9] , Turingin epätäydelliset tiedon strukturointikielet ( XML , .ini , .conf), wikin merkintäkieli , mallintamiskielet ( UML , GPSS ), Erlang monelle -Käyttäjäpalvelimet toimivat keskeytymättömässä tilassa.
Yrityksen resurssienhallintajärjestelmään on sisäänrakennettu ohjelmointikieliä (ABAP-kieli SAP / R3:ssa, Galaktika-, Parus-, 1C-, Info-Accountant-järjestelmien kielet) ja niitä käytettiin täydentämään organisaatiokohtaisilla moduuleilla. Sulautetun kielen käyttö yksinkertaistaa tiettyjen tehtävien ohjelmointia, koska kieli sisältää aluksi aihealueen käsitteet. Jonkin verran[ mitä? ] maantieteellisissä tietojärjestelmissä ja CAD:ssä on myös sisäänrakennetut ohjelmointikielet.
Muita esimerkkejä:
Toisinaan tietokonekielet toteutetaan riippuvaisella tavalla, eli käännetyn kielen "sisällä", jota ilman näitä kieliä ei vain voida suorittaa, eivätkä usein muodosta yhtenäistä symbolijärjestelmää eikä niissä ole Turingia . täydellisyys . Tällaisia kieliä kutsutaan " sulautetuiksi verkkoaluekohtaisiksi kieliksi " ( eng. embedded DSL , EDSL ; joskus DSEL ) tai yksinkertaisesti " sulautetuiksi kieliksi " ( sulautetuksi kieliksi ) [7] [10] , samoin kuin "kieliksi, jotka on toteutettu tämän kielen yläpuolella tai perustuu tähän kieleen".
Perinteisen kielten jaon tulkittuihin ja käännettyihin kieliin lisäksi upotettavat kielet tuovat käyttöön useita muita kielitoteutustyyppejä:
Toisaalta upotettavan kielen toteutusta voidaan pitää " käännättömänä toteutuksena ", mikä tarkoittaa, että DSL on sen kielen syntaktinen ja semanttinen osajoukko, johon se on upotettu [11] .
Kieltä, jota käytetään peruskielenä toisen toteuttamisessa, kutsutaan usein metakieleksi .
Upotetun tekstin kielten kehittämiselle on kolme pääsyytä:
Yleisimmät esimerkit ensimmäisen ryhmän kielistä ovat olio- ominaisuuksien toteutukset toiminnallisilla [12] tai proseduurikielillä [13] , ja CLOS on klassinen esimerkki . On huomattava, että termiä "kieli" ei aina käytetä täällä - joskus puhutaan vain " uusien ominaisuuksien käyttöönotosta kielessä " tai " kielen laajentamisesta alijärjestelmällä, jonka tarkoituksena on ratkaista tiettyjä tehtäviä ". ei tiukkaa jakoa " kirjastoihin " ja "sulautettuihin kieliin", koska muodollisesti mitä tahansa API- , protokolla- tai tietorakennetta voidaan pitää kielenä [14] . Joten esimerkiksi Lisp-kielen olennainen osa on sisäänrakennettu ei-Turingin täydellinen S-lausekekieli .
Toinen upotettavien kielten ryhmä on täydellisimmin edustettuna Haskellin kieliyhteisössä , ja siksi itse Haskellia kutsutaan toisinaan " denotaatiosemantiikan DSL:ksi " [7] . Esimerkkejä ovat Elm ja muut kielet, jotka edustavat toiminnallista reaktiivista paradigmaa , sekä Curry -kieli . Joskus myös Lispistä löytyy samanlainen ilmaus : " Lisp ei ole kieli, vaan puitteet kielten kehittämiselle ." Esimerkki Lispin päälle toteutetusta kielestä on Qi . OCaml -kielellä on toteutettu paljon upotettavaa minikieliä CamlpX -kääntäjämoduulin kautta . Rebol -kieli suunniteltiin myös ohjelmointiin sulautettavien minikielten raskaalla toteutuksella . Lispin Scheme - murre toteuttaa ei-Turing-täydellisen kielen SXML S- lausekekielellä , joka toteuttaa XML - protokollan upotettavalla tavalla.
Upotettavalla kielellä voi olla omavarainen Turing-täydellinen semantiikka, mutta siitä huolimatta itsenäisen toteutuksen sijaan käyttää uudelleen peruskielen komponentteja (kolmas ryhmä, kahden ensimmäisen sekoitus). Silmiinpistävä esimerkki on kieli Schelog [15] , joka toteuttaa Prologin semantiikan Lisp-murrekaavion sisällä jatko - osien kautta ja muuttaa Prologin "erillisestä" kielestä upotettavaksi. Perinteinen opetus- tai "urheilu"tehtävä monille toiminnallisille kielille on jonkin muun kielen toteuttaminen tarkasteltavan kielen lisäksi, useimmiten ensimmäisen asteen predikaattilogiikan kielen [16] .
Metakielien yhteydessä itsenäisiä kieliä kutsutaan joskus "ensimmäisen luokan kieliksi" (samanlainen kuin kielten ensimmäisen luokan kokonaisuuksia ), ja upotettuja kieliä kutsutaan joskus "objektikieliksi".
Suurimmassa osassa tapauksista upotetuilla kielillä on vain yksi tuettu toteutus, ja erot tuloksena olevan koodin koneesityksen välillä riippuvat vain käytetystä peruskielen kääntäjästä. On kuitenkin poikkeuksia - esimerkiksi Concurrent ML (CML) -kielellä, joka laajentaa Standard ML :n rakenteilla eksplisiittistä rinnakkaisuutta varten , on kaksi pohjimmiltaan erilaista toteutusta.
Yksi kielistä (perus- tai sulautettu) voi olla visuaalinen , jota käytetään usein käyttäjäohjelmoinnissa ( loppukäyttäjäkehityksessä ) . Tyypillisiä esimerkkejä tällaisista pareista ovat AutoLisp - AutoCAD ja VBA - Microsoft Excel . Tällaiset parit muodostavat täydellisen interaktiivisen järjestelmän, ja on mahdotonta (eikä välttämätöntä) määrittää käyttäjän näkökulmasta, ovatko visuaaliset työkalut lisäosa, joka matkii sisäänrakennetun tekstikielen komentoja vai onko teksti kieli ohjaa visuaalisia työkaluja. Näiden parien todelliset suhteet ovat kehittäjästä riippuvaisia.
Emacs - Emacs Lisp -parissa suhde on tarkempi. Lisp on perinteisesti luokiteltu metakieleksi , ja tässä tapauksessa sen päälle on rakennettu tekstieditori visuaalisena DSL:nä, mikä tekee jälkimmäisestä muunneltavan ja laajennettavan.
Siinä tapauksessa, että molemmat kielet ovat visuaalisia, upotettuja kieliä kutsutaan yleensä muilla termeillä - laajennuksilla , suodattimilla jne., eivätkä ne käytä kielisuuntautuneen ohjelmoinnin terminologiaa. Muodollisesti voimme esimerkiksi sanoa, että Adobe Photoshopin grafiikankäsittelyn visuaaliseen metakieleen on olemassa monia upotettavia visuaalisia minikieliä (katso Photoshop-laajennus ).
Toiminnalliset ja loogiset ohjelmointikielet näyttävät epäluonnollisilta visuaalisessa ympäristössä, koska toiminnallinen ohjelmointi ja puhdas logiikkaohjelmointi kieltävät sivuvaikutukset ja GUI -vuorovaikutuksen ; niiden käsitteellistä eheyttä on rikottava. Pedagogisesti katsottuna on toivottavaa opettaa ohjelmointia konsolityökaluilla , jotta opiskelijoiden huomio kiinnittyy algoritmisoinnin perusteisiin, ei ergonomiaan, ja vielä vähemmän menettelytaitoihin tiettyjen IDE :iden käytössä [17] .
Tietyn DSL:n käytön yleiskäyttökielen sijaan tietyssä tehtävässä edut ja haitat ovat paljon selkeämpiä kuin yhden yleiskäyttökielen käytön edut ja haitat toisen sijaan: useimmissa tapauksissa jo kehitetty DSL osoittautuu olla käsitteellisesti soveltumattomia joihinkin tehtäviin ja antaa kiistattoman edun useimmissa laatuindikaattoreissa toisissa, ja jotkut osatehtävät jäävät yleensä ratkaisematta DSL:n kehittämiseen asti [4] .
Siten kysymys eduista ja haitoista on oikeampaa ottaa esille kielisuuntautuneen metodologian käytön valossa minkään muun sijasta valmiin DSL:n alun puuttuessa, ja sen käytöstä saatavaa mahdollista hyötyä verrataan sen kehittämisen ja ylläpidon kustannuksia.