pg.gimran.org

Кыскалык — ул кодрәт

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

Translation of Paul Graham's essay 'Succinctness is Power'. Original: https://paulgraham.com/power.html. Machine translation (Gemini).

LL1 хатлар тарату исемлегендә Revenge of the Nerds («Ботаникларның үч алуы») мәкаләсендә күтәрелгән сораулар турында фикер алышканда, Пол Прескод уемда уелып калган бер фикер язган иде.

Python-ның максаты — кыскалык түгел, ә тәртиплелек һәм укылышлылык.

Беренче карашка, бу программалаштыру теле өчен бик үк уңай булмаган белдерү булып тоела. Минемчә, кыскалык = кодрәт. Әгәр шулай икән, берсен икенчесе белән алмаштырсак, болай килеп чыга:

Python-ның максаты — кодрәт түгел, ә тәртиплелек һәм укылышлылык.

һәм бу сез ризалашырга теләрлек компромисс түгел (әгәр ул чынлап та компромисс булса). Бу бит Python-ның максаты программалаштыру теле буларак нәтиҗәле булу түгел дип әйтү белән бер диярлек.

Кыскалык = кодрәтме? Бу миңа мөһим сорау булып күренә, бәлки, телләрне проектлау белән кызыксынучы һәркем өчен иң мөһим сораудыр, һәм аны турыдан-туры карап чыгу файдалы булыр иде. Җавап гади генә «әйе» булуына әле төгәл ышанмыйм, ләкин башлау өчен бу яхшы гипотеза булып тоела.

Гипотеза

Минем гипотезам шуннан гыйбарәт: кыскалык — ул кодрәт, яки патологик мисаллардан тыш, сез аларны тигез дип санарга мөмкин булырлык дәрәҗәдә якын төшенчәләр.

Минемчә, кыскалык — программалаштыру телләренең төп максаты. Компьютерлар ни эшләргә кирәклеген турыдан-туры машина телендә әйтсәң дә бик шат булыр иде. Без югары дәрәҗәле телләрне эшләү мәшәкатенә керүнең төп сәбәбе — машина теленең 1000 юлын таләп итә торган нәрсәне югары дәрәҗәле телнең 10 юлында әйтә (һәм иң мөһиме — уйлый) алырлык отышлылыкка ирешү, дип уйлыйм. Башкача әйткәндә, югары дәрәҗәле телләрнең төп мәгънәсе — башлангыч кодны кыскарак итүдә.

Әгәр башлангыч кодны кыскарту югары дәрәҗәле телләрнең максаты булса, ә нәрсәнеңдер кодрәте аның үз максатына ничек ирешүе белән үлчәнсә, димәк, программалаштыру теленең кодрәт үлчәме — ул сезнең программаларыгызны ни дәрәҗәдә кыска итүендә.

Киресенчә, сезнең программаларыгызны кыска итмәүче тел программалаштыру телләре башкарырга тиешле эшне начар башкара — яхшы кисми торган пычак яки укып булмый торган язу кебек.

Метрикалар

Ләкин нинди мәгънәдә кечкенә соң? Код күләменең иң киң таралган үлчәме — код юллары саны. Әмма бу метрика иң киң таралган, чөнки аны үлчәве иң җиңеле, дип саныйм. Беркем дә аны программа озынлыгының чын сынавы дип чынлап ышанадыр дип уйламыйм. Төрле телләрдә бер юлга күпме язарга яраганлыгы турында төрле кагыйдәләр бар; C телендә бик күп юлларда бер-ике бүлүче билгедән башка бернәрсә дә юк.

Тагын бер җиңел сынау — программадагы билгеләр (хәрефләр) саны, ләкин бу да бик яхшы түгел; кайбер телләр (мәсәлән, Perl) башкаларга караганда кыскарак идентификаторлар куллана, һәм шул гына.

Минемчә, программа күләменең яхшырак үлчәме элементлар саны булыр иде; монда элемент — башлангыч кодны чагылдырган агач сызсагыз, аерым төен була алырлык теләсә нинди нәрсә. Үзгәрешле яки функциянең исеме — элемент; бөтен сан яки йөзүче нокталы сан — элемент; литерал текст кисәге — элемент; үрнәк элементы яки форматлау директивасы — элемент; яңа блок — элемент. Чиктәш очраклар да бар (-5 бер элементмы, әллә икеме?), ләкин аларның күбесе һәр тел өчен бертөрле дип уйлыйм, шуңа күрә чагыштыруларга зур йогынты ясамый.

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

Дизайн

Мондый метрика безгә төрле телләрне чагыштырырга мөмкинлек бирер иде, ләкин аның төп кыйммәте, ким дигәндә минем өчен, анда түгел. Кыскалык сынавының төп кыйммәте — телләрне проектлауда юл күрсәткеч булуында. Телләр арасындагы иң файдалы чагыштыру — бер үк телнең ике потенциаль варианты арасында. Программаларны кыскарак итәр өчен мин телдә нәрсә эшли алам?

