pg.gimran.org

Астан-өскә программалаштыру

Пол Грэмның «Астан-өскә программалаштыру» эссесы тәрҗемәсе. Төп нөсхә: https://paulgraham.com/progbot.html. Машина тәрҗемәсе (Gemini).

Translation of Paul Graham's essay 'Programming Bottom-Up'. Original: https://paulgraham.com/progbot.html. Machine translation (Gemini).

(Бу эссе — On Lisp китабының кереш сүзеннән.)

Программаның функциональ элементлары артык зур булмаска тиеш дигән принцип программалаштыру стилендә күптәннән яши. Әгәр дә программаның ниндидер компоненты җиңел аңлашырлык дәрәҗәдән артып китә икән, ул зур шәһәр качакларны җиңел яшергән кебек хаталарны үзендә яшерүче катлаулылык өеменә әверелә. Мондый программа тәэминатын уку да, сынау да һәм андагы хаталарны төзәтү дә авыр булачак.

Бу принципка ярашлы, зур программа өлешләргә бүленергә тиеш, һәм программа никадәр зуррак булса, аны шулкадәр күбрәк бүләргә кирәк. Программаны ничек бүләргә соң? Гадәти караш өстән-аска проектлау дип атала: сез «программаның максаты — менә шушы җиде нәрсәне башкару, шуңа күрә мин аны җиде төп астпрограммага бүләм. Беренче астпрограмма менә бу дүрт нәрсәне эшләргә тиеш, димәк, аның үзенең дүрт астпрограммасы булачак» дисез, һәм бу шулай дәвам итә. Бу процесс бөтен программа тиешле дәрәҗәдә вакланганчы бара — һәр өлеш шактый зур бер эшне башкарырлык дәрәҗәдә җитди, әмма бер бөтен берәмлек буларак җиңел аңлашылырлык дәрәҗәдә кечкенә булырга тиеш.

Тәҗрибәле Lisp программалаучылары үз программаларын башкача бүләләр. Алар өстән-аска проектлау белән беррәттән, астан-өскә проектлау дип атарга мөмкин булган принципка таяналар — телне мәсьәләгә яраклаштырып үзгәртү. Lisp телендә сез программагызны бары тик телгә таба түбән юнәлештә генә язмыйсыз, сез шулай ук телнең үзен дә программагызга таба өскә төзисез. Программа язганда сез бәлки: «Их, Lisp-та фәлән оператор булсын иде», — дип уйларсыз. Һәм барып аны язасыз. Аннары сез бу яңа операторны куллану программаның башка өлешен гадиләштерәчәген төшенәсез, һәм бу шулай дәвам итә. Тел белән программа бергә үсә. Ике сугышучы дәүләт арасындагы чик кебек, тел белән программа арасындагы чик яңадан-яңа сызыла, һәм ахыр чиктә таулар һәм елгалар — мәсьәләгезнең табигый чикләре буйлап урнаша. Ахырда сезнең программагыз тел нәкъ менә аның өчен махсус эшләнгән кебек күренәчәк. Ә тел һәм программа бер-берсенә яхшы туры килгәндә, сез ачык, кыска һәм нәтиҗәле кодка ия буласыз.

Шунысы мөһим: астан-өскә проектлау шул ук программаны башка тәртиптә язуны гына аңлатмый. Астан-өскә эшләгәндә, гадәттә бөтенләй башка программа килеп чыга. Бербөтен монолит программа урынына сез абстрактрак операторлары булган зуррак тел һәм шул телдә язылган кечерәк программа аласыз. Туры сайлак (перемычка) урынына сездә арка килеп чыгачак.

Гадәти кодта бары тик исәп-хисап эшләрен башкарган өлешләрне чыгарып ташласаң, калганы күпкә кыскарак була; телне никадәр биеккәрәк корсагыз, өстән аска таба аңа таба шулкадәр азрак юл үтәргә кирәк булачак. Моның берничә өстенлеге бар:

Эшнең күбрәк өлешен телгә йөкләү аша астан-өскә проектлау кечерәк һәм сыгылмалырак программалар тудыра. Кыскарак программаны шулкадәр күп компонентларга бүләргә кирәкми, ә азрак компонентлар — җиңелрәк укыла яки үзгәртелә торган программалар дигән сүз. Компонентлар азрак булу шулай ук алар арасындагы бәйләнешләрнең дә азрак булуын аңлата, димәк, анда хаталар килеп чыгу ихтималы да кими. Сәнәгать дизайнерлары машинадагы хәрәкәтләнүче өлешләр санын киметергә омтылган кебек, тәҗрибәле Lisp программалаучылары үз программаларының күләмен һәм катлаулылыгын киметү өчен астан-өскә проектлауны кулланалар.

Астан-өскә проектлау кодны кабат куллануны җиңеләйтә. Ике яки аннан да күбрәк программа язганда, беренче программа өчен язган күп кенә утилиталарыгыз аннан соңгыларында да файдалы булачак. Киң кулланылышлы утилиталар базасы туплангач, яңа программа язу барысын да чиста Lisp белән башлауга караганда күпкә азрак көч таләп итәчәк.

Астан-өскә проектлау программаларны укуны җиңеләйтә. Моңа охшаш абстракция очрагы укучыдан гомуми билгеләнештәге операторны аңлауны таләп итә; ә функциональ абстракция укучыдан махсус билгеләнештәге астпрограмманы аңлауны сорый. [1]

Сезне һәрвакыт кодтагы кабатланучы калыпларны күзәтеп торырга мәҗбүр иткәнгә күрә, астан-өскә эшләү программаның төзелеше турындагы фикерләрегезне ачыкларга ярдәм итә. Әгәр программаның ике ерак компоненты форма ягыннан охшаш икән, сез бу охшашлыкны сизеп алырсыз һәм, бәлки, программаны гадирәк итеп яңадан проектларсыз.

Астан-өскә проектлау билгеле бер дәрәҗәдә Lisp-тан башка телләрдә дә мөмкин. Китапханә функцияләрен күргән саен, сез астан-өскә проектлауны күрәсез. Ләкин Lisp бу өлкәдә сезгә күпкә киңрәк мөмкинлекләр бирә, һәм телне киңәйтү Lisp стилендә чагыштырмача зуррак роль уйный — хәтта шулкадәр ки, Lisp бары тик башка бер тел генә түгел, ә бөтенләй икенче төрле программалаштыру ысулы булып тора.

Әлбәттә, мондый эшкәртү стиле кечкенә төркемнәр яза ала торган программаларга кулайрак. Ләкин шул ук вакытта ул кечкенә төркем башкара ала торган эшләрнең чикләрен киңәйтә. The Mythical Man-Month китабында Фредерик Брукс программалаучылар төркеменең җитештерүчәнлеге аның зурлыгына карап сызыклы рәвештә үсми дигән фикерне алга сөрде. Төркемнең зурлыгы арткан саен, аерым программалаучыларның җитештерүчәнлеге төшә. Lisp программалаштыру тәҗрибәсе бу канунны шатлыклырак итеп әйтергә тәкъдим итә: төркемнең зурлыгы кимегән саен, аерым программалаучыларның җитештерүчәнлеге арта. Кечкенә төркем, чагыштырмача әйткәндә, кечерәк булганы өчен генә дә ота. Ә кечкенә төркем шулай ук Lisp мөмкин кылган алымнарны кулланганда, ул тулысынча җиңәргә мөмкин.

Яңа: On Lisp китабын бушлай йөкләп алыгыз.

[1] «Ләкин сезнең барлык яңа утилиталарыгызны аңламыйча, программаны беркем дә укый алмый бит». Ни өчен мондый фикерләрнең гадәттә ялгыш булуын күрү өчен 4.8 бүлеген карагыз.