Գրագետ ծրագրավորում

Վիքիպեդիայից՝ ազատ հանրագիտարանից

Գրագետ ծրագրավորում (անգլ.՝ Literate programming), 1981 թվականին Դոնալդ Կնուտի առաջարկած ծրագրավորման մեթոդոլոգիա է։ Այստեղ ծրագրերի տրամաբանությունը գրվում է որևէ բնական լեզվով (օրինակ, հայերեն կամ անգլերեն), և այդ մեկնաբանություններում ներդրվում են որևէ ծրագրավորման լեզվով գրված մակրոսներ կամ կոդի հատվածներ։ Այնուհետև, պրեպրոցեսորների օգնությամբ, այդ նկարագրությունից ստեղծվում է և՛ կոմպիլյացվող կոդը, և՛ ծրագրի տրամաբանության ֆորմատավորված տեքստը[1]։ Գրագետ ծրագրավորումը թույլ է տալիս «հեռու մնալ» համակարգչում ընդունված ծրագրի տեսքից, դրա փոխարեն թույլ տալով ծրագրավորողին իր մտքերին ու տրամաբանությանը համապատասխան ծրագրեր գրել, առանց որոշակի խիստ կարգի[2]։ Գրագետ ծրագրավորման գործիքներն օգտագործվում են կոդից ծրագրի երկու ներկայացումները ստանալու համար։ Մեկը հարմար է հետագա կոմպիլյացիայի կամ համակարգչի կողմից ներկայացվելու համար ("tangled" code), իսկ մյուսը՝ ֆորմատավորված նկարագրությունը տեսնելու համար։ Վերջինս, այսպես ասած, «հյուսվել» (weaved) է ծրագրային կոդից։ Գրագետ ծրագրավորման գործիքների առաջին սերունդը կապված էր կոնկրետ լեզվի հետ (օր․ Pascal, C), սակայն հետագայում ստեղծվեցին նաև լեզվից անկախ գործիքներ։

Գաղափարը[խմբագրել | խմբագրել կոդը]

Գրագետ ծրագրավորումը ծրագրավորման մեթոդոլոգիա է, որտեղ ծրագրերի տրամաբանությունը գրվում է որևէ բնական լեզվով (օրինակ, հայերեն կամ անգլերեն), և այդ մեկնաբանություններում ներդրվում են որևէ ծրագրավորման լեզվով գրված մակրոսներ կամ կոդի հատվածներ։ Մակրոսները ծրագրային ֆայլում պարզ, բացատրող արտահայտություններ են, որոնք ներկայացնում են ծրագրավորման խնդրի լուծման գաղափարը մարդկային, բնական լեզվով։ Այս մակրոսները նույնն են, ինչ փսևդոկոդը, որն օգտագործվում է համակարգչային ալգորիթմները նկարագրելու համար։ Պրեպրոցեսորն օգտագործվում է հիերարխիաները փոխարինելու համար, կամ ավելի ճիշտ կլինի ասել՝ փոխկապակցելու համար մակրոսի[3] «վեբերը», ստեղծելու համար կոմպիլյացվող կոդ մեկ հրամանով ("tangle") և փաստաթղթավորում մեկ այլ «հյուսվածքով»։ Պրեպրոցեսորը ունակ է նաև դուրս բերել մակրոսի պարունակությունը և գրել արդեն գոյություն ունեցող այլ գրագետ ծրագրավորման ֆայլի մակորսի մեջ։

Առավելություններ[խմբագրել | խմբագրել կոդը]

Համաձայն Կնուտի[4] գրագետ ծրագրավորումը ապահովում է բարձր որակի ծրագրեր, թույլ տալով ծրագրավորողին ճիշտ արտահայտել մտքերը կոդի տեսքով։ Կնուտը նաև հավաստիացնում է, որ այն ապահովում է առաջնակարգ փաստաթղթերի համակարգ, ինչի շնորհիվ ծրագրավորողին հեշտ է աշխատել, իսկ այլ մասնագետների համար՝ ավելի հեշտ կարդալ կոդը։ Դասական փաստաթղթավորման հետ տարբերությունն այն է, որ այդ ժամանակ ծրագրավորողը պետք է կոդից և մեկնաբանություններից կախված կանխատեսումներ անի գրված ալգորիթմի վերաբերյալ, իսկ գրագետ ծրագրավորման դեպքում այդ խնդիրը չկա։

Օրինակներ[խմբագրել | խմբագրել կոդը]

