Limbajul specific domeniului

Limbă specifică domeniului ( ing.  limbaj specific domeniului , DSL  - „ limbaj specific domeniului ”) - un limbaj de calculator specializat pentru o anumită zonă de aplicație (spre deosebire de un limbaj de uz general aplicabil unei game largi de domenii și care nu ia ţinând cont de caracteristicile domeniilor specifice de cunoaştere). Construcția unui astfel de limbaj și/sau structura lui de date reflectă specificul sarcinilor rezolvate cu ajutorul acestuia [1] . Este un concept cheie al programarii orientate pe limbaj .

Strict vorbind, împărțirea limbajelor de programare în limbaje de uz general și limbaje specifice domeniului este foarte arbitrară, mai ales când considerați că în mod formal orice protocol sau format de fișier este un . Există multe limbi de uz general utilizate ca limbi specifice domeniului pentru anumite sarcini și invers, limbi specifice domeniului utilizate ca limbi de uz general. Deci, limbajul ML , care a dat naștere unei întregi familii de limbaje de uz general (inclusiv Haskell ), a fost dezvoltat inițial ca DSL pentru sistemul de demonstrare a teoremei LCF . Un exemplu care arată condiționalitatea clasificării este limbajul BNF (și compilatorul din acesta Lex / Yacc ): pe de o parte, acesta este un exemplu viu de metalimbaj , pe de altă parte, este conceput pentru o anumită sarcină.

Terminologie

Cele mai simple limbaje specifice domeniului utilizate într-o anumită aplicație sunt adesea denumite „mini-limbi” [2] .

Martin Ward [ 3] în lucrarea sa „Language Oriented Programming” [4] (care este considerată punctul de plecare pentru dezvoltarea LOP ), a folosit termenii „ orientat pe probleme ” și „ orientat pe domeniu ”, dar în limba  științifică vorbitoare de limbă engleză. comunitatea termenul „ specific domeniului ”, în plus, este „ limbaj specific domeniului ”, și nu „ limbaj de programare specific domeniului ”. În literatura rusă despre programare, există opțiuni „ specifice domeniului ”, „ orientate către probleme ”, „ orientate pe domeniu ”.

Fowler [5] și Dmitriev [6] definesc conceptul de DSL ca „ un limbaj de programare redus (în mare parte Turing incomplet ) ”.

Exemple

Cercetătorii de frunte în programarea orientată pe limbaj (Martin Ward, Paul Hudak , Walid Taha și alții) citează următoarele exemple de limbaje specifice domeniului ca fiind clasice [4] [7] [8] :

Potrivit lui Walid Tahi, din punctul de vedere al LOP , Microsoft Excel este poate cel mai folosit limbaj de programare din lume [8] .

Alte exemple de limbaje specifice domeniului sunt limbaje de gestionare a bazelor de date (în plus față de SQL aici, de exemplu, limbajul FoxPro poate fi numit ), limbaje de comandă ale sistemului de operare (limbaje interactive de shell de comandă, în primul rând Unix Shell , lot). limbaje de lucru precum JCL etc.) [9] , Turing limbaje incomplete de structurare a datelor ( XML , .ini , .conf ), limbaj de marcare wiki , limbaje de modelare ( UML , GPSS ), Erlang pentru multi -servere de utilizator care funcționează în mod neîntrerupt.

Există limbaje de programare încorporate în sistemul de management al resurselor întreprinderii (limbaj ABAP în SAP / R3, limbaje Galaktika, Parus, 1C, sisteme Info-Accountant) și folosite pentru a le completa cu module specifice organizației. Utilizarea unui limbaj încorporat simplifică programarea sarcinilor specifice, deoarece limbajul conține inițial conceptele domeniului de studiu. niste[ ce? ] sistemele de informații geografice și CAD au, de asemenea, limbaje de programare încorporate.

Alte exemple:

Limbi încorporate

Uneori, limbajele computerizate sunt implementate într-un mod dependent, adică „în interiorul” unei limbi traduse , fără de care aceste limbi nu numai că nu pot fi executate, dar adesea nu formează un sistem de simboluri coerent și nu au Turing . completitudine . Astfel de limbi sunt numite „limbi încorporate specifice domeniului ” ( de exemplu , embedded DSL , EDSL  ; uneori DSEL ) sau pur și simplu „ limbi încorporate ” ( embedded languages ​​) [7] [10] , precum și „limbi implementate pe partea de sus sau bazată pe această limbă”.