Әгәр программаның концептуаль йөкләнеше аның катлаулылыгына пропорциональ булса, ә билгеле бер программачы билгеле бер концептуаль йөкләнешкә генә түзә алса, димәк, бу: программачыларга мөмкин кадәр күбрәк эш башкарырга мөмкинлек бирү өчен мин нәрсә эшли алам? — дигән сорау белән бер үк. Ә бу миңа: яхшы телне ничек проектларга? — дигән сорау белән бөтенләй бер үк булып күренә.

(Айткәндәй, телләр проектлауга караганда «барлык телләр дә бертигез» дигән иске гыйбарәнең ялган булуын ачыграк күрсәтүче бернәрсә дә юк. Яңа тел проектлаганда, кайсысы яхшырак икәнен хәл итү өчен сез даими рәвештә ике телне — x-ны эшләсәм барлыкка киләчәк телне һәм эшләмәсәм калачагын — чагыштырасыз. Әгәр бу чыннан да мәгънәсез сорау булса, сез тимер акча да ташлый алыр идегез.)

Кыскалыкка омтылу яңа идеяләр табуның яхшы ысулы булып күренә. Әгәр сез бик күп төрле программаларны кыскарта торган берәр нәрсә эшли аласыз икән, бу, мөгаен, очраклылык түгелдер: сез, бәлки, файдалы яңа абстракция тапкансыздыр. Хәтта кабатланучы үрнәкләрне башлангыч кодтан эзләп ярдәм итә торган программа да яза аласыз. Башка телләр арасында яңа идеяләр эзләү өчен нәкъ менә кыскалыгы белән танылган телләргә карарга кирәк: Forth, Joy, Icon.

Чагыштыру

Бу мәсьәләләр турында язган беренче кеше, белүемчә, Фред Брукс булган үзенең The Mythical Man-Month китабында. Ул программачылар, телгә карамастан, көненә якынча бер үк күләмдә код яза кебек, дип язган иде. Егерме яшьләр тирәсендә моны беренче тапкыр укыгач, бу минем өчен зур ачыш булды һәм бик зур нәтиҗәләргә ия кебек күренде. Бу димәк: (a) программа тәэминатын тизрәк язуның бердәнбер юлы — кыскарак тел куллану, һәм (b) моның өчен тырышлык салган кеше моны эшләмәгән көндәшләрен артта калдыра алачак.

Бруксның гипотезасы, әгәр ул дөрес булса, хакерлыкның үзәгендә тора кебек. Шул вакыттан бирле мин бу сорау буенча рәсми тикшеренүләрдән алып аерым проектлар турындагы кызыклы хәлләргә кадәр тапкан һәр дәлилгә зур игътибар бирдем. Аңа каршы килә торган бернәрсә дә күргәнем булмады.

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

Телнең чын сынавы — башка берәү формулировкалаган мәсьәләне чишү өчен аны ничек куллана алуыгызда түгел, ә яңа мәсьәләләрне ничек таба һәм чишә алуыгызда. Бу икесе бөтенләй төрле критерийлар. Сәнгатьтә чигү һәм мозаика кебек чаралар, ни ясарга теләгәнегезне алдан белсәгез, яхшы эшли, ләкин белмәсәгез — бөтенләй яраксыз. Сез сурәтне тудыру барышында ачыкларга теләгәндә — мәсәлән, кеше сурәте кебек катлаулы берәр нәрсә белән эшләгәндә — сезгә каләм, тушь яки майлы буяу кебек сыгылмалырак чаралар кулланырга кирәк. Һәм чынлыкта да, шпалерлар һәм мозаикалар ясау практикасында башта картина ясала, аннары ул күчереп ясала. («Картон» сүзе башта нәкъ менә шушы максатка юнәлтелгән картинаны тасвирлау өчен кулланылган).

Бу дигән сүз, бездә программалаштыру телләренең чагыштырма кодрәтен төгәл чагыштыру беркайчан да булмаячак диярлек. Бездә төгәл үлчәнгән чагыштырулар булыр, ләкин асылга туры килгәннәре булмас. Аерым алганда, телләрне чагыштыру максатыннан үткәрелгән махсус тикшеренүләр, мөгаен, кечкенә мәсьәләләрне һәм һичшиксез алдан билгеләнгән бурычларны кулланачак булганга, көчлерәк телләрнең кодрәтен түбәнрәк бәяләүгә омтылачак.

Практикадан алынган хәбәрләр, «фәнни» тикшеренүләргә караганда азрак төгәл булсалар да, күбрәк мәгънәгә ия булырга мөмкин. Мәсәлән, Ericsson-нан Ульф Вигер ясаган бер тикшеренү Erlang теленең C++ теленә караганда 4-10 тапкыр кыскарак булуын һәм анда программа тәэминатын җитештерү шулкадәр тизрәк баруын күрсәткән:

Ericsson эчендәге эшкәртү проектларын чагыштыру программа тәэминатын булдыруның барлык этапларын кертеп, нинди тел (Erlang, PLEX, C, C++, яисә Java) кулланылуга карамастан, юл/сәгать җитештерүчәнлеге якынча бер үк дәрәҗәдә булуын күрсәтә. Төрле телләрне аерып торучы нәрсә булып башлангыч код күләме кала.

Тикшеренү шулай ук Брукс китабында бары тик күздә генә тотылган (чөнки ул хаталары төзәтелгән код юлларын үлчәгән) бер фикерне турыдан-туры ачып сала: кодрәтлерәк телләрдә язылган программаларда хаталар азрак була. Бу челтәр коммутаторлары кебек кушымталарда, бәлки, программачының җитештерүчәнлегенә караганда да мөһимрәк булып, үзенә бер төп максатка әверелә.

Тәм сынавы

хәер, ахыр чиктә, үз сиземләвегезгә ышанырга туры килә. Бу телдә программалаштыру нинди хисләр уята? Иң яхшы телне табуның (яки проектлауның) юлы — телнең уйларга ни дәрәҗәдә ирек бирүенә үтә сизгер булу, аннары иң яхшы тәэсир калдырган телне сайлау/проектлау, дип саныйм. Әгәр телнең берәр үзенчәлеге уңайсыз яки кыса торган булса, борчылмагыз, сез моны үзегез үк сизәрсез.

Мондый үтә сизгерлекнең үз бәясе булачак. Сез уңайсыз телләрдә программалаштыруга бүтән түзә алмаганыгызны күрерсез. Мин макросларсыз телләрдә программалаштыруны түзә алмаслык чикләүче нәрсә дип табам — нәкъ динамик типлаштыруга күнеккән кешегә һәр үзгәрешленең типын игълан итәргә кирәк булган һәм төрле типтагы объектлардан исемлек ясый алмый торган телгә кире кайту түзә алмаслык чикләү булып тоелган кебек.

Мин генә мондый түгел. Мин моның белән очрашкан күп кенә Lisp хакерларын беләм. Чынлыкта, программалаштыру телләренең чагыштырма кодрәтенең иң төгәл үлчәме — бу телне белгән һәм куллану өлкәсенә карамастан, шул телне куллана ала торган теләсә нинди эшкә урнашырга әзер булган кешеләрнең проценты булырга мөмкин.

Чикләүчәнлек

Хакерларның күбесе телнең кысуын, чикләвен тойганда бу нинди хис булуын беләдер, дип уйлыйм. Моны сизгәндә ни бара? Бу сез барырга теләгән урам ябык булганда һәм кирәкле җиргә барып җитү өчен озын әйләнгеч юл үтәргә туры килгәндә туган хис белән бер үк, дип уйлыйм. Сез берәр нәрсә әйтергә телисез, ә тел сезгә моңа юл куймый.

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

Чикләү тойгысының күпчелек өлеше (туксан проценты?) телдә язган программагызны башыгыздагыдан озынрак итәргә мәҗбүр булудан килә, дип уйлыйм. Чикләүчәнлек — ул күбесенчә кыскалыкның җитмәве. Шуңа күрә тел чикләүче булып тоела икән, бу (нигездә) аның җитәрлек дәрәҗәдә кыска түгеллеген аңлата, һәм тел кыска булмаганда, ул чикләүче булып тоелачак.

Укылышлылык

Мин башлаган өземтә тагын ике сыйфатны искә ала: тәртиплелек һәм укылышлылык. Тәртиплелекнең нәрсә булуын, яки тәртипле һәм укылышлы кодның гади генә укылышлы кодтан нинди дә булса өстенлеге (әгәр ул бар булса) барлыгын төгәл белмим. Ләкин укылышлылык дигәндә нәрсә күздә тотылганын беләм кебек, һәм бу шулай ук кыскалык белән бәйле, дип уйлыйм.

Монда без аерым бер код юлының укылышлылыгы белән бөтен программаның укылышлылыгы арасындагы аерманы яхшы аңларга тиеш. Иң мөһиме — икенчесе. Basic телендәге бер юл Lisp телендәге бер юлга караганда укылышлырак булуы ихтималлыгы белән килешәм. Ләкин Basic телендә язылган программа Lisp телендә язылган шул ук программага караганда күбрәк юллардан торачак (бигрәк тә сез Greenspunland өлкәсенә кергәч). Basic программасын укуның гомуми тырышлыгы, һичшиксез, зуррак булачак.

гомуми тырышлык = бер юлга киткән тырышлык x юллар саны

