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

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

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

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

Օրինակներ 
Գրագետ ծրագրավորման դասական օրինակ է Unix wc ֆայլում բառերը հաշվող ծրագրի իրականացումը։ Կնուտը ներկայացնում է այս օրինակի CWEB տարբերակը իր գրքի 12-րդ գլխում։ Նույն ծրագիրը հետագայում խմբագրվեց noweb գործիքի համար։ Այս գործիքը ապահովում է գրագետ ծրագրավորումը հասկանալու բավարար հիմնային տարրեր։
Մակրոսի ստեղծումը
Գրագետ ծրագրավորման wc դիտարկվող օրինակը ցույց է տալիս, թե որքան պարզ ձևով է բնական լեզուն օգտագործվում մակրոս ստեղծելու գործում, որոնք հանդես են գալիս որպես ծրագրավորման լեզվի նոր օպերատորներ, և թաքցնում են այլ մակրոսների մասերը։

Վերին հատվածը կազմված է կրկնակի անկյունաձև փակագծերից ("<<...>>"), ինչը ցույց է տալիս մակրոսը, «@» նշանը ցույց է տալիս 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-ի հետևյալ օրինակով։

Կոդի հետևյալ հատվածը իրականում ամենապարզերից է գրելու համար։ Դիտարկում ենք յուրաքանչյուր սիմվոլը, և եթե այն սկզբի է կամ վերջի ապա փոխում ենք վիճակը։
    <<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.-ի գաղափարներով։ Ազատ 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-ն իրեն է կցում ԳԾ-ն որոշ գաղափարներ, որը իրականում հնարավոր է միայն որոշակի փորձառության աստիճանից հետո։ Այնուամենայնիվ սա և այլ ընդարձակման ձևերը դարձնում են ընդգծող ծրագրավորումը և տեքստերի կառավարումը հաջողված և հեշտ, և որոշ դեպքերում համարժեք գրագետ ծրագրավորմանը։

Haskell ծրագրավորման լեզուն ի սկզբանե ունի կիսա-գրագետային հիմք, գլխավորապես ոգեշնչված CWEB -ով, բայց 
ավելի սահմանափակ ֆունկցիոնալությամբ և պարզ իրականացմամբ։

 Վեբ 68 ԳԾ համակարգը օգտագործում է Algol 68 որպես խորքային ծրագրավորման լեզու, չնայած այստեղ չկա ոչինչ ՛tang՛ պրեպրոցեսորում, որպեսզի ստիպի օգտագործել այս լեզուն։

 Emacs org-mode
 CoffeeScript-ը ապահովում է «գրագետ» ձևը, որը հնարավորություն է տալիս ծրագրին կոմպիլյացվել Markdown-ով գրված փաստաթղթի միջոցով ներդրված կոդի բլոկներով։

 Wolfram Language, հայտնի որպես Mathematica, գրված նոթբուկերում, որը հավաքում է տեքստ կոդի հետ։

Ընթերցանության համար

 (includes software)

Արտաքին հղումներ
literateprogramming.com
https://weavr.co.uk  օնլայն գրագետ ծրագրավորման սարքավորում։
comp.programming.literate FAQ ինտերնետային հաճախ տրվող հարցերի արխիվ։
Literate Programming newsgroup
LiteratePrograms  վիկիպեդիայի գրագետ ծրագրավորման էջ։
Select  գրագետ ծրագրավորման օրինակ noweb գործիքի օգտագործմամբ։
Literate  ժամանակակից գրագետ ծրագրավորման համակարգ։
nuweb nuweb գրագետ ծրագրավորման գործիք։
Vimes  իրական նախագիծ nuweb-ի կիրառմամբ։
z-vimes Vimes-ի այլընտրանքային աղբյուր։
Softpanorama page գրագետ ծրագրավորման հիման վրա։
Haskell Գրագետ ծրագրավորում
Specification of literate programming in the Haskell Report ընդունված Հասկել ստանդարտ
Noweb — A Simple, Extensible Tool for Literate Programming
Molly – a standalone tool in Perl, which extends L.P. with "folding HTML" and uses noweb markup
Codnar – An inverse literate programming tool
Funnelweb – a complete standalone tool for L.P. independent of target language 
Lp4all — A Simple Literate Programming Tool with a wiki-like markup syntax 
pyWeb - Literate Programming tool that will work with any markup language and any programming language
org-babel  – org-mode Գրագետ ծրագրավորման ընդարծակումը emacs-ում։
– Using Docbook markup for literate programming. Known as xweb
RawFile – a small MediaWiki extension implementing a basic form of literate programming
Shuffle takes files with chunks of text defined in shuffle notation, and filters these chunks according to a requested selection of variant and aspects. It is a part of EHC/UHC (Essential Haskell Compiler/ Utrecht Haskell Compiler).
Knuth: Literate Programming  Կնուտի անձնական էջը, որտեղ կա տեղեկատվություն և հոդվածներ Գրագետ ծրագրավորման  մասին.
RestructuredText to Code Գրագետ ծրագրավորման գործիք RestructuredText-ի փաստաթղթերից։
Docco: Պարզ գրագետ ծրագրավորման փաստաթղթավորում գեներատոր Jeremy Ashkenas.

Ծանոթագրություններ

Ծրագրավորում