Limbi ale textului

Pe lângă împărțirea tradițională a limbilor în limbi interpretate și compilate , limbile încorporabile introduc mai multe tipuri de implementare a limbii:

Pe de altă parte, o implementare a unui limbaj incorporabil poate fi privită ca o „ implementare fără traducere ”, ceea ce implică faptul că DSL-ul va fi un subset sintactic și semantic al limbajului în care este încorporat [11] .

O limbă folosită ca limbă de bază pentru implementarea altuia este adesea denumită metalimbaj .

Există trei motive principale pentru dezvoltarea limbilor de text încorporate:

Cele mai comune exemple de limbaje ale primului grup sunt implementările de caracteristici orientate pe obiect în limbaje funcționale [12] sau procedurale [13] , iar CLOS este un exemplu clasic . Trebuie remarcat faptul că termenul „limbă” nu este întotdeauna folosit aici - uneori se vorbește doar despre „ implementarea de noi caracteristici în limbă ” sau despre „ extinderea limbajului de către un subsistem care vizează rezolvarea anumitor sarcini ”, și există nicio împărțire strictă în „ biblioteci ” și „limbi încorporate” ”, deoarece în mod formal orice API , protocol sau structură de date poate fi considerată ca un limbaj [14] . Deci, de exemplu, o parte integrantă a limbajului Lisp este un limbaj de expresie S complet non-Turing încorporat .

Al doilea grup de limbi încorporabile este cel mai pe deplin reprezentat în comunitatea lingvistică Haskell și, prin urmare, Haskell însuși este uneori denumit „ DSL pentru semantică denotațională ” [7] . Exemple sunt Elm și alte limbi care reprezintă paradigma reactivă funcțională , precum și limba Curry . Uneori, există și o expresie similară în legătură cu Lisp : „ Lisp nu este un limbaj, ci un cadru pentru dezvoltarea limbilor ”. Un exemplu de limbaj implementat peste Lisp este Qi . O mulțime de mini-limbaje încorporabile sunt implementate în limbajul OCaml prin modulul de compilare CamlpX . Limbajul Rebol a fost , de asemenea, proiectat pentru programare prin implementarea intensă a mini-limbaje încorporabile. Dialectul Scheme din Lisp implementează limbajul complet non-Turing SXML folosind limbajul S-expression , care implementează protocolul XML într-un mod încorporabil.

Un limbaj încorporabil poate avea o semantică Turing-completă autosuficientă , dar cu toate acestea, în loc de o implementare independentă , reutilizați componente ale limbajului de bază (al treilea grup, un amestec al primelor două). Un exemplu izbitor este limbajul Schelog [15] , care implementează semantica lui Prolog în interiorul Schemei de dialect Lisp prin continuare și transformă Prolog dintr-un limbaj „autonom” într-unul incorporabil. Sarcina tradițională educațională sau „sport” pentru multe limbi funcționale este implementarea unei alte limbi pe lângă limbajul luat în considerare, cel mai adesea limbajul logicii predicatelor de ordinul întâi [16] .

În contextul metalimbajelor, limbile de sine stătătoare sunt uneori numite „limbi de primă clasă” (similar cu entitățile de primă clasă din limbi), iar limbile încorporate sunt uneori numite „limbi obiect”.

În marea majoritate a cazurilor, limbile încorporate au o singură implementare acceptată, iar diferențele în reprezentarea mașinii rezultată a codului în ele depind doar de traducătorul de limbă de bază utilizat. Cu toate acestea, există excepții - de exemplu, limbajul Concurrent ML (CML), care extinde Standard ML cu constructe pentru paralelism explicit , are două implementări fundamental diferite.

Limbaje vizuale

Unul dintre limbaje (de bază sau încorporat) poate fi vizual , care este adesea folosit în programarea utilizatorului ( dezvoltarea utilizatorului final ) .  Exemple tipice de astfel de perechi sunt AutoLisp  - AutoCAD și VBA  - Microsoft Excel . Astfel de perechi formează un sistem interactiv complet și este imposibil (și nu necesar) să se determine din punctul de vedere al utilizatorului dacă instrumentele vizuale sunt un add-on care imită comenzile limbajului text încorporat sau dacă textul limbajul controlează instrumentele vizuale. Relațiile reale din aceste perechi sunt la latitudinea dezvoltatorului.

