(Был мәҡәлә 2001 йылғы Franz Developer Symposium конференцияһында яһалған сығышҡа нигеҙләнгән.)
1995 йылдың йәйендә дуҫым Роберт Моррис менән мин Viaweb исемле стартап башлап ебәрҙек. Беҙҙең план һуңғы ҡулланыусыларға интернет-магазиндар төҙөргә мөмкинлек биргән программа тәьминәте яҙыу ине. Ул заманда был программа тәьминәтенең яңылығы шунда ине: ул беҙҙең серверҙа эшләне һәм ябай веб-биттәрҙе интерфейс сифатында ҡулланды.
Әлбиттә, был идея бер үк ваҡытта бик күп кешенең башына килә алғандыр, әммә белеүемсә, Viaweb беренсе веб-ҡушымта булды. Был идея беҙгә шул тиклем яңы булып тойолдо, хатта беҙ компанияға шуның хөрмәтенә исем бирҙек: Viaweb, сөнки беҙҙең программа тәьминәте өҫтәл компьютерында эшләү урынына Веб аша (via Web) эшләй ине.
Был программа тәьминәтенең тағы бер ғәҙәти булмаған яғы — уның башлыса Lisp тип аталған программалау телендә яҙылыуында ине. Был Lisp телендә яҙылған тәүге ҙур ҡулланыусы ҡушымталарының береһе булды, ә ул ваҡытҡа тиклем Lisp башлыса университеттарҙа һәм тикшеренеү лабораторияларында ғына ҡулланыла ине. [1]
Йәшерен ҡорал
Эрик Реймонд «Хакер булырға нисек өйрәнергә» исемле эссе яҙған, һәм унда, башҡа нәмәләр менән бер рәттән, буласаҡ хакерҙарға ниндәй телдәрҙе өйрәнергә кәрәклеген әйтә. Ул өйрәнеүе еңел булғанға күрә Python һәм Java телдәренән башларға кәңәш итә. Ҡитғи хакер шулай уҡ Unix-ты еңел өйрәнеп яраҡлаштырыу (hack) өсөн C телен, ә система менән идара итеү һәм cgi-скрипттар өсөн Perl телен өйрәнергә теләр. Ниһайәт, ысынлап та етди хакерға Lisp телен өйрәнеү хаҡында уйланырға кәрәк:
Lisp телен төшөнөп еткәс кисерәсәк тәрән аңлау-яҡтырыу кисереше өсөн генә лә өйрәнергә төшә; хатта һуңынан Lisp-ты үҙен бик күп ҡулланмаһағыҙ ҙа, ул тәжрибә ғүмерегеҙҙең аҙағынаса һеҙҙе яҡшыраҡ программалаусы яһаясаҡ.
Был латин телен өйрәнеү файҙаһына килтерелгән дәлилдәр менән бер төрлө. Ул һеҙгә эш таба алмаясаҡ (бәлки, классик филология профессоры булмаһағыҙ), әммә зиһенегеҙҙе үҫтерәсәк һәм һеҙ үҙегеҙ яҙырға теләгән телдәрҙә, мәҫәлән, инглиз телендә, яҡшыраҡ яҙыусы булырға ярҙам итәсәк.
Ләкин бер минутҡа туҡтап тороғоҙ. Был метафора ул тиклем алыҫҡа барып етмәй. Латин теле ярҙамында эш табып булмауының сәбәбе — унда бер кемдең дә һөйләшмәүе. Әгәр һеҙ латинса яҙһағыҙ, һеҙҙе бер кем дә аңламаясаҡ. Әммә Lisp — компьютер теле, ә компьютерҙар һеҙ, программалаусы, уларға ниндәй телдә бойорһағыҙ, шул телдә һөйләшә.
Шуға күрә, әгәр Lisp, ул әйткәнсә, һеҙҙе яҡшыраҡ программалаусы итә икән, ни өсөн уны ҡулланмаҫҡа һуң? Әгәр рәссамға уны оҫтараҡ итәсәк бумала тәҡдим итһәләр, минеңсә, ул уны бөтә картиналарында ла ҡулланырға теләр ине, шулай түгелме? Мин бында Эрик Реймондтан көлөргә нийәтләмәйем. Дөйөм алғанда, уның кәңәштәре яҡшы. Уның Lisp тураһында әйткәндәре — ғәҙәти дөйөм фекергә (аксиомаға) тап килә. Ләкин был дөйөм ҡабул ителгән фекерҙә ҡаршылыҡ бар: Lisp һеҙҙе яҡшыраҡ программалаусы итәсәк, әммә һеҙ уны ҡулланмаясаҡһығыҙ.
Ни өсөн? Сөнки программалау телдәре — бары тик ҡоралдар ғына. Әгәр Lisp ысынлап та яҡшыраҡ программалар төҙөргә мөмкинлек бирә икән, һеҙ уны ҡулланырға тейешһегеҙ. Әгәр бирмәй икән, ул кемгә кәрәк һуң?
Был бары тик теоретик һорау ғына түгел. Программа тәьминәте булдырыу — тәбиғи монополияларға тартылған, бик көслө конкуренциялы бизнес. Программа тәьминәтен тиҙерәк һәм яҡшыраҡ яҙған компания, башҡа шарттар тигеҙ булғанда, үҙ көнәркәштәрен баҙарҙан ҡыҫырыҡлап сығарасаҡ. Стартап башлаған ваҡытта һеҙ быны бик киҫкен тояһығыҙ. Стартаптар «йә барыһы ла, йә бер нимә лә» тигән принцип менән йәшәй. Һеҙ йә байып китәһегеҙ, йә бер ниһеҙ ҡалаһығыҙ. Стартапта хата технологияға баҫым яһаһағыҙ, көнәркәштәрегеҙ һеҙҙе тар-мар итәсәк.
Роберт та, мин дә Lisp-ты яҡшы белә инек, һәм эске һиҙемләүебеҙгә ышанып, Lisp-ты һайламаҫҡа бер ниндәй ҙә сәбәп күрмәнек. Башҡаларҙың барыһы ла программаларын C++ йәки Perl телендә яҙғанын белә инек. Әммә был бер нимәне лә аңлатмағанын да белә инек. Технологияларҙы шул юл менән һайлаһағыҙ, һеҙ Windows ҡулланыр инегеҙ. Технология һайлағанда, башҡаларҙың ни эшләгәненә иғтибар итмәҫкә, ә бары тик нимә иң яҡшы эшләйәсәген генә ҡарарға кәрәк.
Был бигерәк тә стартаптарға ҡағыла. Эре компанияла һеҙ башҡа бөтә ҙур компаниялар эшләгәнде эшләй алаһығыҙ. Ләкин стартап башҡа бөтә стартаптар эшләгәнде эшләй алмай. Хатта стартаптарҙа эшләгәндәр араһында ла быны күптәр аңламай, шикелле.
Уртаса ҙур компания йылына яҡынса ун процентҡа үҫә. Шуға күрә, әгәр һеҙ ҙур компания менән етәкселек итһәгеҙ һәм бөтә нәмәне уртаса ҙур компания кеүек эшләһәгеҙ, уртаса ҙур компания кеүек эш итергә — йәғни йылына яҡынса ун процентҡа үҫергә — иҫәп тота алаһығыҙ.
Әгәр стартап менән етәкселек итһәгеҙ ҙә, әлбиттә, шул уҡ хәл ҡабатланасаҡ. Бөтә нәмәне уртаса стартап кеүек эшләһәгеҙ, уртаса һөҙөмтәгә генә өмөт итә алаһығыҙ. Бындағы проблема шунда: уртаса һөҙөмтә һеҙҙең бизнестан китеүегеҙҙе аңлата. Стартаптарҙың иҫән ҡалыу кимәле илле проценттан күпкә кәм. Шуға күрә, әгәр стартап башлағанһығыҙ икән, һеҙгә ғәҙәти булмаған берәй нимә менән шөғөлләнеү хәйерлерәк. Юғиһә, эшегеҙ харап.
Элек, 1995 йылда, беҙ көнәркәштәребеҙ төшөнмәгән (һәм хәҙер ҙә аҙҙар ғына аңлаған) бер нәмәне белә инек: үҙегеҙҙең серверҙарҙа ғына эшләргә тейешле программа яҙғанда, һеҙ теләһә ниндәй телде ҡуллана алаһығыҙ. Өҫтәл программаларын яҙғанда, ҡушымталарҙы операция системаһы яҙылған телдә үк яҙыуға ҡарата көслө ынтылыш бар. Ун йыл элек ҡушымта яҙыу тигәнде C телендә яҙыу тип аңлайҙар ине. Әммә веб-ҡушымталар осрағында, бигерәк тә телдең дә, операция системаһының да баштағы кодын үҙегеҙ белгәндә, теләһә ҡайһы телде һайлай алаһығыҙ.
Был яңы ирек, әммә, ике яҡлы ҡылыс кеүек. Хәҙер һеҙ теләһә ниндәй телде ҡуллана алғас, ҡайһыһын ҡулланырға кәрәклеге тураһында уйланырға тура килә. Бер нимә лә үҙгәрмәне тип ҡыланған компаниялар көнәркәштәренең улай уйламауын күреп аптырашта ҡалыу хәүефенә тарый.
Теләһә ниндәй телде ҡуллана алһағыҙ, ҡайһыһын һайлар инегеҙ? Беҙ Lisp-ты һайланыҡ. Бер яҡтан, был баҙарҙа тиҙ эшләү үтә мөһим буласағы асыҡ ине. Барыбыҙ ҙа нулдән башлай инек, шуға күрә яңы мөмкинлектәрҙе көнәркәштәренән алдараҡ эшләп сығара алған компания ҙур өҫтөнлөккә эйә буласаҡ ине. Беҙ Lisp-тың программа тәьминәтен бик тиҙ яҙыу өсөн иҫәпһеҙ яҡшы тел икәнен белә инек, ә сервер ҡушымталары тиҙ үҫтереү эффектын арттыра, сөнки программаны әҙер булыу менән үк ҡулланыуға сығарырға була.
Башҡа компаниялар Lisp-ты ҡулланырға теләмәһә, тағы ла яҡшыраҡ. Был беҙгә технологик өҫтөнлөк бирә алыр ине, ә беҙгә ярҙамдың ниндәйе лә кәрәк булды. Viaweb-ты башлағанда беҙҙең бизнеста бер ниндәй ҙә тәжрибәбеҙ юҡ ине. Беҙ маркетинг, кеше яллау, аҡса йыйыу йәки клиенттар табыу тураһында бер нимә лә белмәй инек. Икебеҙҙең дә ысын эш тип әйтерлек эштә эшләгәнебеҙ ҙә булманы. Беҙҙең ҡулыбыҙҙан килгән берҙән-бер нәмә — программа яҙыу ине. Был беҙҙе ҡотҡарыр тип өмөтләндек. Программалау өлкәһендә ниндәй генә өҫтөнлөккә өлгәшә алабыҙ, барыһын да файҙаланырға булдыҡ.
Шулай итеп, Lisp-ты ҡулланыу бер эксперимент булды, тип әйтергә була. Беҙҙең гипотеза шундай ине: әгәр программабыҙҙы Lisp-та яҙһаҡ, яңы мөмкинлектәрҙе көнәркәштәргә ҡарағанда тиҙерәк тормошҡа ашыра алырбыҙ, шулай уҡ улар булдыра алмаған нәмәләрҙе эшләй алырбыҙ. Ә Lisp шул тиклем юғары кимәлле тел булғанлыҡтан, беҙгә ҙур эшләүселәр командаһы кәрәкмәҫ, тимәк, сығымдарыбыҙ ҙа аҙыраҡ булыр. Әгәр был шулай булһа, беҙ яҡшыраҡ продуктты арзаныраҡ хаҡҡа тәҡдим итә алыр инек һәм барыбер табыш алыр инек. Һөҙөмтәлә беҙ бөтә ҡулланыусыларҙы йәлеп итер инек, ә көнәркәштәребеҙгә бер кем дә ҡалмаҫ һәм улар ахыр сиктә бизнестан китер ине. Нисек кенә булмаһын, беҙҙең өмөтөбөҙ шундай ине.
Был эксперименттың һөҙөмтәләре нисек булды һуң? Ғәжәп булыуы ихтимал, әммә ул аҡланды. Ваҡыт үтеү менән беҙҙең бик күп, яҡынса егерменән утыҙға тиклем көнәркәшебеҙ барлыҡҡа килде, әммә уларҙың береһенең дә программа тәьминәте беҙҙеке менән ярыша алманы. Беҙҙең wysiwyg онлайын-магазин төҙөүсебеҙ серверҙа эшләне, әммә өҫтәл ҡушымтаһы кеүек тойола ине. Ә көнәркәштәребеҙҙә cgi-скрипттар ине. Һәм беҙ функциялар буйынса һәр ваҡыт уларҙан күпкә алда барҙыҡ. Ҡайһы ваҡыт, өмөтһөҙлөктән, көнәркәштәр беҙҙә булмаған функцияларҙы индерергә маташа ине. Ләкин Lisp ярҙамында беҙҙең эшләү циклы шул тиклем тиҙ ине, хатта яңы функцияны көнәркәш пресс-релизда иғлан иткәс, бер-ике көн эсендә үк беҙ уны үҙебеҙҙә ҡабатлай ала инек. Был пресс-релиз буйынса мәҡәлә яҙған журналистар беҙгә шылтыратып өлгөргәнсе, беҙҙә лә шул яңы функция әҙер була торғайны.
Көнәркәштәребеҙгә беҙҙең ниндәйҙер йәшерен ҡоралыбыҙ бар кеүек тойолғандыр — йәнәһе беҙ уларҙың Enigma шифрҙарын сисәбеҙ йәки шуға оҡшаш берәй нәмә эшләйбеҙ. Ысынында иһә беҙҙең йәшерен ҡоралыбыҙ бар ине, ләкин ул улар уйлағандан күпкә ябайыраҡ булды. Беҙгә уларҙың пландары хаҡында бер кем дә хәбәр итмәне. Беҙ бары тик программа тәьминәтен кемдер мөмкин тип уйлағандан күпкә тиҙерәк төҙөргә һәләтле инек.
Миңә туғыҙ йәштәр тирәһе булғанда, ҡулыма Фредерик Форсайттың «Шакал көнө» китабы килеп эләкте. Төп герой — Франция президентын үлтерергә ялланған үлтереүсе. Үлтереүсегә президент маршруты күренеп торған фатирға барып етер өсөн полиция янынан үтергә кәрәк була. Ул ҡултыҡ таяҡлы ҡарт булып кейенә һәм туранан-тура уларҙың янынан үтә, һәм бер кем дә унан шикләнмәй.
Беҙҙең йәшерен ҡорал да ошоға оҡшаш ине. Беҙ программабыҙҙы йәйәләргә тулы ғәжәп синтаксислы сәйер бер яһалма интеллект телендә яҙҙыҡ. Күп йылдар буйы Lisp-тың шулай тасуирланыуын ишетеү минең асыуымды килтерә ине. Ләкин хәҙер был беҙҙең файҙаға эшләне. Бизнеста көнәркәштәрегеҙ аңламаған техник өҫтөнлөктән дә ҡиммәтерәк бер ни ҙә юҡ. Бизнеста, һуғыштағы кеүек, көтөлмәгәнлек көс кеүек үк ҡиммәткә эйә.
Һәм шулай итеп, әйтеүе бер аҙ оят булһа ла, Viaweb өҫтөндә эшләгәндә мин Lisp хаҡында бер ҡасан да халыҡ алдында һөйләмәнем. Беҙ матбуғатта уны бер ҡасан да телгә алманыҡ, һәм әгәр беҙҙең сайтта Lisp һүҙен эҙләһәгеҙ, минең тәржемәи хәлемдәге ике китаптың исемен генә таба алыр инегеҙ. Был осраҡлы түгел ине. Стартап көнәркәштәренә мөмкин тиклем аҙ мәғлүмәт бирергә тейеш. Әгәр улар беҙҙең программаның ниндәй телдә яҙылғанын белмәһә, йәки был уларға барыбер булһа, мин барыһының да шулай ҡалыуын теләнем.[2]
Беҙҙең технологияны иң яҡшы төшөнгән кешеләр — клиенттар ине. Уларға ла Viaweb-тың ниндәй телдә яҙылыуы мөһим түгел ине, әммә уның иҫ киткес яҡшы эшләгәнен улар күрҙе. Был уларға һүҙҙең тура мәғәнәһендә бер нисә минут эсендә шәп күренешле интернет-магазиндар төҙөргә мөмкинлек бирҙе. Шулай итеп, башлыса һүҙҙән һүҙгә таралып, ҡулланыусыларыбыҙ һаны артҡандан-артты. 1996 йылдың аҙағына беҙҙә 70-ләп магазин селтәрҙә эшләй ине. 1997 йыл аҙағында — 500 булды. Алты айҙан һуң, Yahoo беҙҙе һатып алғанда, беҙҙә 1070 ҡулланыусы бар ине. Бөгөн был программа тәьминәте Yahoo Store булараҡ үҙ баҙарында өҫтөнлөк итеүен дауам итә. Был — Yahoo-ның иң табышлы өлөштәренең береһе, һәм уның ярҙамында төҙөлгән магазиндар Yahoo Shopping нигеҙен тәшкил итә. Мин Yahoo-нан 1999 йылда киттем, шуға күрә хәҙер уларҙың күпме ҡулланыусыһы барлығын теүәл белмәйем, әммә һуңғы ишеткән мәғлүмәттәр буйынса яҡынса 20 000 ине.
«Блаб» парадоксы
Lisp-тың нимәһе шул тиклем шәп? Һәм Lisp шул тиклем шәп булһа, ни өсөн уны һәр кем ҡулланмай? Был риторик һорауҙар кеүек яңғырай, ләкин ысынында уларҙың ябай ғына яуаптары бар. Lisp бары тик үҙенә баш эйеүселәргә генә күренгән ниндәйҙер тылсымлы сифаты өсөн түгел, ә бары тик ҡул аҫтындағы иң ҡеүәтле тел булғаны өсөн шул тиклем шәп. Ә һәр кемдең уны ҡулланмауының сәбәбе шунда: программалау телдәре — технологиялар ғына түгел, ә фекерләү ғәҙәттәре лә, һәм бер нәмә лә уларҙан яйыраҡ үҙгәрмәй. Әлбиттә, был ике яуап та аңлатыуға мохтаж.
Мин ғәҙәттән тыш бәхәсле бер белдереүҙән башлармын: программалау телдәре ҡеүәте буйынса айырыла.
Юғары кимәлле телдәрҙең машина теленә ҡарағанда ҡеүәтлерәк булыуы менән һәр хәлдә аҙҙар ғына бәхәсләшер. Бөгөн күпселек программалаусылар ғәҙәттә машина телендә яҙырға теләмәүегеҙ менән ризалашыр ине. Киреһенсә, юғары кимәлле телдә яҙырға, ә компилятор уны һеҙҙең өсөн машина теленә тәржемә итергә тейеш. Был идея хәҙер хатта ҡорамалдар кимәлендә лә һалынған: 1980-се йылдарҙан башлап командалар системалары (instruction sets) кеше-программалаусылар өсөн түгел, ә компиляторҙар өсөн тәғәйенләнеп эшләнә.
Бөтә программаны тотошлайы менән машина телендә ҡулдан яҙыу — хата икәнен һәр кем белә. Һирәгерәк төшөнгән нәмә шул: бында дөйөмөрәк принцип бар: әгәр һеҙҙең бер нисә тел араһынан һайлау мөмкинлегегеҙ булһа, башҡа шарттар тигеҙ булғанда, иң ҡеүәтле телдән башҡа ниндәй ҙә булһа телдә программалау — хата. [3]
Был ҡағиҙәнән күп кенә ташламалар бар. Әгәр һеҙ билдәле бер телдә яҙылған программа менән бик тығыҙ эшләргә тейешле программа яҙаһығыҙ икән, яңы программаны шул уҡ телдә яҙыу яҡшы фекер булыуы ихтимал. Әгәр һеҙ һандарҙы эшкәртеү йәки биттар менән эш итеү кеүек бик ябай ғына нәмә эшләргә тейешле программа яҙаһығыҙ икән, аҙыраҡ абстракт телде ҡулланыуығыҙ ҙа мөмкин, бигерәк тә ул бер аҙ тиҙерәк эшләргә мөмкин булғанда. Ә әгәр һеҙ ҡыҫҡа, бер тапҡыр ҡулланыла торған программа яҙаһығыҙ икән, был бурыс өсөн иң яҡшы китапхана функциялары булған телде ҡулланыу яҡшыраҡ булыр. Ләкин дөйөм алғанда, ҡулланма программа тәьминәте өсөн һеҙ иң ҡеүәтле (һәм етерлек кимәлдә һөҙөмтәле) телде ҡулланырға теләйһегеҙ, ә башҡа берәй телде ҡулланыу — машина телендә яҙыу менән бер үк төрҙәге хата, бәлки, бер аҙ кәмерәк дәрәжәлә генәлер.
Машина теленең бик түбән кимәлдә икәнен күрәһегеҙ. Ләкин, һәр хәлдә ниндәйҙер социаль килешеү булараҡ, юғары кимәлле телдәрҙең барыһы ла йыш ҡына тиң күрелә. Улар тиң түгел. Техник яҡтан «юғары кимәлле тел» термины аныҡ ҡына бер нимәне лә аңлатмай. Бер яҡта машина телдәре, ә икенсе яҡта бөтә юғары кимәлле телдәр ятҡан бүлеү һыҙығы юҡ. Телдәр абстрактлыҡ континуумында [4], иң ҡеүәтле телдәрҙән алып үҙҙәре лә ҡеүәт буйынса айырылған машина телдәренә тиклем теҙелә.
Cobol-ды ҡарайыҡ. Cobol — машина теленә компиляцияланыу мәғәнәһендә юғары кимәлле тел. Cobol ҡеүәте буйынса, әйтәйек, Python менән тиң тип кемдер етди раҫлармы? Ул Python-ға ҡарағанда машина теленә яҡыныраҡтыр, бәлки.
Йәки Perl 4 тураһында нимә әйтерһегеҙ? Perl 4 менән Perl 5 араһында телгә лексик замыканиелар (lexical closures) өҫтәлде. Күпселек Perl хакерҙары Perl 5-тең Perl 4-кә ҡарағанда ҡеүәтлерәк булыуы менән ризалашыр ине. Ләкин быны танығас, һеҙ бер юғары кимәлле телдең икенсеһенән ҡеүәтлерәк була алыуын да таныйһығыҙ. Һәм бынан, махсус осраҡтарҙан тыш, ҡулығыҙҙан килгән иң ҡеүәтлеһен ҡулланырға тейешһегеҙ тигән ҡотолғоһоҙ һығымта яһала.
Ләкин был идея уның логик осона тиклем һирәк еткерелә. Билдәле бер йәштән һуң программалаусылар телдәрҙе үҙ теләктәре менән һирәк алмаштыра. Кешеләр ниндәй телгә өйрәнгән булһа, ғәҙәттә шул телде улар үҙҙәренә ярап ҡалырлыҡ тип һанай.
Программалаусылар үҙҙәренең яратҡан телдәренә ныҡ берегә, ә мин кемдеңдер хистәрен рәнйетергә теләмәйем, шуға күрә был фекерҙе аңлатыу өсөн Блаб (Blub) тип аталған уйҙырма телде ҡулланам. Блаб туранан-тура абстрактлыҡ континуумының уртаһына тура килә. Ул иң ҡеүәтле тел түгел, әммә Cobol йәки машина теленән ҡеүәтлерәк.
Һәм ысынында иһә, беҙҙең фаразланған Блаб программалаусыһы был икеһенең береһен дә ҡулланмаҫ ине. Әлбиттә, ул машина телендә яҙмаясаҡ. Компиляторҙар шуның өсөн бар бит инде. Ә Cobol-ға килгәндә, ул кемдеңдер уның ярҙамында нисек берәй нәмә яһай алыуын төшөнмәй. Унда хатта x (һеҙ теләгән Блаб мөмкинлеге) лә юҡ.
Беҙҙең уйҙырма Блаб программалаусыһы ҡеүәт континуумы буйлап аҫҡа ҡараған саҡта, ул аҫҡа ҡарағанын белә. Блабтан ҡеүәтһеҙерәк телдәр күренеп тора: улар көсһөҙөрәк, сөнки уларҙа ул күнеккән ниндәйҙер мөмкинлектәр юҡ. Ләкин беҙҙең Блаб программалаусыһы икенсе яҡҡа, ҡеүәт континуумы буйлап өҫкә ҡарағанда, ул өҫкә ҡарағанын аңламай. Ул күргән нәмәләр — бары тик сәйер телдәр генә. Ул уларҙы ҡеүәте буйынса яҡынса Блаб менән тиң, ләкин тағы ла әллә күпме буталсыҡ нәмәләр ҡушылған тип иҫәпләй. Блаб уның өсөн етерлек, сөнки ул Блаб телендә фекерләй.
Ләкин беҙ ҡеүәт континуумында юғарыраҡ торған телдәрҙең береһен ҡулланған программалаусы ҡарашына күскәндә, уның да үҙ сиратында Блабҡа өҫтән түбән ҡарағанын күрәбеҙ. Блабта нисек берәй нәмә эшләп булһын инде? Унда хатта y та юҡ.
Индукция буйынса, төрлө телдәр араһындағы ҡеүәт айырмаларын тулыһынса күреү мөмкинлегенә тик иң ҡеүәтле телде төшөнгән программалаусылар ғына эйә. (Эрик Реймондтың «Lisp һеҙҙе яҡшыраҡ программалаусы яһай» тигәндә күҙ уңында тотҡан нәмәһе шулдыр, бәлки). Башҡаларҙың фекеренә ышана алмайһығыҙ, сөнки Блаб парадоксы бар: улар ниндәй генә тел ҡулланһалар ҙа шуға ҡәнәғәт, сөнки ул тел уларҙың программалар хаҡында нисек фекер йөрөтөүен билдәләй.
Мин быны үҙ тәжрибәмдән беләм: юғары кластарҙа уҡыған малай сағымда Basic телендә программалар яҙа инем. Был тел хатта рекурсияны ла хупламай ине. Рекурсия ҡулланмайынса программалар яҙыуҙы күҙ алдына килтереүе ауыр, ләкин ул ваҡытта миңә ул етмәй ҙә ине. Мин Basic телендә уйлай инем. Һәм мин унда оҫта инем. Күҙем күргән бөтә нәмәнең хакимы булдым.
Эрик Реймонд хакерҙарға тәҡдим иткән биш тел ҡеүәт континуумының төрлө нөктәләренә тура килә. Уларҙың бер-береһенә ҡарата ҡайҙа ятыуы — нескә тема. Мин бары тик Lisp иң өҫтә тора тип уйлауымды ғына әйтә алам. Һәм был раҫлауҙы дәлилләр өсөн, башҡа дүрт телгә ҡарағанда үҙемә етешмәгән тип тапҡан бер нәмә хаҡында һөйләрмен. Макростарһыҙ уларҙа нисек берәй нәмә эшләргә мөмкин, тип уйлайым мин? [5]
Күп кенә телдәрҙә макрос тип аталған нәмә бар. Ләкин Lisp макростары — үҙенсәлекле. Һәм ышанһағыҙ ҙа, ышанмаһағыҙ ҙа, уларҙың ни эшләгәне йәйәләр менән бәйле. Lisp төҙөүселәре был бөтә йәйәләрҙе телгә бары тик айырылып тороу өсөн генә ҡуймаған. Блаб программалаусыһына Lisp коды сәйер күренә. Ләкин ул йәйәләр сәбәпһеҙ түгел. Улар — Lisp менән башҡа телдәр араһындағы төп айырманың тышҡы дәлиле.
Lisp коды Lisp мәғлүмәт объекттарынан төҙөлгән. Һәм башланғыс файлдарҙа символдар булыуы һәм юлдар тел яҡлаған мәғлүмәт типтарының береһе булыуы кеүек ябай мәғәнәлә түгел. Lisp коды, уны парсер уҡығандан һуң, үҙегеҙ урап сыға (traverse итә) ала торған мәғлүмәт структураларынан тора.
Әгәр компиляторҙарҙың нисек эшләгәнен аңлаһағыҙ, ғәмәлдә мәсьәлә Lisp-тың сәйер синтаксисҡа эйә булыуында түгел, ә Lisp-тың бөтөнләй синтаксисы булмауында. Һеҙ программаларҙы башҡа телдәр парсинг үткәндә компилятор эсендә хасил булған синтаксис ағастарында (parse trees) яҙаһығыҙ. Әммә был синтаксис ағастары программаларығыҙ өсөн тулыһынса асыҡ. Һеҙ улар менән эш итә торған программалар яҙа алаһығыҙ. Lisp-та бындай программалар макростар тип атала. Улар — программалар яҙа торған программалар.
Программа яҙа торған программалар? Быны ҡасан эшләргә кәрәк булыр ине һуң? Әгәр Cobol телендә фекерләһәгеҙ — бик һирәк. Әгәр Lisp телендә фекерләһәгеҙ — һәр ваҡыт. Бында ҡеүәтле берәй макрос миҫалын килтереп: «бына! быға нисек ҡарайһығыҙ?» тип әйтһәм уңайлы булыр ине. Ләкин шулай эшләһәм, Lisp-ты белмәгән кеше өсөн был аңлайышһыҙ һүҙ булып ҡына күренер ине; уның нимә аңлатҡанын төшөнөү өсөн кәрәк булған бөтә нәмәне аңлатырлыҡ урын юҡ бында. Ansi Common Lisp китабымда мин эште мөмкин тиклем тиҙерәк алға алып барырға тырыштым, һәм шулай ҙа 160-сы биткә етмәйенсә макростарға барып етә алманым.
Ләкин, минеңсә, мин ышандырырлыҡ бер дәлил килтерә алам. Viaweb мөхәрририәтенең башланғыс коды яҡынса 20-25% макростарҙан тора ине. Макростарҙы яҙыу ябай Lisp функцияларына ҡарағанда ауырыраҡ, һәм улар кәрәк булмағанда макростар ҡулланыу насар стиль тип һанала. Тимәк, ул кодтағы һәр макрос унда кәрәк булғанға ғына бар. Был шул хаҡта һөйләй: был программалағы кодтың кәм тигәндә 20-25%-ы башҡа бер ниндәй ҙә телдә еңел генә эшләп булмай торған ғәмәлдәрҙе башҡара. Блаб программалаусыһы Lisp-тың серле көсө тураһындағы раҫлауҙарыма ни тиклем генә шикләнеп ҡарамаһын, был уның ҡыҙыҡһыныуын уятырға тейеш. Беҙ был кодты үҙебеҙҙең күңел асыуыбыҙ өсөн яҙманыҡ. Беҙ үҙебеҙ менән көнәркәштәребеҙ араһында техник тотҡарлыҡтар ҡуйыр өсөн бар көсөнә программа яҙған бәләкәй генә стартап инек.
Шиксел кеше бында ниндәйҙер үҙ-ара бәйләнеш бармы икән тип уйланырға мөмкин. Кодыбыҙҙың ҙур өлөшө башҡа телдәрҙә эшләү бик ауыр булған нәмәләрҙе башҡара ине. Һөҙөмтәлә барлыҡҡа килгән программа тәьминәте көнәркәштәребеҙҙең программалары булдыра алмаған нәмәләрҙе эшләне. Бәлки, бында ниндәйҙер бәйләнеш булғандыр. Мин һеҙгә шул епте күҙәтергә кәңәш итәм. Ҡултыҡ таяҡтарында атлап барған теге ҡарт күренгәненән күпкә мәкерлерәк булыуы ихтимал.
Стартаптар өсөн айкидо
Ләкин мин кемде булһа ла (25 йәштән уҙғандарҙы) барып Lisp-ты өйрәнергә өгөтләп күндерә алырмын тип өмөт итмәйем. Был мәҡәләнең маҡсаты — кемдеңдер фекерен үҙгәртеү түгел, ә Lisp ҡулланыу менән ҡыҙыҡһынған кешеләрҙең — Lisp-тың ҡеүәтле тел булыуын белгән, ләкин уның киң ҡулланылмауы сәбәпле борсолғандарҙың күңелен тынысландырыу. Конкуренция шарттарында был — өҫтөнлөк. Көнәркәштәрегеҙҙең уны төшөнмәүе Lisp-тың көсөн тағы ла арттыра.
Әгәр һеҙ стартапта Lisp ҡулланыу тураһында уйлайһығыҙ икән, уның киң таралмауына борсолорға тейеш түгелһегеҙ. Киреһенсә, уның шулай ҡалыуына өмөт итергә кәрәк. Һәм ул, моғайын, шулай ҡалыр ҙа. Был — программалау телдәренең тәбиғәте: күпселек кешене үҙҙәре хәҙерге ваҡытта ҡулланған нәмә менән тулыһынса ҡәнәғәтләндереү. Компьютер ҡорамалдары шәхси ғәҙәттәргә ҡарағанда шул тиклем тиҙ үҙгәрә, хатта программалау практикаһы процессорҙан ғәҙәттә ун-егерме йылға ҡалышып бара. MIT кеүек урындарҙа программаларҙы юғары кимәлле телдәрҙә 1960-сы йылдар башында уҡ яҙалар ине, әммә күп кенә компаниялар кодты машина телендә 1980-се йылдарға тиклем яҙыуҙы дауам итте. Күптәр машина телендә яҙыуҙы процессор, ябылып өйгә ҡайтырға ашыҡҡан бармен кеүек, ниһайәт risc командалар системаһына күсеп уларҙы ҡыуып сығарғансы дауам иткәндер, тип уйлайым.
Ғәҙәттә технологиялар тиҙ үҙгәрә. Әммә программалау телдәре башҡаса: программалау телдәре бары тик технология ғына түгел, ә программалаусылар фекерләгән мөхит тә. Улар яртылаш технология һәм яртылаш дин.[6] Шуға күрә уртаса тел, йәғни уртаса программалаусы ҡулланған теләһә ниндәй тел, айсберг кеүек яй шыла. Яҡынса 1960 йылда Lisp тарафынан индерелгән сүп-сар йыйыу (garbage collection) хәҙер дөйөм танылған яҡшы нәмә тип һанала. Башҡарыу ваҡытында типтарҙы билдәләү (runtime typing) ҙа шулай уҡ популярлыҡ яулай. 1970-се йылдар башында Lisp индергән лексик замыканиелар хәҙер, саҡ-саҡ ҡына булһа ла, күҙгә салына башланы. 1960-сы йылдар уртаһында Lisp тарафынан индерелгән макростар иһә һаман да terra incognita булып ҡала бирә.
Әлбиттә, уртаса телдең инерция көсө ифрат ҙур. Мин был ҡеүәтле көс менән көрәшергә тәҡдим итмәйем. Мин тап киреһенсә нәмәне тәҡдим итәм: айкидо оҫтаһы кеүек, һеҙ уны дәғүәселәрегеҙгә ҡаршы файҙалана алаһығыҙ.
Әгәр һеҙ ҙур компанияла эшләһәгеҙ, был еңел булмаҫҡа мөмкин. Осло сәсле босс гәзиттән егерме йыл элек Ada кеүек тағы ниндәйҙер телдең бөтә донъяны яулап алырға тороуы тураһында яңы ғына уҡып сыҡҡас, уны берәй нәмәне Lisp-та яһарға рөхсәт итеүенә күндереүе бик ауыр буласаҡ. Ләкин әгәр һеҙ әлегә осло сәсле бостары булмаған стартапта эшләйһегеҙ икән, беҙҙең кеүек үк, Блаб парадоксын үҙ файҙағыҙға бора алаһығыҙ: уртаса телгә ҡуҙғалмаҫлыҡ булып йәбешкән көнәркәштәрегеҙ бер ҡасан да етә алмаҫлыҡ технологияны ҡуллана алаһығыҙ.
Әгәр ҡасан да булһа стартапта эшләүегеҙҙе абайлап ҡалһағыҙ, бына һеҙгә көнәркәштәрҙе баһалау өсөн файҙалы кәңәш. Уларҙың вакансияларын уҡығыҙ. Сайттарындағы башҡа бөтә нәмә фотобанк һүрәттәре йәки уларға оҡшаш күпертелгән проза булыуы ихтимал, ләкин эш тураһындағы белдереүҙәрҙә үҙҙәре теләгән белгестәрҙе аныҡ күрһәтергә мәжбүр, юғиһә улар тап килмәгән кандидаттарҙы аласаҡ.
Беҙ Viaweb өҫтөндә эшләгән йылдарҙа мин бик күп вакансия тасуирламаларын уҡыным. Яңы көнәркәш яҡынса һәр ай һайын ҡайҙандыр сығып торған кеүек ине. Уларҙың реаль эшләп торған демо-өлгөһө бармы-юҡмы икәнен тикшергәндән һуң мин эшләгән беренсе нәмә — уларҙың эш урындары тураһындағы белдереүҙәрен ҡарау булды. Бының менән бер-ике йыл шөғөлләнгәндән һуң, ниндәй компанияларҙан хәүефләнергә, ә ниндәйҙәренән юҡ икәнен айыра башланым. Вакансияларҙа IT яғы ни тиклем нығыраҡ сағылһа, компания шул тиклем аҙыраҡ ҡурҡыныс ине. Иң ҡурҡынысһыҙҙары — Oracle буйынса тәжрибә талап иткәндәре булды. Улар тураһында бер ҡасан да борсолорға кәрәкмәй ине. Шулай уҡ улар C++ йәки Java эшләүселәрен эҙләүҙәрен белдерһә лә хәүефләнмәҫкә була ине. Әгәр улар Perl йәки Python программалаусыларын эҙләһә, был бер аҙ хәүефле була башлай — был компанияның техник яғын, кәм тигәндә, ысын хакерҙар алып барған төҫ ала. Әгәр мин ҡасан да булһа Lisp хакерҙарын эҙләгән вакансия күрһәм, ысынлап та ныҡ борсолор инем.
Иҫкәрмәләр
[1] Тәүҙә Viaweb ике өлөштән торҙо: сайттарҙы төҙөү өсөн кешеләр ҡулланған һәм Lisp телендә яҙылған мөхәрририәт, һәм C телендә яҙылып, заказтарҙы эшкәрткән заказ ҡабул итеү системаһы. Беренсе версия башлыса Lisp-та ине, сөнки заказ ҡабул итеү системаһы бәләкәй булды. Һуңыраҡ беҙ тағы ике модуль өҫтәнек: C телендә яҙылған һүрәт генераторы һәм башлыса Perl телендә яҙылған бек-офис менеджеры.
2003 йылдың ғинуарында Yahoo C++ һәм Perl телдәрендә яҙылған редакторҙың яңы версияһын сығарҙы. Шулай ҙа программаның бүтән Lisp телендә яҙылмаған тип әйтеүе ауыр, сөнки был программаны C++ теленә күсереү өсөн уларға һүҙмә-һүҙ Lisp интерпретаторын яҙырға тура килде: сәхифәләрҙе яһаусы бөтә ҡалыптарҙың башланғыс файлдары, минең белеүемсә, һаман да Lisp коды булып ҡала. (Гринспендың унынсы ҡағиҙәһен ҡарағыҙ.)
[2] Роберт Моррис, миңә сер һаҡларға кәрәк тә булманы, сөнки көнсөлдәребеҙ беҙҙең Lisp ҡулланғаныбыҙҙы белһә лә, бының ни өсөн икәнен аңламаҫ ине, ти: «Әгәр улар шул тиклем аҡыллы булһа, үҙҙәре лә күптән Lisp-та программалар ине».
[3] Барлыҡ телдәр ҙә Тьюринг эквивалентлығы мәғәнәһендә тигеҙ ҡеүәтле, әммә был программалаусылар ҡыҙыҡһынған һүҙ мәғәнәһе түгел. (Бер кем дә Тьюринг машинаһында программа яҙырға теләмәй.) Программалаусыларға мөһим булған ҡеүәт формаль рәүештә билдәләнмәҫкә лә мөмкин, әммә уны аңлатыуҙың бер ысулы — ул көсһөҙөрәк телдә бары тик көслөрәк тел өсөн интерпретатор яҙыу юлы менән генә өлгәшеп булған мөмкинлектәрҙе аңлата, тип әйтеү. Әгәр А телендә юлдарҙан бушлыҡтарҙы (пробелдарҙы) юйҙырыу операторы булһа, ә Б телендә булмаһа, был моғайын А телен ҡеүәтлерәк итмәйҙер, сөнки һеҙ быны Б телендә ярҙамсы программа яҙып та эшләй алаһығыҙ. Әммә А теле, әйтәйек, рекурсияны хуплаһа, ә Б теле хупламаһа, быны китапхана функцияларын яҙып ҡына төҙәтеп булмай торғандыр.
[4] «Нерд»тар өсөн иҫкәрмә: йәки, бәлки, өҫкә табан тарайыусы рәшәткә (lattice) булырға мөмкин; бында форма түгел, ә кәм тигәндә өлөшләтә тәртип булыуы тураһындағы идея мөһим.
[5] Макростарҙы айырым бер үҙенсәлек итеп ҡарау бер аҙ яңылыштыра. Ғәмәлдә уларҙың файҙаһы лексик йомолоуҙар (closures) һәм ҡалған параметрҙар (rest parameters) кеүек башҡа Lisp үҙенсәлектәре менән тағы ла нығыраҡ арта.
[6] Һөҙөмтәлә, программалау телдәрен сағыштырыу йә дини һуғыштар формаһын ала, йә булмаһа студенттар өсөн шул тиклем ныҡ нейтраль дәреслектәргә әйләнә, хатта улар ғәмәлдә антропология хеҙмәттәренә оҡшап ҡала. Үҙ тыныслығын баһалаған йәки даими профессор урынын (tenure) алырға теләгән кешеләр был теманан ситтә тора. Әммә был мәсьәлә яртылаш ҡына дини; унда өйрәнергә лайыҡ нәмә бар, айырыуса һеҙ яңы телдәр проектларға теләһәгеҙ.