Programare orientată pe limbaj

Programare orientată pe limbă (LOP) ( Programare orientată pe limba engleză  ), de asemenea, dezvoltare divergentă ( dezvoltare în engleză middle out ), de asemenea, abstracție a metalajului , și dezvoltare bazată pe un limbaj specific domeniului ( dezvoltare bazată pe DSL engleză ) [1] - paradigma de programare , care constă în împărțirea procesului de dezvoltare software în stadiul de dezvoltare a limbajelor specifice domeniului (DSL) și descrierea soluției efective a problemei folosindu-le. Etapele pot fi conduse secvenţial sau în paralel, o singură dată sau recursiv [2] [1] ; DSL-urile pot fi implementate dependent sau independent de limba de bază și au una sau mai multe implementări.   

Locul și rolul în informatică

LOP este conceput pentru a separa complexitățile: partea orientată către mașină a codului (funcționalitate de nivel scăzut) și partea orientată către om (soluția reală a problemei aplicate) sunt dezvoltate independent una de cealaltă, ceea ce elimină creșterea exponențială a complexitatea rezultată a dezvoltării întregului proiect și rezolvă problema complexității ca problemă fundamentală de programare [2 ] , descrisă de Frederick Brooks în celebrul eseu „The There is no silver bullet ”, din cauza căruia este imposibil să creștem productivitatea programatorilor. chiar și cu un ordin de mărime prin simpla îmbunătățire a instrumentelor de lucru. Cele mai multe dintre celelalte avantaje decurg direct din aceasta .

Meritele restrângerii specializării limbilor au fost discutate încă de la mijlocul anilor 1980 [3] , iar meritele ridicării nivelului limbilor mult mai devreme [4] , dar dezvoltarea orientată spre DSL s-a format ca un independent metodologia abia la mijlocul anilor 1990 .

Utilizarea DSL -urilor în locul limbajelor de uz general crește foarte mult nivelul de abstractizare a codului, ceea ce vă permite să dezvoltați rapid și eficient și să creați programe ușor de înțeles și de întreținut; și, de asemenea, face posibilă sau simplifică semnificativ rezolvarea multor probleme legate de manipularea programelor ( generarea de programe , studiul unei anumite proprietăți a programelor - corectitudine, eficiență etc.) [3] [1] [5] [ 6] . Pe de altă parte, dezvoltarea unui nou limbaj și implementarea sa efectivă este o problemă nebanală a informaticii teoretice și aplicate .

Printre alte abordări ale proiectării programelor, LOP se remarcă prin concentrarea mult mai agresivă pe aducerea computerului mai aproape de om. Există o opinie printre cercetătorii LOP că, în sarcinile intensive în știință, un DSL bine conceput și implementat face comunicarea om-calculator mult mai convenabilă și productivă decât o interfață grafică cu utilizatorul . Exemplele cele mai frecvent citate sunt următoarele limbi populare specifice domeniului :

si etc.

Avantajele LOP apar chiar și în cazurile în care DSL-ul nu este dezvoltat pentru utilizare în masă, ci pentru rezolvarea unei singure sarcini. De exemplu, la dezvoltarea unui sistem de conversie automată echivalentă a programelor FermaT , trecerea de la programarea „plată” în Lisp la LOP recursiv (WSL a fost implementat pe Lisp , MetaWSL a fost implementat pe acesta, iar funcționalitatea țintă era deja activată it) nu numai că a permis reducerea cantității totale de cod de la 100 la 16 mii de linii, dar, în același timp, a crescut toate caracteristicile calitative principale ale codului și chiar a făcut posibilă rezolvarea problemelor care nu puteau fi rezolvate altfel [2] .

O comparație simplificată a creșterii costurilor forței de muncă atunci când se utilizează abordările tradiționale și orientate pe limbă permite graficul [1] . După cum puteți vedea, LOP este adecvat doar pornind de la un anumit prag de volum și complexitate a funcționalității sistemului țintă.