Într-o pereche de Emacs  - Emacs Lisp , relația este mai definită. Lisp este în mod tradițional clasificat ca un metalimbaj și, în acest caz, un editor de text este construit pe deasupra ca un DSL vizual , ceea ce îl face pe acesta din urmă mutabil și extensibil.

În cazul în care ambele limbi sunt vizuale, limbajele încorporate sunt de obicei numite prin alți termeni - pluginuri , filtre etc. și nu folosesc terminologia programării orientate pe limbaj. Formal , putem spune, de exemplu, că există multe mini-limbaje vizuale încorporabile pentru meta-limbajul vizual al procesării grafice Adobe Photoshop (vezi pluginul Photoshop ).

Limbajele de programare funcționale și logice arată nefiresc într-un mediu vizual, deoarece programarea funcțională și programarea pură logică interzic efectele secundare și pentru interacțiunea GUI ; integritatea lor conceptuală trebuie încălcată. Din punct de vedere pedagogic, se consideră de dorit să se predea programarea folosind instrumente de consolă pentru a focaliza atenția elevilor asupra elementelor de bază ale algoritmizării, și nu asupra ergonomiei, și cu atât mai puțin asupra abilităților procedurale în utilizarea anumitor IDE-uri [17] .

Avantaje și dezavantaje

Avantajele și dezavantajele utilizării unui anumit DSL în locul unei limbi de uz general într-o anumită sarcină sunt mult mai clare decât avantajele și dezavantajele utilizării unei limbi de uz general în loc de alta: în cele mai multe cazuri, un DSL deja dezvoltat se dovedește a fi să fie conceptual inaplicabile unor sarcini și oferă un avantaj incontestabil în majoritatea indicatorilor de calitate în altele, iar unele subsarcini rămân în general nerezolvate până la dezvoltarea DSL [4] .

Astfel, problema avantajelor și dezavantajelor este mai corect de ridicat în lumina utilizării unei metodologii orientate pe limbă în locul oricărei alte în absența inițială a unui DSL gata făcut, comparând câștigul potențial din utilizarea acesteia cu costurile dezvoltării și întreținerii acestuia.

Vezi și

Note

  1. A. Ya. Friedland, L. S. Chanamirova. Informatica si tehnologia calculatoarelor: termeni de baza: dictionar explicativ. - Astrel, 01.01.2003. — 270 s. — ISBN 9785170145461 .
  2. Bentley - Little languages, 1986 .
  3. Pagina de pornire a lui Martin Ward
  4. 1 2 3 Ward - Programare orientată pe limbaj, 1994 .
  5. Martin Fowler . Setul de instrumente lingvistice: o nouă viață pentru limbile de domeniu . — 2005.
  6. Serghei Dmitriev ( JetBrains ). Programare orientată pe limbaj: următoarea paradigmă  // = RSDN Magazine . — 2005.
  7. 1 2 3 4 Hudak - Limbaje și instrumente specifice domeniului modulare, 1998 .
  8. 1 2 Taha - Limbi specifice domeniului, 2008 .
  9. Brett D. Hirsch. Pedagogia științelor umaniste digitale: practici, principii și politică . - Open Book Publishers, 2012. - 450 p. — ISBN 9781909254251 .
  10. Mernik, 2012 .
  11. 1 2 Czarnecki, O'Donnell, Striegnitz, Taha - Implementarea DSL în metaocaml, template haskell și C++, 2004 .
  12. Bernard Berthomieu. Stiluri de programare OO în ML . — Raportul LAAS #2000111, Centre National De La Recherche Scientifique Laboratoire d'Analyse et d'Architecture des Systèmes, 2000.
  13. Violoncel - bibliotecă care introduce programarea de nivel superior la C
  14. Hopcroft, Motwani, Ullman - Teoria automatelor, limbajelor și calculului, 2001 .
  15. Schelog, 2003 .
  16. Paulson - ML for the Working Programmer, 1996 .
  17. Igor Golovin, Andrei Stolyarov. Abordare multi-paradigmă a predării programării și rolul software-ului liber // Universitatea de Stat din Moscova Lomonosov, Rezumate ale celei de-a II-a Conferințe a dezvoltatorilor de software liber „On Protva”. - orașul Obninsk, 2005.

Literatură

Link -uri