Գրագետ ծրագրավորման դասական օրինակ է Unix wc ֆայլում բառերը հաշվող ծրագրի իրականացումը։ Կնուտը ներկայացնում է այս օրինակի CWEB տարբերակը իր գրքի 12-րդ գլխում։ Նույն ծրագիրը հետագայում խմբագրվեց noweb գործիքի համար[5]: Այս գործիքը ապահովում է գրագետ ծրագրավորումը հասկանալու բավարար հիմնային տարրեր։

Մակրոսի ստեղծումը

Գրագետ ծրագրավորման wc դիտարկվող օրինակը[5] ցույց է տալիս, թե որքան պարզ ձևով է բնական լեզուն օգտագործվում մակրոս ստեղծելու գործում, որոնք հանդես են գալիս որպես ծրագրավորման լեզվի նոր օպերատորներ, և թաքցնում են այլ մակրոսների մասերը։

Վերին հատվածը կազմված է կրկնակի անկյունաձև փակագծերից ("<<...>>"), ինչը ցույց է տալիս մակրոսը, «@» նշանը ցույց է տալիս noweb ֆայլում կոդի հատվածի ավարտը։ «<<*>>» սիմվոլը ընկած է «արմատում», գրագետ ծրագրավորման գործիքի ամենավերևում, որտեղից սկսում է ընդլայնվել մակրոսը։

wc-ի նպատակն է հաշվել տողերը, սյուները, և/կամ սիմվոլները ֆայլում։ Այստեղ wc.c ֆայլի նկարագիրն է, որը սահմանված է noweb ծրագրում wc.nw:

<<*>>=
 <<Header files to include>>
 <<Definitions>>
 <<Global variables>>
 <<Functions>>
 <<The main program>>
 @

Պետք է ներմուծենք ստանդարտ մուտքի/ելքի գրադարանը, եթե ուզում ենք ձևավորված ելքը ուղարկել stdout և stderr.

 <<Header files to include>>=
 #include <stdio.h>
 @
Ծրագիրը որպես վեբ-մակրոս միայն անունների տիրույթ չէ

Մակրոսը նույնը չէ, ինչ ստանդարտ փաստաթղթավորման անունների տիրույթը։ Գրագետ ծրագրավորման մակրոսը կարող է իր մեջ թաքցնել կոդի կտորներ և իր մեջ օգտագործել ցանկացած ցածր մակարդակի լեզվի օպերատորներ, ինչպիսիք են օրինակ "if", "while" or "case": Դա կարելի է ցույց տալ wc-ի հետևյալ օրինակով[5]:

Կոդի հետևյալ հատվածը իրականում ամենապարզերից է գրելու համար: Դիտարկում ենք յուրաքանչյուր սիմվոլը, և եթե այն սկզբի է կամ վերջի ապա փոխում ենք վիճակը:
    <<Scan file>>=
    while (1) {
      <<Fill buffer if it is empty; break at end of file>>
      c = *ptr++;
      if (c > ' ' && c < 0177) {
        /* visible ASCII codes */
        if (!in_word) {
          word_count++;
          in_word = 1;
        }
        continue;
      }
      if (c == '\n') line_count++;
      else if (c != ' ' && c != '\t') continue;
      in_word = 0;
        /* c is newline, space, or tab */
    }
    @

Իրականում մակրոսը կարող է ընակած լինել կոդի այլ հատվածի կամ այլ մակրոսի մեջ, և արդյոք դա ավելի ընդհանուր չէ քան վերևից-ներքև (top-down) և ներքևից- վերև (bottom-up) մեթոդները։ Կնուտը ասում է, որ երբ նա սկսում է իրականացնել սա, սկսում է մտածել ծրագրի մասին որպես տարբեր մասերից բաղկացած վեբ:

Առաջնորդվելով ոչ թե կոմպիլյատորի, այլ մարդկային տրամաբանությամբ

Գրագետ ծրագրավորման noweb ծրագրում բացի ազատ գրելու ձևից կան նաև մակրոսի մեջ հատվածներ, որոնք ստեղծվում են "<<...>>="-ի միջոցով, որը հետո կարելի է իրականացնել ֆայլի ցանկացած մասում գրելով "<<կոդի հատվածի անուն>>="

 Գլոբալ արժեքները պետք է արժեքավորվեն 0-ով ծրագրի սկզբում: Եթե փոփոխականները հայտարարում ենք լոկալ ՛՛main՛՛-ում, ապա արժեէավորումը պետք է կատարել ուղղակիորեն: Այնուամենայնիվ C-ն գլոբալ փոփոխականը ավտոմատ զրոացվում է:
    <<Global variables>>+=
    long tot_word_count, tot_line_count,
         tot_char_count;
      /* total number of words, lines, chars */
    @

Գրագետ ծրագրավորման գործիքները[խմբագրել | խմբագրել կոդը]

