Программа тәьминәте өлкәһендә ҡаты башлы ғалимдар менән уларҙан кәм булмаған тағы бер дәһшәтле көс — осло сәсле етәкселәр араһында өҙлөкһөҙ көрәш бара. Осло сәсле етәксе (pointy-haired boss) кем икәнен һәр кем белә бит, шулаймы? Минеңсә, технологиялар донъяһындағы күпселек кеше был мультфильм персонажын танып ҡына ҡалмай, ә уның үҙ компанияларындағы прототибы булған тере кешене лә белә.
Осло сәсле етәксе үҙендә ғәҙәттә айырым осраған, әммә бергә бик һирәк күренгән ике сифатты ғәжәп рәүештә берләштерә: (а) ул технологиялар тураһында бөтөнләй бер ни ҙә белмәй, һәм (б) шул уҡ ваҡытта улар тураһында ныҡлы фекергә эйә.
Мәҫәлән, һеҙгә программа яҙырға кәрәк, ти. Осло сәсле етәксе был программаның нисек эшләргә тейешлеге тураһында бер ни ҙә белмәй, бер программалау телен икенсеһенән айыра алмай, әммә һеҙҙең уны ниндәй телдә яҙырға тейешлегегеҙҙе яҡшы белә. Тап шулай. Ул һеҙҙе уны Java телендә яҙырға тейеш тип иҫәпләй.
Ни өсөн ул шулай уйлай? Әйҙәгеҙ, осло сәсле етәксенең мейеһенә күҙ һалайыҡ. Уның уйҙары яҡынса ошондай: Java — стандарт. Мин уның шулай булырға тейешлеген беләм, сөнки матбуғатта гел уның тураһында уҡыйым. Ул стандарт булғас, уны ҡулланыу арҡаһында миндә проблемалар тыумаясаҡ. Һәм был шулай уҡ күп кенә Java-программалаусылар һәр ваҡыт буласаҡ тигәнде аңлата, шуға күрә хәҙерге эшләгән программалаусыларым эштән китһә лә (ә миндә эшләүселәр серле рәүештә гел шулай итә), мин уларҙы еңел генә алмаштыра алам.
Ярай, был бик үк мәғәнәһеҙ ҙә яңғырамай кеүек. Әммә былар барыһы ла әйтелмәгән бер фаразға нигеҙләнгән, һәм ул фараз ялған булып сыға. Осло сәсле етәксе бөтә программалау телдәре лә бер-береһенә тиң тип ышана. Әгәр был дөрөҫ булһа, ул хаҡлы булыр ине. Әгәр телдәр бөтәһе лә тиң икән, әлбиттә, башҡалар ҡулланған телде генә ҡулланығыҙ.
Ләкин бөтә телдәр ҙә бер иш түгел, һәм мин быны хатта улар араһындағы айырмаларға инеп тормайынса ла иҫбатлай алам, тип уйлайым. Әгәр һеҙ 1992 йылда осло сәсле етәкенән программаларҙы ниндәй телдә яҙырға кәрәк тип һораһағыҙ, ул бөгөнгө кеүек үк шикләнмәйенсә яуап бирер ине: программалар C++ телендә яҙылырға тейеш. Ләкин әгәр бөтә телдәр ҙә тиң булһа, ни өсөн осло сәсле етәксенең фекере үҙгәрергә тейеш булған һуң? Ғөмүмән, ни өсөн Java-ны төҙөүселәр яңы тел булдырыу менән мәшәҡәтләнеп йөрөргә тейеш булған?
Күрәһең, әгәр яңы тел төҙөйһөгөҙ икән, һеҙ уны ниндәйҙер яҡтан булған телдәрҙән яҡшыраҡ тип уйлағанға күрә шулай итәһегеҙ. Һәм ысынында ла, Гослинг тәүге Java тасуирламаһында (white paper) Java-ның C++ телендәге ҡайһы бер проблемаларҙы төҙәтеү өсөн махсус эшләнгәнен асыҡ күрһәтә. Бына, күрәһегеҙме: бөтә телдәр ҙә бер иш түгел. Әгәр осло сәсле етәксенең мейеһенән сығып Java-ға барһағыҙ, ә унан һуң Java тарихы буйлап уның тамырҙарына тиклем кире барһағыҙ, һеҙ башта ҡабул иткән фаразға ҡаршы килгән фекергә килеп терәләсәкһегеҙ.
Шулай итеп, кем хаҡлы? Джеймс Гослингмы, әллә осло сәсле етәксеме? Ғәжәп түгел, Гослинг хаҡлы. Ҡайһы бер телдәр билдәле бер мәсьәләләр өсөн башҡаларға ҡарағанда ысынлап та яҡшыраҡ. Һәм беләһегеҙме, был ҡыҙыҡлы һорауҙар тыуҙыра. Java билдәле бер мәсьәләләр өсөн C++ теленә ҡарағанда яҡшыраҡ итеп эшләнгән. Ниндәй мәсьәләләр өсөн? Ҡасан Java яҡшыраҡ һәм ҡасан C++ яҡшыраҡ? Икеһенә ҡарағанда ла башҡа телдәр яҡшыраҡ булған осраҡтар бармы?
Был һорау тураһында уйлана башлаһағыҙ, һеҙ ысын мәғәнәһендә буталсыҡ бер төйөнгә тап булаһығыҙ. Әгәр осло сәсле етәксегә мәсьәләне уның бөтә ҡатмарлығында уйларға тура килһә, уның мейеһе шартлар ине. Ул бөтә телдәрҙе лә бер тиң тип һанаған саҡта, уға бары тик иң ҙур популярлыҡҡа эйә булған кеүек күренгән телде һайлау ғына кәрәк, ә был технологияға ҡарағанда күберәк модаға бәйле булғанлыҡтан, хатта ул да дөрөҫ яуапты таба ала. Ләкин телдәр төрлө булһа, ул үҙе бер ни белмәгән ике нәмә араһында оптималь баланс табырға тырышып, бер юлы ике тигеҙләмәне сисергә мәжбүр: ул хәл итергә тейешле мәсьәлә өсөн төп егермеләп телдең сағыштырма яраҡлылығы һәм уларҙың һәр береһе өсөн программалаусыларҙы, китапханаларҙы һ.б. табыу мөмкинлеге. Әгәр ишек артында ошо ята икән, осло сәсле етәксенең уны асырға теләмәүе бер ҙә ғәжәп түгел.
Бөтә программалау телдәрен берҙәй тип уйлауҙың кире яғы шунда: был дөрөҫ түгел. Әммә яҡшы яғы — был һеҙҙең тормошоғоҙҙо күпкә ябайлаштыра. Һәм минеңсә, был фекерҙең шулай киң таралыуының төп сәбәбе лә ошонда. Был бик уңайлы фекер.
Беҙ Java-ның бик яҡшы булырға тейешлеген беләбеҙ, сөнки ул — шәп, яңы программалау теле. Әллә улай түгелме? Программалау телдәре донъяһына алыҫтан ҡараһаң, Java иң һуңғы ҡаҙаныш кеүек күренә. (Етәрлек алыҫтан ҡарағанда, Sun түләгән ҙур, емелдәүсе реклама таҡтаһы ғына күренә.) Ләкин был донъяға яҡындан ҡараһағыҙ, унда төрлө кимәлдәге шәплек барлығын күрерһегеҙ. Хакер субкультураһы эсендә Perl тигән тағы бер тел бар, һәм ул Java-ға ҡарағанда күпкә шәберәк тип һанала. Мәҫәлән, Slashdot нәҡ Perl ярҙамында эшләнә. Был егеттәрҙең Java Server Pages ҡулланыуын күрмәҫһегеҙ, тип уйлайым. Ләкин тағы ла яңыраҡ булған Python тигән тел бар, уны ҡулланыусылар Perl-ға өҫтән ҡарарға ярата, һәм сиратта көтөп торған башҡалар ҙа бар.
Әгәр был телдәргә тәртип менән ҡараһағыҙ — Java, Perl, Python — ҡыҙыҡлы бер законлылыҡты күрерһегеҙ. Нисек кенә булмаһын, әгәр һеҙ Lisp хакеры булһағыҙ, был законлылыҡты мотлаҡ күрерһегеҙ. Һәр береһе аҙым һайын Lisp-ҡа нығыраҡ оҡшай бара. Python хатта күп кенә Lisp хакерҙары хата тип иҫәпләгән үҙенсәлектәрҙе лә күсереп алған. Ябай Lisp программаларын юлмә-юл Python-ға тәржемә итергә мөмкин. Хәҙер 2002 йыл, һәм программалау телдәре ниһайәт 1958 йылға етеп килә тиерлек.
Математикаға ҡыуып етеү
Мин нимәне күҙ уңында тотам: Lisp-ты беренсе тапҡыр Джон Маккарти 1958 йылда асҡан, һәм популяр программалау телдәре уның шул ваҡытта уҡ эшләп сығарған идеяларын тик хәҙер генә ҡыуып етеп килә.
Был нисек дөрөҫ булыуы мөмкин һуң? Компьютер технологиялары бик тиҙ үҙгәреүсән өлкә түгелме ни? Мин әйтәм, 1958 йылда компьютерҙар ҡул сәғәтенең иҫәпләү ҡеүәтенә эйә булған, һыуытҡыс дәүмәлендәге дәһшәтле ғифриттәр ине. Нисек итеп шул тиклем иҫке теләһә ниндәй технология әле лә актуал булып ҡала, хатта иң һуңғы яңылыҡтарҙан да өҫтөнөрәк була ала?
Мин һеҙгә бының ни өсөн шулай булыуын аңлатам. Сөнки Lisp ысынында бер ваҡытта ла программалау теле булыу өсөн махсус булдырылмаған, кәм тигәндә беҙ бөгөн аңлаған мәғәнәлә түгел. Программалау теле тигәндә беҙ компьютерға нимә эшләргә кәрәклеген ҡушыу өсөн файҙаланған ҡоралды күҙ уңында тотабыҙ. Ахыр сиктә Маккарти нәҡ ошо мәғәнәләге телде булдырырға ниятләгән, ләкин беҙҙең ҡулға килеп эләккән реаль Lisp уның айырым бер эшмәкәрлегенә — Тьюринг машинаһына уңайлыраҡ альтернатива билдәләүгә ынтылған теоретик күнегеүенә нигеҙләнгән ине. Маккарти һуңыраҡ әйткәнсә,
Lisp-тың Тьюринг машиналарына ҡарағанда уңайлыраҡ һәм таҙараҡ булыуын күрһәтеүҙең тағы бер юлы — универсаль Lisp функцияһын яҙыу һәм уның универсаль Тьюринг машинасы тасуирламаһына ҡарағанда ҡыҫҡараҡ һәм төшөнөрлөрәк булыуын иҫбатлау ине. Был Lisp аңлатмаһының ҡиммәтен иҫәпләүсе eval... функцияһы булды.... eval-ды яҙыу өсөн Lisp функцияларын Lisp мәғлүмәттәре итеп сағылдырыусы тамғалау алымын уйлап табырға кәрәк ине, һәм бындай нотация фәҡәт мәҡәлә маҡсаттары өсөн генә төҙөлдө, уны ғәмәлдә Lisp программаларын яҙыу өсөн ҡулланыу тураһында бер ниндәй ҙә уй юҡ ине.
Артабан нимә булды тигәндә, 1958 йылдың аҙаҡтарында Маккартиҙың аспиранттарының береһе Стив Рассел ошо eval билдәләмәһенә ҡарап торған да, әгәр уны машина теленә тәржемә итһә, һөҙөмтәлә Lisp интерпретаторы килеп сығасағын аңлап ҡалған.
Был ул ваҡытта ҙур көтөлмәгән хәл булды. Бына Маккарти был хаҡта һуңыраҡ бер интервьюһында нимә тигән:
Стив Рассел әйтте: ҡара әле, ниңә әле мин ошо eval-ды программалап ҡуймайым, тине. Ә мин уға әйттем: һу-һу, һин теория менән практиканы бутайһың, был eval иҫәпләү өсөн түгел, уҡыу өсөн тәғәйенләнгән. Ләкин ул барыбер тотондо ла эшләне. Йәғни ул минең мәҡәләмдәге eval-ды хаталарын төҙәтеп [IBM] 704 машина кодына ҡуйҙы, һәм быны Lisp интерпретаторы тип иғлан итте — һәм был ысынында ла шулай ине. Шулай итеп, ошо мәлдә Lisp төп асылында бөгөнгө ҡиәфәтен алды....
Ҡапыл ғына, минеңсә бер нисә аҙна эсендә, Маккарти үҙенең теоретик күнегеүенең реаль программалау теленә — үҙе ниәтләгәндән дә ҡеүәтлерәк телгә әйләнеүен күрҙе.
Шулай итеп, был 1950-се йылдар теленең иҫкермәүенең ҡыҫҡаса аңлатмаһы шул: ул технология түгел, ә математика ине, ә математика иҫкермәй. Lisp-ты 1950-се йылдар аппарат тәьминәте менән түгел, ә, әйтәйек, 1960 йылда табылған һәм әле лә иң шәп универсаль тәртипкә килтереү ысулы булып ҡалған Quicksort алгоритмы менән сағыштырыу дөрөҫ булыр ине.
1950-се йылдарҙан һаҡланып ҡалған тағы бер тел бар — Fortran, һәм ул тел төҙөлөшөнә бөтөнләй ҡапма-ҡаршы ҡарашты кәүҙәләндерә. Lisp көтөлмәгәндә программалау теленә әйләнгән теоретик хеҙмәт булһа, Fortran маҡсатлы рәүештә программалау теле булараҡ эшләнгән, әммә беҙ уны хәҙер бик түбән кимәлдәге тел тип иҫәпләр инек.
1956 йылда эшләнгән тел — Fortran I — бөгөнгө Fortran-дан бөтөнләй айырылып торған нәмә ине. Fortran I ысынында иҫәпләүҙәр менән байытылған ассемблер теле ине. Ҡайһы бер яҡтан ул хатта һуңғыраҡ ассемблер телдәренән дә көсһөҙөрәк булды; мәҫәлән, унда аҫпрограммалар бөтөнләй булманы, бары тик күсеүҙәр (branches) генә бар ине. Хәҙерге заман Fortran-ы Fortran I-гә ҡарағанда Lisp-ҡа яҡыныраҡ тип әйтеп булалыр.
Lisp һәм Fortran ике айырым эволюцион ағастың олоно булды: береһе математикаға, икенсеһе машина архитектураһына тамыр йәйгән ине. Был ике ағас шул ваҡыттан алып бер-береһенә яҡыная. Lisp башта ҡеүәтле булып башланды һәм киләһе егерме йыл эсендә етеҙләште. «Мейнстрим» тип аталған телдәр иһә башта етеҙ булып башланды һәм киләһе ҡырҡ йыл эсендә яйлап ҡеүәтлерәк була барҙы, һәм бөгөн уларҙың иң алдынғылары Lisp-ҡа бик яҡынлашты. Яҡынлашты, әммә уларҙа барыбер ҡайһы бер нәмәләр етмәй әле...
Lisp-ты нимә айырып торҙо
Беренсе тапҡыр барлыҡҡа килгәнендә Lisp үҙендә туғыҙ яңы идеяны берләштергән ине. Уларҙың ҡайһы берҙәрен беҙ хәҙер өйрәнелгән ғәҙәти нәмә тип ҡабул итәбеҙ, башҡалары тик алдынғы телдәрҙә генә күренә, ә икәүһе һаман да тик Lisp-ҡа ғына хас. Төп ағым тарафынан ҡабул ителеү тәртибендә был туғыҙ идея түбәндәгеләр: Шартлы конструкциялар. Шартлы конструкция — ул if-then-else төҙөлөшө. Беҙ уларҙы хәҙер өйрәнелгән ғәҙәти күренеш тип һанайбыҙ, әммә Fortran I-ҙә улар юҡ ине. Унда бары тик машина инструкцияһына нигеҙләнгән шартлы goto ғына бар ине.
Функция тибы. Lisp-та функциялар — бөтөн һандар йәки юлдар кеүек үк мәғлүмәт тибы. Уларҙың үҙ литерал күренеше бар, улар үҙгәреүсәндәрҙә һаҡлана, аргумент булараҡ тапшырыла ала һ.б.
Рекурсия. Lisp уны хуплаған беренсе программалау теле булды.
Динамик типлаштырыу. Lisp-та бөтә үҙгәреүсәндәр ҙә ғәмәлдә күрһәткестәр (pointers) булып тора. Тип үҙгәреүсәндәргә түгел, ә ҡиммәттәргә бирелә, һәм үҙгәреүсәнде тәғәйенләү йәки бәйләү күрһәткес күрһәткән нәмәне түгел, ә күрһәткестең үҙен күсереүҙе аңлата.
Сүп-сар йыйыу (Garbage-collection).
Аңлатмаларҙан (expressions) торған программалар. Lisp программалары — һәр береһе ҡиммәт ҡайтарған аңлатмалар ағасы. Был аңлатмалар менән операторҙар (statements) араһында айырма яһаусы Fortran һәм унан һуңғы күпселек телдәрҙән ныҡ айырылып тора.
Fortran I-ҙә был айырманың булыуы табиғи ине, сөнки унда операторҙарҙы бер-береһенең эсенә ҡуйып булмай ине. Шуға күрә математика эшләү өсөн аңлатмалар кәрәк булһа ла, башҡа бер нәмәнең дә ҡиммәт ҡайтарыуының мәғәнәһе юҡ ине, сөнки уны көтөп тороусы бер ни булманы.
Блоклы структуралы телдәрҙең барлыҡҡа килеүе менән был сикләү юҡҡа сыҡты, әммә ул ваҡытта һуң ине инде. Аңлатмалар менән операторҙар араһындағы айырма ныҡлап төпләнгәйне. Ул Fortran-дан Algol-ға, ә унан һуң уларҙың икеһенең дә вариҫтарына таралды.
Символ тибы. Символдар ғәмәлдә хеш-таблицала һаҡланған юлдарға күрһәткес булып тора. Шуға күрә һеҙ һәр тамғаны сағыштырып ултырмайынса, күрһәткесте сағыштырып ҡына тиңлекте тикшерә алаһығыҙ.
Символдар һәм константалар ағасын ҡулланып кодты тамғалау алымы.
Бөтә телдең һәр ваҡыт ҡул аҫтында булыуы. Уҡыу ваҡыты (read-time), компиляция ваҡыты (compile-time) һәм башҡарылыу ваҡыты (runtime) араһында ысын айырма юҡ. Һеҙ кодты уҡыған ваҡытта компиляциялай йәки башҡара алаһығыҙ, компиляциялағанда уҡый йәки башҡара алаһығыҙ, һәм программа эшләгән ваҡытта уҡый йәки компиляциялай алаһығыҙ.
Уҡыу ваҡытында кодты башҡарыу ҡулланыусыларға Lisp синтаксисын яңынан программаларға мөмкинлек бирә; компиляция ваҡытында кодты башҡарыу — макростарҙың нигеҙе; башҡарылыу ваҡытында компиляциялау Lisp-ты Emacs кеүек программаларҙа киңәйтеү теле булараҡ ҡулланыуҙың нигеҙендә ята; ә программа эшләгәндә уҡыу программаларға s-аңлатмалар ярҙамында үҙ-ара бәйләнешкә инергә мөмкинлек бирә, был идея күптән түгел XML булараҡ яңынан уйлап табылды. Lisp тәүге тапҡыр барлыҡҡа килгәндә, был идеялар 1950-се йылдар аҙағындағы техник саралар менән билдәләнгән ғәҙәти программалау практикаһынан бик алыҫ ине. Ваҡыт үтеү менән, популяр телдәр сылбырында сағылған «ғәҙәти» тел әкренләп Lisp яғына табан үҫеште. 1–5-се идеялар хәҙер киң таралған. 6-сыһы мейнстримда күренә башланы. Python-да 7-сеһенең ниндәйҙер төрө бар, әммә уның өсөн махсус синтаксис юҡ кеүек.
8-се идеяға килгәндә, ул иң ҡыҙыҡлыһы булыуы ихтимал. 8 һәм 9-сы идеялар Lisp өлөшөнә осраҡлы рәүештә генә әүерелде, сөнки Стив Рассел Маккарти бер ҡасан да бойомға ашырырға уйламаған нәмәне эшләп ҡуйҙы. Шуға ҡарамаҫтан, тап ошо идеялар Lisp-тың сәйер ҡиәфәтенә лә, уның иң үҙенсәлекле сифаттарына ла сәбәпсе булды. Lisp-тың сәйер күренеүе уның сәйер синтаксислы булыуынан түгел, ә синтаксисы бөтөнләй булмауынан; башҡа телдәрҙе тарҡатҡанда шаршау артында төҙөлгән парсинг ағастарын һеҙ бында программаларҙы туранан-тура белдереү өсөн ҡулланаһығыҙ, ә был ағастар исемлектәрҙән — Lisp-тың үҙ мәғлүмәт структураларынан — тора.
Телде уның үҙ мәғлүмәт структуралары аша сағылдырыу бик ҡеүәтле үҙенсәлек булып сыға. 8 һәм 9-сы идеялар бергәләп һеҙгә программалар яҙыусы программалар яҙырға мөмкинлек бирә тигәнде аңлата. Был сәйер идея кеүек яңғырауы мөмкин, әммә Lisp-та был — көндәлек ғәҙәти эш. Быны эшләүҙең иң таралған юлы — макрос тип аталған нәмә аша.
Lisp-тағы «макрос» термины башҡа телдәрҙәге мәғәнәне аңлатмай. Lisp макросы ябай ҡыҫҡартыуҙан алып яңы тел өсөн компиляторға тиклем теләһә нимә булыуы мөмкин. Әгәр һеҙ Lisp-ты ысынлап аңларға йәки программалау офоғоғоҙҙо киңәйтергә теләһәгеҙ, мин макростар тураһында күберәк белергә кәңәш итер инем.
Макростар (Lisp мәғәнәһендә) минең белеүемсә әле лә фәҡәт Lisp-ҡа ғына хас. Был бер яҡтан шуның өсөн: макростарға эйә булыу өсөн, моғайын, һеҙгә үҙ телегеҙҙе Lisp кеүек үк сәйер күренештә яһарға тура киләсәк. Икенсе яҡтан сәбәбе шул булыуы ихтимал: әгәр һеҙ был һуңғы көс өҫтәмәһен ҡушһағыҙ, үҙегеҙҙе яңы тел түгел, ә Lisp-тың яңы диалектын ғына уйлап таптым тип танырға мәжбүр буласаҡһығыҙ.
Мин быны күберәк шаяртып әйтәм, ләкин был бик хаҡ. Әгәр һеҙ car, cdr, cons, quote, cond, atom, eq үҙенсәлектәренә һәм исемлектәр менән бирелгән функциялар нотацияһына эйә булған тел билдәләһәгеҙ, унан Lisp-тың ҡалған бөтә өлөшөн үҙегеҙ төҙөй алаһығыҙ. Ысынында тап ошо сифат Lisp-ты билдәләй ҙә: тап ошолай булһын өсөн Маккарти Lisp-ҡа хәҙерге формаһын биргән дә инде.
Телдәрҙең әһәмиәте ҡайҙа күренә
Шулай итеп, Lisp төп ағымдағы телдәр асимптотик рәүештә яҡынлашҡан ниндәйҙер сикте кәүҙәләндерә ти, был һеҙ уны программалар яҙыу өсөн ысынлап та ҡулланырға тейешһегеҙ тигәнде аңлатамы? Ҡеүәте аҙыраҡ телде ҡулланып, һеҙ күпме юғалтаһығыҙ? Ҡайһы берҙә инновацияларҙың иң сигендә булмау аҡыллыраҡ түгелме ни? Һәм популярлыҡ ниндәйҙер кимәлдә үҙен-үҙе аҡламаймы ни? Мәҫәлән, осло сәсле етәксенең еңел генә программалаусылар яллай алған телде ҡулланырға теләүе дөрөҫ түгелме?
Әлбиттә, программалау телен һайлау бик мөһим булмаған проекттар ҙа бар. Ҡағиҙә булараҡ, ҡушымтаға талаптар ни тиклем ҙурыраҡ булһа, ҡеүәтле телде ҡулланыуҙан шул тиклем ҙурыраҡ өҫтөнлөк алаһығыҙ. Ләкин күп кенә проекттар бер ҙә ҙур талаптар ҡуймай. Күпселек программалау, моғайын, бәләкәй ялғаусы (glue) программалар яҙыуҙан тора, ә ундай программалар өсөн һеҙ үҙегеҙ белгән һәм кәрәкле эшегеҙ өсөн яҡшы китапханалары булған теләһә ниндәй телде ҡуллана алаһығыҙ. Әгәр һеҙгә бары тик бер Windows ҡушымтаһынан икенсеһенә мәғлүмәт күсерергә кәрәк булһа, әлбиттә, Visual Basic ҡулланығыҙ.
Һеҙ бәләкәй ялғаусы программаларҙы Lisp-та ла яҙа алаһығыҙ (мин уны өҫтәл калькуляторы сифатында ҡулланам), ләкин Lisp кеүек телдәрҙең иң ҙур еңеүе спектрҙың икенсе осонда — ҡаты конкуренция шарттарында ауыр мәсьәләләрҙе сисеү өсөн ҡатмарлы программалар яҙырға кәрәк булған урында күренә. Яҡшы бер миҫал — ITA Software компанияһының Orbitz өсөн лицензиялаған авиабилеттар хаҡын эҙләү программаһы. Был егеттәр Travelocity һәм Expedia кеүек ике ҙур, тамыр йәйгән көнәркәш өҫтөнлөк иткән баҙарға килеп инде һәм технологик йәһәттән уларҙы еңел генә баҫып уҙҙы шикелле.
ITA ҡушымтаһының үҙәге — 200 000 юллыҡ Common Lisp программаһы, ул һаман да мейнфрейм дәүерендәге программалау ысулдарын ҡулланған көнәркәштәренә ҡарағанда тиҫтәләрсә тапҡыр күберәк варианттарҙы тикшерә. (Гәрсә ITA ла үҙенсә мейнфрейм дәүерендәге программалау телен ҡулланһа ла.) Мин ITA-ның кодын бер ҡасан да күргәнем юҡ, ләкин уларҙың төп хакерҙарының береһе әйтеүенсә, улар бик күп макростар ҡуллана, һәм быны ишетеүемә мин бер ҙә ғәжәпләнмәйем.
Үҙәккә ынтылыусы көстәр
Мин һирәк осраған технологияларҙы ҡулланыуҙың бер ниндәй ҙә ауырлығы юҡ тип әйтмәйем. Был хаҡта борсолоуҙа осло сәсле етәксе бөтөнләй үк яңылышмай. Ләкин ул хәүеф-хәтәрҙәрҙе аңламағанлыҡтан, уларҙы күпертергә ярата.
Һирәгерәк ҡулланылған телдәрҙән сығырға мөмкин булған өс проблема тураһында уйлай алам. Һеҙҙең программалар башҡа телдәрҙә яҙылған программалар менән яҡшы эшләмәҫкә мөмкин. Һеҙҙең ҡул аҫтында китапханалар аҙыраҡ булыуы ихтимал. Һәм һеҙгә программалаусылар яллау ҡыйынлашырға мөмкин.
Быларҙың һәр береһе ни тиклем ҙур проблема булып тора? Беренсеһенең әһәмиәте һеҙҙең бөтә системаны контролдә тотоуығыҙға бәйле. Әгәр һеҙ ситтәге ҡулланыусының машинаһында хаталы, ябыҡ операция системаһы өҫтөндә (исемдәр атап тормайым) эшләргә тейешле программа яҙаһығыҙ икән, ҡушымтағыҙҙы шул ОС телендә яҙыуҙың өҫтөнлөктәре булыуы ихтимал. Ләкин әгәр һеҙ бөтә системаны контролдә тотһағыҙ һәм бөтә өлөштәрҙең дә баштағы коды (source code) һеҙҙә булһа, ITA кеүек, үҙегеҙ теләгән теләһә ниндәй телде ҡуллана алаһығыҙ. Әгәр бер-береһенә яраҡлашмау килеп сыҡһа, һеҙ уны үҙегеҙ төҙәтә алаһығыҙ.
Серверҙа эшләгән ҡушымталарҙа иң алдынғы технологияларҙы еңел ҡуллана алаһығыҙ, һәм минеңсә, Джонатан Эриксон «программалау телдәренең яңырыу дәүере» тип атаған нәмәнең төп сәбәбе лә ошонда. Бына ни өсөн беҙ хатта Perl һәм Python кеүек яңы телдәр тураһында ишетәбеҙ. Беҙ был телдәр тураһында кешеләрҙең уларҙа Windows ҡушымталары яҙғандары өсөн түгел, ә уларҙы серверҙарҙа ҡулланғандары өсөн ишетәбеҙ. Программа тәьминәте өҫтәл компьютерҙарынан серверҙарға күскән һайын (хатта Microsoft та был киләсәккә күнде шикелле), урта ҡул технологияларҙы ҡулланыуға баҫым кәмей барасаҡ.
Китапханаларға килгәндә, уларҙың әһәмиәте лә ҡушымтаға бәйле. Түбәнерәк талаплы мәсьәләләр өсөн китапханаларҙың булыуы телдең үҙ эске ҡеүәтен баҫып китергә мөмкин. Килемһеҙлекте ҡаплау сиге ҡайҙа? Төгәл әйтеүе ҡыйын, ләкин ул ҡайҙа ғына булмаһын, ысын ҡушымта тип атарлыҡ теләһә ниндәй нәмәнән аҫтараҡ ята. Әгәр компания үҙен программа тәьминәте өлкәһендә тип иҫәпләй һәм улар үҙҙәренең төп продукттарының береһе буласаҡ ҡушымта яҙа икән, ул, моғайын, бер нисә хакерҙы һәм кәм тигәндә алты айлыҡ яҙыу ваҡытын талап итәсәк. Бындай дәүмәлдәге проектта ҡеүәтле телдәр әҙер китапханаларҙың уңайлылығын уҙып китә башлай.
Осло сәсле етәксенең өсөнсө борсолоуы — программалаусылар яллау ҡыйынлығы — минеңсә, уйҙырма бер һылтау. Ахыр сиктә һеҙгә күпме хакер яллап алырға кәрәк һуң? Хәҙер барыбыҙ ҙа беләбеҙ: программа тәьминәтен иң яҡшыһы ундан кәм кешенән торған командалар эшләй. Һәм кемдер ҡасан да булһа ишеткән теләһә ниндәй тел өсөн ошондай күләмдә хакерҙар яллауҙа ауырлыҡтар булмаҫҡа тейеш. Әгәр һеҙ ун Lisp хакерын таба алмайһығыҙ икән, тимәк, һеҙҙең компания программа тәьминәтен эшләү өсөн дөрөҫ булмаған ҡалала төпләнгән.
Ысынында, ҡеүәтерәк тел һайлау һеҙгә кәрәк булған команданың күләмен кәметәлер ҙә, сөнки (а) әгәр ҡеүәтерәк тел ҡулланһағыҙ, һеҙгә шул тиклем күп хакер кәрәкмәйәсәк, һәм (б) алдынғыраҡ телдәрҙә эшләгән хакерҙар ғәҙәттә аҡыллыраҡ була.
Мин «стандарт» тип ҡабул ителгән технологияларҙы ҡулланырға көслө баҫым булмаясаҡ, тип әйтмәйем. Viaweb-та (хәҙер Yahoo Store), беҙ Lisp ҡулланып, венчур инвесторҙарын һәм беҙҙе һатып алырға теләгән потенциаль клиенттарҙы ғәжәпләндерҙек. Ләкин беҙ шулай уҡ Sun кеүек «сәнәғәт кимәлендәге» серверҙар урынына ябай Intel ҡаптарын сервер итеп ҡулланғаныбыҙ, Windows NT кеүек реаль коммерция операция системаһы урынына FreeBSD тигән ул ваҡытта билдәһеҙ булған асыҡ сығанаҡлы Unix вариантын һайлағаныбыҙ, хәҙер бер кем дә хәтерләмәгән SET тигән ялған электрон сауҙа стандартын һанға һуҡмағаныбыҙ һ.б. өсөн дә уларҙы аптырашта ҡалдырҙыҡ.
Костюм кейгән етәкселәрҙең һеҙҙең өсөн техник ҡарарҙар ҡабул итеүенә юл ҡуя алмайһығыҙ. Беҙҙең Lisp ҡулланыуыбыҙ ҡайһы бер потенциаль һатып алыусыларҙы шиккә һалдымы? Ҡайһы берәүҙәрен, бер аҙ, ләкин әгәр беҙ Lisp ҡулланмаған булһаҡ, уларҙың беҙҙе һатып алыу теләген уятҡан программаны яҙа алмаҫ инек. Уларға аномалия булып күренгән нәмә ысынында сәбәп менән һөҙөмтә ине.
Әгәр һеҙ стартап башлаһағыҙ, үҙ продуктығыҙҙы венчур инвесторҙарына йәки потенциаль һатып алыусыларға ярарлыҡ итеп проектламағыҙ. Үҙ продуктығыҙҙы ҡулланыусыларға оҡшарлыҡ итеп проектлағыҙ. Әгәр һеҙ ҡулланыусыларҙың күңелен яулаһағыҙ, ҡалған бөтә нәмә лә артынан киләсәк. Әгәр яулай алмаһағыҙ, технология һайлауығыҙҙың ни тиклем уңайлы һәм ортодоксаль булғаны бер кемде лә ҡыҙыҡһындырмаясаҡ.
Уртаса булыуҙың хаҡы
Ҡеүәте аҙыраҡ телде ҡулланып, һеҙ күпме юғалтаһығыҙ? Был хаҡта ысынында ҡайһы бер мәғлүмәттәр бар.
Ҡеүәттең иң уңайлы үлсәме, моғайын, кодтың күләме булып торалыр. Юғары кимәлдәге телдәрҙең маҡсаты — һеҙгә ҙурыраҡ абстракциялар биреү — йәғни ҙурыраҡ кирбестәр, тимәк, билдәле бер дәүмәлдәге диуарҙы төҙөү өсөн улар шул тиклем күп кәрәкмәй. Шуға күрә тел ни тиклем ҡеүәтлерәк булһа, программа шул тиклем ҡыҫҡараҡ була (әлбиттә, тамғалар һаны буйынса ғына түгел, ә айырым элементтар буйынса).
Ҡеүәтерәк тел һеҙгә ҡыҫҡараҡ программалар яҙырға нисек мөмкинлек бирә? Әгәр тел рөхсәт итһә, һеҙ ҡуллана алған бер ысул — ул түбәндән өҫкә программалау (bottom-up programming). Ҡушымтағыҙҙы ябай ғына төп телдә яҙыу урынына, һеҙ төп тел өҫтөндә үҙегеҙҙеке кеүек программалар яҙыу өсөн тел төҙөйһөгөҙ, ә шунан һуң уның ярҙамында үҙ программағыҙҙы яҙаһығыҙ. Был дөйөм код, һеҙ бөтә программағыҙҙы төп телдә яҙғанға ҡарағанда, күпкә ҡыҫҡараҡ булыуы мөмкин — ысынында күпселек ҡыҫыу алгоритмдары тап ошолай эшләй. Түбәндән өҫкә төҙөлгән программаны үҙгәртеү ҙә еңелерәк булырға тейеш, сөнки күп осраҡтарҙа тел ҡатламын бөтөнләй үҙгәртергә тура килмәйәсәк.
Кодтың дәүмәле мөһим, сөнки программаны яҙыу өсөн киткән ваҡыт күбеһенсә уның оҙонлоғона бәйле. Әгәр программағыҙ икенсе телдә өс тапҡырға оҙонораҡ була икән, уны яҙыу ҙа өс тапҡырға күберәк ваҡытты аласаҡ — һәм быны күберәк кеше яллау менән еңеп сығып булмай, сөнки билдәле бер дәүмәлдән һуң яңы хеҙмәткәрҙәр ысынында таҙа зыян килтерә. Фред Брукс үҙенең билдәле The Mythical Man-Month китабында ошо күренеште тасуирлағайны, һәм мин күргән бөтә нәмә уның һүҙҙәрен раҫлауға табан бара.
Шулай итеп, Lisp-та яҙһағыҙ, программаларығыҙ күпмегә ҡыҫҡараҡ буласаҡ? Мәҫәлән, Lisp менән C телен сағыштырғанда мин ишеткән һандарҙың күбеһе 7–10 тапҡыр тирәһе ине. Ләкин яңыраҡ New Architect журналындағы ITA тураһындағы мәҡәләлә «Lisp-тың бер юлы C-ның 20 юлын алмаштыра ала» тип яҙылған ине, һәм был мәҡәлә ITA президентының өҙөктәре менән тулы булғанлыҡтан, улар был һанды тап ITA-нан алғандыр тип уйлайым. Әгәр шулай булһа, беҙ уға ышана алабыҙ; ITA-ның программа тәьминәте үҙенә Lisp менән бер рәттән күп кенә C һәм C++-ты ла индерә, шуға күрә улар үҙ тәжрибәһенән сығып һөйләй.
Минең фаразым буйынса, был тапҡырлаусылар хатта даими ҙа түгел. Ҡатмарлыраҡ мәсьәләләргә осрағанда, шулай уҡ аҡыллыраҡ программалаусыларығыҙ булғанда, улар тағы ла арта төшәлер тип уйлайым. Ысынлап та яҡшы хакер яҡшыраҡ ҡоралдарҙан күберәк файҙа һығып сығара ала.
Нисек кенә булмаһын, кәкре һыҙыҡтағы бер мәғлүмәт нөктәһе булараҡ: әгәр һеҙ ITA менән ярышырға һәм үҙ программағыҙҙы C телендә яҙырға булһағыҙ, улар һеҙгә ҡарағанда программа тәьминәтен егерме тапҡырға етеҙерәк эшләй аласаҡ ине. Әгәр һеҙ яңы бер функцияға бер йыл ваҡыт сарыф итһәгеҙ, улар уны өс аҙнанан да кәм ваҡыт эсендә ҡабатлай алыр ине. Әгәр улар яңы нәмәне эшләүгә ни бары өс ай ваҡыт бүлһә, һеҙҙә шул уҡ нәмә булһын өсөн биш йыл ваҡыт үтәсәк.
Һәм беләһегеҙме нимә? Был иң яҡшы осраҡ. Код күләме нисбәттәре тураһында һүҙ алып барғанда, һеҙ программаны көсһөҙөрәк телдә лә яҙып була тип алдан күҙаллайһығыҙ. Әммә ысынында программистарҙың мөмкинлектәренең сиктәре бар. Әгәр һеҙ артыҡ түбән кимәлле тел менән ауыр мәсьәләне сисергә тырышһағыҙ, башығыҙға бер юлы бөтәһен дә һыйҙырып булмай торған нөктәгә етәһегеҙ.
Шуға күрә, ITA өс айҙа Lisp телендә яҙа алған нәмәне уның уйлап сығарылған көнсөлөнә ҡабатлау өсөн биш йыл кәрәк буласаҡ тигәндә, мин бер ниндәй ҙә тотҡарлыҡ булмаған осраҡтағы биш йылды күҙ уңында тотам. Ысынында, күпселек компанияларҙа эштәр ойошторолоуы буйынса, биш йыл талап иткән теләһә ниндәй эшкәртеү проекты, моғайын, бер ҡасан да тамамланмаясаҡ.
Был сикке осраҡ икәнен таныйым. ITA-ның хакерҙары ғәҙәттән тыш аҡыллы кеүек, ә C — ярайһы уҡ түбән кимәлле тел. Әммә конкурентлы баҙарҙа хатта ике йәки өскә бер нисбәте лә һеҙҙең һәр ваҡыт артта ҡалыуығыҙҙы гарантиялар өсөн етерлек булыр ине.
Рецепт
Был — өрпәк сәсле етәксе (pointy-haired boss) хатта уйларға ла теләмәгән ихтималлыҡ төрө. Һәм шуға күрә уларҙың күбеһе был турала уйламай ҙа. Сөнки, асылда, өрпәк сәсле етәксе, үҙенең ғәйебе икәнен бер кем дә иҫбат итә алмаған осраҡта, компанияһының тар-мар ителеүенә лә артыҡ борсолмай. Шәхсән уның өсөн иң хәүефһеҙ план — көтөүҙең уртаһына яҡыныраҡ булыу.
Ҙур ойошмалар эсендә был алымды тасуирлау өсөн ҡулланылған фраза — «индустрияның иң яҡшы тәжрибәһе» (industry best practice). Уның маҡсаты — өрпәк сәсле етәксене яуаплылыҡтан ҡурсалау: әгәр ул «индустрияның иң яҡшы тәжрибәһе» булған нәмәне һайлаһа һәм компания еңелһә, уны ғәйепләп булмай. Ул түгел, ә индустрия үҙе һайлаған.
Был термин башта бухгалтер иҫәбе алымдарын һәм башҡаларҙы тасуирлау өсөн ҡулланылған тип уйлайым. Уның мәғәнәһе, яҡынса алғанда: сәйер бер ни ҙә эшләмәгеҙ. Һәм бухгалтер иҫәбендә был, моғайын, яҡшы фекерҙер. «Алдынғы ҡарашлы» һәм «бухгалтерия» тигән терминдар бергә яҡшы яңғырамай. Әммә был критерийҙы технологиялар тураһындағы ҡарарҙарға индерһәгеҙ, хата яуаптар ала башлайһығыҙ.
Технология йыш ҡына нәҡ алдынғы булырға тейеш. Программалау телдәрендә, Эранн Гат билдәләп үткәнсә, «индустрияның иң яҡшы тәжрибәһе» һеҙгә ысынында иң яҡшыһын түгел, ә ябай уртасаһын ғына бирә. Ҡабул ителгән ҡарар һеҙҙе агрессив көнсөлдәрегеҙҙең тиҙлегенең бәләкәй генә бер өлөшө менән программа тәьминәтен яҙырға мәжбүр иткәндә, «иң яҡшы тәжрибә» — дөрөҫ булмаған атама.
Шулай итеп, бында беҙҙә бик ҡиммәтле тип иҫәпләгән ике мәғлүмәт бар. Ысынында, мин быны үҙ тәжрибәмдән беләм. 1-се: телдәрҙең ҡеүәте төрлөсә. 2-се: күпселек менеджерҙар быны аңлы рәүештә иғтибарһыҙ ҡалдыра. Бергәләп, был ике факт һүҙмә-һүҙ аҡса эшләү рецебы булып тора. ITA — был рецепттың эш итеү миҫалы. Әгәр программа тәьминәте бизнесында еңергә теләһәгеҙ, таба алған иң ауыр мәсьәләгә тотоноғоҙ, ҡулығыҙға эләгә алған иң ҡеүәтле телде ҡулланығыҙ һәм көнсөлдәрегеҙҙең өрпәк сәсле етәкселәре уртаса кимәлгә ҡайтҡанын көтөгөҙ.
Ҡушымта: Ҡеүәт
Программалау телдәренең сағыштырма ҡеүәте тураһында нимәне күҙ уңында тотҡанымды күрһәтеү өсөн ошо мәсьәләне ҡарап сығайыҡ. Беҙгә аккумуляторҙар етештереүсе функция яҙырға кәрәк — ул n һанын ҡабул иткән һәм икенсе бер i һанын алып, n-ға i ҡушылған ҡиммәтте ҡайтарған функцияны биреүсе функция.
(Был ҡушып арттырыу, ябай ғына ҡушыу түгел. Аккумулятор тупларға тейеш.)
Common Lisp телендә был түбәндәгесә булыр ине: (defun foo (n) (lambda (i) (incf n i))), ә Perl 5 телендә: sub foo { my ($n) = @_; sub {$n += shift} }, бында Lisp версияһына ҡарағанда элементтар күберәк, сөнки Perl-да параметрҙарҙы ҡул менән алырға тура килә.
Smalltalk телендә код Lisp-ҡа ҡарағанда бер аҙ оҙонораҡ foo: n |s| s := n. ^[:i| s := s+i. ], сөнки дөйөм алғанда лексик үҙгәреүсәндәр эшләһә лә, параметрға ҡиммәт йөкмәтеп булмай, шуға күрә яңы s үҙгәреүсәнен булдырырға кәрәк.
Javascript телендә миҫал тағы ла бер аҙ оҙонораҡ, сөнки Javascript инструкциялар менән аңлатмалар араһындағы айырманы һаҡлай, шуға күрә ҡиммәттәрҙе кире ҡайтарыу өсөн асыҡ return операторҙары кәрәк: function foo(n) { return function (i) { return n += i } } (Ғәҙеллек өсөн шуны әйтергә кәрәк: Perl дә был айырманы һаҡлай, ләкин үҙенә хас ғәҙәт буйынса return операторын төшөрөп ҡалдырырға рөхсәт итеп хәл итә.)
Әгәр Lisp/Perl/Smalltalk/Javascript кодын Python теленә тәржемә итергә тырышһағыҙ, ҡайһы бер сикләүҙәргә осрайһығыҙ. Сөнки Python лексик үҙгәреүсәндәрҙе тулыһынса тәьмин итмәй, n ҡиммәтен һаҡлау өсөн мәғлүмәттәр структураһын булдырырға тура килә. Һәм Python-да функция типтары булһа ла, улар өсөн литерал кәүҙәләнеш юҡ (кәүҙәһе бары тик бер аңлатманан ғына тормаһа), шуға күрә кире ҡайтарыу өсөн исемле функция булдырырға кәрәк. Һөҙөмтәлә һеҙ бына нимәгә киләсәкһегеҙ: def foo(n): s = [n] def bar(i): s[0] += i return s[0] return bar Python ҡулланыусылары хаҡлы рәүештә ни өсөн улар бары тик def foo(n): return lambda i: return n += i йәки хатта def foo(n): lambda i: n += i тип яҙа алмай тип һорай ала, һәм минең уйымса, ҡасандыр улар моғайын шулай эшләй алыр. (Ләкин әгәр улар Python-дың артабан Lisp-ҡа әйләнеүен көтөргә теләмәһә, һәр ваҡыт ябай ғына...)
Объектҡа йүнәлтелгән (ОО) телдәрҙә һеҙ бикле ҡаплауҙы (closure — тышҡы өлкәләрҙә билдәләнгән үҙгәреүсәндәргә һылтанған функцияны) сикләнгән кимәлдә имитациялай алаһығыҙ: бының өсөн бер методлы һәм һәр тышҡы үҙгәреүсәнде алмаштырыу өсөн бер ҡырлы (field) класс билдәләргә кәрәк. Был программисты лексик өлкәне тулыһынса яҡлаған телдә компилятор башҡара торған код анализын эшләргә мәжбүр итә, һәм әгәр бер нисә функция бер үк үҙгәреүсәнгә һылтанһа, был эшләмәйәсәк, әммә бындай ябай осраҡтарҙа был етерлек.
Python белгестәре был мәсьәләне хәл итеүҙең иң яҡшы юлы тап ошо тип ризалаша кеүек, йә def foo(n): class acc: def __init__(self, s): self.s = s def inc(self, i): self.s += i return self.s return acc(n).inc йәки class foo: def __init__(self, n): self.n = n def __call__(self, i): self.n += i return self.n тип яҙалар. Мин быларҙы Python яҡлаусылары мине телде дөрөҫ күрһәтмәүҙә ғәйепләмәһен өсөн индерҙем, ләкин икеһе лә миңә беренсе версияға ҡарағанда ҡатмарлыраҡ күренә. Һеҙ шул уҡ нәмәне эшләйһегеҙ — аккумуляторҙы һаҡлау өсөн айырым урын бүләһегеҙ; был бары тик исемлек башы урынына объекттың ҡыры ғына булып тора. Һәм бындай махсус, һаҡланған ҡыр исемдәрен, айырыуса __call__ ҡулланыу бер аҙ «хак» (яһалма алым) кеүек күренә.
Perl менән Python араһындағы ярышта Python хакерҙары Python-ды Perl-ға ҡарағанда нәфисерәк альтернатива тип раҫлай кеүек, ләкин был осраҡ ҡеүәттең иң юғары нәфислек булыуын күрһәтә: Perl программаһы ябайыраҡ (элементтары аҙыраҡ), хатта синтаксисы бер аҙ йәмһеҙерәк булһа ла.
Башҡа телдәр тураһында нимә әйтеп була? Был сығышта телгә алынған башҡа телдәрҙә — Fortran, C, C++, Java һәм Visual Basic — был мәсьәләне ысынында сисеп буламы-юҡмы икәне аңлашылмай. Кен Андерсон Java-ла иң яҡын вариант ошо була алыуын әйтә: public interface Inttoint { public int call(int i); } public static Inttoint foo(final int n) { return new Inttoint() { int s = n; public int call(int i) { s = s + i; return s; }}; } Был талаптарға тулыһынса тап килмәй, сөнки бары тик бөтөн һандар менән генә эшләй. Java хакерҙары менән күп хат алышҡандан һуң, алдағы миҫалдар кеүек эшләгән дөрөҫ полиморфлы версияны яҙыу ҡәһәр һуҡҡан ҡулайһыҙлыҡ менән мөмкин булмағанлыҡ араһында ята тип әйтер инем. Әгәр кемдер уны яҙырға теләһә, күрергә бик ҡыҙыҡ булыр ине, әммә минең шәхси ваҡытым бөттө.
Әлбиттә, был мәсьәләне башҡа телдәрҙә сисеп булмай тигәнде һүҙмә-һүҙ аңларға ярамай. Был телдәрҙең барыһының да Тьюринг-эквивалентлы булыуы факт булып тора, тимәк, ҡәтғи әйткәндә, уларҙың теләһә ҡайһыһында теләһә ниндәй программа яҙып була. Тимәк, быны нисек эшләргә? Сикке осраҡта — көсһөҙөрәк телдә Lisp интерпретаторын яҙыу аша.
Был шаяртыу кеүек яңғырай, ләкин ҙур программалау проекттарында төрлө кимәлдә шул тиклем йыш осрай, хатта был күренеш өсөн исем дә бар — Гринспендың унынсы ҡағиҙәһе:
Теләһә ниндәй етерлек кимәлдә ҡатмарлы булған C йәки Fortran программаһы үҙ эсенә Common Lisp теленең яртыһының махсус, формаль рәүештә тасуирланмаған, хаталар менән тулы һәм яй эшләүсе тормошҡа ашырылышын ала.
Әгәр ҡатмарлы мәсьәләне хәл итергә тырышһағыҙ, һорау етерлек ҡеүәтле тел ҡулланыуығыҙҙа түгел, ә түбәндәгеләрҙе эшләүегеҙҙә: (a) ҡеүәтле телде ҡулланыу, (b) шундай тел өсөн де-факто интерпретатор яҙыу, йәки (c) үҙегеҙ шундай тел өсөн тере компиляторға әүерелеү. Беҙ бының башланғанын Python миҫалында күрәбеҙ инде, унда беҙ асылда компилятор лексик үҙгәреүсәнде тормошҡа ашырыу өсөн генерациялай торған кодты имитациялайбыҙ.
Был ғәмәлиәт киң таралған ғына түгел, ә институционалләштерелгән дә. Мәҫәлән, ОО донъяһында «паттерндар» (ҡалыптар) тураһында күп ишетергә мөмкин. Был паттерндар ҡайһы берҙә шул (c) осрағының, йәғни эшләүсе «тере компиляторҙың» дәлиле түгелме икән тип уйланам. Үҙ программаларымда паттерндар күрһәм, быны проблема билдәһе тип һанайым. Программаның формаһы ул сисергә тейеш булған мәсьәләне генә сағылдырырға тейеш. Кодтағы башҡа теләһә ниндәй даими ҡабатланыу — минең өсөн кәм тигәндә — үҙемдең етерлек дәрәжәлә ҡеүәтле булмаған абстракцияларҙы ҡулланыуымдың билдәһе; йыш ҡына үҙем яҙырға тейеш булған ниндәйҙер макростың киңәйеүҙәрен ҡулдан эшләп ултырыуымды аңлата.
Иҫкәрмәләр
IBM 704 процесоры яҡынса һыуытҡыс ҙурлығында ине, ләкин күпкә ауырыраҡ. Процессор 3150 фунт тарта ине, ә 4K оператив хәтер тағы 4000 фунт ауырлыҡтағы айырым йәшниктә булды. Иң ҙур көнкүреш һыуытҡыстарының береһе булған Sub-Zero 690 моделе 656 фунт тарта.
Стив Рассел шулай уҡ 1962 йылда тәүге (һанлы) компьютер уйыны булған Spacewar-ҙы яҙған.
Әгәр һеҙ өрпәк сәсле етәксене Lisp телендә программа яҙырға рөхсәт итерлек итеп алдарға теләһәгеҙ, уға быны XML тип әйтеп ҡарай алаһығыҙ.
Бына башҡа Lisp диалекттарында аккумулятор генераторы: Scheme: (define (foo n) (lambda (i) (set! n (+ n i)) n)) Goo: (df foo (n) (op incf n _))) Arc: (def foo (n) [++ n _]) Эранн Гаттың JPL-дағы «индустрияның иң яҡшы тәжрибәһе» тураһындағы моңһоу хикәйәһе мине ошо ғәҙәттә дөрөҫ ҡулланылмаған фразаға иғтибар итергә илһамландырҙы.
Питер Норвиг Design Patterns китабындағы 23 паттерндың 16-һы Lisp-та «күренмәй торған йәки ябайыраҡ» булыуын асыҡлаған.
Төрлө телдәр буйынса һорауҙарыма яуап биргән һәм/йәки ошо яҙманың ҡараламаларын уҡыған күп кешеләргә, шул иҫәптән Кен Андерсон, Тревор Блэквелл, Эранн Гат, Дэн Гиффин, Сара Харлин, Джереми Хилтон, Роберт Моррис, Питер Норвиг, Гай Стил һәм Антон ван Страатенға рәхмәт белдерәм. Улар әйтелгән фекерҙәр өсөн яуаплылыҡ йөрөтмәй.
Бәйле яҙмалар:
Күп кешеләр был сығышҡа баһа бирҙе, шуға күрә улар күтәргән мәсьәләләрҙе ҡарау өсөн өҫтәмә бит астым: Re: Revenge of the Nerds.
Был шулай уҡ LL1 хатлашыу исемлегендә киң һәм йыш ҡына файҙалы фекер алышыу уятты. Айырыуса Антон ван Страатендың семантик ҡыҫыу тураһындағы хатын ҡарағыҙ.
LL1-ҙәге ҡайһы бер хаттар мине Succinctness is Power мәҡәләһендә тел ҡеүәте темаһына тәрәнерәк үтергә этәрҙе.
Аккумулятор генераторының сағыштырма һынауының киңерәк ҡануни тормошҡа ашырылыуҙар йыйынтығы айырым биткә тупланған.