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 китабының инеш өлөшөнән алынды.)

Программалау стилендә борондан килгән бер ҡағиҙә бар: программаның функциональ элементтары саманан тыш ҙур булырға тейеш түгел. Әгәр программаның ниндәйҙер компоненты еңел аңлай алырлыҡ сиктән артып ҙурайһа, ул ҙур ҡала ҡасаҡтарҙы йәшергән кеүек хаталарҙы еңел йәшерә торған ҡатмарлыҡ өйөмөнә әйләнә. Бындай программа тәьминәтен уҡыуы ла, һынауы ла һәм хаталарын төҙәтеүе лә ауыр буласаҡ.

Ошо принципҡа ярашлы, ҙур программа киҫәктәргә бүленергә тейеш, һәм программа ни тиклем ҙурыраҡ булһа, уны шул тиклем нығыраҡ бүлергә кәрәк. Программаны нисек бүлергә? Ғәҙәти алым өҫтән түбәнгә проектлау (top-down design) тип атала: һеҙ «программаның маҡсаты — ошо ете ғәмәлде үтәү, шуға күрә мин уны ете төп ярҙамсы программаға (subroutine) бүләм. Беренсе ярҙамсы программа ошо дүрт ғәмәлде үтәргә тейеш, тимәк, уның үҙенең дүрт өҫтәмә ярҙамсы программаһы буласаҡ», һәм башҡа шулай тип әйтәһегеҙ. Был процесс бөтә программа тейешле кимәлдә ваҡланғанға тиклем дауам итә — һәр өлөш етди бер эш башҡарырлыҡ кимәлдә ҙур, ләкин бер бөтөн булараҡ аңлай алырлыҡ дәрәжәлә бәләкәй булырға тейеш.

Тәжрибәле Lisp программалаусылары үҙ программаларын башҡасараҡ бүлә. Өҫтән түбәнгә проектлау менән бер рәттән, улар түбәндән өҫкә проектлау (bottom-up design) тип атарға мөмкин булған принципҡа таяна — телде мәсьәләгә яраҡлаштырып үҙгәртә. Lisp-та һеҙ үҙ программағыҙҙы тел кимәленә тиклем түбән төшөп кенә яҙмайһығыҙ, ә телде лә үҙ программағыҙға ҡарай өҫкә үҫтерәһегеҙ. Программа яҙған саҡта һеҙ: «Lisp-та фәлән-фәлән оператор булһын ине», — тип уйларға мөмкинһегеҙ. Шунан барып уны яҙаһығыҙ. Һуңынан яңы операторҙы ҡулланыу программаның икенсе бер өлөшөнөң структураһын ябайлаштырасағын аңлайһығыҙ, һәм был шулай дауам итә. Тел һәм программа бергә үҫешә. Ике дошман дәүләт араһындағы сик кеүек, тел менән программа араһындағы сик тә үҙгәреп тора, ахыр сиктә ул тауҙар һәм йылғалар — мәсьәләгеҙҙең тәбиғи сиктәре буйлап нығынып ҡала. Ахырҙа программағыҙ тап ошо тел уның өсөн махсус булдырылған кеүек күренәсәк. Ә тел менән программа бер-береһенә яҡшы тап килгәндә, һеҙ аңлайышлы, бәләкәй һәм һөҙөмтәле кодҡа эйә булаһығыҙ.

Шуны һыҙыҡ өҫтөнә алырға кәрәк: түбәндән өҫкә проектлау шул уҡ программаны бары тик башҡа тәртиптә яҙыуҙы аңлатмай. Түбәндән өҫкә эшләгәндә, ғәҙәттә бөтөнләй икенсе программа килеп сыға. Бер бөтөн, монолит программа урынына һеҙ абстрактлыраҡ операторҙарға эйә киңерәк тел һәм шул телдә яҙылған бәләкәйерәк программа алаһығыҙ. Төҙөлөштәге ябай урҙа (күперлек) урынына арка килеп сыға.

Ғәҙәти кодта, бары тик көндәлек иҫәп-хисапты алып барған өлөштәрҙе абстракциялап ситкә ҡуйһағыҙ, ҡалған өлөш күпкә ҡыҫҡараҡ була; телде ни тиклем бейегерәк төҙөһәгеҙ, өҫтән уға табан барырға кәрәк булған аралыҡ шул тиклем аҙыраҡ буласаҡ. Был бер нисә өҫтөнлөк бирә:

Телгә күберәк эш йөкмәтеп, түбәндән өҫкә проектлау бәләкәйерәк һәм һығылмалыраҡ программалар барлыҡҡа килтерә. Ҡыҫҡараҡ программаны шул тиклем күп компоненттарға бүлеү талап ителмәй, ә компоненттар аҙыраҡ булыуы программаларҙы уҡыуҙы һәм үҙгәртеүҙе еңеләйтә. Компоненттарҙың аҙыраҡ булыуы шулай уҡ улар араһындағы бәйләнештәрҙең дә аҙыраҡ булыуын аңлата, тимәк, унда хаталар килеп сығыу ихтималлығы ла кәмей. Сәнәғәт дизайнерҙары машиналағы хәрәкәт итеүсе частар һанын кәметергә ынтылған кеүек, тәжрибәле Lisp программалаусылары үҙ программаларының күләмен һәм ҡатмарлылығын кәметеү өсөн түбәндән өҫкә проектлауҙы ҡуллана.

Түбәндән өҫкә проектлау кодты ҡабаттан ҡулланыуға булышлыҡ итә. Ике йәки унан да күберәк программа яҙған саҡта, тәүге программа өсөн яҙған күп кенә утилиталарығыҙ артабанғыларында ла файҙалы буласаҡ. Бер тапҡыр киң утилиталар нигеҙен булдырғас, яңы программа яҙыу бөтөнләй яңы Lisp менән башларға тура килгәндәге көсөргәнештең бик аҙ өлөшөн генә талап итәсәк.

Түбәндән өҫкә проектлау программаларҙы уҡыуҙы еңеләйтә. Абстракцияның был төрөнөң бер өлгөһө уҡыусынан дөйөм тәғәйенләнештәге операторҙы аңлауҙы талап итә; ә функциональ абстракцияның бер өлгөһө уҡыусынан махсус тәғәйенләнештәге ярҙамсы программаны аңлауҙы талап итә. [1]

Кодығыҙҙа даими рәүештә ҡалыптарҙы (үрнәктәрҙе) күҙәтеп барырға мәжбүр иткәнгә күрә, түбәндән өҫкә эшләү программағыҙҙың төҙөлөшө тураһындағы фекерҙәрегеҙҙе асыҡларға ярҙам итә. Әгәр программаның ике алыҫ компоненты формаһы буйынса оҡшаш булһа, һеҙ был оҡшашлыҡты күрерһегеҙ һәм, бәлки, программаны ябайыраҡ итеп үҙгәртеп проектларһығыҙ.

Түбәндән өҫкә проектлау Lisp-тан башҡа телдәрҙә лә билдәле бер кимәлдә мөмкин. Ҡасан ғына китапхана функцияларын күрһәгеҙ, унда түбәндән өҫкә проектлау бара. Ләкин Lisp был йәһәттән һеҙгә күпкә киңерәк мөмкинлектәр бирә, һәм телде тулыландырыу Lisp стилендә пропорциональ рәүештә ҙурыраҡ роль уйнай — шул дәрәжәлә хатта, Lisp бары тик башҡа бер тел генә түгел, ә программалауҙың бөтөнләй икенсе бер ысулы булып тора.

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

Яңы: On Lisp китабын бушлай күсереп алығыҙ.

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