(Был мәҡәлә яңы тел өсөн бизнес-план төрөндә яҙылған ине. Шуға күрә бында яҡшы программалау теленең иң мөһим һыҙаты төшөп ҡалған (сөнки ул үҙенән-үҙе аңлашылған тип һанала): бик ҡеүәтле абстракциялар.)
Бер танышым күренекле операцион системалар белгесенә ысынлап та яҡшы программалау теле эшләргә теләүе тураһында әйткәйне. Белгес уға бының ваҡытты бушҡа уҙғарыу булыуын, программалау телдәре үҙҙәренең яҡшы сифаттары арҡаһында ғына популяр йәки популяр булмаған булып китмәй, һәм теле ни тиклем генә яҡшы булмаһын, уны бер кем дә ҡулланмаясаҡ, тип яуап бирҙе. Сөнки уның үҙе ижад иткән тел менән нәҡ шулай килеп сыҡҡайны.
Телде нимә популяр итә һуң? Популяр телдәр үҙҙәренең популярлығына лайыҡмы? Яҡшы программалау телен булдырырға тырышыуға ваҡыт сарыф итергә кәрәкме? Быны нисек эшләргә?
Минеңсә, был һорауҙарға яуапты хакерҙарға ҡарап һәм уларҙың нимә теләүен белеп табырға була. Программалау телдәре хакерҙар өсөн булдырылған, һәм программалау теле тик шул ваҡытта ғына программалау теле булараҡ яҡшы (мәҫәлән, денотацион семантика йәки компиляторҙар проекциялау буйынса ябай күнегеү түгел) булып тора, әгәр ҙә ул хакерҙарға оҡшаһа.
1 Популярлыҡ механикаһы
Эйе, күпселек кешеләрҙең программалау телдәрен бары тик уларҙың яҡшы сифаттарына ҡарап ҡына һайламауы хаҡ. Күпселек программалаусыларға ниндәй телде ҡулланырға кәрәклеген башҡалар әйтә. Шулай ҙа, минеңсә, бындай тышҡы факторҙарҙың программалау телдәренең популярлығына йоғонтоһо ҡайһы берҙә уйлағанса ҙур түгел. Тағы ла ҙурыраҡ проблема шунда: хакерҙың яҡшы программалау теле тураһындағы төшөнсәһе күпселек тел проектлаусыларҙыҡы менән тап килмәй.
Был ике яҡ араһында тап хакерҙың фекере мөһим булып тора. Программалау телдәре теорема түгел. Улар кешеләр өсөн эшләнгән ҡоралдар, һәм улар, аяҡ кейеме кеше аяғына яраҡлаштырылған кеүек, кешенең көслө һәм йомшаҡ яҡтарына тура килтереп проектланырға тейеш. Әгәр аяҡ кейеме кейгәндә ҡыҫһа, ул ни тиклем генә нәфис скульптура әҫәре булмаһын, яман аяҡ кейеме булып ҡала.
Бәлки, программалаусыларҙың күпселеге яҡшы телде яманынан айыра белмәйҙер. Ләкин башҡа ҡоралдар менән дә шулай уҡ. Был яҡшы тел проектларға тырышыу ваҡытты бушҡа уҙғарыу тигәнде аңлатмай. Оҫта хакерҙар яҡшы телде күреү менән таный һәм уны ҡуллана башлай. Оҫта хакерҙар, әлбиттә, бик аҙсылыҡ, ләкин тап шул бәләкәй аҙсылыҡ барлыҡ яҡшы программа тәьминәтен яҙа, һәм уларҙың абруйы шул тиклем ҙур, ҡалған программалаусылар улар ниндәй телде ҡулланһа, шуны ҡулланырға ынтыла. Ғәҙәттә, был ябай йоғонто ғына түгел, ә бойроҡ: йыш ҡына оҫта хакерҙар начальниктар йәки ғилми етәкселәр булараҡ башҡа программалаусыларға ниндәй тел ҡулланырға кәрәклеген күрһәтеп тора.
Оҫта хакерҙарҙың фекере — программалау телдәренең сағыштырма популярлығын билдәләүсе берҙән-бер көс түгел; элекке мираҫ программалар (Cobol) һәм шау-шыу (Ada, Java) ҙа роль уйнай, ләкин оҙайлы ваҡыт арауығында тап хакерҙар иң ҡеүәтле көс булып тора, тип уйлайым. Башланғыс критик масса һәм етерлек ваҡыт бирелгәндә, программалау теле, бәлки, үҙе ни тиклем лайыҡ булһа, шунса популярлыҡ яулайҙыр. Ә популярлыҡ яҡшы телдәрҙе насарҙарынан тағы ла нығыраҡ айыра, сөнки тере ҡулланыусыларҙың кире бәйләнеше һәр ваҡыт яҡшыртыуҙарға килтерә. Һәр популяр телдең үҙ ғүмерендә ни тиклем үҙгәргәненә ҡарағыҙ. Perl менән Fortran — сиктән тыш миҫалдар, ләкин хатта Lisp та бик ныҡ үҙгәрҙе. Мәҫәлән, Lisp 1.5-тә макростар юҡ ине; улар һуңыраҡ, MIT хакерҙары бер нисә йыл буйы Lisp ҡулланып ысын программалар яҙғандан һуң барлыҡҡа килде. [1]
Шуға күрә, тел популяр булыу өсөн яҡшы булырға тейешме-юҡмы, ләкин, минеңсә, тел яҡшы булыу өсөн популяр булырға тейеш. Һәм яҡшы булып ҡалыу өсөн ул популяр булып ҡалырға тейеш. Программалау телдәренең үҫеш кимәле бер урында тормай. Шулай ҙа бөгөнгө Lisps телдәре әле лә 1980-се йылдар уртаһында MIT-ла булғанға бик оҡшаш, сөнки Lisp һуңғы тапҡыр тап шул ваҡытта етерлек ҙур һәм талапсан ҡулланыусылар базаһына эйә ине.
Әлбиттә, хакерҙар телде ҡуллана алыр өсөн иң тәүҙә уның тураһында белергә тейеш. Улар быны ҡайҙан ишетә? Башҡа хакерҙарҙан. Ләкин башҡалар ишетһен өсөн башта был телде ҡулланыусы хакерҙар төркөмө булырға тейеш. Ҡыҙыҡ, был төркөм ни тиклем ҙур булырға тейеш икән; нисә ҡулланыусы критик массаны тәшкил итә? Уйламайынса ғына әйткәндә, егерме тип әйтер инем. Әгәр телдең егерме айырым ҡулланыусыһы булһа, йәғни уны үҙ аллы ҡулланырға ҡарар иткән егерме кеше, мин уны ысын тел тип һанар инем.
Ундай кимәлгә етеү еңел түгелдер. Нолдән егермегә тиклем барыу егерменән меңгә барыуға ҡарағанда ауырыраҡ булһа, мин ғәжәпләнмәҫ инем. Был тәүге егерме ҡулланыусыны йәлеп итеүҙең иң яҡшы юлы, моғайын, троян атын ҡулланыуҙыр: кешеләргә улар теләгән ҡушымтаны биреү, һәм ул яңы телдә яҙылған булып сығырға тейеш.
2 Тышҡы факторҙар
Башта программалау теленең популярлығына ысынлап та тәьҫир иткән бер тышҡы факторҙы таныйыҡ. Популяр булыу өсөн программалау теле популяр бер системаның скрипт яҙыу теле булырға тейеш. Fortran менән Cobol тәүге IBM мейнфреймдарының скрипт телдәре ине. C теле Unix-тың скрипт теле булды, ә һуңыраҡ Perl шул ролде алды. Tcl — Tk-ның скрипт теле. Java һәм Javascript веб-браузерҙарҙың скрипт телдәре булырға тейеш тип күҙалланды.
Lisp-тың киң таралған популяр тел булмауының сәбәбе — ул киң таралған популяр системаның скрипт теле түгел. Уның һаҡланып ҡалған популярлығы 1960-сы һәм 1970-се йылдарға барып тоташа, ул ваҡытта ул MIT-ның скрипт теле ине. Шул дәүерҙең бик күп бөйөк программалаусылары ниндәйҙер кимәлдә MIT менән бәйле булған. Һәм 1970-се йылдар башында, C барлыҡҡа килгәнгә тиклем, Lisp-тың MacLisp тип аталған диалекты етди хакер ҡулланырға теләгән берҙән-бер программалау телдәренең береһе ине.
Бөгөн Lisp уртаса популярлыҡтағы ике системаның — Emacs һәм Autocad-тың скрипт теле булып тора, һәм шул сәбәпле, бөгөн яҙылған Lisp программаларының күбеһе Emacs Lisp йәки AutoLisp телендә башҡарыла тип шикләнәм.
Программалау телдәре айырым ғына йәшәмәй. «Хакерлыҡ итеү» (хак) — күсемле ҡылым, хакерҙар ғәҙәттә нимәнелер хак итә, һәм ғәмәлдә телдәр улар менән нимә эшләнә, шуға ҡарап баһалана. Шуға күрә, әгәр популяр тел эшләргә теләһәгеҙ, һеҙгә йә телгә ҡарағанда күберәк нәмә тәҡдим итергә, йәки телегеҙҙе ниндәйҙер булған системаның скрипт телен алмаштырырлыҡ итеп проектларға кәрәк.
Common Lisp популяр түгел, өлөшләтә сөнки ул етем. Башта уның хак итерлек системаһы бар ине: Lisp Machine. Ләкин Lisp машиналары (параллель компьютерҙар менән бергә) 1980-се йылдарҙа дөйөм тәғәйенләнештәге процессорҙарҙың ҡеүәте артыуы менән юҡҡа сығарылды. Common Lisp, әгәр Unix өсөн яҡшы скрипт теле булһа, популяр булып ҡалыр ине. Әммә ул, үкенескә күрә, ғәжәп насар тел.
Был хәлде аңлатыуҙың бер юлы — тел үҙ сифаттары буйынса ғына баһаланмай тип әйтеү. Икенсе ҡараш шунда: программалау теле, әгәр ул бер үк ваҡытта нимәнеңдер скрипт теле булмаһа, ысынында программалау теле түгел. Был көтөлмәгән хәл булып тойолһа ғына ғәҙелһеҙ күренә. Минеңсә, был программалау теленең, әйтәйек, реализацияһы (инструменты) булыуын көтөүгә ҡарағанда бер ҙә ғәҙелһеҙ түгел. Был бары тик программалау теленең тәбиғәтенең бер өлөшө.
Программалау теленә, әлбиттә, яҡшы реализация кәрәк, һәм ул бушлай булырға тейеш. Компаниялар программа тәьминәте өсөн аҡса түләйәсәк, ләкин айырым хакерҙар түләмәйәсәк, ә һеҙгә тап хакерҙарҙы йәлеп итергә кәрәк.
Шулай уҡ тел хаҡында китап булыуы зарур. Китап нәҙек, яҡшы яҙылған һәм яҡшы миҫалдар менән тулы булырға тейеш. K&R — бында иң яҡшы өлгө. Хәҙерге ваҡытта телдең O'Reilly нәшер иткән китабы булырға тейеш тиерлек инем. Хакерҙар өсөн телдең әһәмиәтен билдәләүсе һынау ошо булып бара.
Бынан тыш, онлайн документтар ҙа булырға тейеш. Ысынында, китап онлайн документация булараҡ башлана ала. Ләкин матди китаптар иҫкергән тип уйламайым. Уларҙың форматы уңайлы, һәм нәшриәтселәр һалған де-факто цензура — камил булмаһа ла, файҙалы фильтр. Китап магазиндары — яңы телдәр тураһында белеү өсөн иң мөһим урындарҙың береһе.
3 Ҡыҫҡалыҡ
Һәр телгә кәрәк булған өс нәмәне — бушлай реализацияны, китапты һәм хак итерлек системаны — бирә алһағыҙ, хакерҙарға оҡшарлыҡ телде нисек яһарға?
Хакерҙар оҡшатҡан нәмәләрҙең береһе — ҡыҫҡалыҡ. Хакерҙар ялҡау, тап математиктар һәм модерн архитекторҙары ялҡау булған кеүек: улар артыҡ нәмәне яратмай. Программа яҙырға йыйынған хакер ниндәй тел ҡулланырға кәрәклеген, кәм тигәндә аң аҫтында, йыясаҡ символдарҙың дөйөм һанына ҡарап хәл итә, тиһәң, дөрөҫлөктән алыҫ булмаҫ. Хакерҙар теүәл генә шулай уйламаһа ла, тел эшләүсе уларҙы тап шулай тип уйлай тип эш итһә, яҡшы булыр ине.
Ҡулланыусыны инглиз теленә оҡшаған оҙон һүҙбәйләнештәр менән иркәләргә тырышыу — хата. Cobol был етешһеҙлеге менән яман аты сыҡҡан тел. Хакер өсөн
add x to y giving z
урынына
z = x+y
тип яҙыуҙы талап итеү — үҙенең аҡылын кәмһетеү менән Хоҙай алдындағы гонаһ араһындағы бер нәмә кеүек тойоласаҡ.
Ҡайһы берҙә Lisp-та car һәм cdr урынына first һәм rest ҡулланырға кәрәк, сөнки был программаларҙы уҡыуҙы еңеләйтә, тигән фекерҙәр әйтелә ине. Бәлки, тәүге ике сәғәттә шулайҙыр ҙа. Ләкин хакер car һүҙенең исемлектең беренсе элементын, ә cdr ҡалған өлөшөн аңлатҡанын бик тиҙ өйрәнә ала. first һәм rest ҡулланыу яҙыу күләмен 50%-ҡа арттыра. Бынан тыш, уларҙың оҙонлоғо төрлө, был иһә аргументтар рәттән килгән юлдарҙа саҡырылғанда (car һәм cdr йыш ҡына шулай ҡулланыла) бер тигеҙ теҙелмәйәсәк тигәнде аңлата. Кодтың биттә нисек теҙелеүе бик мөһим икәнен күрҙем. Пропорциональ шрифт менән бирелгән Lisp кодын мин саҡ уҡый алам, һәм дуҫтарым башҡа телдәр өсөн дә был дөрөҫ тиҙәр.
Ҡыҫҡалыҡ — ҡәтғи типтағы телдәр отолған урын. Башҡа шарттар тигеҙ булғанда, бер кем дә программаны күп һанлы декларациялар менән башларға теләмәй. Асыҡтан-асыҡ әйтелмәй генә төшөнөрлөк нәмә булһа, ул шулай булырға тейеш.
Айырым токендар ҙа ҡыҫҡа булырға тейеш. Perl һәм Common Lisp был мәсьәләлә ҡапма-ҡаршы полюстарҙа тора. Perl программалары серле дәрәжәлә тығыҙ булырға мөмкин, ә Common Lisp-тың төҙөлгән операторҙарының исемдәре көлкөлө дәрәжәлә оҙон. Моғайын, Common Lisp авторҙары ҡулланыусыларҙың был оҙон исемдәрҙе улар урынына яҙып тороусы текст редакторҙары булыр тип көткәндер. Ләкин оҙон исемдең хаҡы уны яҙыу ваҡыты менән генә сикләнмәй. Уны уҡыу хаҡы һәм экранда алған урынының хаҡы ла бар.
4 Хакерлыҡ итеү еңеллеге (Hackability)
Хакер өсөн ҡыҫҡалыҡтан да мөһим бер нәмә бар: үҙең теләгәнсә эшләй алыу. Программалау телдәре тарихында программалаусыларға «дөрөҫ түгел» тип һаналған ғәмәлдәрҙе башҡарыуҙы тыйыу өсөн ғәжәп күп көс сарыф ителде. Был — ҡурҡыныс кимәлдә тәкәббер план. Тел дизайнеры программалаусыға нимә эшләргә кәрәк буласағын ҡайҙан белһен? Минеңсә, тел проектлаусыларына үҙ ҡулланыусыларын үҙенән үҙе һаҡланырға мохтаж булған бер ахмаҡ түгел, ә улар алдан күрә алмаған нәмәләрҙе эшләргә тейеш булған даһи тип күреү яҡшыраҡ булыр ине. Ахмаҡ үҙ аяғына барыбер атасаҡ. Һеҙ уны башҡа пакеттағы үҙгәреүсәндәргә мөрәжәғәт итеүҙән ҡотҡара алырһығыҙ, ләкин хата проблеманы сисеү өсөн насар проектланған программа яҙыуҙан һәм быға сикһеҙ күп ваҡыт сарыф итеүҙән ҡотҡара алмаясаҡһығыҙ.
Яҡшы программалаусылар йыш ҡына хәүефле һәм «ярамаған» нәмәләрҙе эшләргә теләй. «Ярамаған» тигәндә мин тел күрһәтергә тырышҡан семантик фасад артына үтеүҙе күҙ уңында тотам: мәҫәлән, ниндәйҙер юғары кимәлдәге абстракцияның эске төҙөлөшөнә эләгеү. Хакерҙар хак итергә ярата, ә хак итеү — эскә үтеп инеүҙе һәм тәүге уйлап табыусынан яҡшыраҡ итеп белергә тырышыуҙы аңлата.
Үҙегеҙҙе төҙәтергә ирек бирегеҙ. Нимә генә эшләһәгеҙ ҙә, кешеләр уны һеҙ күҙ уңында тотмағанса ҡулланасаҡ, һәм был программалау теле кеүек ҡатмарлы ҡоралға айырыуса ҡағыла. Күп кенә хакерҙар һеҙҙең семантик моделегеҙҙе һеҙ башығыҙға ла килтермәгәнсә көйләргә теләйәсәк. Мин әйтәм: ирек бирегеҙ уларға; сүп-сар йыйыусы (garbage collector) кеүек системаларға зыян килтермәйенсә, программалаусыға мөмкин тиклем күберәк эске механизмдар менән эш итергә рөхсәт итегеҙ.
Common Lisp-та мин йыш ҡына структураның (struct) яландары буйлап цикл үткәрергә теләй инем — мәҫәлән, юйылған объектҡа һылтанмаларҙы таҙартыр өсөн йәки инициализацияланмаған яландарҙы табыр өсөн. Был структураларҙың аҫта ябай векторҙар ғына булыуын беләм. Шулай ҙа мин теләһә ниндәй структураға ҡуллана алырлыҡ дөйөм тәғәйенләнештәге функция яҙа алмайым. Мин яландарға бары тик исемдәре аша ғына мөрәжәғәт итә алам, сөнки структура тап шуны аңлатырға тейеш тип иҫәпләнә.
Хакер ҙур программала төп моделде бер йәки ике тапҡыр ғына үҙгәртергә теләргә мөмкин. Ләкин быны эшләй алыу ниндәй ҙур әһәмиәткә эйә! Һәм был бары тик проблеманы сисеү мәсьәләһе генә булмауы ихтимал. Бында ниндәйҙер кинәнес тә бар. Хакерҙар эске ағзаларҙы соҡоған хирургтың серле кинәнесен, һытҡы һыҡҡан үҫмерҙең серле кинәнесен уртаҡлаша. [2] Ир-аттар өсөн, кәм тигәндә, ҡайһы бер ҡурҡыныс нәмәләр ылыҡтырғыс. Maxim журналы йыл һайын һылыуҡайҙар һәм ҡурҡыныс авариялар фотоларын берләштергән баҫма сығара. Улар үҙ аудиторияһын яҡшы белә.
Тарихи яҡтан, Lisp хакерҙарға үҙ белгәненсә эшләргә мөмкинлек биреүҙә һәр ваҡыт яҡшы булды. Common Lisp-тың сәйәси яҡтан дөрөҫ булырға тырышыуы — тайпылыш. Башланғыс Lisp телдәре барыһына ла ҡул тейҙерергә рөхсәт итә ине. Был рухтың ҙур өлөшө, бәхеткә күрә, макростарҙа һаҡланып ҡалған. Башланғыс кодта теләһә ниндәй үҙгәртеүҙәр яһай алыу ниндәй ғәжәйеп күренеш!
Классик макростар — хаҡ хакер ҡоралы: ябай, ҡеүәтле һәм ҡурҡыныс. Уларҙың нимә эшләгәнен аңлауы шул тиклем ябай: һеҙ макростың аргументтарына функция саҡыраһығыҙ, һәм ул нимә ҡайтарһа, шул макрос саҡырылған урынға өҫтәлә. Гигиеник макростар ҡапма-ҡаршы принципты кәүҙәләндерә. Улар һеҙҙе нимә эшләгәндәрен аңлауҙан һаҡларға тырыша. Мин гигиеник макростарҙың бер һөйләм менән аңлатылғанын бер ҡасан да ишеткәнем булманы. Һәм улар — программалаусыларға нимә теләргә рөхсәт ителгәнен билдәләүҙең ни тиклем ҡурҡыныс булыуының классик миҫалы. Гигиеник макростар, башҡа нәмәләр менән бер рәттән, мине үҙгәреүсәндәрҙе эләктереп алыуҙан (variable capture) һаҡларға тейеш, ләкин ҡайһы бер макростарҙа тап ошо үҙгәреүсәндәрҙе эләктереү миңә кәрәк тә бит.
Ысынлап та яҡшы тел бер үк ваҡытта таҙа ла, бысраҡ та булырға тейеш: таҙа проектланған, яҡшы аңлашылған һәм ортогональ операторҙарҙың ҙур булмаған үҙәге менән, ләкин хакерҙарға уның менән үҙ белгәненсә эш итергә рөхсәт итеү мәғәнәһендә бысраҡ. C шундай. Башланғыс Lisp та шундай ине. Ысын хакер теленең һәр ваҡыт бер аҙ тыйыуҙарға буйһонмаҫ холоҡ-фиғеле буласаҡ.
Яҡшы программалау теленең «программа инженерияһы» тигән фразаны ҡулланыусы кешеләрҙең ризаһыҙлыҡ менән баш сайҡауына сәбәп булырлыҡ һыҙаттары булырға тейеш. Икенсе оста Ada һәм Pascal кеүек телдәр тора — улар уҡытыу өсөн яҡшы һәм башҡа бер нәмәгә лә ярамай торған тәртип өлгөләре.
5 Бер тапҡыр ҡулланылыусы программалар
Хакерҙарҙы йәлеп итеү өсөн тел улар яҙырға теләгән программа төрҙәрен яҙыу өсөн яҡшы булырға тейеш. Был иһә, бәлки, ғәжәп тойолор, уның бер тапҡыр ҡулланылыусы (throwaway) программалар яҙыу өсөн яҡшы булырға тейешлеген аңлата.
Бер тапҡыр ҡулланылыусы программа — ниндәйҙер сикләнгән бурыс өсөн тиҙ генә яҙылған программа: система менән идара итеү бурысын автоматлаштырыу, симуляция өсөн һынау мәғлүмәттәре булдырыу йәки мәғлүмәттәрҙе бер форматтан икенсеһенә күсереү өсөн программа. Бындай бер тапҡыр ҡулланылыусы программалар тураһында ғәжәп нәмә шул: Икенсе донъя һуғышы ваҡытында бик күп Америка университеттарында төҙөлгән «ваҡытлыса» биналар кеүек, улар йыш ҡына ташланмай. Күбеһе ысын функциялары һәм ысын ҡулланыусылары булған ҙур программаларға әүерелә.
Минеңсә, иң яҡшы ҙур программалар Гувер быуаһы кеүек башынан уҡ ҙур итеп проектланыу урынына, тап ошолай башлана. Баштан уҡ ҙур нәмә төҙөү ҡурҡыныс. Кешеләр бигерәк ҙур проектҡа тотонғанда, улар аптырап ҡала. Проект йә туҡтап ҡала, йәки һөҙөмтәһе йәнһеҙ һәм ҡаты була: ысын ҡала үҙәге урынына сауҙа үҙәге, Рим урынына Бразилиа, C урынына Ada барлыҡҡа килә.
Ҙур программа алыуҙың тағы бер юлы — бер тапҡыр ҡулланылыусы программанан башлап, уны даими яҡшыртыу. Был алым шөрләтерлек түгел, һәм программаның конструкцияһы эволюциянан файҙа күрә. Әгәр ҡараһаң, күпселек ҙур программалар тап ошо юл менән үҫешкән булып сығыр, тип уйлайым. Һәм шулай үҫешкәндәр, моғайын, башта ниндәй телдә яҙылған булһа, шул телдә ҡала бирә, сөнки сәйәси сәбәптәрҙән тыш программаның яңы телгә күсерелеүе һирәк күренеш. Шуға күрә, парадоксаль рәүештә, ҙур системалар өсөн ҡулланылырлыҡ тел яһарға теләһәгеҙ, уны ваҡытлыса программалар яҙыу өсөн уңайлы итергә тейешһегеҙ, сөнки ҙур системалар тап шуларҙан үҫеп сыға.
Perl — был идеяның асыҡ миҫалы. Ул бер тапҡыр ҡулланылыусы программалар яҙыу өсөн генә проектланмаған, ә үҙе лә шундай программа булған тиерлек ине. Perl үҙ ғүмерен отчеттар төҙөү өсөн утилиталар йыйынтығы булараҡ башланы, һәм кешеләр унда яҙған ваҡытлы программалар ҙурая барған һайын ғына программалау теленә әүерелде. Perl 5-кә тиклем (хатта шул ваҡытта ла) тел етди программалар яҙыуға яраҡһыҙ ине, шуға ҡарамаҫтан ул бик популяр булып өлгөрҙө.
Бер тапҡыр ҡулланылыусы программалар өсөн телде нимә яҡшы итә? Тәү сиратта, ул һәр саҡ ҡул аҫтында булырға тейеш. Бер тапҡыр ҡулланылыусы программа — һеҙ бер сәғәт эсендә яҙып бөтөрөргә өмөт иткән нәмә. Шуға күрә тел, моғайын, һеҙ ҡулланған компьютерҙа алдан уҡ ҡуйылған булырға тейеш. Ул ҡулланыр алдынан мотлаҡ ҡуйырға тейеш булған программа була алмай. Ул унда булырға тейеш. C шунда ине, сөнки ул операцион система менән бергә килә ине. Perl шунда ине, сөнки ул башта система администраторҙары өсөн ҡорал булған, һәм һеҙҙең администраторығыҙ уны күптән ҡуйып ҡуйған булған.
Әммә ҡул аҫтында булыу ҡуйылған булыуҙан күберәкте аңлата. Команда юлы интерфейсы булған интерактив тел айырым компиляциялауҙы һәм ебәреүҙе талап иткән телгә ҡарағанда тиҙерәк ҡул аҫтында була. Популяр программалау теле интерактив булырға һәм тиҙ эшләп китергә тейеш.
Бер тапҡыр ҡулланылыусы программала талап ителгән тағы бер нәмә — ҡыҫҡалыҡ. Ҡыҫҡалыҡ һәр ваҡыт хакерҙар өсөн ылыҡтырғыс, ә бер сәғәт эсендә тамамларға өмөт иткән программала ул айырыуса ҡиммәтле.
6 Китапханалар
Әлбиттә, иң юғары ҡыҫҡалыҡ — программаның һеҙҙең өсөн алдан яҙылып ҡуйылыуы һәм һеҙгә бары уны саҡырыу ғына ҡалыуы. Һәм был беҙҙе программалау телдәренең артабан тағы ла мөһимерәк буласаҡ һыҙатына килтерә: китапхана функциялары. Perl еңеп сыға, сөнки уның юлдар (strings) менән эшләү өсөн ҙур китапханалары бар. Был төр китапхана функциялары бер тапҡыр ҡулланылыусы программалар өсөн айырыуса мөһим, сөнки улар йыш ҡына мәғлүмәттәрҙе үҙгәртеү йәки сығарып алыу өсөн яҙыла. Күп кенә Perl программалары, моғайын, бергә йәбештерелгән бер нисә китапхана саҡырыуынан ғына ғибәрәт булып башланалыр.
Киләһе илленән артыҡ йыл эсендә программалау телдәрендә булған бик күп алға китешеш китапхана функциялары менән бәйле булыр, тип уйлайым. Киләсәктең программалау телдәре телдең төп ядроһы кеүек үк ентекләп эшләнгән китапханаларға эйә буласаҡ. Программалау телен проектлау телде ҡәтғи йәки бушаҡ типлы итеү, объектҡа йүнәлтелгән йәки функциональ итеү хаҡында түгел, ә шәп китапханалар төҙөү тураһында буласаҡ. Типтар системаһын нисек проектлау тураһында уйларға яратҡан тел проектлаусылары бынан тертләп китергә мөмкин. Был ҡулланма программалар яҙыу кеүек бит инде! Ярай, ни хәл итәһең. Телдәр программалаусылар өсөн эшләнгән, ә программалаусыларға китапханалар кәрәк.
Яҡшы китапханалар проектлау ҡыйын. Был күп код яҙыу ғына түгел. Китапханалар артыҡ ҙурайһа, ҡайһы саҡта кәрәкле функцияны табыу өсөн кодты үҙең яҙыуға ҡарағанда күберәк ваҡыт китеүе мөмкин. Китапханалар ҙа, төп тел кеүек үк, үҙ-ара ортогональ булған бәләкәй операторҙар йыйынтығы ярҙамында проектланырға тейеш. Программалаусы ниндәй китапхана саҡырыуы уға кәрәкле нәмәне эшләйәсәген алдан тойомлай алырға тейеш.
Китапханалар — Common Lisp ҡалышҡан өлкәләрҙең береһе. Унда юлдар менән эшләү өсөн башланғыс ҡына китапханалар бар, ә операцион система менән аралашыу өсөн бөтөнләй юҡ тиерлек. Тарихи сәбәптәр арҡаһында Common Lisp үҙен операцион система бөтөнләй юҡ һымаҡ тоторға тырыша. Һәм һеҙ операцион система менән аралаша алмағас, бары тик Common Lisp-тың эске операторҙарын ғына ҡулланып, етди программа яҙыуығыҙ икеле. Һеҙгә ҡулланылған реализацияға бәйле булған хактарҙы ла файҙаланырға тура киләсәк, ә ғәмәлдә улар һеҙ теләгән бар нәмәне лә бирмәй. Әгәр Common Lisp-та ҡеүәтле юл китапханалары һәм яҡшы операцион система ярҙамы булһа, хакерҙар Lisp хаҡында күпкә юғарыраҡ фекерҙә булыр ине.
7 Синтаксис
Lisp синтаксисына, дөрөҫөрәге, синтаксистың булмауына эйә тел ҡасан да булһа популяр була алырмы? Был һорауға яуапты белмәйем. Мин синтаксис — Lisp-тың әлеге ваҡытта популяр булмауының төп сәбәбе түгел, тип уйлайым. Common Lisp-та ят синтаксисҡа ҡарағанда насарыраҡ проблемалар бар. Мин префикслы синтаксисты яҡшы белгән, әммә Perl-ды өҫтөн күргән бер нисә программалаусыны беләм, сөнки унда ҡеүәтле юл китапханалары бар һәм ул операцион система менән бәйләнешкә инә ала.
Префикслы яҙылышта ике ихтимал проблема бар: ул программалаусыларға таныш түгел, һәм ул етерлек дәрәжәлә тығыҙ түгел. Lisp донъяһындағы ғәҙәти ҡараш буйынса, төп ҡаршылыҡ — беренсе проблема. Мин быға бик үк ышанып етмәйем. Эйе, префикслы яҙылыш ябай программалаусыларҙы паникаға һала. Ләкин ябай программалаусыларҙың фекере әллә ни мөһим түгел, тип уйлайым. Телдәр оҫта хакерҙарҙың улар тураһында ни уйлауына ҡарап популяр йәки популяр түгел була, һәм оҫта хакерҙар префикслы яҙылыш менән эш итә алалыр. Perl синтаксисы ла бик аңлайышһыҙ булырға мөмкин, ләкин был Perl-дың популярлығына ҡамасауламаны. Киреһенсә, бәлки, Perl культын үҫтереүгә ярҙам иткәндер.
Етдиерәк проблема — префикслы яҙылыштың һүҙмәнлеге (киң таралғанлығы). Оҫта хакерҙар өсөн был ысынлап та проблема. a[x,y] тип яҙа алған саҡта бер кемдең дә (aref a x y) тип яҙғыһы килмәй.
Был осраҡта проблеманан оҫта ҡотолоу юлы бар. Әгәр беҙ мәғлүмәт структураларына индекстарға ҡулланылған функциялар кеүек ҡараһаҡ, уның урынына (a x y) тип яҙа алыр инек, был Perl формаһынан да ҡыҫҡараҡ. Ошондай хәйләләр башҡа төрлө аңлатмаларҙы ла ҡыҫҡартырға мөмкин.
Абзац сиген (интендацияны) мәғәнәүи итеп, күп кенә йәйәләрҙән ҡотолорға (йәки уларҙы мотлаҡ булмаған итергә) була. Программалаусылар кодты барыбер шулай уҡый: сиктәр бер нәмәне, ә бүлгестәр икенсе нәмәне күрһәткәндә, беҙ сиктәргә таянабыҙ. Абзац сиген мәғәнәүи тип иҫәпләү был хаталар сығанағын юҡ итер ине, шулай уҡ программаларҙы ҡыҫҡараҡ яһар ине.
Ҡайһы берҙә инфикслы синтаксисты уҡыуы еңелерәк. Был айырыуса математик аңлатмалар өсөн дөрөҫ. Мин үҙемдең бөтә программалау тормошомда Lisp ҡулландым, һәм әле лә префикслы математик аңлатмаларҙы тәбиғи тип һанамайым. Шулай ҙа, айырыуса код етештергәндә, теләһә ниндәй һандағы аргументтарҙы алған операторҙарға эйә булыу уңайлы. Шуға күрә, әгәр инфикслы синтаксис эшләһәк, ул, моғайын, ниндәйҙер уҡыу макросы (read-macro) рәүешендә тормошҡа ашырылырға тейеш.
Lisp-ҡа синтаксис индереүгә фанатик рәүештә ҡаршы торорға тейеш түгелбеҙ, әгәр ул аңлайышлы рәүештә төп s-аңлатмаларға тәржемә ителә икән. Lisp-та былай ҙа байтаҡ ҡына синтаксис бар. Бер кемде лә уны ҡулланырға мәжбүр итмәгәндә, тағы ла күберәк индереү насар түгел. Common Lisp-та ҡайһы бер бүлгестәр тел өсөн һаҡланған, был кәм тигәндә авторҙарҙың ҡайһы берҙәренең киләсәктә күберәк синтаксис булдырырға ниәтләүен күрһәтә.
Common Lisp-тағы Lisp стиленә бөтөнләй тап килмәгән иң көслө синтаксис өлөштәренең береһе format юлдарында осрай; format — үҙ аллы тел, һәм был тел Lisp түгел. Әгәр Lisp-ҡа күберәк синтаксис индереү планы булһа, format спецификаторҙарын шунда индерергә мөмкин булыр ине. Әгәр макростар теләһә ниндәй башҡа кодты булдырған кеүек format спецификаторҙарын да яһай алһа, шәп булыр ине.
Бер күренекле Lisp хакеры миңә үҙенең CLTL китабының тап format бүлегендә асылыуын әйткәйне. Минеке лә шулай. Был, моғайын, яҡшыртырға урын барлығын күрһәтәлер. Был шулай уҡ программаларҙың бик күп индереү/сығарыу (I/O) эштәрен башҡарыуын да аңлатырға мөмкин.
8 Һөҙөмтәлелек
Яҡшы тел, һәр кемгә мәғлүм булыуынса, тиҙ эшләй торған код етештерергә тейеш. Ләкин ғәмәлдә тиҙ код иң тәүҙә телде проектлауҙа эшләгән нәмәләрҙән килә тип уйламайым. Кнут күптән билдәләп үткәнсә, тиҙлек тик билдәле бер киҫкен урындарҙа (bottlenecks) ғына әһәмиәткә эйә. Һәм шул ваҡыттан алып күп программалаусылар күҙәткәнсә, был тар урындарҙың ҡайҙа булыуы тураһында кешеләр бик йыш хаталана.
Шуға күрә, ғәмәлдә, шәп код алыуҙың юлы — телде ҡәтғи типташтырыу түгел, ә бик яҡшы профилировщикка эйә булыу. Һеҙгә программалағы һәр саҡырыуҙа һәр аргументтың тибын белеү кәрәкмәй. Һеҙгә бары тик тар урындарҙағы (bottlenecks) аргументтарҙың типтарын иғлан итә белеү кәрәк. Һәм унан да бигерәк, был тар урындарҙың ҡайҙа булыуын таба белергә кәрәк.
Кешеләрҙең Lisp буйынса бер дәғүәһе — нимәнең ҡыйбатҡа төшкәнен белеү ауыр булыуында. Был дөрөҫ булырға ла мөмкин. Әгәр һеҙ бик абстракт телгә эйә булырға теләһәгеҙ, был ҡотолғоһоҙ ҙа булырға мөмкин. Һәр хәлдә, минеңсә, яҡшы профилирование был проблеманы хәл итеүгә ҙур өлөш индерер ине: һеҙ нимәнең ҡыйбат икәнен тиҙ арала өйрәнер инегеҙ.
Был проблеманың бер өлөшө — социаль. Тел төҙөүселәр етеҙ компиляторҙар яҙырға ярата. Улар үҙ оҫталығын шуның менән үлсәй. Улар профилировщикка иң яҡшы осраҡта өҫтәмә ҡушымта итеп кенә ҡарай. Әммә ғәмәлдә яҡшы профилировщик, ошо телдә яҙылған ысын программаларҙың тиҙлеген арттырыу өсөн, етеҙ код етештереүсе компиляторға ҡарағанда күберәк ярҙам итә ала. Бында ла тел төҙөүселәр үҙ ҡулланыусыларынан бер аҙ айырылған. Улар бер аҙ дөрөҫ булмаған проблеманы бик оҫта хәл итә.
Актив профилировщик яһау яҡшы фекер булыр ине — программалаусының килеп һорағанын көтөп тормайынса, етештереүсәнлек мәғлүмәттәрен уға үҙе ебәрһен. Мәҫәлән, мөхәррир сығанаҡ кодты үҙгәрткән ваҡытта тар урындарҙы ҡыҙыл төҫ менән күрһәтә алыр ине. Тағы бер ысул — эшләп торған программаларҙа нимә бара икәнен нисектер сағылдырыу. Был айырыуса сервер ҡушымталарында ҙур отош бирер ине, сөнки унда ҡарап торорлоҡ бик күп эшләп ятҡан программалар бар. Актив профилировщик программа эшләгән саҡта хәтерҙә нимә булғанын график рәүештә күрһәтә, йәки хатта нимә барыуын белдергән тауыштар сығара алыр ине.
Тауыш — проблемаларҙы аңлау өсөн яҡшы ишара. Мин эшләгән бер урында веб-серверҙарыбыҙҙа нимә булғанын күрһәткән шкалалар менән ҙур таҡта бар ине. Уҡтарҙы борған ваҡытта еңелсә тауыш сығарған бәләкәй сервомоторҙар хәрәкәткә килтерә ине. Мин үҙ өҫтәлемдән таҡтаны күрә алмай инем, әммә серверҙа проблема килеп сыҡһа, тауыштан шунда уҡ белә ала икәнемде аңланым.
Хатта һөҙөмтәһеҙ алгоритмдарҙы автоматик рәүештә асыҡлай торған профилировщик яҙыу ҙа мөмкин булыр ине. Хәтергә мөрәжәғәт итеүҙең ҡайһы бер ҡалыптары насар алгоритмдарҙың аныҡ билдәләре булып сыҡһа, мин ғәжәпләнмәҫ инем. Әгәр компьютер эсендә беҙҙең программаларҙы башҡарып йүгереп йөрөгән бәләкәй генә кеше булһа, уның үҙ эше тураһында һөйләр һүҙе федераль хөкүмәт хеҙмәткәренеке кеүек үк оҙон һәм моңло булыр ине. Мин йыш ҡына процессорҙы бушҡа йүгертәм һымаҡ тойғо кисерәм, әммә уның нимә эшләгәнен ҡарап тороуҙың яҡшы юлы бер ҡасан да булманы.
Бөгөн бер нисә Lisp байт-кодҡа компиляциялана, ә ул һуңынан интерпретатор тарафынан башҡарыла. Ғәҙәттә был күсереп йөрөтөүҙе еңелләштереү өсөн эшләнә, әммә ул телдең файҙалы үҙенсәлеге лә була ала. Байт-кодты телдең рәсми өлөшө итеү һәм программалаусыларға тар урындарҙа эскә ҡуйылған (inline) байт-код ҡулланырға рөхсәт итеү яҡшы фекер булыр ине. Ул саҡта бындай оптимизациялар ҙа күсереп йөрөтмәле булыр ине.
Һуңғы ҡулланыусы тойған тиҙлектең тәбиғәте үҙгәрә бара, шикелле. Сервер ҡушымталарының таралыуы менән, күберәк программалар керетеү-сығарыуға (i/o-bound) бәйле булып сығыуы ихтимал. Керетеү-сығарыуҙы тиҙләтеү файҙалы буласаҡ. Тел ябай, тиҙ, форматланған сығарыу функциялары кеүек тура ысулдар менән дә, кэшлау һәм даими (persistent) объекттар кеүек тәрән структур үҙгәрештәр менән дә ярҙам итә ала.
Ҡулланыусылар яуап ҡайтарыу ваҡыты менән ҡыҙыҡһына. Әммә һөҙөмтәлелектең икенсе төрө лә көндән-көн мөһимерәк буласаҡ: бер процессорға тура килгән бер үк ваҡыттағы ҡулланыусылар һаны. Яҡын киләсәктә яҙыласаҡ күп кенә ҡыҙыҡлы ҡушымталар серверға нигеҙләнгән буласаҡ, һәм бер серверға тура килгән ҡулланыусылар һаны — бындай ҡушымталарҙы урынлаштырған һәр кем өсөн хәлткес һорау. Сервер ҡушымтаһын тәҡдим иткән бизнестың төп сығымдарында был — бүлеүсе.
Йылдар буйы ҡулланыусыларҙың күпселек ҡушымталарында һөҙөмтәлелек ҙур әһәмиәткә эйә булманы. Эшләүселәр һәр ҡулланыусының өҫтәлендә көндән-көн ҡеүәтлерәк процессор торасаҡ тип иҫәпләй ала ине. Һәм Паркинсон законы буйынса, программа тәьминәте булған ресурстарҙы тотоноу өсөн киңәйә барҙы. Сервер ҡушымталары менән был үҙгәрәсәк. Ул донъяла аппарат саралары һәм программа тәьминәте бергә биреләсәк. Сервер ҡушымталарын тәҡдим иткән компаниялар өсөн бер серверға күпме ҡулланыусыны һыйҙыра алыуҙары уларҙың килеменә бик ҙур йоғонто яһаясаҡ.
Ҡайһы бер ҡушымталарҙа процессор сикләүсе фактор буласаҡ, һәм башҡарыу тиҙлеге оптималләштереү өсөн иң мөһим нәмәгә әйләнәсәк. Әммә йыш ҡына сикләүсе булып хәтер торасаҡ; бер үк ваҡыттағы ҡулланыусылар һаны һәр ҡулланыусының мәғлүмәттәре өсөн кәрәк булған хәтер күләме менән билдәләнәсәк. Тел бында ла ярҙам итә ала. Ағымдарға (threads) яҡшы ярҙам бөтә ҡулланыусыларға бер дөйөм өйөмдө (heap) уртаҡлашырға мөмкинлек бирәсәк. Шулай уҡ даими объекттар һәм/йәки ялҡау йөкләүгә (lazy loading) тел кимәлендә ярҙам итеү файҙалы булыуы мөмкин.
9 Ваҡыт
Популяр телгә кәрәк булған һуңғы ингредиент — ул ваҡыт. Бер кем дә, бик күп программалау телдәре кеүек, юҡҡа сығыуы ихтимал булған телдә программалар яҙырға теләмәй. Шуға күрә хакерҙарҙың күбеһе, телде ҡулланыу тураһында уйлай башлар алдынан, уның кәм тигәндә бер-ике йыл йәшәүен көтөргә төҫлө.
Гүзәл яңы нәмәләрҙе уйлап табыусылар быны белгәс йыш ҡына ғәжәпләнә, әммә кешеләргә ниндәй ҙә булһа хәбәрҙе еткереү өсөн ваҡыт кәрәк. Бер танышым кемдер унан берәй нәмә һораһа, уны беренсе тапҡырҙан бер ҡасан да эшләмәй. Ул кешеләрҙең ҡайһы саҡ үҙҙәренә кәрәкмәгән нәмәне һорауҙарын белә. Үҙ ваҡытын әрәм итмәҫ өсөн, ул үҙенән өсөнсө йәки дүртенсе тапҡыр һорағандарын көтә; ул ваҡытҡа һораусы кеше ярайһы уҡ асыуланған булыуы мөмкин, әммә, кәм тигәндә, улар һораған нәмәһенә ысынлап та мохтаж.
Күпселек кешеләр ишеткән яңы нәмәләрен ошондай уҡ ысул менән иләргә өйрәнгән. Улар берәй нәмә тураһында ун тапҡыр ишетмәйенсә, уға иғтибар ҙа итмәй башлай. Улар тулыһынса хаҡлы: яңы шау-шыулы нәмәләрҙең күпселеге ваҡытты бушҡа уҙғарыу булып сыға һәм ахыр сиктә юҡҡа сыға. VRML-ды өйрәнеүҙе кисектереп, мин уны бөтөнләй өйрәнмәүгә ирештем.
Шуға күрә яңы нәмә уйлап тапҡан һәр кем, кешеләр уны аңлай башлағансы, үҙ фекерен йылдар буйы ҡабатларға әҙер булырға тейеш. Беҙ, минең белеүемсә, тәүге веб-серверға нигеҙләнгән ҡушымтаны яҙҙыҡ, һәм кешеләргә уны күсереп алырға (download) кәрәкмәгәнен еткереү өсөн йылдар кәрәк булды. Улар ахмаҡ түгел ине. Улар бары тик беҙгә ҡолаҡ һалмай ине.
Яҡшы яңылыҡ шул: ябай ҡабатлау был проблеманы хәл итә. Һеҙгә бары тик үҙ тарихығыҙҙы һөйләп торорға кәрәк, һәм ваҡыт үтеү менән кешеләр ишетә башлаясаҡ. Кешеләр һеҙҙең барлығығыҙҙы күргәндә түгел, ә һаман да шунда булыуығыҙҙы тойғанда ғына иғтибар итәләр.
Тиҙлек алыу өсөн ғәҙәттә ваҡыт кәрәк булыуы хатта яҡшы. Күпселек технологиялар тәү башлап ебәрелгәндән һуң да ныҡ үҫешә — айырыуса программалау телдәре. Яңы технология өсөн тәүге ҡулланыусыларҙың (early adopters) бәләкәй генә төркөмө тарафынан бер нисә йыл файҙаланылыуҙан да яҡшыраҡ нәмә юҡ. Тәүге ҡулланыусылар — тәжрибәле һәм талапсан, һәм технологияғыҙҙа ҡалған етешһеҙлектәрҙе тиҙ асыҡлай. Ҡулланыусыларығыҙ аҙ булғанда, һеҙ уларҙың һәр береһе менән тығыҙ бәйләнештә була алаһығыҙ. Һәм тәүге ҡулланыусылар, системағыҙҙы яҡшыртҡанда ниндәйҙер ватылыуҙар булһа ла, быны ғәфү итә белә.
Яңы технологияны индереүҙең ике ысулы бар: органик үҫеш ысулы һәм «Ҙур шартлау» (big bang) ысулы. Органик үҫеш ысулына аҡсаһы етмәгән классик гараж стартабы миҫал булып тора. Бер-ике егет, күҙгә салынмай эшләп, ниндәйҙер яңы технология булдыра. Улар уны бер ниндәй маркетингһыҙ сығара һәм башта уларҙың бары тик бер нисә (фанатик рәүештә тоғро) ҡулланыусыһы ғына була. Улар технологияны яҡшыртыуҙы дауам итә, шул уҡ ваҡытта уларҙың ҡулланыусылар базаһы һүҙҙән-һүҙгә күсеп үҫә. Һәм улар һиҙмәй ҙә ҡала — ҙур булып киткәндәр.
Икенсе ысул, «Ҙур шартлау» ысулы — венчур капиталы (VC) ярҙамында барлыҡҡа килгән, көслө маркетинглы стартап. Улар ашығыс рәүештә продукт эшләй, ҙур шау-шыу менән баҙарға сығара һәм шунда уҡ (улар өмөт иткәнсә) ҙур ҡулланыусылар базаһына эйә була.
Ғәҙәттә гараж егеттәре «Ҙур шартлау» егеттәренән көнләшә. «Ҙур шартлау» егеттәре — нәзәкәтле, үҙҙәренә ышанған һәм венчур инвесторҙары тарафынан хөрмәт ителгән. Улар бөтә нәмәнең иң яҡшыһын алырға һәләтле, ә сығарылыш тирәләй барған PR-кампания уларҙы йондоҙҙарға әйләндерә. Ә үҙ гаражында ултырған органик үҫеш егеттәре үҙҙәрен ярлы һәм бер кемгә лә кәрәкмәгән кеүек тоя. Шулай ҙа, минеңсә, уларҙың үҙ-үҙҙәрен йәлләүе йыш ҡына хата. Органик үҫеш «Ҙур шартлау» ысулына ҡарағанда яҡшыраҡ технология һәм байыраҡ нигеҙләүселәр бирә кеүек. Бөгөнгө көндә өҫтөнлөк иткән технологияларға ҡараһағыҙ, уларҙың күбеһенең органик рәүештә үҫкәнен күрерһегеҙ.
Был ҡалып компанияларға ғына ҡағылмай. Һеҙ быны финансланған тикшеренеүҙәрҙә лә күрәһегеҙ. Multics һәм Common Lisp «Ҙур шартлау» проекттары булһа, Unix һәм MacLisp органик үҫеш проекттары ине.
10 Ҡайтанан проектлау (Redesign)
«Иң яҡшы яҙыу — ул ҡайтанан яҙыу», — тип яҙған Э. Б. Уайт. Һәр яҡшы яҙыусы быны белә, һәм был программа тәьминәте өсөн дә дөрөҫ. Проектлауҙың иң мөһим өлөшө — ҡайтанан проектлау. Айырыуса программалау телдәре етәрлек дәрәжәлә ҡайтанан проектланмай.
Яҡшы программа тәьминәте яҙыу өсөн башығыҙҙа бер юлы ике ҡапма-ҡаршы фекерҙе тоторға тейешһегеҙ. Һеҙгә йәш хакерҙың үҙ көсөнә булған бер ҡатлы ышанысы ла, шул уҡ ваҡытта тәжрибәле ветерандың шикләнеүе лә кәрәк. Һеҙ мейегеҙҙең бер яртыһы менән был нисек ауыр булһын инде? тип уйлай белгәндә, икенсе яртыһы менән был бер ҡасан да эшләмәйәсәк тип уйларға тейешһегеҙ.
Сере шунда: бында бер ниндәй ҙә ысын ҡапма-ҡаршылыҡ юҡлығын аңларға кәрәк. Һеҙ ике төрлө нәмәгә ҡарата оптимистик һәм шиксел булырға теләйһегеҙ. Һеҙ проблеманы хәл итеү мөмкинлегенә оптимистик ҡарашта булырға, әммә әлегә тиклем булған теләһә ниндәй сиселештең ҡиммәтенә шикләнеп ҡарарға тейешһегеҙ.
Яҡшы эш башҡарған кешеләр йыш ҡына үҙҙәре эшләгән нәмәне насар тип уйлай. Башҡалар уларҙың эшләгәнен күреп хайран ҡала, ә ижадсы үҙе хәүеф менән тулы була. Был осраҡлылыҡ түгел: эште яҡшы иткән нәмә — тап шул борсолоу.
Әгәр өмөт менән борсолоуҙы тигеҙлектә тота алһағыҙ, улар, һеҙҙең ике аяғығыҙ велосипедты алға этәргән кеүек, проектты алға этәрәсәк. Ике тактлы инновация двигателенең беренсе этабында һеҙ, уны хәл итә алыуығыҙға булған ышанысығыҙҙан рухланып, ниндәйҙер проблема өҫтөндә ярһып эшләйһегеҙ. Икенсе этапта һеҙ эшләгәнегеҙгә иртәнге һалҡын яҡтылыҡта ҡарайһығыҙ һәм уның бөтә етешһеҙлектәрен бик асыҡ күрәһегеҙ. Әммә тәнҡит рухығыҙ өмөтөгөҙҙән өҫтөн сыҡмаһа, һеҙ үҙегеҙҙең тулы булмаған системағыҙға ҡарап, «ҡалғанын эшләү нисек ауыр булһын инде?» тип уйлай аласаҡһығыҙ, һәм шулай итеп цикл дауам итәсәк.
Был ике көстө тигеҙлектә тотоу еңел түгел. Йәш хакерҙарҙа оптимизм өҫтөнлөк итә. Улар ниҙер эшләй, уның шәп булыуына ышана һәм уны бер ҡасан да яҡшыртмай. Ҡарт хакерҙарҙа шикләнеү өҫтөнлөк итә, һәм улар ҙур маҡсатлы проекттарға тотонорға ла баҙнат итмәй.
Ҡайтанан проектлау циклын дауам итеү өсөн эшләй алған һәр нәмәгеҙ яҡшы. Прозаны, үҙегеҙ ҡәнәғәт булғансы, ҡабат-ҡабат үҙгәртеп яҙырға була. Әммә программа тәьминәте, ҡағиҙә булараҡ, етәрлек дәрәжәлә яңынан проектланмай. Прозаның уҡыусылары бар, ә программа тәьминәтенең ҡулланыусылары бар. Әгәр яҙыусы берәй эссены ҡайтанан яҙһа, элекке өлгөһөн уҡыған кешеләр, яңы индерелгән ниндәйҙер тап килмәүсәнлек арҡаһында уйҙарыбыҙ бүленде, тип зарланыуы икеле.
Ҡулланыусылар — ике яҡлы ҡылыс. Улар һеҙгә телде яҡшыртырға ярҙам итә ала, әммә улар һеҙгә уны яҡшыртыуға ҡамасаулай ҙа ала. Шуға күрә ҡулланыусыларығыҙҙы һаҡлыҡ менән һайлағыҙ һәм уларҙың һанын яйлап арттырығыҙ. Ҡулланыусыларға эйә булыу — ул оптимизация кеүек: иң аҡыллы юл — уны кисектереү. Шулай уҡ, дөйөм ҡағиҙә булараҡ, теләһә ниндәй ваҡытта һеҙ уйлағандан да күберәк үҙгәрештәр индерә алаһығыҙ. Үҙгәреш индереү — яра бәйләүесен ҡуптарып алыу кеүек: һыҙланыуҙы һиҙеү менән, ул инде хәтирәгә генә әйләнә.
Телдең комитет тарафынан проектланыуы яҡшы фекер түгел икәнен һәр кем белә. Комитеттар насар дизайн килтерә. Әммә, минеңсә, комитеттарҙың иң ҙур ҡурҡынысы — уларҙың ҡайтанан проектлауға ҡамасаулауында. Үҙгәрештәр индереү шул тиклем күп көс талап итә, хатта бер кем дә бының менән булышырға теләмәй. Комитет нимә генә хәл итмәһен, күпселек ағзаларына оҡшамаһа ла, шул көйө ҡалыуға тартҡан була.
Хатта ике кешенән торған комитет та ҡайтанан проектлауға ҡамасаулай. Был, бигерәк тә, ике төрлө кеше тарафынан яҙылған программа тәьминәте киҫәктәре араһындағы интерфейстарҙа була. Интерфейсты үҙгәртеү өсөн икеһе лә уны бер үк ваҡытта үҙгәртергә ризалашырға тейеш. Шуға күрә интерфейстар бөтөнләй үҙгәрмәй бара, был иһә проблема булып тора, сөнки улар теләһә ниндәй системаның иң осраҡлы (ad hoc) төҙөлгән өлөштәренең береһе була.
Бында бер сиселеш — системаларҙы интерфейстар вертикаль түгел, ә горизонталь булырлыҡ итеп проектлау, йәғни модулдәр һәр ваҡыт вертикаль рәүештә ҡатлам-ҡатлам абстракциялар булып торһон. Ул саҡта интерфейс ғәҙәттә уларҙың береһенә ҡараған булыр. Ике кимәлдең түбәнгеһе йә өҫкөһө яҙылған тел булыр (был осраҡта түбәнге кимәл интерфейс хужаһы булыр), йә ул бойондороҡло булыр (был осраҡта интерфейсты өҫкө кимәл билдәләй ала).
11 Lisp
Быларҙың барыһы ла яңы Lisp өсөн өмөт барлығын аңлата. Хакерҙарға улар теләгән нәмәне биргән теләһә ниндәй тел өсөн, шул иҫәптән Lisp өсөн дә, өмөт бар. Хакерҙарҙы Lisp-тың сәйерлеге ҡурҡыта тип уйлап, беҙ хата яһаныҡ шикелле. Был йыуаныслы яңылышыу беҙгә Lisp-тың, йәки, кәм тигәндә, Common Lisp-тың ысын проблемаһын күрергә ҡамасаулаған булыуы мөмкин: ул хакерҙар эшләргә теләгән нәмәне эшләү өсөн ҡулайһыҙ. Хакер теленә ҡеүәтле китапханалар һәм ватып-төҙәтергә (hack) ниҙер кәрәк. Common Lisp-та икеһе лә юҡ. Хакер теле — ҡыҫҡа һәм еңел үҙгәртелә торған тел. Common Lisp ундай түгел.
Яҡшы яңылыҡ шунда: насар булғаны Lisp түгел, ә тап Common Lisp. Әгәр беҙ ысын хакер теле булған яңы Lisp булдыра алһаҡ, хакерҙар уны ҡулланыр тип уйлайым. Улар эште башҡарған теләһә ниндәй телде ҡулланасаҡ. Беҙгә бары тик был яңы Lisp ниндәйҙер мөһим эште башҡа телдәргә ҡарағанда яҡшыраҡ башҡарыуын тәьмин итергә кәрәк.
Тарих быға дәртләндерә. Ваҡыт үтеү менән бер-бер артлы сыҡҡан яңы программалау телдәре Lisp-тан көндән-көн күберәк үҙенсәлектәр үҙләштерә барҙы. Һеҙ эшләгән тел Lisp булғанға тиклем күсерерлек нәмә күп ҡалманы инде. Һуңғы популяр тел — Python — инфикслы синтаксислы һәм макросһыҙ, шыйыҡландырылған Lisp булып тора. Яңы Lisp был үҫеш юлында тәбиғи аҙым булыр ине.
Мин ҡайһы саҡ уны Python-дың яҡшыртылған өлгөһө тип атау яҡшы маркетинг алымы булыр ине тип уйлайым. Был Lisp һүҙенә ҡарағанда замансараҡ яңғырай. Күптәр өсөн Lisp — күп йәйәләре булған, яй эшләгән яһалма интеллект теле. Фриц Кунце үҙенең рәсми биографияһында «L-һүҙен» атауҙан оҫта ҡаса. Әммә минеңсә, яңы Lisp-ты Lisp тип атауҙан ҡурҡырға ярамай. Иң яҡшы хакерҙар араһында — мәҫәлән, 6.001 курсын үтеп, уны аңлағандарҙа — Lisp әле лә ҙур хөрмәт менән файҙалана. Ә һеҙ яуларға тейешле ҡулланыусылар тап шулар бит инде.
Эрик Реймонд «Нисек хакер булырға» тигән яҙмаһында Lisp-ты латин йәки грек теленә оҡшаш тип тасуирлай — уны ғәмәлдә ҡулланмаһағыҙ ҙа, интеллектуаль күнегеү сифатында өйрәнергә тейешле тел:
Lisp-ты өйрәнеүгә ваҡыт бүлергә кәрәк, сөнки уны аңлап еткәс, һеҙ тәрән асылыу тәжрибәһе кисерәсәкһегеҙ; был тәжрибә һеҙҙе ғүмерегеҙҙең ҡалған өлөшөндә яҡшыраҡ программалаусы итәсәк, хатта үҙегеҙ бер ҡасан да Lisp-ты күп ҡулланмаһағыҙ ҙа.
Әгәр мин Lisp-ты белмәһәм, быны уҡыу миндә һорауҙар тыуҙырыр ине. Мине яҡшыраҡ программалаусы итә торған тел, әгәр был һүҙҙәрҙең мәғәнәһе булһа, программалау өсөн яҡшыраҡ тел тигәнде аңлата. Һәм Эрик әйткән һүҙҙәрҙең төп мәғәнәһе тап шунда.
Был фекер йәшәп килгәндә, хакерҙар яңы Lisp-ты, хатта уны Lisp тип атаһалар ҙа, яҡшы ҡабул итер тип уйлайым. Әммә был Lisp, 1970-се йылдарҙағы классик Lisp-тар кеүек, хакер теле булырға тейеш. Ул ҡыҫҡа, ябай һәм еңел үҙгәртелә торған булырға тейеш. Һәм унда бөгөн хакерҙар эшләргә теләгән эштәрҙе башҡарыу өсөн ҡеүәтле китапханалар булырға тейеш.
Китапханалар мәсьәләһендә, Perl һәм Python кеүек телдәрҙе үҙ уйынында еңеү мөмкинлеге бар, тип уйлайым. Алдағы йылдарҙа яҙылырға тейешле яңы ҡушымталарҙың күбеһе сервер ҡушымталары буласаҡ. Яңы Lisp-та Perl-дағы кеүек яҡшы юлдар (strings) менән эшләү китапханалары булмаҫҡа бер сәбәп тә юҡ, һәм әгәр был яңы Lisp-та шулай уҡ сервер ҡушымталары өсөн дә ҡеүәтле китапханалар булһа, ул бик популяр булыр ине. Ысын хакерҙар бер нисә китапхана саҡырыуы менән ҡатмарлы проблемаларҙы хәл итергә мөмкинлек биргән яңы ҡоралдан баш тартмаясаҡ. Хәтерегеҙҙә тотоғоҙ, хакерҙар — ялҡау халыҡ.
Сервер ҡушымталарына телдең төп кимәлендә ярҙам итеү тағы ла ҙурыраҡ отош булыр ине. Мәҫәлән, күп ҡулланыусылы программалар өсөн асыҡ ярҙам, йәки тип тамғалары кимәлендә мәғлүмәткә хужа булыу (data ownership).
Сервер ҡушымталары был яңы Lisp нимәне боҙоп-төҙәтеү (hack) өсөн ҡулланыласаҡ тигән һорауға ла яуап бирә. Lisp-ты Unix өсөн яҡшыраҡ скрипт теле итеү бер ҙә ҡамасауламаҫ ине. (Уны унан да насарыраҡ итеүе ауыр булыр ине.) Әммә ғәмәлдәге телдәрҙе еңеүе еңелерәк булған өлкәләр бар, тип уйлайым. Минеңсә, Tcl моделенә эйәреп, Lisp-ты сервер ҡушымталарын тәьмин итеү өсөн тулы система менән бергә биреү яҡшыраҡ булыр ине. Lisp сервер ҡушымталары өсөн тәбиғи рәүештә тап килә. Лексик ябылыуҙар (lexical closures), интерфейс бары тик веб-биттәр теҙмәһенән торғанда, эске программалар эффектын алыу юлын бирә. S-аңлатмалар HTML-ға бик яҡшы тура килә, ә макростар уны етештереү өсөн бик ҡулай. Сервер ҡушымталарын яҙыу өсөн яҡшыраҡ ҡоралдар кәрәк, һәм яңы Lisp кәрәк, һәм был икәү бергә бик шәп эшләр ине.
12 Хыялдагы тел
Йомғаҡлау рәүешендә, хакерҙың хыялындағы телде тасуирлап ҡарайыҡ. Хыялдагы тел — матур, таҙа һәм ҡыҫҡа. Уның тиҙ башланып киткән интерактив юғары кимәле (toplevel) бар. Һеҙ ҙур булмаған код менән дөйөм проблемаларҙы хәл итеү өсөн программалар яҙа алаһығыҙ. Һеҙ яҙған һәр программалағы кодтың барыһы ла тиерлек тап һеҙҙең ҡушымтағыҙға хас код була. Ҡалған бөтә нәмә һеҙҙең өсөн алдан эшләнгән.
Телдең синтаксисы үтә лә ҡыҫҡа. Һеҙгә бер ҡасан да артыҡ символ баҫырға, йәки хәтта shift төймәһен күп ҡулланырға кәрәкмәй.
Ҙур абстракциялар ярҙамында программаның беренсе өлгөһөн бик тиҙ яҙа алаһығыҙ. Һуңыраҡ, оптималләштерергә теләгәндә, һеҙгә иғтибарҙы ҡайҙа йүнәлтергә кәрәклеген күрһәткән бик яҡшы профилировщик бар. Һеҙ эске циклдарҙы күҙ асып йомғансы шәп итә алаһығыҙ, кәрәк булһа, хатта эскә ҡуйылған (inline) байт-код яҙа алаһығыҙ.
Өйрәнеү өсөн бик күп яҡшы миҫалдар бар, һәм тел шул тиклем интуитив, хатта уны миҫалдар ярҙамында бер нисә минутта өйрәнә алаһығыҙ. Ҡулланмаға артыҡ ҡарарға кәрәкмәй. Ҡулланма йоҡа, һәм унда киҫәтеүҙәр менән иҫкәрмәләр аҙ.
Телдең бәләкәй үҙәге бар, һәм уның төп тел кеүек үк ентекләп проектланған, ҡеүәтле, үҙ-ара бойондороҡһоҙ (orthogonal) китапханалары бар. Бөтә китапханалар бер-береһе менән яҡшы эшләй; телдәге бөтә нәмә гүзәл фотоаппараттың өлөштәре кеүек бер-береһенә ярашып тора. Бер нәмә лә иҫкергән (deprecated) тип иҫәпләнмәй йәки ярашыусанлыҡ өсөн генә һаҡланмай. Бөтә китапханаларҙың да сығанаҡ коды еңел асыла. Операцион система һәм башҡа телдәрҙә яҙылған ҡушымталар менән бәйләнешкә инеү еңел.
Тел ҡатлам-ҡатлам итеп төҙөлгән. Юғары кимәлдәге абстракциялар түбәнге кимәлдәге абстракцияларҙан бик асыҡ итеп төҙөлгән, һәм теләһәгеҙ, һеҙ уларҙы ҡулығыҙға ала алаһығыҙ.
Һеҙҙән мотлаҡ йәшерергә кәрәк булмаған бер нәмә лә йәшерелмәй. Тел абстракцияларҙы һеҙгә нимә эшләргә кәрәклеген өйрәтеү юлы итеп түгел, ә бары тик эшегеҙҙе еңелләштереү сараһы сифатында ғына тәҡдим итә. Ысынында иһә, тел һеҙҙе уны проектлауҙа тиң хоҡуҡлы ҡатнашыусы булырға дәртләндерә. Һеҙ уның тураһында бөтә нәмәне, шул иҫәптән хатта уның синтаксисын да үҙгәртә алаһығыҙ, һәм һеҙ яҙған һәр нәмә алдан билдәләнгәндәр менән мөмкин тиклем бер тигеҙ статусҡа эйә була.
Иҫкәрмәләр
[1] Хәҙерге заман төшөнсәһенә бик яҡын торған макростарҙы 1964 йылда, Lisp 1.5 сыҡҡандан һуң ике йыл үткәс, Тимоти Харт тәҡдим иткән. Иң башта үҙгәреүсәнде эләктереүҙән (variable capture) һәм күп тапҡыр иҫәпләүҙән ҡотолоу юлдары етмәй ине; Харттың миҫалдары был ике проблемаға ла дусар була.
[2] When the Air Hits Your Brain китабында нейрохирург Фрэнк Вертосик үҙенең өлкән ординаторы Гэриның хирургтар менән терапевтар («бөрсәләр») араһындағы айырма тураһында һөйләшкәнен иҫкә ала:
Гэри менән мин ҙур пиццаға заказ бирҙек һәм буш урын таптыҡ. Шеф тәмәке тоҡандырҙы. «Ҡара әле был ҡәһәр һуҡҡан бөрсәләргә, ғүмерҙәренә бер тапҡыр ғына күрәсәк ниндәйҙер ауырыу тураһында сәпсейҙәр. Бөрсәләрҙең бәләһе шул: улар бары тик сәйер нәмәләрҙе ярата. Көн дә осрай торған ғәҙәти осраҡтарҙы улар күрә алмай. Беҙҙең менән ул ҡәһәр төшкөрө бөрсәләр араһындағы айырма тап шунда. Ҡара, беҙ ҙур, һутлы бил дискы бүҫүен яратабыҙ, ә улар гипертонияны күрә алмай....»
Бил дискы бүҫүен (тура мәғәнәнән башҡа) һутлы тип күҙ алдына килтереүе ауыр. Шулай ҙа мин уларҙың нимәне күҙ уңында тотҡанын аңлайым, шикелле. Эҙәрлекләп табырлыҡ «һутлы» хаталар миндә лә йыш була ине. Программалаусы булмаған кешегә хатала ниндәй ҙә булһа кинәнес булыуын күҙ алдына килтереүе ауыр булыр ине. Әлбәттә, барыһы ла өҙлөкһөҙ эшләп торһа яҡшыраҡ. Бер яҡтан, шулай. Шулай ҙа ҡайһы бер хаталарҙы һунар итеп табыуҙа һис шикһеҙ бер ҡара мөғжизәле ҡәнәғәтлек бар.