(Бу мәкалә яңа тел өчен үзенә күрә бер бизнес-план буларак язылган иде. Шуңа күрә анда яхшы программалаштыру теленең иң мөһим сыйфаты төшеп калган (чөнки ул үзлегеннән аңлашыла торган нәрсә дип кабул ителә): бик көчле абстракцияләр.)
Бервакыт бер дустым танылган операцион системалар белгеченә чыннан да яхшы программалаштыру теле ясарга теләве турында әйткән иде. Белгеч исә аңа бу вакытны бушка уздыру булыр, программалаштыру телләре үзләренең өстенлекләре аркасында популяр яки популяр түгел булып китмиләр, һәм телең никадәр яхшы булса да, аны беркем дә кулланмаячак, дигән. Һәрхәлдә, ул үзе ясаган тел белән нәкъ шулай булган иде.
Телне нәрсә популяр итә соң? Популяр телләр үзләренең популярлыгына чыннан да лаекмы? Яхшы программалаштыру телен билгеләргә тырышу моңа лаекмы? Сез моны ничек эшләр идегез?
Минемчә, бу сорауларга җавапларны хакерларга карап һәм аларның нәрсә теләгәнен өйрәнеп табып була. Программалаштыру телләре хакерлар өчен ясалган, һәм программалаштыру теле (әйтик, денотацион семантика яки компиляторлар төзү өлкәсендәге күнегү булуга караганда) нәкъ менә программалаштыру теле буларак яхшы, әгәр дә һәм фәкать хакерларга ул ошаса гына.
1 Популярлык механикасы
Әлбәттә, күпчелек кешеләр программалаштыру телләрен гади генә үз өстенлекләренә карап сайламыйлар. Күпчелек программистларга нинди тел кулланырга кирәклеген бүтән кеше куша. Шулай да, минемчә, мондый тышкы факторларның программалаштыру телләренең популярлыгына йогынтысы кайвакыт уйланылган дәрәҗәдә зур түгел. Минемчә, зуррак проблема шунда: хакерның яхшы программалаштыру теле турындагы фикере күпчелек тел авторларының карашы белән туры килми.
Икесенең арасында хакерның фикере иң мөһиме булып тора. Программалаштыру телләре — теоремалар түгел. Алар — кешеләр өчен эшләнгән кораллар, һәм аяк киеме кеше аякларына яраклаштырылырга тиеш кебек, алар да кешенең көчле һәм көчсез якларына туры китереп ясалырга тиеш. Әгәр аяк киеме кигәндә кыса икән, ул сын сәнгате әсәре буларак никадәр нәфис булса да, яраксыз аяк киеме.
Бәлки, программистларның күпчелеге яхшы телне яманнан аера алмый торгандыр. Ләкин башка теләсә кайсы корал белән дә хәл шундый ук. Бу яхшы тел проектларга тырышу — вакытны бушка уздыру дигән сүз түгел. Эксперт хакерлар яхшы телне күргәч тә аера алалар, һәм алар аны кулланачаклар. Дөрес, эксперт хакерлар — бик азчылык, ләкин бу кечкенә азчылык барлык яхшы программа тәэминатын яза, һәм аларның йогынтысы зур: калган программистлар алар нинди тел кулланса, шуны кулланырга омтылачак. Еш кына бу хәтта гади йогынты гына түгел, ә боерык булып тора: еш кына эксперт хакерлар үзләре җитәкчеләр яки фәнни җитәкчеләр буларак, башка программистларга нинди тел кулланырга кирәклеген әйтәләр.
Эксперт хакерларның фикере — программалаштыру телләренең чагыштырмача популярлыгын билгеләүче бердәнбер көч түгел (элеккеге иске программалар (Cobol) һәм шау-шу, реклама (Ada, Java) да үз ролен уйный), ләкин озак вакыт эчендә ул иң көчле фактор дип уйлыйм. Башлангыч критик масса һәм җитәрлек вакыт булганда, программалаштыру теле, мөгаен, үзенең лаеклы дәрәҗәсендә популяр булып китәдер. Популярлык исә яхшы телләрне яманнарыннан тагын да ныграк аера, чөнки реаль тере кулланучыларның кире элемтәсе һәрвакыт камилләштерүгә китерә. Теләсә кайсы популяр тел үз гомерендә никадәр үзгәргәненә карагыз. Perl һәм Fortran — экстремаль мисаллар, ләкин хәтта Lisp та нык үзгәрде. Мәсәлән, Lisp 1.5 макрослары юк иде; алар соңрак, MIT хакерлары реаль программалар язу өчен Lisp'ны ике ел кулланганнан соң барлыкка килде. [1]
Шуңа күрә тел популяр булу өчен яхшы булырга тиешме-юкмы, минемчә, яхшы булу өчен тел популяр булырга тиеш. Һәм яхшы булып калу өчен аңа популяр булып калу кирәк. Программалаштыру телләре үсеше бер урында тормый. Шулай да бүген бездә булган Lisp төрләре 1980-еллар уртасында MIT'та булган нәрсәгә бик охшаш булып кала бирә, чөнки бу Lisp'ның җитәрлек зур һәм таләпчән кулланучылар базасы булган соңгы вакыт иде.
Әлбәттә, хакерлар телне куллана алганчы, аның турында белергә тиеш. Алар ничек ишетәчәк? Башка хакерлардан. Ләкин башкалар тел турында гомумән ишетсен өчен, аны кулланучы хакерларның башлангыч төркеме булырга тиеш. Кызык, бу төркем никадәр зур булырга тиеш икән; ничә кулланучы критик массаны тәшкил итә? Уйлап тормастан, егерме дияр идем. Әгәр телнең егерме аерым кулланучысы булса, ягъни аны үз теләге белән кулланырга карар кылган егерме кулланучы, мин аны чын тел дип санар идем.
Мондый нәтиҗәгә ирешү җиңел түгелдер. Нулдән егермегә кадәр җитү егермедән меңгә җитүгә караганда кыенрак булса, мин бөтенләй гаҗәпләнмәс идем. Бу беренче егерме кулланучыны җәлеп итүнең иң яхшы ысулы, бәлки, «троян аты» кулланудыр: кешеләргә алар теләгән һәм нәкъ менә яңа телдә язылган кушымтаны тәкъдим итү.
2 Тышкы факторлар
Әйдәгез, иң элек программалаштыру теленең популярлыгына йогынты ясый торган бер тышкы факторны таныйк. Популяр булу өчен программалаштыру теле популяр бер системаның скрипт теле булырга тиеш. Fortran һәм Cobol — иртә IBM мейнфреймнарының скрипт телләре иде. C теле Unix'ның скрипт теле иде, ә соңрак шулай ук Perl да шундый булды. Tcl — Tk'ның скрипт теле. Java һәм Javascript веб-браузерларның скрипт телләре булыр өчен билгеләнгән.
Lisp гаять зур популярлык казанмаган тел, чөнки ул гаять зур популяр системаның скрипт теле түгел. Аның сакланып калган популярлыгы 1960 һәм 1970-елларга барып тоташа, ул вакытта ул MIT'ның скрипт теле иде. Ул чорның күп кенә бөек программистлары ниндидер вакытта MIT белән бәйле булган. Һәм 1970-еллар башында, C барлыкка килгәнче, MacLisp дип аталган MIT'ның Lisp диалекты җитди хакер кулланырга теләрлек бердәнбер программалаштыру телләренең берсе иде.
Бүген Lisp уртача популяр булган ике системаның скрипт теле булып тора: Emacs һәм Autocad; шул сәбәпле, мин бүген башкарылган күпчелек Lisp программалаштыруы Emacs Lisp яки AutoLisp эчендә башкарыла дип шикләнәм.
Программалаштыру телләре изоляциядә яшәми. «Хакерлык итү» (to hack) — күчемле фигыль, хакерлар гадәттә нәрсәнедер хаклыйлар, һәм гамәлдә телләр аларны нәрсәне хаклау өчен куллансалар, шуңа карап бәяләнә. Димәк, популяр тел ясарга теләсәгез, сезгә я телгә өстәмә берәр нәрсә тәкъдим итәргә, яисә телегезне ниндидер булган системаның скрипт телен алыштырырлык итеп ясарга кирәк.
Common Lisp өлешчә популяр түгел, чөнки ул ятим калган. Башта аның белән хаклау өчен бер система бар иде: Lisp Machine. Ләкин Lisp машиналары (параллель компьютерлар белән бергә) 1980-елларда гомуми тәгаенләнешле процессорларның көчәюе белән юкка чыгарылды. Common Lisp, әгәр Unix өчен яхшы скрипт теле булса, популяр булып кала алыр иде. Ләкин ул, кызганычка каршы, гаять дәрәҗәдә начар скрипт теле.
Бу вазгыятьне аңлатуның бер юлы — тел үз өстенлекләре буенча гына бәяләнми дип әйтү. Икенче караш буенча, программалаштыру теле, әгәр ул берәр нәрсәнең скрипт теле булмаса, чынлыкта программалаштыру теле дә түгел. Бу көтелмәгән хәл булса гына гаделсез булып тоела. Минемчә, бу программалаштыру теленнән, әйтик, реализация (компилятор/интерпретатор) таләп итүдән артык түгел. Бу гади генә программалаштыру теленең бер өлеше.
Әлбәттә, программалаштыру теленә яхшы реализация кирәк, һәм ул бушлай булырга тиеш. Компанияләр программа тәэминаты өчен түләячәк, ләкин аерым хакерлар түләмәячәк, ә сезгә нәкъ менә хакерларны җәлеп итәргә кирәк.
Тел турында шулай ук китап булырга тиеш. Китап юка, яхшы язылган һәм яхшы мисаллар белән тулы булырга тиеш. K&R монда идеал булып тора. Хәзерге вакытта телнең O'Reilly тарафыннан бастырылган китабы булырга тиеш дияр идем. Бу хакерлар өчен мөһимлекнең бер сынавына әйләнеп бара.
Шулай ук онлайн-документация дә булырга тиеш. Чынлыкта, китап башта онлайн-документация буларак башланырга мөмкин. Ләкин мин кәгазь китаплар искергән дип уйламыйм. Аларның форматы уңайлы, һәм нәширләр куйган де-факто цензура — камил булмаса да файдалы фильтр. Китап кибетләре — яңа телләр турында белү өчен иң мөһим урыннарның берсе.
3 Кыскалык
Теләсә кайсы телгә кирәкле өч нәрсәне — бушлай реализацияне, китапны һәм хаклау өчен берәр нәрсәне — бирә алуыгызны күз алдында тотсак, хакерларга ошарлык телне ничек ясарга?
Хакерларга ошый торган бер нәрсә — кыскалык. Математиклар һәм модернист архитекторлар ялкау булган кебек, хакерлар да ялкау: алар артык нәрсәне яратмый. Программа язарга торган хакер, ким дигәндә аң астында, нинди тел сайларга кирәклеген басарга туры киләчәк символларның гомуми саныннан чыгып хәл итә дисәк, чынбарлыктан ерак булмас идек. Хакерларның уйлау рәвеше нәкъ шундый булмаса да, телне эшләүчегә нәкъ шулай дип эш итү файдалы булыр иде.
Кулланучыны инглиз теленә охшатып эшләнгән озын-озак гыйбарәләр белән иркәләргә тырышу — хата. Cobol бу кимчелеге белән билгеле. Хакер өчен
z = x+y
урынына
add x to y giving z
дип язуны сорау — аның акылын кимсетү һәм Аллага каршы гөнаһ кылу арасында бер нәрсә булып күренәчәк.
Кайвакыт 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 версияләре сезгә бөтен нәрсәгә кагылырга мөмкинлек бирә иде. Бу рухның шактый өлеше, бәхеткә каршы, макросларда сакланып калган. Башлангыч кодта ирекле үзгәртүләр ясый алу — нинди искиткеч нәрсә!
Классик макрослар — чын хакер коралы: гади, көчле һәм куркыныч. Аларның нәрсә эшләгәнен аңлау бик җиңел: сез макрос аргументларына функцияне чакырасыз, һәм ул нәрсә кайтарса, шул макрос чакыруы урынына куела. Гигиеник (hygienic) макрослар исә капма-каршы принципны гәүдәләндерә. Алар сезне үзләренең нәрсә эшләгәннәрен аңлаудан сакларга тырышалар. Мин беркайчан да бер җөмлә белән аңлатылган гигиеник макросларны ишеткәнем юк. Һәм алар — программистларның нәрсә теләргә рөхсәт ителгәнен алдан билгеләү куркынычының классик мисалы. Гигиеник макрослар мине башка нәрсәләр белән беррәттән үзгәрүчәнне эләктереп алудан (variable capture) сакларга тиеш, ләкин кайбер макросларда нәкъ менә үзгәрүчәнне эләктереп алу миңа кирәк тә инде.
Чыннан да яхшы тел бер үк вакытта чиста да, пычрак та булырга тиеш: яхшы аңлашылган һәм югары ортогональ операторларның кечкенә үзәге белән чиста проектланган, ләкин хакерларга үз теләгәнчә эш итәргә мөмкинлек бирү мәгънәсендә пычрак. C шундый. Иртә Lisp телләре дә шундый иде. Чын хакер теленең һәрвакыт бераз иркен, җиңелчә кыланмышлы холкы булачак.
Яхшы программалаштыру телендә «программа инженериясе» (software engineering) сүзтезмәсен кулланучы кешеләрне ризасызлык белән баш чайкарга мәҗбүр итә торган үзенчәлекләр булырга тиеш. Шкаланың икенче ягында исә белем бирү өчен яхшы, ләкин бүтән нәрсәгә бик ярап бетми торган әдәплелек үрнәкләре булган Ada һәм Pascal кебек телләр тора.
5 Бер тапкыр кулланыла торган программалар
Хакерлар өчен кызыклы булу өчен, тел алар язарга теләгән программа төрләрен язу өчен яхшы булырга тиеш. Димәк, бәлки гаҗәп тоелыр, ләкин ул бер тапкыр кулланыла торган программалар (throwaway programs) язу өчен дә яхшы булырга тиеш.
Бер тапкыр кулланыла торган программа — ниндидер чикле бурыч өчен тиз генә язган программагыз: система белән идарә итү бурычын автоматлаштыру, симуляция өчен тест мәгълүматларын ясау яки мәгълүматны бер форматтан икенчесенә күчерү программасы. Бер тапкыр кулланыла торган программалар турында гаҗәп нәрсә шул: Икенче бөтендөнья сугышы вакытында бик күп Америка университетларында төзелгән «вакытлы» биналар кебек, аларны еш кына ташламыйлар. Күбесе реаль функцияләре һәм реаль кулланучылары булган чын программаларга әверелә.
Минем уйлавымча, иң яхшы зур программалар тормышын Гувер дамбасы кебек башыннан ук зур итеп проектланудан түгел, ә нәкъ менә шулай башлыйлар. Баштан ук бик зур нәрсәне төзү — куркыныч. Кешеләр бик зур проектка алынгач, алар югалып калалар. Проект я сазлыкка бата, яисә нәтиҗә җансыз һәм коры була: чын шәһәр үзәге урынына сәүдә үзәге, Рим урынына Бразилиа, C урынына Ada барлыкка килә.
Зур программага ирешүнең икенче юлы — аны бер тапкыр кулланыла торган программадан башлау һәм аны гел яхшырта бару. Бу алым артык куркыныч түгел, һәм программаның конструкциясе эволюциядән отыш ала. Әгәр карасак, минемчә, күпчелек зур программалар нәкъ менә шулай эшләнгән булып чыгачак. Һәм шулай үскәннәр, мөгаен, әле дә башта нинди телдә язылган булсалар, шул телдә калалар, чөнки программаны бүтән телгә күчерү сәяси сәбәпләрдән тыш бик сирәк очрый. Шуңа күрә, парадоксаль рәвештә, әгәр зур системалар өчен кулланыла торган тел ясарга теләсәгез, сез аны бер тапкыр кулланыла торган программалар язу өчен уңайлы итәргә тиеш, чөнки зур системалар нәкъ шуннан туа.
Perl — бу фикернең ачык мисалы. Ул бер тапкыр кулланыла торган программалар язу өчен генә проектланмаган, ә үзе дә гамәлдә шундый бер программа иде. Perl тормышын хисаплар төзү өчен кулланылган утилитлар җыелмасы буларак башлады һәм анда язылган вакытлы программалар зурайган саен гына программалаштыру теленә әверелде. Perl 5 чыкканчы (әгәр ул вакытта да булса), тел җитди программалар язу өчен яраклы түгел иде, әмма ул инде гаять популяр иде.
Телне бер тапкыр кулланыла торган программалар өчен нәрсә уңайлы итә? Беренчедән, ул җиңел табылырга тиеш. Бер тапкыр кулланыла торган программа — сез бер сәгать эчендә язарга өметләнгән нәрсә. Димәк, тел, мөгаен, сез кулланган компьютерда инде урнаштырылган булырга тиеш. Ул сезгә кулланыр алдыннан урнаштырырга кирәк булган нәрсә була алмый. Ул шунда булырга тиеш. C шунда иде, чөнки ул операцион система белән бергә килде. Perl шунда иде, чөнки ул башта система администраторлары өчен корал иде, һәм сезнең администраторыгыз аны инде урнаштырган иде.
Гамәлдә булу бары тик урнаштырылган булудан артыгракны аңлата. Команда юлы интерфейсы булган интерактив тел, аерым компиляцияләргә һәм эшләтеп җибәрергә кирәк булган телгә караганда, тизрәк кулланышка керергә әзер. Популяр программалаштыру теле интерактив булырга һәм тиз эшләтеп җибәрелергә тиеш.
Бер тапкыр кулланыла торган программада кирәк булган тагын бер нәрсә — кыскалык. Кыскалык хакерлар өчен һәрвакыт кызыклы, ә бер сәгатьтә язып бетерергә теләгән программада бу аеруча мөһим.
6 Китапханәләр
Әлбәттә, иң югары кыскалык — программаның сезнең өчен инде язылган булуы һәм сезгә аны бары тик чакыру гына калуы. Бу безне программалаштыру телләренең көннән-көн мөһимрәк үзенчәлегенә китерә: китапханә функцияләренә. Perl юллар (хәрефләр тезмәсе) белән эшләү өчен зур китапханәләргә ия булганга җиңә. Бу класс китапханә функцияләре бер тапкыр кулланыла торган программалар өчен аеруча мөһим, чөнки алар еш кына мәгълүматны конвертацияләү яки чыгарып алу өчен языла. Күп кенә 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 — үзенә күрә аерым бер тел, һәм бу тел Lisp түгел. Әгәр Lisp'ка күбрәк синтаксис кертү планы булса, формат спецификаторларын аңа кертеп булыр иде. Макрослар башка теләсә нинди кодны ясаган кебек, формат спецификаторларын да ясый алса, яхшы булыр иде.
Танылган Lisp хакеры миңа үзенең CLTL китабының нәкъ менә format бүлегендә ачылып китүен әйтте. Минеке дә шулай. Бу, мөгаен, камилләштерү өчен урын барлыгын күрсәтәдер. Шулай ук бу программаларның күп кенә кертү/чыгару (I/O) башкаруын да аңлатырга мөмкин.
8 Эффективлык
Яхшы тел, һәркемгә билгеле булганча, тиз код генерацияләргә тиеш. Ләкин гамәлдә тиз код барыннан да элек телне проектлаганда эшләгән нәрсәләрдән килеп чыкмый дип уйлыйм. Кнут күптән түгел күрсәткәнчә, тизлек бары тик кайбер критик тыгыннарда (тар җирләрдә) гына мөһим. Һәм шуннан бирле күп кенә программистлар күзәткәнчә, кеше бу тар урыннарның кайда булуы турында бик еш ялгыша.
Шулай итеп, практикада тиз код алуның юлы — телне, әйтик, катгый типлаштырылган итү түгел, ә бик яхшы профилировщикка ия булу. Сезгә программадагы һәр чакыруда һәр аргументның тибын белү кирәкми. Сезгә иң тар урыннардагы аргументларның типларын игълан итә белү кирәк. Һәм тагын да мөһимрәге, сезгә ул тар урыннарның кайда икәнен таба белү кирәк.
Кешеләрнең Lisp белән бәйле бер зарлануы шуннан гыйбарәт иде: анда нәрсәнең кыйммәткә төшүен аңлавы кыен. Бу дөрес тә булырга мөмкин. Әгәр сез бик абстракт тел телисез икән, бу котылгысыз да булырга мөмкин. Һәм теләсә кайсы очракта да, яхшы профилирование бу проблеманы чишүгә зур өлеш кертер иде дип уйлыйм: нәрсә кыйммәткә төшүен сез тиз арада өйрәнер идегез.
Мондагы проблеманың бер өлеше — социаль. Тел төзүчеләр тиз компиляторлар язарга ярата. Үз осталыкларын алар шулай үлчи. Алар профилировщикка иң яхшы очракта да өстәмә нәрсә буларак карый. Ләкин практикада яхшы профилировщик, телне кулланып язылган реаль программаларның тизлеген арттыру өчен, тиз код тудыручы компиляторга караганда күбрәк файда китерергә мөмкин. Монда да тел төзүчеләр үз кулланучыларыннан бераз аерылган. Алар бераз башка, ялгышрак проблеманы бик яхшы чишә.
Актив профилировщик ясау яхшы фикер булыр иде — эшчәнлек мәгълүматларын программачы үзе сораганны көтеп тормыйча, аңа үзеннән тәкъдим итеп тору. Мәсәлән, программачы башлангыч кодны үзгәрткәндә, редактор тар урыннарны кызыл төс белән күрсәтә алыр иде. Тагын бер алым — эшләүче программаларда ни барганын ничектер визуальләштерү. Бу аеруча серверга нигезләнгән кушымталарда зур отыш бирер иде, чөнки анда карап торырлык бик күп эшләүче программалар бар. Актив профилировщик программа эшләгән вакытта хәтердә ни барганын график рәвештә күрсәтә, хәтта ни булып ятканын белдерүче тавышлар да чыгара алыр иде.
Тавыш — проблемаларны сизеп алу өчен яхшы билге. Мин эшләгән бер урында веб-серверларыбызда ни барганын күрсәтүче шкалалары булган зур табло бар иде. Телләрне кечкенә сервомоторлар йөртә иде, һәм алар борылганда җиңелчә тавыш чыгара иде. Мин өстәлем артыннан ул таблоны күрә алмый идем, ләкин сервер белән берәр проблема килеп чыгуын тавышыннан шундук аңлый алуымны ачыкладым.
Хәтта нәтиҗәсез алгоритмнарны автоматик рәвештә ачыклый торган профилировщик язу да мөмкин булыр иде. Хәтергә мөрәҗәгать итүнең кайбер модельләре начар алгоритмнарның шиксез билгесе булып чыкса, мин бөтенләй гаҗәпләнмәс идем. Әгәр санак эчендә безнең программаларны үтәп йөрүче бер бәләкәй кеше булса, аның үз эше турында сөйләрлек зарлы һәм озын хикәясе федераль хөкүмәт хезмәткәреннекеннән ким булмас иде мөгаен. Миндә еш кына процессорны буш эш артыннан кудырам дигән хис туа, ләкин аның нәрсә белән шөгыльләнүен күзәтергә минем беркайчан да яхшы җаем булмады.
Бүгенге көндә кайбер Lisp системалары байт-кодка компиляцияләнә, ә ул аннары интерпретатор тарафыннан үтәлә. Бу гадәттә реализацияне башка платформаларга күчерүне җиңеләйтү өчен эшләнә, ләкин ул файдалы тел үзенчәлеге дә була алыр иде. Байт-кодны телнең рәсми өлеше итү һәм программачыларга иң тар урыннарда эчкә кертелгән (inline) байт-код кулланырга рөхсәт итү яхшы фикер булыр иде. Шул вакытта мондый оптимизацияләр дә күчерелә торган булыр иде.
Ахыргы кулланучы кабул иткән тизлек төшенчәсенең табигате үзгәрергә мөмкин. Сервер кушымталарының артуы белән, күбрәк программаларның кереш/чыгыш (i/o) тизлегенә бәйле булуы ачыкланырга мөмкин. Кереш/чыгышны тиз итү файдалы булачак. Тел моңа гади һәм тиз форматланган чыгару функцияләре кебек ачык чаралар белән дә, шулай ук кэшлау һәм тотрыклы (persistent) объектлар кебек тирән структур үзгәрешләр белән дә ярдәм итә ала.
Кулланучыларны җавап бирү вакыты кызыксындыра. Ләкин нәтиҗәлелекнең тагын бер төре көннән-көн мөһимрәк булачак: бер процессор күтәрә алган бер үк вакыттагы кулланучылар саны. Якын киләчәктә язылачак кызыклы кушымталарның күбесе серверга нигезләнгән булачак, һәм бер серверга төшкән кулланучылар саны мондый кушымталарны урнаштыручы һәркем өчен хәлиткеч сорау булып тора. Сервер кушымтасын тәкъдим итүче бизнесның төп чыгымнарында бу — бүлүче сан.
Еллар буе кулланучылар кушымталарының күбесендә нәтиҗәлелек әллә ни мөһим булмады. Эшләүчеләр һәр кулланучының өстәлендә көннән-көн көчлерәк процессор торачак дип исәпли алды. Һәм Паркинсон кануны буенча, программа тәэминаты булган ресурсларны куллану өчен киңәйде. Сервер кушымталары белән бу хәл үзгәрәчәк. Ул дөньяда аппарат тәэминаты белән программа тәэминаты бергә биреләчәк. Сервер кушымталарын тәкъдим итүче ширкәтләр өчен бер серверда күпме кулланучыга хезмәт күрсәтә алулары аларның саф табышында бик зур аерма ясаячак.
Кайбер кушымталарда процессор чикләүче фактор булачак, һәм үтәлү тизлеге оптимизацияләнәсе иң мөһим нәрсә булып торачак. Әмма еш кына чик хәтер булачак; берьюлы эшли торган кулланучылар саны һәр кулланучының мәгълүматлары өчен кирәк булган хәтер күләме белән билгеләнәчәк. Тел монда да булыша ала. Агымнарны (threads) яхшы тәэмин итү барлык кулланучыларга бер үк кучаны (heap) уртаклашырга мөмкинлек бирәчәк. Шулай ук тотрыклы объектлар һәм/яисә ялкау йөкләүне (lazy loading) тел дәрәҗәсендә хуплау да ярдәм итә ала.
9 Вакыт
Популяр телгә кирәк булган соңгы ингредиент — вакыт. Бик күп программалаштыру телләре юкка чыккан кебек, юкка чыгарга мөмкин булган телдә беркемнең дә программа язасы килми. Шуңа күрә күпчелек хакерлар, телне куллану турында уйлый башлаганчы да, аның берничә ел яшәвен көтүне өстен күрәчәк.
Гадәттән тыш яңа әйберләр уйлап табучылар моны белгәч еш гаҗәпләнә, ләкин кешеләргә нинди дә булса фикерне җиткерү өчен сезгә вакыт кирәк. Бер дустым кешеләр аңардан нәрсәдер сораган беренче очракта аны сирәк эшли. Ул кешеләрнең кайчак үзләренә кирәк тә булмаган нәрсәне сорауларын белә. Үз вакытын әрәм итмәс өчен, ул шул эшне эшләргә өченче я дүртенче тапкыр сораганнарын көтә; ул вакытка сораучы кеше шактый ачуланган булырга мөмкин, ләкин ким дигәндә алар үзләре сораган нәрсәне чыннан да телиләр дигән сүз.
Күпчелек кешеләр ишеткән яңа нәрсәләренә карата шундый ук фильтр кулланырга өйрәнгән. Берәр нәрсә турында ун тапкыр ишетмичә, алар аңа игътибар да итми башлый. Алар бөтенләй хаклы: мактаулы яңа нәрсәләрнең күбесе вакытны бушка уздыру булып чыга һәм ахыр чиктә югала. VRML өйрәнүне кичектереп, мин аны бөтенләй өйрәнүдән котылдым.
Шуңа күрә ниндидер яңа нәрсә уйлап тапкан һәркем, кешеләр моны аңлый башлаганчы, үз сүзен еллар буе кабатларга әзер булырга тиеш. Без, минем белүемчә, беренче веб-сервер кушымтасын яздык, һәм кешеләргә аны санакка күчереп алырга кирәк түгеллеген аңлату өчен безгә еллар кирәк булды. Алар юләр булганга түгел. Алар бары тик безгә колак салмый иде.
Яхшы ягы шул: гади кабатлау проблеманы чишә. Сезгә бары тик үз тарихыгызны сөйләүдән туктамаска кирәк, һәм ахыр чиктә кешеләр ишетә башлар. Кешеләр сезнең барлыгыгызны сизгәндә түгел, ә сезнең һаман да шунда булуыгызны сизгәндә генә игътибар итә башлый.
Гадәттә көч туплау өчен күпмедер вакыт кирәк булуы — үзе бер яхшылык. Күпчелек технологияләр беренче тапкыр эшләтеп җибәрелгәннән соң да бик нык үсә — программалаштыру телләре бигрәк тә. Яңа технология өчен аны баштагы берничә елда аз санлы беренче кулланучыларның гына куллануыннан да яхшырак нәрсә юк. Беренче кулланучылар таләпчән һәм тәҗрибәле була, һәм алар технологиягездә калган барлык кимчелекләрне тиз арада фаш итәчәк. Сезнең кулланучыларыгыз аз булганда, сез аларның һәрберсе белән якыннан аралаша аласыз. Һәм сез системагызны камилләштергәндә, бу хәтта кайбер җирләрнең ватылуына китерсә дә, беренче кулланучылар кичерүчән була.
Яңа технологиянең таралуының ике юлы бар: органистик үсеш ысулы һәм «зур шартлау» (big bang) ысулы. Органистик үсеш ысулының мисалы — классик, үз көче белән генә башланган, акчасы җитмәгән гараж стартапы. Берничә егет, беркемгә билгесез килеш эшләп, ниндидер яңа технология булдыра. Алар аны бернинди маркетингсыз чыгара һәм башта бик аз (ләкин чиксез тугры) кулланучыга гына ия була. Алар технологияне яхшыртуларын дәвам итә, ә шул арада аларның кулланучылар базасы телдән-телгә күчеп үсә. Ничек булганын аңлап та өлгермиләр, алар зур булып җитешә.
Икенче караш, «зур шартлау» ысулы — венчур капиталы белән тәэмин ителгән, көчле маркетинглы стартап мисалында. Алар продуктны ясарга ашыга, аны зур тавыш белән чыгара һәм шунда ук (өмет итүләренчә) зур кулланучылар базасына ия була.
Гадәттә гараж егетләре «зур шартлау» егетләреннән көнләшә. Зур шартлау егетләре купшы, үзләренә ышанган һәм венчур инвесторлары тарафыннан хөрмәт ителгән була. Алар иң яхшы нәрсәләрне сатып ала ала, ә продуктны чыгару тирәсендәге PR кампаниясе өстәмә рәвештә аларны танылган шәхесләргә әйләндерә. Үз гаражларында утырган органистик үсеш егетләре исә үзләрен ярлы һәм беркемгә кирәксез итеп хис итә. Шулай да, аларның үз-үзләрен жәлләве еш кына ялгыш дип саныйм. Органистик үсеш «зур шартлау» ысулына караганда яхшырак технология һәм баерак нигезләүчеләр китерә кебек. Әгәр сез бүгенге өстенлекле технологияләргә карасагыз, аларның күбесенең органистик рәвештә үскәнен күрерсез.
Бу кагыйдә компанияләргә генә кагылмый. Сез моны финансланган тикшеренүләрдә дә күрәсез. Multics һәм Common Lisp «зур шартлау» проектлары булса, Unix һәм MacLisp органистик үсеш проектлары иде.
10 Кабат проектлау (Redesign)
«Иң яхшы язу — ул яңадан язу», — дип язган Э. Б. Уайт. Һәр яхшы язучы моны белә, һәм бу программа тәэминатына да кагыла. Проектлауның иң мөһим өлеше — ул яңадан проектлау. Программалаштыру телләрен, аеруча, җитәрлек дәрәҗәдә яңадан проектламыйлар.
Яхшы программа язу өчен сез берьюлы башыгызда ике капма-каршы фикерне тотарга тиешсез. Сезгә яшь хакерның үз көченә карата самими ышанычы, һәм шул ук вакытта тәҗрибәле ветеранның скептицизмы кирәк. Сез миегезнең бер яртысы белән моның нәрсәсе кыен булсын инде? дип, ә икенче яртысы белән бу беркайчан да эшләмәячәк дип уйлый белергә тиешсез.
Мондагы сер шунда: чынлыкта бернинди каршылык юклыгын аңлау кирәк. Сез ике төрле нәрсәгә оптимистик һәм скептик карашта булырга тиеш. Сез проблеманың чишелү мөмкинлегенә оптимистик, әмма хәзергә кадәр булган чишелешегезнең кыйммәтенә скептик карарга тиешсез.
Яхшы эш башкарган кешеләр еш кына үзләре эшләгән нәрсәне яраксыз дип саный. Башкалар аларның эшләгәнен күреп соклана, ә авторның күңеле исә борчу белән тулы. Бу гадәт очраклы түгел: нәкъ менә шул борчу эшне яхшы иткән дә инде.
Әгәр сез өмет белән борчуны тигезлектә тота алсагыз, алар ике аягыгыз велосипедны алга этәргән кебек үк проектны алга этәрәчәк. Ике тактлы инновация йөрткеченең беренче этабында, сез аны чишә алачагыгызга ышанып, ниндидер проблема өстендә ярсып эшлисез. Икенче этабында, иртәнге салкын яктылыкта эшләгәнегезгә карыйсыз һәм аның бөтен кимчелекләрен бик ачык күрәсез. Ләкин сезнең тәнкыйди рухыгыз өметегезне басып китмәгән вакытта, сез үз системагызның тулы түгеллеген күреп тә: «Калганын бетерүнең нәрсәсе кыен булсын инде?» — дип уйлый аласыз, һәм шуның белән циклны дәвам итәсез.
Бу ике көчне тигезлектә тоту җиңел түгел. Яшь хакерларда оптимизм өстенлек итә. Алар берәр нәрсә ясый, аның шәп булуына ышана һәм аны беркайчан да камилләштерми. Олы хакерларда исә скептицизм өстенлек итә, һәм алар хәтта амбицияле проектларга тотынырга да базмый.
Яңадан проектлау циклын саклап калу өчен сез эшли алган һәр нәрсә яхшы. Прозаны сез үзегез канәгать булганчы кат-кат яңадан яза аласыз. Әмма программа тәэминатын, кагыйдә буларак, җитәрлек дәрәҗәдә яңадан проектламыйлар. Прозаның укучылары бар, ә программа тәэминатының — кулланучылары. Әгәр язучы эссене яңадан язса, элеккеге юраманы укыган кешеләр, яңа кертелгән ярашсызлык аркасында фикерләребез өзелде, дип зарланмас мөгаен.
Кулланучылар — ул ике ягы да үткен кылыч. Алар сезгә телегезне яхшыртырга ярдәм итә ала, ләкин алар сезне аны яхшыртудан туктатырга да мөмкин. Шуңа күрә кулланучыларыгызны җентекләп сайлагыз, һәм аларның санын арттыруга ашыкмагыз. Кулланучыларга ия булу оптимизация кебек: иң акыллы юл — аны тоткарлап тору. Шулай ук, гадәти кагыйдә буларак, теләсә кайсы вакытта сез үзегез уйлаганнан да күбрәк үзгәреш кертергә җөрьәт итә аласыз. Үзгәрешләр кертү пластырьны йолкып алу кебек: авыртуны тойганчы ук ул инде истәлеккә әйләнә.
Телне комитет проектлавы яхшы фикер түгеллеген һәркем белә. Комитетлар начар дизайн тудыра. Ләкин минемчә, комитетларның иң зур куркынычы — алар яңадан проектлауга комачаулый. Үзгәрешләр кертү шулкадәр зур хезмәт таләп итә ки, беркемнең дә моның белән мәшәкатьләнәсе килми. Комитет нәрсә генә карар кылмасын, әгъзаларның күбесенә бу ошамаса да, гадәттә шул килеш кала.
Хәтта ике кешедән торган комитет та яңадан проектлауга юл куймый. Бу аеруча ике төрле кеше язган программа өлешләре арасындагы интерфейсларда килеп чыга. Интерфейсны үзгәртү өчен икесенә дә аны берьюлы үзгәртергә ризалашырга кирәк. Һәм шулай итеп интерфейслар бөтенләй үзгәрми торган булып кала, ә бу — проблема, чөнки алар теләсә кайсы системаның иң уйланылмаган өлешләренең берсе булырга омтыла.
Мондагы бер чишелеш — системаларны интерфейслар вертикаль түгел, ә горизонталь булырлык итеп проектлау, ягъни модульләр һәрвакыт вертикаль рәвештә өелгән абстракция катламнары булырга тиеш. Ул вакытта интерфейс шуларның берсенә караячак. Ике дәрәҗәнең түбәнрәге я югары дәрәҗә язылган тел булачак (бу очракта түбәнге катлам интерфейска ия булачак), яисә ул буйсынучы булачак (бу очракта интерфейсны югарыгы дәрәҗә билгели алачак).
11 Lisp
Болар барысы да нәрсә аңлата дигәндә, яңа Lisp өчен өмет бар. Хакерларга алар теләгән нәрсәне бирә торган теләсә кайсы тел өчен, шул исәптән Lisp өчен дә өмет бар. Минемчә, хакерлар Lisp'ның сәерлегеннән курка дип уйлап, без ялгышканбыздыр. Бу тынычландыручы иллюзия безгә Lisp, яки ким дигәндә Common Lisp белән булган чын проблеманы күрергә комачаулагандыр: ул хакерлар эшләргә теләгән эшләр өчен бөтенләй яраксыз. Хакерлар теленә көчле китапханәләр һәм программалаштыру (hack) өчен берәр нәрсә кирәк. Common Lisp'та икесе дә юк. Хакерлар теле кыска һәм сыгылмалы (hackable). Common Lisp исә алай түгел.
Яхшы ягы шул: Lisp үзе түгел, ә Common Lisp начар. Әгәр без чын хакерлар теле булган яңа Lisp ясый алсак, минемчә, хакерлар аны кулланачак. Алар эшне башкара торган теләсә кайсы телне кулланачак. Безгә бары тик бу яңа Lisp'ның кайбер мөһим эшләрне башка телләргә караганда яхшырак башкаруын тәэмин итәргә кирәк.
Тарих моңа өмет уята. Вакыт узу белән, бер-бер артлы чыккан яңа программалаштыру телләре Lisp'тан күбрәк үзенчәлекләр алды. Сез ясаган тел Lisp'ка әйләнгәнче күчереп алырлык әйбер күп калмады инде. Соңгы популяр тел булган Python — инфикс синтаксислы һәм макросларсыз камилләштерелмәгән (сыекландырылган) Lisp ул. Яңа Lisp бу эволюциядә табигый адым булыр иде.
Кайвакыт мин аны Python'ның яхшыртылган юрамасы дип атау яхшы маркетинг алымы булыр иде дип уйлыйм. Бу Lisp'ка караганда заманчарак яңгырый. Күпләр өчен Lisp — ул күп җәяләре булган ясалма интеллект өчен акрын тел. Фриц Кунце үзенең рәсми биографиясендә «L» хәрефеннән башланган сүзне телгә алудан саклык белән кача. Ләкин минем уйлавымча, без яңа Lisp'ны Lisp дип атарга курыкмаска тиешбез. Иң яхшы хакерлар — мәсәлән, 6.001 курсын үтеп, аны аңлаганнар арасында Lisp һаман да яшерен зур хөрмәткә ия. Ә сезгә нәкъ менә шул кулланучыларны яулап алырга кирәк.
«Хакер булу юлы» (How to Become a Hacker) китабында Эрик Рэймонд Lisp'ны латин яки грек теле кебек нәрсә дип сурәтли — аны сез, хәтта чынлыкта кулланмаячак булсагыз да, интеллектуаль күнегү буларак өйрәнергә тиешсез:
Lisp'ны сез аны аңлап җиткәч кичерәчәк тирән яктырыну тәҗрибәсе өчен өйрәнергә кыйммәт; ул тәҗрибә сезне калган гомерегез буена яхшырак программачы итәчәк, хәтта Lisp'ның үзен беркайчан да күп кулланмасагыз да.
Әгәр мин Lisp'ны белмәсәм, моны уку миндә сораулар тудырыр иде. Мине яхшырак программачы итә торган тел, әгәр аның гомумән нинди дә булса мәгънәсе булса, программалаштыру өчен яхшырак тел булуын аңлата. Һәм чынлыкта Эрик сүзләренең асылы да шуннан гыйбарәт.
Бу фикер әле дә яшәп килгәндә, хәтта Lisp дип аталса да, хакерлар яңа Lisp'ны яхшы кабул итәр дип уйлыйм. Ләкин бу Lisp, 1970 еллардагы классик Lisp'лар кебек үк, хакерлар теле булырга тиеш. Ул кыска, гади һәм сыгылмалы булырга тиеш. Һәм аның хакерлар хәзер эшләргә теләгән эшләр өчен көчле китапханәләре булырга тиеш.
Китапханәләр мәсьәләсендә, Perl һәм Python кебек телләрне үз уеннарында җиңәргә мөмкинлек бар дип саныйм. Киләсе елларда языласы күп кенә яңа кушымталар серверга нигезләнгән кушымталар булачак. Яңа Lisp'ның Perl дәрәҗәсендә яхшы юллар белән эшләү китапханәләре булмаска бернинди сәбәп юк, һәм әгәр бу яңа Lisp'та сервер кушымталары өчен дә көчле китапханәләр булса, ул бик популярлаша алыр иде. Чын хакерлар берничә китапханә чакыруы белән кыен проблемаларны чишәргә мөмкинлек бирүче яңа коралга борын төртмәячәк. Онытмагыз, хакерлар ялкау.
Әгәр телнең төбендә сервер кушымталары өчен турыдан-туры хуплау булса, бу тагын да зуррак отыш булыр иде. Мәсәлән, күп кулланучылы программаларны ачык хуплау яки тип тамгалары дәрәҗәсендә мәгълүматка хуҗа булу.
Сервер кушымталары шулай ук бу яңа Lisp'ның нәрсә язу өчен кулланылачагы турындагы сорауга җавап бирә. Lisp'ны Unix өчен скрипт теле буларак яхшырту начар булмас иде. (Аны моннан да начаррак итү кыен булыр иде.) Ләкин булган телләрне җиңелрәк җиңеп була торган өлкәләр бар дип уйлыйм. Минемчә, Tcl моделенә ияреп, Lisp'ны сервер кушымталарын хуплауның тулы бер системасы белән бергә тәкъдим итү яхшырак булыр иде. Lisp сервер кушымталары өчен табигый рәвештә туры килә. Кулланучы интерфейсы бары тик веб-битләр сериясеннән генә гыйбарәт булганда, лексик йомылулар (lexical closures) ярдәмче программалар (subroutines) эффектына ирешү юлын бирә. S-аңлатмалар HTML'га бик яхшы туры килә, ә макрослар аны генерацияләү өчен бик уңайлы. Сервер кушымталарын язу өчен яхшырак кораллар кирәк, һәм яңа Lisp кирәк, ә бу икесе бергә бик яхшы эшләр иде.
12 Хыялдагы тел
Йомгаклап әйткәндә, әйдәгез, хакерның хыялындагы телен сурәтләп карыйк. Хыялдагы тел — матур, пөхтә һәм кыска. Аның тиз башланып китә торган интерактив югары дәрәҗәсе (toplevel) бар. Сез гадәти проблемаларны чишү өчен программаларны бик аз код белән яза аласыз. Сез язган теләсә кайсы программадагы бөтен код диярлек нәкъ сезнең кушымтагызга гына хас кодтан тора. Калган барлык нәрсә сезнең өчен инде эшләнгән.
Телнең синтаксисы җиренә җиткереп кыска. Сезгә беркайчан да кирәкмәгән билгене язарга, яки хәтта shift төймәсен күп кулланырга кирәкми.
Зур абстракцияләр кулланып, сез программаның беренче юрамасын бик тиз яза аласыз. Соңрак, сез оптимизацияләргә теләгәндә, игътибарыгызны кая юнәлтергә кирәклеген әйтүче бик яхшы профилировщик бар. Сез эчке циклларны искиткеч тиз итә аласыз, кирәк булса хәтта эчкә кертелгән байт-код язып та.
Өйрәнү өчен бик күп яхшы мисаллар бар, һәм тел интуитив дәрәҗәдә шулкадәр аңлаешлы ки, сез аны мисаллар аша берничә минут эчендә кулланырга өйрәнә аласыз. Сезгә кулланмага күп карарга кирәкми. Кулланма юка, һәм анда кисәтүләр белән искәрмәләр аз.
Телнең кечкенә үзәге, һәм телнең үзәге кебек үк җентекләп проектланган көчле, бик ортогональ китапханәләре бар. Китапханәләрнең барысы да үзара яхшы эшли; телдәге һәр нәрсә яхшы фотоаппаратның детальләре кебек бер-берсенә туры килә. Бернәрсә дә искергән (deprecated) дип игълан ителмәгән һәм ярашу хакына гына калдырылмаган. Барлык китапханәләрнең башлангыч коды җиңел ачыла. Операцион система белән һәм башка телләрдә язылган кушымталар белән элемтәгә керүе җиңел.
Тел катламнардан төзелгән. Югары дәрәҗәдәге абстракцияләр, теләсәгез үзегез куллана алырлык түбән дәрәҗәдәге абстракцияләрдән бик үтә күренмәле итеп төзелгән.
Һичшиксез яшерелергә тиеш булмаган бернәрсә дә сездән яшерелми. Тел сезгә нәрсә эшләргә кирәклеген кушу чарасы буларак түгел, ә бары тик сезнең хезмәтегезне җиңеләйтү чарасы буларак кына абстракцияләр тәкъдим итә. Чынлыкта, тел сезне аны проектлауда тигез хокуклы катнашучы булырга өнди. Сез андагы һәр нәрсәне, хәтта синтаксисын да үзгәртә аласыз, һәм сез язган теләсә нинди нәрсә, мөмкин кадәр, башта ук билгеләнгән нәрсәләр белән бер үк статуска ия.
Искәрмәләр
[1] Хәзерге заманча төшенчәгә бик якын булган макросларны Тимоти Харт 1964 елда, Lisp 1.5 чыкканнан соң ике ел узгач тәкъдим иткән иде. Иң башта үзгәрешлеләрне эләктереп алудан (variable capture) һәм кабат бәяләүдән (multiple evaluation) качу юллары җитешми иде; Хартның мисаллары икесеннән дә интегә.
[2] When the Air Hits Your Brain китабында нейрохирург Фрэнк Вертосик баш ординаторы Гэриның хирурглар белән терапевтлар («бетләр») арасындагы аерма турында сөйләгән сөйләшүен искә төшерә:
Гэри белән мин зур пиццага заказ бирдек һәм буш өстәл таптык. Баш табиб сигарет кабызды. «Кара әле син ул каргыш төшкөр бетләргә, гомерләрендә бер тапкыр күрәчәк авыру турында тел бистәсе саталар. Менә шул инде аларның бәласе — бетләр бары тик сәер нәрсәләрне генә ярата. Алар үзләренең көндәлек эшләрен нәфрәт итә. Менә шул инде безнең белән ул ләгънәт төшкөр бетләр арасындагы аерма. Күрәсеңме, без бил умырткалыгы дискының зур сырхаулы бүсерләрен яратабыз, ә алар гипертонияне күрә алмый....»
Бил дискы бүсерен сырхаулы-татлы дип күз алдына китерү кыен (туры мәгънәсеннән тыш). Шулай да аларның нәрсә әйтергә теләгәнен аңлыйм кебек. Миңа да еш кына эзенә төшәрлек «татлы» хата (bug) очрый иде. Программачы булмаган кешегә хатадан ниндидер ләззәт табып була дигәнне күз алдына китерүе кыен булыр. Әлбәттә, барысы да эшләп кенә торса яхшырак. Бер караганда, шулай. Шулай да кайбер төр хаталарны аулауда һичшиксез кырыс бер канәгатьлек бар.