Majoritatea cercetătorilor LOP se bazează pe limbaje funcționale și metalimbaje , ceea ce duce la un prag de intrare ridicat pentru dezvoltatori. Martin Ward observă posibilitatea implementării DSL în limbi tradiționale, dar numai după dezvoltarea sa finală.

În general , se folosește adesea încorporarea unui interpret într-un limbaj de uz general (vezi Abordare ), deși acest lucru se face nu numai fără a face apel la principiile LOP, ci de multe ori fără a realiza aplicarea sa ca atare. Cel mai adesea încorporate: limbaj de expresie regulată ( interpret PCRE ), Lua , SQL , XML . Un set de instrumente de programare vizuală a fost, de asemenea, dezvoltat pentru utilizarea generală a unora dintre ideile LOP.

Mulți cercetători văd ca obiectivul LOP să estompeze complet granițele dintre un model matematic și implementarea lui pe un computer și să facă posibilă dezvoltarea de software de către specialiști în materie care nu au cunoștințe specifice în programare [1] [6] :

-- проверка вхождения точки в регион:
inRegion :: Point -> Region -> Bool
p ‘inRegion‘ r = r p
...
Prin capturarea cu acuratețe a semanticii domeniului, chiar și non-programatorii sunt capabili să înțeleagă o mare parte din cod. Într-un experiment comandat de Naval Surface Warfare Center, oamenii complet nefamiliarizați cu Haskell au înțeles din mers conceptele de bază. Unii și-au exprimat chiar neîncrederea că acest cod era de fapt executabil.
(Într-adevăr, în ciuda prezenței acestei ultime propoziții în text, unul dintre recenzorii primei schițe a acestei lucrări și-a exprimat nemulțumirea față de faptul că „ lucrarea se pretinde a fi un discurs atât despre sintaxă, cât și despre semantică, dar conținutul său este preocupat în principal de sintaxă (cum ar fi, de exemplu, definiția inRegion), și nu se face nicio distincție între matematică și programare ". Dar, de fapt, această definiție inRegioneste în întregime semantică. Mai mult, raționamentul ecuațional [7] ... vă permite să estompați linia dintre matematică și programare: programele pot fi considerate ca specificații. Acest lucru este special deoarece extinde utilizarea metodelor formale.)

Text original  (engleză)[ arataascunde] ...
Deoarece semantica domeniului este surprinsă concis, este posibil chiar și pentru non-programatori să înțeleagă o mare parte din cod. În experimentul Naval Surface Warfare Center, cei complet nefamiliarizați cu Haskell au reușit să înțeleagă conceptele imediat. Unii și-au exprimat chiar neîncrederea că codul era de fapt executabil.
(Într-adevăr, în ciuda prezenței acestei ultime propoziții, un recenzent al primei schițe a acestei lucrări s-a plâns că „lucrarea pretinde că este interesată atât de sintaxă, cât și de semantică, dar detaliile prezentate sunt în mare parte sintactice (de exemplu, definiția inRegion) și lucrarea nu face nicio încercare de a distinge entitățile matematice și programatice." Dar, de fapt, această definiție a inRegioneste în întregime semantică. În plus, raționamentul ecuațional [7] ... permite să estompeze distincția dintre entitățile matematice și programatice: programele pot fi privite ca specificații. Aceasta este o caracteristică, deoarece îmbunătățește aplicarea metodelor formale.) — Paul Hudak, „Limbaje și instrumente specifice domeniului modular” [1]

Abordare

Abordarea se bazează pe ideea că un limbaj special conceput pentru o anumită sarcină va oferi indicatori de calitate a codului evident mai mari decât orice limbaj de uz general [1] [6] , și că pentru rezolvarea problemelor industriale complexe va fi mai eficient să inventezi limbaj mai ușor de înțeles (orientat către om [8] sau care încapsulează cu acuratețe cunoștințele subiectului [2] [1] ), mai degrabă decât să depășească dificultățile de a folosi unul existent, chiar și unul care are rădăcini în industrie [4] .

Majoritatea cercetătorilor vorbesc despre LOP ca o tranziție a întregii industrii de dezvoltare software la utilizarea limbajelor bazate pe text din generația a 4-a și a 5-a [8] , dar unii se concentrează pe utilizarea limbajelor vizuale [9] [10 ] ] .

Principalele probleme ale abordării sunt găsirea modalităților de a crea rapid o implementare a DSL -ului inventat pentru a începe dezvoltarea soluției reale a problemei și pentru a asigura o bună performanță de calcul a DSL -ului .

Un limbaj specific unui domeniu, ca orice limbaj de programare în general, este definit de alfabet , gramatică , semantică și psiholingvistică , totuși, în funcție de modul în care este implementat DSL, rolul și relația acestor niveluri pot fi neclare și/sau moștenite din limbajul implementării acestuia.

Diferiți autori subliniază diferite moduri de dezvoltare a limbajelor specifice domeniului:

Când se utilizează instrumente macro, la rândul său, există o distincție între metaprogramarea șablonului și interpretarea statică în mai multe etape [13] [17] [18] [5] .

A treia și a patra metodă au un avantaj fundamental față de primele două - DSL nu înlocuiește, ci extinde limbajul de uz general [14] [1] [19] [20] , reutilizand întregul set de instrumente pentru limbajul de bază, începând cu parserul , datorită căruia:

Mulți autori se concentrează pe încorporarea eficientă (fără interpretare) în limbaj a anumitor caracteristici inițial absente pentru adaptarea la anumite sarcini [15] [16] , care ulterior pot servi drept bază pentru încorporarea pură a DSL [21] . Se acordă o atenție considerabilă utilizării continuărilor pentru dezvoltarea DSL-urilor cu semantică nedeterministă ( Steel , Wend , Felleisen , Ramsey , Reppy și alții).

Aplicații ale abordării și autoaplicabilitatea

O subspecie importantă a LOP este programarea utilizatorului , care permite unei varietăți de oameni care nu au idee despre informatică să rezolve eficient multe probleme aplicate. Rolul acestei aplicații a LOP este atât de mare încât, probabil, cel mai comun limbaj de programare din lume în practică este instrumentele de aspect al foilor de calcul ( ing. foi de  calcul ) [6] .

În funcție de interpretarea termenului „ metaprogramare ” (MP) și de modul în care este implementat DSL, fie LOP este chintesența MT, fie MT este una dintre modalitățile de implementare a LOP. Ultima opțiune este cea mai aplicabilă în cazul înglobării DSL într-un limbaj de uz general printr-un subset macro al acestuia din urmă [13] . Când se utilizează instrumente de dezvoltare vizuală DSL [9] [10] , aceste definiții sunt sinonime, deoarece programarea vizuală în sine este cea mai simplă formă de MT. Considerarea MT ca o autoaplicare a LOP înseamnă:

Trusa de instrumente

Pentru a dezvolta traducători independenți, generatoarele de lexer și parser sunt utilizate pe scară largă pe baza definiției gramaticii DSL -ului țintă folosind BNF și expresii regulate :

si altii.

Atunci când compilarea unui DSL independent, codul nativ sau chiar asamblatorul sunt rareori alese ca platformă țintă , este mai de preferat (atât pentru a reduce complexitatea implementării DSL, cât și pentru a crește portabilitatea) să folosiți o platformă de nivel superior:

Următoarele tehnologii sunt utilizate pentru a încorpora DSL într-un limbaj de uz general:

Încorporarea pură nu implică instrumente suplimentare, ci impune restricții destul de severe asupra alegerii limbajului de bază .

Când se utilizează interpretarea statică în mai multe etape, platforma țintă este aceeași cu limba de bază [13] [17] [18] [5] .

În cadrul programării tradiționale (în limbaje moștenite de la Algol ), utilizarea unora dintre ideile LOP face posibilă setul de instrumente de programare vizuală , dezvoltat în prima jumătate a anilor 2000 [9] [10] [27] [ 28] :

Istorie, filozofie, terminologie

În comunitatea lingvistică Lisp , aproape din momentul creării, s-a practicat utilizarea instrumentelor macro pentru a se adapta la cerințele domeniului problemei. Această abordare, în special, a fost descrisă în detaliu în cartea The Structure and Interpretation of Computer Programs . Idei similare au fost aplicate uneori în comunitatea lingvistică Forth . Practic, aceste decizii au fost de natură spontană și adesea pot fi clasificate drept decizii ad-hoc [13] .

În a doua jumătate a anilor 1970, a fost inventat sistemul de tip Hindley -Milner, care a stat la baza limbajului ML ( abreviere pentru MetaLanguage ) . ML a fost conceput inițial ca un DSL pentru sistemul de demonstrare a teoremei LCF , dar în curând a devenit clar că ar putea fi un bun limbaj aplicat de uz general - mai bun decât limbajele concepute inițial pentru a fi limbaje de uz general, deoarece depanat pe o problemă complexă specifică [30] [31] . În consecință, a dat naștere unei întregi familii de limbi tip X-M care au câștigat popularitate ca limbi pentru dezvoltarea limbajului ( metalimbi ) și sunt adesea definite ca „ DSL-uri pentru semantică denotațională [1] .

În 1994, Martin  Ward [ 32] a oferit o descriere detaliată a metodologiei [2] și a propus termenii „ programare orientată pe limbaj ” și „ dezvoltare divergentă ” (sau „ dezvoltare de la centru spre margini ”, dezvoltare de la mijloc spre exterior ), observând că abordarea, sub diverse forme, fusese aplicată de multe ori înainte. Termenul „ dezvoltare divergentă ” subliniază faptul că stratul de mijloc (stratul de mijloc ) din sistemul rezultat este DSL-ul dezvoltat, spre deosebire de metodele cunoscute anterior și încă utilizate pe scară largă de „ dezvoltare de jos în sus ” ( dezvoltare de jos în sus ), „ dezvoltare de sus în jos ” ( dezvoltare de sus în jos ) și „ dezvoltare convergentă ” ( în afara dezvoltării ) care le combină.

Ward a sugerat, de asemenea, utilizarea LOP recursiv, crescând treptat complexitatea sistemului dezvoltat de jos în sus; și combinați LOP cu prototiparea rapidă dezvoltând mai întâi cel mai simplu prototip DSL (care se poate face foarte rapid) și cea mai simplă soluție folosindu-l, apoi, după testarea limbajului, identificarea defectelor și clarificarea cerințelor, rafinați DSL-ul și rescrieți soluția într-un versiune nouă a limbii și așa mai departe în mod iterativ.

Paul Hudak a propus [1] o  metodă pură de încorporare folosind limbaje de tip sigur (de preferință cele lene, precum Haskell , dar eventual unele stricte precum ML , deși în acest din urmă caz ​​implementarea iese puțin mai greoaie și mai puțin naturală ) și raționamentul ecuațional [7] prin dezvoltarea recursivă a sistemului de sus în jos și acumularea de cod reutilizabil sub formă de „DSL for DSL development”.

Metoda pură de încorporare a dat naștere termenului „embedded domain-specific language” ( ing.  Embedded DSL, EDSL ; uneori DSEL ) [1] [8] . Un număr de EDSL-uri peste Haskell au fost dezvoltate pentru programare într-un stil pur și simplu funcțional, aplicații interactive în timp real (Fran, Fruit, FRP și RT-FRP, FAL, Frob, Fvision, Yampa) [33] [19] , care au format o unitate independentă . paradigmă - programare reactivă funcțională (FRP). Acest lucru arată că LOP nu este o paradigmă separată de programare închisă, ci, dimpotrivă, poate fi folosită ca instrument în dezvoltarea de noi paradigme.

ML standard , dialectul de bază al ML , a fost subiect de controversă încă de la începutul anilor 1990 cu privire la lipsa caracteristicilor macro în limbă [30] . Criticii au susținut că lipsa macrocomenzilor a fost un dezavantaj, dar dactilografele puternice au obiectat că absența lor este doar un avantaj. Într-un alt dialect al ML - OCaml - a fost propusă o idee de compromis - parametrizarea sintaxei prin extragerea parserului într-un modul compilator CamlpX personalizat , prin care a fost dezvoltat un set de EDSL-uri pentru OCaml. Mai târziu, a apărut o extensie pentru generarea codului în timpul execuției - MetaOCaml . La sfârșitul anilor 1990, ideea macro-urilor sigure de tip a fost propusă ca instrument pentru implementarea eficientă a DSL-urilor sigure de tip [34] . Această idee a fost implementată în curând ca extensii MetaML [13] [17] [18] pentru Standard ML și Template Haskell [35] pentru Haskell . În primul caz, instrumentele macro sunt considerate exclusiv ca un interpret static în mai multe etape; în al doilea, ele sunt considerate atât ca aceeași abordare, cât și ca cvasi-citare cunoscută din limbajul Lisp , și ca subsistem șablon , similar cu cel disponibil în limbajul C++ .

Un studiu al posibilității de implementare și aplicare a acestor abordări în diferite limbi a arătat că C++ este un instrument extrem de incomod pentru dezvoltarea limbajelor încorporate [36] . Cu toate acestea, C++ permite implementarea soluțiilor din această direcție, cultivate și depanate sub auspiciile programării funcționale [5] [37] , ceea ce este un avantaj rar pentru limbajele mainstream [5] .

Datele de cercetare preliminară publicate în 2012 au arătat că DSL independent este mai convenabil de utilizat, în timp ce EDSL este mai ușor de implementat [8] .

Critică și comparație cu alternative

Avantaje

Creșterea complexității oricărui sistem software este limitată fundamental de limita până la care este încă posibil să se mențină controlul asupra acestuia: dacă cantitatea de informații necesară pentru a înțelege o componentă a acestui sistem depășește „capacitatea” creierului unuia. persoană, atunci această componentă nu va fi pe deplin înțeleasă. Va deveni extrem de dificil să-l rafinați sau să corectați erori și se poate aștepta ca fiecare corectare să introducă noi erori din cauza acestor cunoștințe incomplete.

Text original  (engleză)[ arataascunde] Există o limită fundamentală a complexității oricărui sistem software pentru ca acesta să fie încă gestionabil: dacă necesită mai mult de „un minut” de informații pentru a înțelege o componentă a sistemului, atunci acea componentă nu va fi înțeleasă pe deplin. Va fi extrem de dificil să faceți îmbunătățiri sau să remediați erori și fiecare remediere este probabil să introducă erori suplimentare din cauza acestor cunoștințe incomplete. — Martin Ward, „Programare orientată pe limbă” [2]

LOP are multe avantaje față de dezvoltarea tradițională „plată” [2] :

Implementarea limbilor prin dezvoltarea traducătorilor independenți este o sarcină de rutină, deoarece s-au acumulat o bază formală extinsă și instrumente bazate pe aceasta ( Lex/Yacc , ANTLR , Parsec [22] ). De exemplu, pe Parsec, dezvoltarea de parseri pentru limbi cu gramatică simplă (comparabilă cu gramatica lui Pascal Wirth ) se face într-o chestiune de ore-om [38] [39] .

Dezavantaje

Programarea orientată pe limbaj are două dezavantaje principale față de programarea tradițională, care, totuși, nu sunt fundamentale: un prag ridicat de intrare pentru dezvoltatorii de limbaje (redus cu prețul renunțării la majoritatea avantajelor metodologiei) și dificultatea asigurării performanței computaționale. . Ambele deficiențe sunt relevante doar pentru dezvoltatorii de limbaje specifice domeniului; utilizatorii limbii (specialiști în aplicații) obțin un beneficiu net.

Restricții

Dezvoltarea de noi limbi necesită un fundal teoretic bun și fluență în limbi diferite din punct de vedere semantic și extensiile acestora. Martin Ward observă că proiectarea unui limbaj bun, cu potențialul de a-și satisface utilizatorii și de a avea un ciclu de viață lung, este o sarcină complexă care necesită un grad ridicat de cunoaștere a informaticii și recomandă programatorilor să practice constant dezvoltarea limbajului pentru a obține suficientă experiență practică. În plus, el subliniază că scopul LOP nu este de a reduce pragul de intrare pentru dezvoltatori, ci, dimpotrivă, de a împuternici și simplifica munca dezvoltatorilor calificați - și deja în viitor acest lucru duce la o scădere a intrării. prag pentru utilizatorii sistemului, care este necesar pentru utilizarea și dezvoltarea acestuia.

Metodele de încorporare a unui DSL într-o limbă de uz general sunt departe de a fi aplicabile în orice limbă, deoarece necesită anumite proprietăți ale semanticii limbajului de bază în diverse combinații: un model de apel aplicativ , un sistem de tip cu adevărat polimorf sau o tastare dinamică (vezi polimorfismul ), funcții de ordin superior , continuări , un subsistem de macro-extensiune dezvoltat, reflexivitate , lene . Aceste proprietăți nu sunt disponibile inițial (sau pot fi implementate complet) în niciun caz în nicio limbă. Cel mai adesea, ambele metode și combinațiile lor sunt utilizate în dialectele limbilor bazate pe calcul lambda netipizat și tipat (un model matematic pentru descrierea semanticii), uneori cu extensii specifice nestandardizate: Common Lisp , Scheme , Standard ML , MetaML [ 13] , Alice , OCaml , MetaOCaml , Haskell , Template Haskell , Nemerle . Aceste metode sunt aplicabile și în limbajul Forth , deși sunt relativ rar folosite de dezvoltatorii Forth. Toate aceste limbi au un prag de intrare ridicat. Unii autori notează posibilitatea utilizării celei de-a treia metode în C++ mainstream , dar adecvarea C++ pentru LOP a fost criticată [36] .

Dezvoltarea DSL vizuală [9] [10] are o barieră scăzută de intrare, dar sacrifică o serie de caracteristici LOP descrise de Ward, Hudak și alții:

  • Conceptul de DSL este definit ca „ un limbaj de programare redus (în majoritatea cazurilor nu este complet Turing ) ”;
  • Numai DSL-urile cu semantică deterministă sunt considerate, în special, Fowler clasifică modelele de obiecte adaptive drept DSL-uri (astfel încât estomparea granițelor dintre matematică și semantică, pe care o subliniază Hudak, nu are loc);
  • Nu este luată în considerare nici utilizarea recursivă a LOP, nici posibilitatea creșterii numărului de implementări ale DSL-ului dezvoltat, astfel încât eficacitatea implementării DSL-ului depinde în întregime de dezvoltatorii mediului vizual.
Eficiență

Performanța de calcul a unei implementări DSL „neîncetate” poate fi scăzută, iar o bună optimizare poate fi nerezonabil de costisitoare. Desigur, datorită scopului unor DSL-uri, viteza nu este de o importanță fundamentală pentru ele ( Τ Ε Χ , AutoLisp ). În alte cazuri, depinde atât de metoda de implementare, cât și de platforma de compilare țintă, iar în multe cazuri este posibil să se obțină rezultate foarte bune. De exemplu, Waleed Taha descrie [40] implementarea traducătorului de limbaj FRP prin metoda de generare a codului C imperativ , cu care au fost dezvoltate aplicații în timp real pentru microcontrolerul PIC16C66 pe 16 biți [41] . Hudak subliniază [1] că implementările lui Haskell în mai multe etape, modulare pur în linie DSL (vezi Abordarea ) sunt extrem de lente, deoarece fiecare strat de abstractizare dă o încetinire de 15-70 de ori - dar datorită utilizării tehnicilor de supercompilare , viteza poate fi mărită înapoi cu trei ordine de mărime (de la 400 la 2800 de ori).

Este posibil să se dezvolte un DSL conceput pentru a optimiza design-urile utilizate în logica de nivel superior. De exemplu, limbajul OL (Operator Language) [42] a fost dezvoltat pentru a descrie algoritmii matematici într-un mod independent de platformă și pentru a simplifica portarea către noi arhitecturi de biblioteci matematice cu cerințe de înaltă performanță (vezi number crusher ). Compilatorul este parametrizat prin date privind arhitectura procesorului (suport pentru operații vectoriale, număr de nuclee etc.), iar uneori realizează testarea comparativă automată a opțiunilor de implementare cu alegerea celei mai rapide. Ca urmare, un program într-un limbaj declarativ de nivel super-înalt generează cod C foarte eficient (comparabil cu scris de mână) care implementează algoritmul în cel mai eficient mod pentru o arhitectură dată. În acest caz, strângerea dimensiunii datelor de intrare devine, de asemenea, o componentă a eficienței - de exemplu, se poate construi o funcție rapidă pentru a multiplica matrice 8x8.

Utilizarea DSL-urilor încorporabile în limbi pentru care există compilatoare de optimizare globală (cum ar fi Stalin Scheme , MLton ) permite descompunerea sarcinilor specifice limbii fără pierderea eficienței în comparație cu alte abordări de proiectare, dar poate impune restricții asupra DSL. Această direcție face obiectul multor studii.

Toate aceste soluții sunt private, iar aplicabilitatea fiecăreia dintre ele depinde de natura DSL-ului dezvoltat la toate nivelurile, sau invers, îi impune cerințe speciale. Astfel, corelarea arhitecturii proiectului cu eficacitatea implementării acestuia este o parte integrantă a problemei LOP. Acest lucru este valabil și pentru alte abordări de design, dar într-o măsură mult mai mică.

Note

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Hudak - Limbaje și instrumente specifice domeniului modular, 1998 .
  2. 1 2 3 4 5 6 7 8 Ward - Programare orientată pe limbaj, 1994 .
  3. 1 2 Bentley - Little languages, 1986 .
  4. 1 2 Backus - Programarea poate fi eliberată de stilul vonNeumann?, 1978 , Introducere.
  5. 1 2 3 4 5 Czarnecki, O'Donnell, Striegnitz, Taha - Implementarea DSL în metaocaml, template haskell și C++, 2004 .
  6. 1 2 3 4 5 Taha - Limbi specifice domeniului, 2008 .
  7. 1 2 3 Raționament ecuațional
  8. 1 2 3 4 Mernik - Formal and Practical Aspects of Domain-Specific Languages, 2012 .
  9. 1 2 3 4 Martin Fowler . Setul de instrumente lingvistice: o nouă viață pentru limbile de domeniu . — 2005.
  10. 1 2 3 4 Serghei Dmitriev ( JetBrains ). Programare orientată pe limbaj: următoarea paradigmă  // = RSDN Magazine . — 2005.
  11. Aho, Seti, Ulman, 1985, 2001, 2003 .
  12. Dezvoltarea de aplicații cu Objective Caml
  13. 1 2 3 4 5 6 7 Ganz, Sabry, Taha - Macros as Multi-Stage Computations, 2001 .
  14. 1 2 Shivers - The ultimate little language, 1996 .
  15. 1 2 Berthomieu - OO Stiluri de programare în ML, 2000 .
  16. 12 Ramsey , 1990 .
  17. 123 Taha , 2004 .
  18. 123 Taha , 2007 .
  19. 1 2 Cheong - Programare funcțională și jocuri 3D, 2005 .
  20. Benton - Embedded Interpreters, 2005 .
  21. Schelog, 2003 .
  22. 12 Parsec pentru Haskell .
  23. Biblioteca MLRISC - un cadru pentru retargetable și optimizarea back-end-urilor compilatorului (downlink) . Consultat la 6 februarie 2014. Arhivat din original la 6 decembrie 2013. 
  24. Încorporarea limbajului obiect în SML cu citat/antiquote .
  25. Daniel de Rauglaudre. Camlp4 - Tutorial ((c) 2002 Institut National de Recherche en Informatique et Automatique).
  26. Martin Jambon. Cum să personalizați sintaxa lui OCaml, folosind Camlp5 (link mort) ((c) 2005, 2010). Data accesului: 10 decembrie 2013. Arhivat din original pe 26 noiembrie 2013. 
  27. Dmitri Kirillov. Orientare lingvistică . Computerra (14 martie 2006). Preluat: 5 mai 2006.
  28. Igor Tamashchuk. Limbajul specific domeniului din aplicația dvs. este simplu (link indisponibil) (22 octombrie 2008). Consultat la 24 octombrie 2008. Arhivat din original pe 15 decembrie 2013. 
  29. JetBrains - Mediu de dezvoltare DSL
  30. 1 2 Appel - A Critique of Standard ML, 1992 .
  31. Paulson, 1991, 1996 , Standard ML, p. unsprezece.
  32. Pagina de pornire a lui Martin Ward
  33. Elliott, Hudak - Animație reactivă funcțională, 1997 .
  34. Bawden - Macro-urile de primă clasă au tipuri, 2000 .
  35. Sheard, SPJones - Template Meta-programare pentru Haskell, 2002 .
  36. 1 2 Czarnecki, O'Donnell, Striegnitz, Taha - Implementarea DSL în metaocaml, template haskell și C++, 2004 , 6. Discuție și observații finale, p. optsprezece:"Text original  (engleză)[ arataascunde] Metaprogramarea șabloanelor C++ suferă de o serie de limitări, inclusiv probleme de portabilitate din cauza limitărilor compilatorului (deși acest lucru s-a îmbunătățit semnificativ în ultimii câțiva ani), lipsa suportului de depanare sau IO în timpul instanțierii șablonului, timpi lungi de compilare, erori lungi și de neînțeles, slabe lizibilitatea codului și raportarea slabă a erorilor. ".
  37. Daniel Lincke, Patrik Jansson, Marcin Zalewski și Cezar Ionescu. Biblioteci generice în C++ cu concepte din Descrieri de domenii de nivel înalt în Haskell  // DSL-uri, Conferința de lucru IFIP TC 2. - Oxford, Marea Britanie: Springer Berlin Heidelberg New York, Germania, 2009. - Vol. 15-17 iulie, Volum Editor WM Taha . - S. 236-261 . - ISBN 3-642-03033-5 , 978-3-642-03033-8 . — ISSN 0302-9743 .
  38. Jonathan Tang. Scrieți-vă o schemă în 48 de ore .
  39. Cum să compilați Pascal în Haskell c. .
  40. Zhanyong Wan, Walid Taha, Paul Hudak. FRP bazat pe evenimente . — Departamentul de Informatică, Universitatea Yale.
  41. PIC16C66 - Microcontrolere PIC®
  42. Franz Franchetti, Frédéric de Mesmay, Daniel McFarlin și Markus Püschel, Universitatea Carnegie Mellon. Operator Language: A Program Generation Framework for Fast Kernels  // Limbaje specifice domeniului, Conferința de lucru IFIP TC 2, Federația Internațională pentru Procesarea Informației. - Oxford, Marea Britanie: Springer Berlin Heidelberg New York, Germania, 2009. - Vol. 15-17 iulie, Volum Editor WM Taha . — S. 385–409 . - ISBN 3-642-03033-5 , 978-3-642-03033-8 . — ISSN 0302-9743 .

Literatură

Tutoriale, ghiduri, cărți de referință, utilizare

Istorie, analiză, critică

Link -uri