Кіріспе
Бағдарламалық жасақтаманы әзірлеудегі бағдарламалау тәсілі.
Сауатты бағдарламалау – 1984 жылы Дональд Кнут ұсынған бағдарламалау парадигмасы. Онда компьютерлік бағдарлама табиғи тілде, мысалы, ағылшын тілінде, макростар мен дәстүрлі бастапқы кодтың фрагменттерімен араластырылып (енгізіліп) жұмыс ілу қағидасын түсіндіру түрінде беріледі, одан компиляцияланатын бастапқы код жасауға болады. Бұл тәсіл ғылыми есептеулер мен дерек ғылымында қайталанатын зерттеулерді жүргізу және ашық қолжетімділікті қамтамасыз ету үшін кеңінен қолданылады. Бүгінде миллиондаған бағдарламашы сауатты бағдарламалау құралдарын пайдаланады. Дональд Кнуттың ойынша, сауатты бағдарламалау парадигмасы компьютерлік бағдарламаларды компилятор талап ететін тәртіппен жазудан бас тартуды білдіреді, және бағдарламашыларға логикасы мен ойларының ағынына сәйкес бағдарламаларды жасау үшін макростарды ұсынады. Сауатты бағдарламалар логиканы табиғи тілде баяндау ретінде жазылады, онда абстракцияларды және дәстүрлі бастапқы кодты жасыру үшін макростар қолданылады, бұл эссе мәтініне ұқсас. Сауатты бағдарламалау (LP) құралдары бастапқы файлдан екі түрлі формат алуға мүмкіндік береді: бірі компилятор немесе интерпретатор түсінетін "біріктірілген" код, екіншісі – пішімделген құжаттама ретінде қарауға арналған, ол сауатты бастапқы кодтан "тоқылған" деп есептеледі. Сауатты бағдарламалау құралдарының алғашқы буыны нақты бағдарламалау тіліне тәуелді болса, кейінгілері тілден тәуелсіз және жеке бағдарламалау тілдерінен тыс қолданылады.
Тарих және философия
Әдеби бағдарламалауды алғаш рет 1984 жылы Дональд Кнут енгізді, оның мақсаты – адамдар оқуға ыңғайлы әдебиет деңгейіндегі бағдарламаларды жасау болатын. Ол оны Стэнфорд университетінде алгоритмдер және цифрлық типография саласындағы зерттеулерінің бір бөлігі ретінде жүзеге асырды. Ол бұл жүйені "WEB" деп атады, себебі ол ағылшын тіліндегі үш әріпті сөздердің санаулы бірі екенін, және ол әлі есептеу саласында қолданылмағанын сендірді. Дегенмен, ол қарапайым құралымдардан жиналған күрделі бағдарламалық қамтамасыз етуге ұқсайды. Бір команда ("tangle") арқылы компиляцияланатын бастапқы кодты және тағы бір команда ("weave") арқылы құжаттаманы жасауға болады. Алдын ала өңдеуші макростардың мазмұнын жазуға және әдеби бағдарламаның бастапқы кодының кез келген жеріне бұрыннан жасалған макростарды қосуға мүмкіндік береді, соның арқасында дәстүрлі бағдарламалау тілдерінің шектеулерін есте сақтау немесе ой ағынын тоқтату қажеттілігі туындамайды.
Құжаттама жасаумен салыстыру
Сауатты бағдарламалау көбінесе бастапқы коды мен түсініктемелері бар ортақ файлдан жасалған форматталған құжаттамаға ғана қатысты деп қате түсініледі – бұл дұрыс құжаттама жасау деп аталады, немесе кодпен бірге қоса берілген көлемді түсініктемелер. Бұл сауатты бағдарламалаудың керісі: жақсы құжатталған код немесе кодтан алынған құжаттама кодтың құрылымын қалайды, құжаттама кодқа енгізілген болады; ал сауатты бағдарламалауда код құжаттамаға енгізіледі, код құжаттаманың құрылымын қалайды. Осы қате түсінік Perl Plain Old Documentation немесе Java Javadoc сияқты түсініктемелерді шығару құралдарының "сауатты бағдарламалау құралдары" екендігі туралы талаптарға әкелді. Дегенмен, бұл құралдар табиғи тіл макролары жүйесінің артында жасырынған "абстракт ұғымдар желісін" іске асырмайды және бастапқы кодтың реттілігін машина жүргізетін реттіліктен адам санасына қолайлы реттілікке өзгерту мүмкіндігін де ұсынбайды. Сондықтан, оларды Кнуттың ниет еткен мағынасында сауатты бағдарламалау құралдары деп атауға болмайды.
Сын-пікір
1986 жылы Джон Бентли Кнуттан ACM Communications журналындағы Programming Pearls бағанында сауатты бағдарламалау тұжырымдамасын WEB бағдарламасын жазып көрсетуін сұрады. Кнут оған бағанда бұрын талқыланған мәселеге арналған бағдарлама жіберді (1-N диапазонындағы M кездейсоқ санды таңдау), сондай-ақ "тапсырма" сұрады. Бентли оған мәтіндік файлдан K ең көп кездесетін сөздерді табу мәселесін қойды, соған Кнут Белл Лабораториясының Дуглас Макилройдың шолуымен бірге жарияланған WEB бағдарламасын жазды. Макилрой Кнуттың шешімінің күрделілігін, оның деректер құрылымын таңдауын (Фрэнк М. Лянның хэш-триінің түрі) және ұсынылысын жоғары бағалады. Ол стильдің кейбір аспектілерін сынға алды, мысалы, негізгі идеяның мақаланың соңында сипатталуы, «сиқырлы» тұрақтылардың қолданылуы және деректер құрылымын түсіндіруге қосатын диаграмманың болмауы. Макилрой сонымен қатар шолуды бағдарламалау тапсырмасының өзін сынау үшін пайдаланды, Unix-те (Белл Лабораториясында жасалған) мәтінді өңдеуге арналған құралдардың (tr, sort, uniq және sed) бұрыннан «негізгі» болып қалыптасқанын көрсетіп, осы құралдарды алты жолды қабықша сценарийіне біріктіру арқылы оңай іске асырылатын, түзетілетін және қайта қолданылатын шешім алуға болатынын атап өтті. Бентли жауап ретінде былай деп жазды: [Макилрой] шешімнің орындалуын бағалайды, бірақ мәселені инженерлік тұрғыдан кемшіліксіз деп есептейді. (Әрине, бұл проблеманы қойған адам ретінде менің жауапкершілігім; Кнут оған берілген мәселені көптеген инженерлер үшін маңызды себептермен шешті – олардың проблемаларын қойған адамдар төлейтін жалақылар.) Кейінірек Макилрой өзінің сын-пікірінің әділетсіз екенін мойындады, өйткені ол Кнуттың бағдарламасын инженерлік тұрғыдан сынады, ал Кнуттың мақсаты тек сауатты бағдарламалау техникасын көрсету болды. 1987 жылы ACM Communications журналы Кнуттың көркемдік тәсілі мен Макилройдың инженерлік тәсілін біріктірген C бағдарламасымен сауатты бағдарламалауды суреттейтін, Джон Гилберт сынға алған мақала жариялады.
[McIlroy] admires the execution of the solution, but faults the problem on engineering grounds. (That is, of course, my responsibility as problem assigner; Knuth solved the problem he was given on grounds that are important to most engineers—the paychecks provided by their problem assigners.) McIlroy later admitted that his critique was unfair, since he criticized Knuth's program on engineering grounds, while Knuth's purpose was only to demonstrate the literate programming technique. In 1987, Communications of the ACM published a followup article which illustrated literate programming with a C program that combined artistic approach of Knuth with engineering approach of McIlroy, with a critique by John Gilbert.
Мысал
Сауатты бағдарламалаудың классикалық мысалы – стандартты Unix wc сөздерін санау бағдарламасының сауатты түрде іске асырылуы. Кнут өзінің "Сауатты бағдарламалау" кітабының 12-тарауында осы мысалдың CWEB нұсқасын ұсынды. Кейіннен осы мысал noweb сауатты бағдарламалау құралы үшін қайта жазылды. Бұл мысал сауатты бағдарламалаудың негізгі элементтерін жақсы көрсетеді.
Ерекше мысалдар
Axiom, IBM компаниясы әзірлеген компьютерлік алгебра жүйесі – scratchpad-тен жаңадан құрылған. Қазір оны scratchpad-тің жасаушыларының бірі Tim Daly дамытып жатыр, Axiom толығымен сауатты бағдарлама түрінде жазылған.