Գրագետ ծրագրավորման առաջին մատչելի գործիքը web-ն էր, ստեղծված 1981 թվականին՝ Դոնալդ Կնուտի կողմից, իր TeX համակարգի համար։ Այն օգտագործում էր Պասկալ-ը որպես ծրագրավորման լեզու և TeX-ը՝ փաստաթղթավորման շարվածքի համար։ TeX-ի ամբողջական տարբերակի կոդը հրատարակվել է իր TeX-ում, 5 հատորներից երկրորդում Computers and Typesetting։ Կնուտը գրագետ ծրագրավորումը DOC անունով օգտագործում էր 1979 թվականից։ Նա ոգեշնչվել էր Pierre-Arnoul de Marneffe.[6]-ի գաղափարներով։ Ազատ CWEB-ը գրվել է Կնուտի և Սիլվիո Լևիի կողմից, որը web-ը հարմարեցնում էր C և C++ լեզուների համար, աշխատում էր տարբեր օպերացիոն համակարգերի համար և ստեղծում TeX և PDF ֆայլեր։

Այստեղ նշված են գրագետ ծրագրավորման գաղափարի տարբեր իրականացումներ.

  • noweb -ը անկախ է ծրագրավորման լեզվի կոդից։ Այն հայտնի է իր պարզությամբ. ընդամենը երկու տեքստ նշող միջոցներ և երկու կանչի հրամաներ են անհրաժեշտ այն օգտագործելու համար, և այն թույլ է տալիս ձևավորել տեքստը HTML-ում, ոչ թե անցնել TEX:
  • Literate -ը «ժամանակակից գրագետ ծրագրավորման համակարգ է » noweb-ի նման և աշխատում է ցանկացած ծրագրավորման լեզվի հետ։ Այն ապահովում է հիանալի տպված և շարահյուսությունը ընդգծող HTML, և փորձում է պահպանել CWEB-ի բոլոր առավոլությունները, ներառելով ելքի ձևավորումը CWEB-ի նման։ Հաջորդ ակնհայտ առավելությունը Markdown-ի վրա հիմնված լինելն է և լավ ձևավորված «հյուսված» կոդի գեներացումը։ Տես Արտաքին հղումներ.
  • FunnelWeb-ը մեկ այլ գործիք է, որը կարող է ստեղծել HTML փաստաթղթավորման ելք։ Այն ունի բարդ և պարզ գործողություններ և noweb-ի նման կախված չէ ծրագրավորման լեզվից։
  • Nuweb-ը կարող է թարգմանել պարզ ԳԾ կոդը այլ կոդի ցանկացած լեզվի հետ միասին LaTeX-ի փաստաթղթավորման հետ։ Կա միայն մեկ պայման, որ այն չպետք է ունենա առանձին հյուսված և խճճված հրամաններ։ Այն չպետք է ունենա noweb-ի ընդարձակելիությունը, բայց այն կարող է օգտագործել LaTeX-ի փաթեթների հատկությունները, ապահովելու համար լավ որակի տպում, և hyperref փաթեթ PDF ֆայլի ելքին հղումներ ապահովելու համար։ Այն նաև ունի լայն տարածված ինդեքսային և հղումային հնարավորություններ, հղումներ գեներացված կոդից դեպի փաստաթղթեր։ Դրանք ավտոմատ գեներացնում են մեկնաբանություններ, որոնք հետո կոդը կարող է օգտագործել որպես իր վարքի նկարագրություն։ Vim-ը տիպերը որոշող միջոց է Z notation-ի համար, որը ցույց է տալիս nuweb-ի կիրառումը գործնականում։ Մոտ 15.000 տող nuweb կոդ թարգմանվել է 15.000 տող C/C++ կոդի և մոտ 460 էջ փաստաղթավորման։ Տես Արտաքին հղումներ.
  • Molly-ն ԳԾ գործիք է գրված Perl-ով, որի նպատակն է արդիականացնել և ընդլայնել կոդը "folding HTML" և "virtual views" -ի միջոցով։ Այն օգտագործում է noweb-ի նշման ձևը։ Տես Արտաքին հղումներ.
  • Codnar-ը հակադիր ԳԾ գործիք է, հայտնի որպես Ruby Gem (Նայել Արտաքին հղումներ
  • The Leo text editor -ը ուրվագծային խմբագրիչ է, որը ապահովում է ընդհանուր noweb և CWEB նշում։ Leo-ի հեղինակը իրար է միացրել երկու տարբեր մոտեցում. առաջինը, որ Leo-ն ուրվագծող խմբագրիչ է, որը օգնում է կառավարել մեծ տեքստերը։ Երկրորդ, որ Leo-ն իրեն է կցում ԳԾ-ն որոշ գաղափարներ, որը իրականում հնարավոր է միայն որոշակի փորձառության աստիճանից հետո։ Այնուամենայնիվ սա և այլ ընդարձակման ձևերը դարձնում են ընդգծող ծրագրավորումը և տեքստերի կառավարումը հաջողված և հեշտ, և որոշ դեպքերում համարժեք գրագետ ծրագրավորմանը[7]:
  • Haskell ծրագրավորման լեզուն ի սկզբանե ունի կիսա-գրագետային հիմք, գլխավորապես ոգեշնչված CWEB -ով, բայց

ավելի սահմանափակ ֆունկցիոնալությամբ և պարզ իրականացմամբ[8]:

  • Վեբ 68 ԳԾ համակարգը օգտագործում է Algol 68 որպես խորքային ծրագրավորման լեզու, չնայած այստեղ չկա ոչինչ ՛tang՛ պրեպրոցեսորում, որպեսզի ստիպի օգտագործել այս լեզուն[9]:
  • Emacs org-mode[10][11][12]
  • CoffeeScript-ը ապահովում է «գրագետ» ձևը, որը հնարավորություն է տալիս ծրագրին կոմպիլյացվել Markdown-ով գրված փաստաթղթի միջոցով ներդրված կոդի բլոկներով[13]:

Ընթերցանության համար[խմբագրել | խմբագրել կոդը]

Արտաքին հղումներ[խմբագրել | խմբագրել կոդը]

Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]

  1. Knuth, Donald, Literate Programming. The Computer Journal (British Computer Society) 27 (2): 97–111.
  2. «Այնպիսի զգացողություն ունեի, որ վերևից-ներքև (top-down) և ներքևից-վերև (bottom-up) մեթոդները հակառակ են իրար. մեկը հարմար է ծրագրերի ցուցադրման, մյուսը մշակելու համար։ Բայց web֊ով ծրագրավորման փորձը ցույց տվեց, որ կարիք չկա ընտրություն կատարել այս երկու մեթոդների միջև, որովհետև ծրագիրը պետք է դիտարկել որպես web, այլ ոչ թե ծառ։ Հիերարխիկ կառուցվածքը առկա է, բայց ավելի կարևոր են կառուցվածքային հարաբերությունները։ Ծրագրային ապահովման բարդ հատվածը կազմում են պարզ կապերը և պարզ տարրերը այդ մասերի միջև, ծրագրավորողի խնդիրն է ձևակերպել այս հարաբերություններ միջև կապերը այնպես, որ այն լինի լավագույնը հասկանալու համար, ոչ թե խստորեն սահմանված, ինչպես վերևից-ներքև կամ ներքևից-վերև մեթոդները։» — Donald E. Knuth, Literate Programming[1]
  3. Վեբ-ի մակրոսը թույլ է տալիս ունենալ ամենաշատը մեկ պարամետր: Դա արված է պարզության համար, քանի որ ես նկատեցի, որ շատ պարամետրերը կարող են իրականում ներկայացվել մեկ պարամետրի տեսքով։ Donald E. Knuth, Literate Programming[1]
  4. Knuth Donald E., Binstock Andrew (Ապրիլի 25, 2008)։ «Interview with Donald Knuth»։ Վերցված է Հունվարի 4, 2009 թ. " 
  5. 5,0 5,1 5,2 Ramsey Norman (մայիսի 13, 2008)։ «An Example of noweb»։ Վերցված է հունվարի 4, 2009 
  6. de Marneffe Pierre Arnoul (December 1973)։ «Holon Programming – Report PMAR 73-23»։ University de Liège, Service d'Informatique 
  7. Ream Edward K. (սեպտեմբերի 2, 2008)։ «Leo's Home Page»։ Վերցված է ապրիլի 3, 2015 
  8. Hughes John (հունվարի 9, 2002)։ «Why Functional Programming Matters»։ Institutionen för Datavetenskap, Chalmers Tekniska Högskola,։ Վերցված է մարտի 22, 2011 
  9. Sian Mountbatten։ «Web 68: Literate programming with Algol 68»։ Վերցված է հունվարի 1, 2013 
  10. http://orgmode.org/worg/org-contrib/babel/intro.html
  11. http://orgmode.org/worg/org-contrib/babel/languages.html#langs
  12. http://orgmode.org/worg/org-contrib/babel/intro.html#literate-programming
  13. Jeremy Ashkenas։ «Literate CoffeeScript»։ Վերցված է նոյեմբերի 13, 2014 
  14. Milestones in Computer Science and Information Technology by Edwin D. Reilly, p. 157.