Укылышлылык кыскалыкка кодрәт кебек үк турыдан-туры пропорциональ булуына артык ышанып бетмим, ләкин, әлбәттә, кыскалык укылышлылыкның бер тапкырлаучысы (математик мәгънәдә; югарыдагы тигезләмәне карагыз) булып тора. Шуңа күрә телнең максаты — кыскалык түгел, ә укылышлылык дип әйтү хәтта мәгънәсез булырга мөмкин; бу максат укылышлылык түгел, ә укылышлылык дип әйтү кебек бер нәрсә булырга мөмкин.

Бер юлның укылышлылыгы, тел белән беренче тапкыр очрашкан кулланучы өчен, башлангыч кодның куркынычсыз булып күренүен аңлата. Шуңа күрә бер юлның укылышлылыгы начар проект карары булса да, яхшы маркетинг карары булырга мөмкин. Бу кешеләргә өлешләп түләргә мөмкинлек бирү кебек бик уңышлы ысулга охшаш: аларны югары башлангыч бәя белән куркыту урынына, сез аларга түбән айлык түләү турында әйтәсез. Ләкин өлешләп түләү планы сатып алучы өчен гомуми алганда зыянлы, нәкъ менә бары тик бер юллык укылышлылык та программачы өчен шулай. Сатып алучы ул бик түбән түләүләрне бик күп ясаячак; ә программачы ул аерым алганда укылышлы юлларны бик күп укыячак.

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

Кайсы дәрәҗәгә кадәр?

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

Мин моны бәхәсне мәдәнирәк итәр өчен генә тәкъдим итмим. Мин чыннан да җавапны белергә телим. Тел кайчан (әгәр андый нәрсә булса) үзенең файдасы өчен артык кыска була ала?

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

Программалар түгел, телләр

Без аерым программалар турында түгел, ә телләрнең кыскалыгы турында сөйләшүебезне ачык аңларга тиешбез. Әлбәттә, аерым программаларның артык тыгыз язылуы ихтимал.

Мин бу турыда On Lisp китабында язган идем. Катлаулы макрос үзенең озынлыгын аклар өчен үз күләменнән күп тапкырлар артыграк озынлыкны янга калдырырга тиеш булырга мөмкин. Әгәр берәр катлаулы макрос язу аны һәр кулланган саен ун юл кодны янга калдыра алса, һәм макрос үзе ун юлдан торса, аны бер тапкырдан артык куллансагыз, сез юллар саны буенча саф отыш аласыз. Ләкин бу барыбер начар адым булырга мөмкин, чөнки макрос билгеләмәләрен гади кодка караганда уку кыенрак. Макрос укылышлылыкны сизелерлек яхшыртсын өчен, аны ун яки егерме тапкыр кулланырга кирәк булырга мөмкин.

Һәр телнең шундый компромисслары барлыгына шигем юк (гәрчә тел кодрәтлерәк булган саен, ставкалар да югарырак була бара, дип шикләнәм). Һәр программачы берәр зирәк кешенең шикле программалаштыру алымнары ярдәмендә чак кына кыскарткан кодын күргәндер.

Шуңа күрә моның турында бернинди бәхәс юк — ким дигәндә, минем яктан. Аерым программалар, әлбәттә, үзләре өчен артык кыска булырга мөмкин. Сорау шунда: тел шундый була аламы? Тел программачыларны гомуми укылышлылык хисабына (элементлар буенча) кыска булган код язарга мәҗбүр итә аламы?

Телнең артык кыска булуын күз алдына китерүнең кыен булуының бер сәбәбе — әгәр нәрсәнедер белдерүнең артык кыска берәр ысулы булса, аның, мөгаен, озынрак юлы да булыр иде. Мәсәлән, күп санлы макрослар яки югары тәртипле функцияләр кулланган Lisp программалары сезгә артык тыгыз булып тоелса, теләсәгез, сез Pascal теленә охшаш код яза аласыз. Әгәр Arc телендә факториалны югары тәртипле функциягә мөрәҗәгать итеп белдерергә теләмисез икән (rec zero 1 * 1-), сез шулай ук рекурсив билгеләмә яза аласыз: (rfn fact (x) (if (zero x) 1 (* x (fact (1- x))))) Хәзерге вакытта башыма бернинди мисал килмәсә дә, телнең артык кыска булуы мөмкинме дигән сорау мине кызыксындыра. Сезне кырыс һәм аңлаешсыз итеп код язарга мәҗбүр итүче телләр бармы? Кемдә дә булса мисаллар булса, мин аларны бик теләп карар идем.

(Искәрмә: Мин югарыда тасвирланган «элементлар» метрикасы буенча бик тыгыз булган программаларны эзлим, бүлүче билгеләрне төшереп калдырып булганга һәм һәр нәрсәнең бер хәрефле исеме булганга гына кыска булган программаларны түгел.)