(Был эссе PyCon 2003 конференцияһындағы пленар сығышҡа нигеҙләнгән.)
Йөҙ йылдан һуң тормоштоң ниндәй буласағын күҙаллау ауыр. Беҙ ни бары бер нисә нәмәне генә ышаныс менән әйтә алабыҙ. Һәр кем оса торған автомобилдәрҙә йөрөйәсәк, йөҙәр ҡатлы бейек биналар төҙөргә рөхсәт ителеп, райондарға бүлеү ҡағиҙәләре йомшартыласаҡ, күп ваҡытта ҡараңғы буласаҡ һәм барлыҡ ҡатын-ҡыҙҙар ҙа көрәш сәнғәтенә өйрәтелгән буласаҡ икәнен беләбеҙ. Бында мин ошо күренештең бер өлөшөнә иғтибарҙы йүнәлтмәксемен. Ул оса торған автомобилдәрҙе идара итеүсе программа тәьминәтен яҙыу өсөн улар ниндәй программалау телен ҡулланыр икән?
Был турала уйланыу беҙ ул телдәрҙе ысынлап та ҡулланасағыбыҙ өсөн түгел, ә бәхетебеҙгә күрә, ошо нөктәнән шул нөктәгә барыу юлындағы телдәрҙе ҡулланасағыбыҙ өсөн файҙалы.
Минең уйымса, биологик төрҙәр кеүек үк, телдәр ҙә эволюция ағастарын барлыҡҡа килтерәсәк, һәм һәр яҡлап бөтөүгә илтеүсе тармаҡтар айырылып торасаҡ. Беҙ бының хәҙер ҙә бара башлағанын күрәбеҙ. Cobol, бер заман шул тиклем популяр булыуына ҡарамаҫтан, бер ниндәй ҙә интеллектуаль дауамсыларға эйә түгел кеүек. Был — эволюцион тығын, неандерталдар теле.
Мин Java өсөн дә ошондай уҡ яҙмыш фаразлайым. Кешеләр ҡайһы ваҡыт миңә: «Java уңышлы тел булмаясаҡ тип нисек әйтә алаһығыҙ? Ул бит инде уңышлы тел», — тип хат яҙалар. Әгәр уңышты уның тураһындағы китаптар (айырыуса айырым китаптар) кәштәләрҙә биләгән урын йәки эш табыу өсөн уны өйрәнергә кәрәк тип иҫәпләгән студенттар һаны менән үлсәһәк, мин уның уңышлы булыуын таныйым. Әммә мин Java уңышлы тел булмаясаҡ тип әйткәндә, күпкә анығыраҡ нәмәне күҙҙә тотам: Java, Cobol кеүек үк, эволюцион тығын булып сығасаҡ.
Был бары тик фараз ғына. Мин яңылышыуым да мөмкин. Бында минең маҡсатым — Java-ны яманлау түгел, ә эволюция ағастары мәсьәләһен күтәреү һәм кешеләрҙе «был ағаста X теле ҡайҙа урынлашҡан?» тигән һорауҙы бирергә мәжбүр итеү. Был һорауҙы биреүҙең сәбәбе — йөҙ йылдан һуң беҙҙең рухтарыбыҙ «мин һеҙгә әйткәйнем бит» тип әйтә алһын өсөн генә түгел. Төп тармаҡтарға яҡын тороу — хәҙер программалау өсөн яҡшы буласаҡ телдәрҙе табыу өсөн файҙалы эвристика.
Һәр ваҡытта ла һеҙгә эволюция ағасының төп тармаҡтарында булыу иң уңайлыһылыр. Неандерталдар күп булған ваҡытта ла, уларҙың береһе булыу бик насар булғандыр инде. Кроманьондар даими рәүештә килеп һеҙҙе туҡмар һәм аҙығығыҙҙы тартып алыр ине.
Йөҙ йылдан һуң телдәрҙең ниндәй буласағын белергә теләүемдең сәбәбе — хәҙер ағастың ҡайһы тармағына өмөт бағларға кәрәклеген белеү өсөн.
Телдәр эволюцияһы төрҙәр эволюцияһынан айырыла, сөнки тармаҡтар бер-береһенә ҡушыла ала. Мәҫәлән, Fortran тармағы Algol-дың тоҡомдары менән берләшә бара кеүек. Теория буйынса, был төрҙәр өсөн дә мөмкин, әммә күҙәнәктән ҙурыраҡ бер ниндәй йән эйәһендә лә бының булыуы ихтимал түгел.
Телдәр өсөн ҡушылыу ихтималлығы ҙурыраҡ, өлөшләтә сөнки мөмкинлектәр даирәһе бәләкәйерәк, һәм өлөшләтә сөнки мутациялар осраҡлы түгел. Телде эшләүселәр аңлы рәүештә башҡа телдәрҙән идеялар алалар.
Тел эшләүселәргә программалау телдәре эволюцияһының ҡайҙа алып барыуы ихтималлығы тураһында уйланыу айырыуса файҙалы, сөнки улар үҙ йүнәлешен шуға ярашлы көйләй ала. Был осраҡта «төп тармаҡта ҡалыу» яҡшы телде һайлау ысулы булыуҙан да артығыраҡ булып китә. Ул тел дизайны тураһында дөрөҫ ҡарарҙар ҡабул итеү өсөн эвристикаға әйләнә.
Һәр программалау телен ике өлөшкә бүлергә була: аксиомалар ролен үтәүсе ҡайһы бер төп операторҙар тупланмаһы һәм телдең ҡалған өлөшө, ул принципта ошо төп операторҙар ярҙамында яҙылыуы мөмкин.
Минеңсә, төп операторҙар — телдең оҙаҡ ваҡыт йәшәп ҡалыуында иң мөһим фактор. Ҡалғанын үҙгәртергә була. Был йорт һатып алғанда иң тәүҙә урынды иҫәпкә алырға кәрәк тигән ҡағиҙәгә оҡшаған. Башҡа бөтә нәмәне һуңыраҡ төҙәтергә була, әммә урынды төҙәтеп булмай.
Минеңсә, аксиомаларҙың яҡшы һайланыуы ғына түгел, ә уларҙың аҙ булыуы ла мөһим. Математиктар аксиомаларға ҡарата һәр ваҡыт шулай ҡарағандар — ни тиклем аҙыраҡ, шул тиклем яҡшыраҡ — һәм, минеңсә, уларҙың хаҡлығы бар.
Һис юғында, алып ташлап була торған аксиомалар бармы-юҡмы икәнен күреү өсөн телдең үҙәгенә ентекләп ҡарау файҙалы күнегеү булырға тейеш. Минең ялҡау кеше сифатындағы оҙон ғүмеремдә сүп-сар үҙ артынан яңы сүп-сар тыуҙырыуын күргәнем булды, һәм бының карауат аҫтында һәм бүлмә мөйөштәрендә генә түгел, программа тәьминәтендә лә булғанын күрҙем.
Минең күңелем шуны һиҙә: эволюция ағасының төп тармаҡтары иң бәләкәй, иң таҙа үҙәкле телдәр аша үтә. Бер телдең күберәк өлөшөн уның үҙендә яҙа алһағыҙ, шул тиклем яҡшыраҡ.
Әлбиттә, йөҙ йылдан һуң программалау телдәре ниндәй буласаҡ тип һорау ҡуйғанда уҡ мин ҙур бер фараз яһайым. Беҙ йөҙ йылдан һуң бөтөнләй программалар яҙырбыҙмы икән? Компьютерҙарға ни эшләргә кәрәклеген әйтеп кенә тормаҫбыҙмы?
Әлегә был өлкәлә ҙур алға китеш юҡ. Минең фаразымса, йөҙ йылдан һуң да кешеләр компьютерҙарға үҙебеҙ аңларлыҡ программалар аша ни эшләргә кәрәклеген күрһәтерҙәр. Хәҙер беҙ программалар яҙып хәл иткән һәм йөҙ йылдан һуң уларҙы хәл итеү өсөн программа яҙырға кәрәк булмаясаҡ мәсьәләләр булыуы мөмкин, әммә бөгөн беҙ башҡарған төргә оҡшаш программалау байтаҡ ҡаласаҡ тип уйлайым.
Йөҙ йылдан һуң теләһә ниндәй технологияның ниндәй буласағын кемдер фаразлай алыр тип уйлау үтә баҙнатлы булып күренергә мөмкин. Ләкин онотмағыҙ: беҙҙең артта инде илле йылға яҡын тарих ята. Һуңғы илле йыл эсендә телдәрҙең ни тиклем яй үҫешкәнен иҫәпкә алғанда, йөҙ йыл алға ҡарау — аңларлыҡ бер уй.
Телдәр яй үҫешә, сөнки улар ысынбарлыҡта технология түгел. Телдәр — ул тамғалау системаһы. Программа — ул компьютер һеҙҙең өсөн хәл итергә тейешле мәсьәләнең формаль тасуирламаһы. Шуға күрә программалау телдәренең үҫеш тиҙлеге, әйтәйек, транспорт йәки бәйләнештәргә ҡарағанда, күберәк математик тамғалау системаһының үҫеш тиҙлегенә оҡшаш. Математик тамғалау системаһы үҫешә, әммә технологияларҙа күргән ҙур һикерештәр менән түгел.
Йөҙ йылдан һуң компьютерҙар нимәнән генә яһалмаһын, уларҙың хәҙергегә ҡарағанда күпкә шәберәк буласағын фаразлау хәүефһеҙ күренә. Әгәр Мур ҡануны эшләүен дауам итһә, улар 74 квинтиллион (73 786 976 294 838 206 464) тапҡырға шәберәк буласаҡ. Быны күҙ алдына килтереүе ауыр. Һәм ысынында ла, тиҙлек өлкәһендә иң ихтимал фараз — Мур ҡануны эшләүҙән туҡтаясаҡ. Һәр ун һигеҙ ай һайын икеләтә артырға тейешле теләһә ниндәй нәмә, ахыр сиктә, ниндәйҙер фундаменталь сиккә барып терәлергә тейеш һымаҡ. Ләкин компьютерҙарҙың күпкә шәберәк буласағына ышаныу миңә ауыр түгел. Улар бары тик меңләгән генә тапҡырға шәберәк булып сыҡһа ла, был программалау телдәренең төп ҡағиҙәләрен һиҙелерлек үҙгәртергә тейеш. Башҡа нәмәләр араһында, хәҙер яй тип һаналған телдәргә, йәғни бик үк һөҙөмтәле код бирмәгән телдәргә лә күберәк урын буласаҡ.
Шулай ҙа ҡайһы бер ҡушымталар һаман да тиҙлек талап итәсәк. Компьютерҙар менән хәл итергә теләгән ҡайһы бер мәсьәләләр компьютерҙар тарафынан барлыҡҡа килтерелә; мәҫәлән, видеояҙмаларҙы эшкәртеү тиҙлеге икенсе бер компьютерҙың уларҙы ниндәй тиҙлектә етештерә алыуына бәйле. Һәм процессор такттарын сикһеҙ күләмдә йотоуға эйә булған мәсьәләләрҙең тағы бер класы бар: һүрәтте рендеринглау, криптография, симуляциялар.
Әгәр ҡайһы бер ҡушымталар көндән-көн һөҙөмтәһеҙерәк була алһа, ә икенселәре аппарат саралары бирә алған бөтә тиҙлекте талап итеүҙе дауам итһә, шәберәк компьютерҙар телдәрҙең һөҙөмтәлелектең тағы ла киңерәк диапазонын үҙ эсенә алырға тейешлеген аңлатасаҡ. Беҙ бының хәҙер ҙә барғанын күрәбеҙ. Ҡайһы бер популяр яңы телдәрҙең хәҙерге тормошҡа ашырылыуы үткән ун йыллыҡтарҙың стандарттары буйынса ҡот осҡос исрафсыл булып тора.
Был тик программалау телдәрендә генә була торған нәмә түгел. Был — дөйөм тарихи йүнәлеш. Технологиялар яҡшырған һайын, һәр быуын алдыңғы быуын исрафлыҡ тип иҫәпләрлек эштәрҙе башҡара ала. Утыҙ йыл элек кешеләр беҙҙең ҡала-ара телефон аша нисек еңел шылтыратыуыбыҙға аптырар ине. Йөҙ йыл элекке кешеләр бер посылканың Бостондан Нью-Йоркка Мемфис аша сәйәхәт итәсәгенә тағы ла нығыраҡ хайран ҡалыр ине.
Киләһе йөҙ йылда шәберәк аппарат саралары беҙгә бирәсәк бөтә шул өҫтәмә такттарға нимә буласағын мин хәҙер үк әйтә алам. Улар барыһы ла тиерлек бушҡа сарыф ителәсәк.
Мин компьютер ҡеүәте самалы булған осорҙа программаларға өйрәндем. Үҙемдең Basic программаларымды 4K TRS-80 хәтеренә һыйҙырыу өсөн уларҙағы бөтә буш урындарҙы (пробелдарҙы) алып ташлауым хәтеремдә. Бер үк нәмәне ҡабат-ҡабат эшләп, ғәйәт ҙур һөҙөмтәһеҙ программа тәьминәтенең процессор такттарын яндырыуы тураһындағы уй миңә ҡайһы берҙә ерәнгес булып күренә. Ләкин, минеңсә, бында интуициям яңылыша. Мин ярлылыҡта үҫкән һәм табипҡа барыу кеүек мөһим нәмәгә лә аҡса тотонорға баҙнат итмәгән кешегә оҡшағанмын.
Ҡайһы бер исрафлыҡ ысынлап та ерәнгес. Мәҫәлән, юл тармаҡлы автомобилдәр (SUV), моғайын, бер ҡасан да бөтмәй торған һәм бер ниндәй бысраныу килтермәй торған яғыулыҡ менән йөрөһә лә ерәнгес булыр ине. SUV-тар ерәнгес, сөнки улар ерәнгес мәсьәләнең сиселеше. (Минивэндәрҙе нисек итеп батырыраҡ күрһәтергә тигән.) Ләкин бөтә исрафлыҡ та насар түгел. Хәҙер, уны хуплай торған инфраструктураға эйә булғас, ҡала-ара шылтыратыуҙарҙың минуттарын һанау ваҡсыл булып күренә башлай. Әгәр ресурстарығыҙ бар икән, икенсе кешенең ҡайҙа булыуына ҡарамаҫтан, бөтә телефон шылтыратыуҙарын бер төрлө нәмә тип уйлау күпкә нәфисерәк.
Яҡшы исрафлыҡ бар, һәм насар исрафлыҡ бар. Мин яҡшы исрафлыҡ менән ҡыҙыҡһынам — күберәк сығым яһап, ябайыраҡ дизайндарға өлгәшә ала торған төрө менән. Яңы, шәберәк аппарат сараларынан аласаҡ такттарҙы бушҡа сарыф итеү мөмкинлектәренән беҙ нисек файҙаланырбыҙ?
Тиҙлеккә ынтылыш беҙҙең үҙебеҙҙең ябай ғына компьютерҙарыбыҙ менән күңелебеҙгә шул тиклем тәрән һеңгән, хатта уны еңеп сығыу өсөн аңлы тырышлыҡ талап ителәсәк. Тел дизайнында беҙ ҳатта иң бәләкәй уңайлыҡты арттырыу өсөн дә һөҙөмтәлелекте ҡорбан итә ала торған осраҡтарҙы аңлы рәүештә эҙләргә тейешбеҙ.
Күпселек мәғлүмәт структуралары тиҙлек арҡаһында йәшәй. Мәҫәлән, бөгөн күп телдәрҙә юлдар (strings) ҙа, исемлектәр (lists) ҙә бар. Семантик яҡтан ҡарағанда, юлдар — элементтары символдар булған исемлектәрҙең ябай ғына бер аҫкүмәклеге. Тимәк, һеҙгә айырым мәғлүмәт төрө ни өсөн кәрәк? Ысынында иһә, кәрәкмәй. Юлдар бары тик һөҙөмтәлелек өсөн генә йәшәп килә. Әммә программаларҙың тиҙерәк эшләп китеүе өсөн ҡулланылған яһалма хәйләләр менән телдең семантикаһын сүпләү — ҡыҙғаныс күренеш. Телдә юлдарҙың булыуы — ваҡытынан алда оптималләштереү миҫалы һымаҡ.
Әгәр беҙ телдең үҙәген аксиомалар тупланмаһы тип күҙ алдына килтерһәк, бары тик һөҙөмтәлелек өсөн генә бер ниндәй ҙә тасуирлау ҡеүәте өҫтәмәгән өҫтәмә аксиомаларҙың булыуы, һис шикһеҙ, насар. Һөҙөмтәлелек мөһим, әммә уға өлгәшеүҙең дөрөҫ юлы был түгел тип уйлайым.
Был мәсьәләне хәл итеүҙең дөрөҫ юлы, минеңсә, программаның мәғәнәһен уны тормошҡа ашырыу нескәлектәренән айырыу. Исемлектәрҙе лә, юлдарҙы ла тотоу урынына, бары тик исемлектәрҙе генә тоторға, кәрәк булғанда компиляторға юлдарҙы эҙмә-эҙлекле байттар итеп урынлаштырырға мөмкинлек биргән оптималләштереү буйынса кәңәштәр биреү ысулын ҡулланырға кәрәк.
Программаның күпселек өлөшөндә тиҙлек мөһим булмағанлыҡтан, ғәҙәттә һеҙгә бындай ваҡ-төйәккә ҡыҫылырға кәрәкмәйәсәк. Компьютерҙар шәберәк булған һайын, был тағы ла дөрөҫөрәк буласаҡ.
Реализация тураһында аҙыраҡ һөйләү шулай уҡ программаларҙы һығылмалыраҡ итергә тейеш. Программа яҙылған ваҡытта уның аныҡламалары үҙгәрә, һәм был ҡотолғоһоҙ ғына түгел, ә хуплана торған да күренеш.
«Эссе» һүҙе француз телендәге «essayer» ҡылымынан килеп сыҡҡан, был «һынап ҡарау» тигәнде аңлата. Тәүге мәғәнәһендә эссе — нимәнелер аңларға тырышып яҙылған әҫәр. Был программа тәьминәтендә лә була. Минеңсә, иң яҡшы программаларҙың ҡайһы берҙәре нәҡ эссе булған, сөнки авторҙар башлаған ваҡытта нимә яҙырға тырышҡандарын теүәл белмәгән.
Lisp хакерҙары мәғлүмәт структуралары менән һығылмалы булыуҙың ҡиммәтен беләләр инде. Беҙ ғәҙәттә программаның тәүге версияһын барыһын да исемлектәр ярҙамында эшләрлек итеп яҙабыҙ. Был башланғыс версиялар шул тиклем ҡот осҡос һөҙөмтәһеҙ булыуы мөмкин, хатта уларҙың нимә эшләгәне тураһында уйламау өсөн аңлы тырышлыҡ талап ителә — был, минең өсөн һәр хәлдә, ит ашағанда уның ҡайҙан килгәнен уйламаҫҡа тырышыуға оҡшаған.
Йөҙ йылдан һуң программалаусылар иң элек мөмкин булған иң бәләкәй көс менән программаның ышангыһыҙ һөҙөмтәһеҙ 1-се версияһын тиҙ генә төҙөп ҡуя алырлыҡ тел эҙләйәсәк. Һәр хәлдә, бөгөнгө көн төшөнсәләре менән беҙ уны шулай тасуирлар инек. Улар иһә үҙҙәренә программалау еңел булған тел кәрәклеген әйтәсәк.
Һөҙөмтәһеҙ программа тәьминәте ерәнгес түгел. Ерәнгес булғаны — программалаусыларҙы кәрәкмәгән эш менән булышырға мәжбүр иткән тел. Программалаусының ваҡытын бушҡа сарыф итеү — ысын һөҙөмтәһеҙлек, машина ваҡытын сарыф итеү түгел. Компьютерҙар шәберәк булған һайын, был тағы ла асығыраҡ буласаҡ.
Юлдарҙан ҡотолоу — был беҙ хәҙер үк уйлап ҡарай алырлыҡ нәмә тип уйлайым. Беҙ быны Arc телендә эшләнек, һәм был оташлы булып сыҡты һымаҡ; регуляр аңлатмалар менән тасуирлау уңайһыҙ булған ҡайһы бер операцияларҙы рекурсив функциялар рәүешендә еңел генә тасуирларға була.
Мәғлүмәт структураларын бындай ябайлаштырыу ҡайһы тиклемгә тиклем барыр икән? Хатта аңлы рәүештә киңәйтелгән аҡылым менән үҙемде лә шаңҡытҡан ихтималлыҡтарҙы уйлап таба алам. Мәҫәлән, массивтарҙан ҡотолорбоҙмо? Сөнки улар — асҡыстары бөтөн һандар векторҙары булған хеш-таблицаларҙың бер өлөшө генә. Хеш-таблицаларҙың үҙҙәрен дә исемлектәр менән алмаштырырбыҙмы?
Бынан да шомлораҡ перспективалар бар. Мәҫәлән, Маккарти 1960 йылда тасуирлаған Lisp-та һандар юҡ ине. Логик яҡтан ҡарағанда, һеҙгә айырым һандар төшөнсәһе кәрәкмәй, сөнки уларҙы исемлектәр рәүешендә күрһәтергә була: n бөтөн һанын n элементтан торған исемлек итеп күрһәтергә була. Был юл менән математика менән шөғөлләнергә мөмкин. Тик ул түҙеп торғоһоҙ һөҙөмтәһеҙ генә.
Был ысулды бер кем дә ғәмәлдә һандарҙы исемлектәр итеп эшләргә тәҡдим итмәне. Ысынында иһә, Маккартиҙың 1960 йылғы мәҡәләһе ул ваҡытта бөтөнләй тормошҡа ашырыу өсөн тәғәйенләнмәгән ине. Был теоретик күнегеү, Тьюринг машиналарына нәфисерәк альтернатива булдырыу ынтылышы ине. Көтмәгәндә берәү был мәҡәләне алып, уны эшләүсе Lisp интерпретаторына тәржемә иткәс, һандар һис шикһеҙ исемлектәр рәүешендә күрһәтелмәне; башҡа һәр телдәге кеүек, улар икеле (бинар) системала күрһәтелде.
Программалау теле төп мәғлүмәт төрө булараҡ һандарҙан ҡотолоуға тиклем барып етергә мөмкинме? Мин быны етди һорау булараҡ түгел, ә киләсәк менән ҡурҡыу белмәҫ уйын уйнау сараһы булараҡ һорайым. Был еңелмәҫ көстөң ҡуҙғалмаҫ объект менән осрашыуы тураһындағы гипотетик осраҡҡа оҡшаған — бында күҙ алдына килтергеһеҙ һөҙөмтәһеҙ тормошҡа ашырыу күҙ алдына килтергеһеҙ ҙур ресурстар менән осраша. Ниңә булмаҫҡа ти? Киләсәк бик оҙон. Әгәр телдең төп өлөшөндәге аксиомалар һанын кәметеү өсөн эшләй алырлыҡ нәмәбеҙ бар икән, ваҡыт (t) сикһеҙлеккә ынтылған һайын был яҡҡа өмөт бағлау дөрөҫ булыр кеүек. Әгәр был уй йөҙ йылдан һуң да түҙеп торғоһоҙ булып күренһә, бәлки, мең йылдан һуң улай булмаҫ.
Аңлашылһын өсөн әйтәм: мин барлыҡ һанлы иҫәпләүҙәрҙе лә исемлектәр ярҙамында башҡарырға тәҡдим итмәйем. Мин телдең төп нигеҙе реализация тураһында өҫтәмә билдәләмәләргә тиклем үк шулай билдәләнеүен тәҡдим итәм. Ғәмәлдә, аҙ булһа ла математика менән шөғөлләнергә теләгән теләһә ниндәй программа һандарҙы икеле системала күрһәтер ине, ләкин был телдең төп семантикаһының бер өлөшө түгел, ә оптималләштереү булыр ине.
Такттарҙы яндырыуҙың тағы бер юлы — ҡулланма программа менән аппарат саралары араһында программа тәьминәтенең күп ҡатламдары булыуы. Был да беҙ инде күреп торған йүнәлеш: күп кенә яңы телдәр байт-кодҡа компиляциялана. Билл Вудс бер ваҡыт миңә ябай бер ҡағиҙәне әйткәйне: интерпретацияның һәр ҡатламы тиҙлекте яҡынса 10 тапҡырға кәметә. Был өҫтәмә хаҡ һеҙгә һығылмалылыҡ бирә.
Arc-тың иң тәүге версияһы бындай күп кимәлле яйлыҡтың һәм уға тап килгән өҫтөнлөктәрҙең сиктән тыш бер миҫалы ине. Был Common Lisp өҫтөндә яҙылған классик «метациклик» интерпретатор ине, ул Маккартиҙың төп Lisp мәҡәләһендә билдәләнгән eval функцияһына ныҡ оҡшаған ине. Барлыҡ нәмә ни бары ике йөҙгә яҡын код юлынан тора ине, шуға күрә уны аңлау һәм үҙгәртеү бик еңел булды. Беҙ ҡулланған Common Lisp, CLisp үҙе байт-код интерпретаторы өҫтөндә эшләй. Тимәк, бында беҙҙә интерпретацияның ике кимәле бар ине, шуларҙың береһе (иң өҫкөһө) ҡот осҡос һөҙөмтәһеҙ ине, һәм тел ҡулланырлыҡ ине. Саҡ ҡына ғына ҡулланырлыҡ, таныйым, әммә барыбер ҡулланырлыҡ ине.
Программа тәьминәтен күп ҡатламлы итеп яҙыу — ҡулланма программалар эсендә лә ҡеүәтле алым. Түбәндән өҫкә (bottom-up) программалау программаны ҡатламдар теҙмәһе итеп яҙыуҙы аңлата, уларҙың һәр береһе үрҙәге ҡатлам өсөн тел булып хеҙмәт итә. Был алым ғәҙәттә бәләкәйерәк, һығылмалыраҡ программалар барлыҡҡа килтерә. Шулай уҡ ул изге грааль булған ҡабаттан ҡулланыусанлыҡҡа (reusability) илтеүсе иң яҡшы юл. Тел билдәләмә буйынса уҡ ҡабаттан ҡулланырлыҡ. Ҡушымтағыҙҙың күберәк өлөшөн шул типтағы ҡушымталарҙы яҙыу өсөн ҡулланылған телгә күсерә алған һайын, программа тәьминәтегеҙ ҙә шул тиклем нығыраҡ ҡабаттан ҡулланырлыҡ буласаҡ.
Нисектер, ҡабаттан ҡулланыусанлыҡ идеяһы 1980-се йылдарҙа объектҡа йүнәлтелгән программалауға (ООП) йәбешеп ҡалды, һәм киреһен иҫбатлаған бер ниндәй дәлилдәр ҙә уны айыра алмай кеүек. Объектҡа йүнәлтелгән ҡайһы бер программа тәьминәте ҡабаттан ҡулланырлыҡ булһа ла, уны ҡабаттан ҡулланырлыҡ иткән нәмә — уның объектҡа йүнәлеүе түгел, ә түбәндән өҫкә төҙөлөшө. Китапханаларҙы ҡарағыҙ: улар тел булғанға күрә ҡабаттан ҡулланырлыҡ, улар объектҡа йүнәлтелгән стилдә яҙылғанмы, юҡмы — мөһим түгел.
Әйткәндәй, мин объектҡа йүнәлтелгән программалауҙың бөтөүен фаразламайым. Был ҡайһы бер махсуслаштырылған өлкәләрҙән тыш яҡшы программалаусыларға ҙур файҙа килтерә тип уйламаһам да, ул эре ойошмалар өсөн тартыу көсөнә эйә. Объектҡа йүнәлтелгән программалау «спагетти-код» яҙыуҙың тотороҡло ысулын тәҡдим итә. Ул һеҙгә программаларҙы ямауҙар сылбыры итеп ҙурайтырға мөмкинлек бирә. Эре ойошмалар һәр ваҡыт программа тәьминәтен ошо юл менән үҫтерергә ынтыла, һәм йөҙ йылдан һуң был бөгөнгө кеүек үк дөрөҫ булыр тип уйлайым.
Киләсәк тураһында һөйләшкәндә, беҙгә параллель иҫәпләүҙәр тураһында һөйләшеү яҡшыраҡ, сөнки был идея нәҡ шунда йәшәй кеүек. Йәғни ҡайһы ваҡытта һөйләшһәгеҙ ҙә, параллель иҫәпләүҙәр һәр саҡ киләсәктә буласаҡ нәмә кеүек күренә.
Киләсәк берәй ҡасан уға барып етерме? Кешеләр параллель иҫәпләүҙәр тураһында яҡынлашып килгән нәмә булараҡ кәмендә 20 йыл буйы һөйләй, әммә әлегә тиклем ул программалау ғәмәлиәтенә әллә ни йоғонто яһамаған. Йәки йоғонто яһанымы? Чиптар эшләүселәргә был хаҡта уйланырға тура килә инде, күп процессорлы компьютерҙарҙа системалы программалар яҙырға тырышҡан кешеләргә лә шулай.
Төп һорау шунда: параллелизм абстракция баҫҡысы буйлап ни тиклем юғары күтәрелер? Йөҙ йылдан һуң ул хатта ҡулланма программалар яҙыусыларға ла ҡағылырмы? Йәки был компилятор яҙыусылар уйлай торған, әммә ғәҙәттә ҡушымталарҙың башланғыс кодында күренмәй торған нәмә булырмы?
Бер нәмә бик ихтимал булып күренә: параллелизмдың күпселек мөмкинлектәре юҡҡа сығасаҡ. Был — беҙгә бирелгән өҫтәмә компьютер ҡеүәтенең күп өлөшө бушҡа сарыф ителәсәк тигән минең дөйөмөрәк фаразымдың айырым осрағы. Төп аппарат сараларының ғәйәт тиҙлеге кеүек үк, параллелизм да, әгәр аныҡ һораһағыҙ, ҡулланырлыҡ буласаҡ, әммә ғәҙәттә ҡулланылмаясаҡ тип көтәм. Был тигәнде, махсус ҡушымталарҙан тыш, йөҙ йылдан һуң беҙҙә буласаҡ параллелизм массив параллелизм булмаясаҡ. Ғәҙәти программалаусылар өсөн был параллель эшләп китә торған процестарҙы айырып ебәрә алыу мөмкинлеге кеүегерәк булыр тип көтәм.
Һәм был, мәғлүмәт структураларының аныҡ реализацияларын һорау кеүек үк, программаның ғүмеренең аҙағындараҡ, уны оптималләштерергә тырышҡанда эшләнә торған нәмә буласаҡ. 1-се версиялар, ғәҙәттә, мәғлүмәттәрҙең аныҡ сағылышынан алырға мөмкин булған өҫтөнлөктәрҙе иғтибарһыҙ ҡалдырған кеүек үк, параллель иҫәпләүҙәрҙән алырға мөмкин булған өҫтөнлөктәрҙе лә һанға һуҡмаясаҡ.
Махсус төрҙәге ҡушымталарҙан тыш, параллелизм йөҙ йылдан һуң яҙыласаҡ программаларға тулыһынса үтеп инмәйәсәк. Әгәр инһә, был ваҡытынан алда оптималләштереү булыр ине.
Йөҙ йылдан һуң күпме программалау теле булыр? Һуңғы ваҡытта бик күп яңы программалау телдәре барлыҡҡа килде кеүек. Сәбәптең бер өлөшө шунда: шәберәк аппарат саралары программалаусыларға, ҡушымтаға ҡарап, тиҙлек менән уңайлыҡ араһында төрлө компромистар яһарға мөмкинлек бирҙе. Әгәр был ысынбарлыҡтағы йүнәлеш булһа, йөҙ йылдан һуң беҙҙә буласаҡ аппарат саралары уны көсәйтә генәсәк.
Шулай ҙа йөҙ йылдан һуң киң ҡулланылған телдәр бары бер нисә генә булыуы мөмкин. Быны әйтеүемдең бер сәбәбе — оптимизм: әгәр ысынлап та яҡшы эшләһәгеҙ, яй 1-се версияны яҙыу өсөн идеаль булған һәм, шул уҡ ваҡытта компиляторға оптималләштереү буйынса дөрөҫ кәңәштәр биреп, кәрәк булғанда бик етеҙ код бирә торған тел эшләргә була кеүек күренә. Шуға күрә, мин оптимист булғанлыҡтан, йөҙ йылдан һуң ҡулай һәм максималь һөҙөмтәлелек араһындағы ғәйәт ҙур айырмаға ҡарамаҫтан, программалаусыларҙа уның күп өлөшөн үҙ эсенә ала торған телдәр буласаҡ тип фаразлайым.
Был аралыҡ киңәйгән һайын, профайлерҙарҙың әһәмиәте арта барасаҡ. Хәҙер профилләүгә аҙ иғтибар бирелә. Күптәр тиҙ ҡушымталар алыуҙың сере — етеҙ код етештереүсе компиляторҙар яҙыуҙа тип ышаныуын дауам итә. Ҡулай һәм максималь етештереүсәнлек араһындағы ара киңәйгән һайын, етеҙ ҡушымталар алыу юлы береһенән икенсеһенә алып бара торған яҡшы күрһәткескә эйә булыуҙа икәне көндән-көн асығыраҡ буласаҡ.
Мин ни бары бер нисә тел генә булыр тигәндә, махсус өлкәгә тәғәйенләнгән «бәләкәй телдәрҙе» иҫәпкә алмайым. Бындай ҡушылған телдәрҙе мин шәп идея тип уйлайым, һәм улар күбәйер тип көтәм. Ләкин улар ҡулланыусыларға аҫтағы дөйөм тәғәйенләнештәге тел күренеп торһын өсөн етерлек дәрәжәлә йоҡа ҡатлам булып яҙылыр тип уйлайым.
Киләсәк телдәрен кем проектлаясаҡ? Һуңғы ун йылдағы иң тулҡынландырғыс ағымдарҙың береһе — Perl, Python һәм Ruby кеүек асыҡ кодлы телдәрҙең күтәрелеүе булды. Тел дизайнын хакерҙар үҙ ҡулына ала башланы. Әлегә һөҙөмтәләр сыуаҡ, әммә өмөтлө. Мәҫәлән, Perl телендә ғәжәйеп яңы идеялар бар. Күбеһе ғәйәт насар, әммә ҙур маҡсатлы тырышлыҡтарҙа һәр саҡ шулай була. Хәҙерге мутация тиҙлегендә Perl-дың йөҙ йылдан һуң нимәгә әйләнеүен Алла үҙе генә белә инде.
Булдыра алмағандар уҡыта тигән һүҙ дөрөҫ түгел (мин белгән иң яҡшы хакерҙарҙың ҡайһы берҙәре — профессорҙар), әммә уҡытҡандарҙың күп нәмәне эшләй алмауы — хаҡ. Фәнни тикшеренеүҙәр ҡыҫыҡ каста сикләүҙәрен һала. Теләһә ниндәй академик өлкәлә эшләү яраған һәм ярамаған темалар бар. Ҡыҙғанысҡа ҡаршы, яраҡлы һәм тыйылған темалар араһындағы айырма ғәҙәттә эш яҡшы һөҙөмтәләргә өлгәшеү өсөн ни тиклем мөһим булыуына түгел, ә ғилми мәҡәләләрҙә яҙылғанда ни тиклем интеллектуаль яңғырауына ҡарап яһала. Иң сикке осраҡ — моғайын, әҙәбиәттер; әҙәбиәтте өйрәнеүсе кешеләр уны тыуҙырыусылар өсөн бер ниндәй ҙә файҙаһы тейерлек һүҙ әйтмәй тиерлек.
Фәндәрҙә хәл яҡшыраҡ булһа ла, эшләргә рөхсәт ителгән эш менән яҡшы телдәр барлыҡҡа килтерә торған эш араһындағы уртаҡлыҡ ҡыҙғаныс рәүештә бик аҙ. (Олин Шиверс был турала тәьҫирле итеп зарланғайны.) Мәҫәлән, типлаштырыу ғилми мәҡәләләрҙең бөтмәҫ-төкәнмәҫ сығанағы булып күренә, шул уҡ ваҡытта статик типлаштырыу ысын макростарҙы булдырмай кеүек — ә уларһыҙ, минең уйымса, бер ниндәй телде лә ҡулланыуға тормай.
Был йүнәлеш телдәрҙең «тикшеренеү» рәүешендә түгел, ә асыҡ проекттар булараҡ үҫешеүенә генә түгел, бәлки компилятор яҙыусылар түгел, ә уларҙы ҡулланырға мохтаж булған ҡулланма программалаусылар тарафынан проектланыуына ла ҡарай бара. Был яҡшы тенденция булып күренә һәм мин уның дауам итеүен көтәм.
Йөҙ йылдан һуң физиканың ниндәй буласағын күҙаллауы бөтөнләй мөмкин булмағандан айырмалы рәүештә, хәҙер үк йөҙ йылдан һуң ҡулланыусыларға оҡшарлыҡ тел эшләү принципта мөмкин тип уйлайым.
Тел эшләүҙең бер юлы — уны тәржемә итә алырлыҡ компилятор йәки эшләтә алырлыҡ аппарат сараһы булыу-булмауына ҡарамаҫтан, үҙегеҙ яҙырға теләгән программаны яҙып ҡуйыу. Быны эшләгәндә һеҙ сикһеҙ ресурстар бар тип уйлай алаһығыҙ. Йөҙ йылдан һуң нисек булһа, бөгөн дә сикһеҙ ресурстарҙы күҙ алдына шулай уҡ яҡшы килтерә алырға тейешбеҙ кеүек.
Кеше ниндәй программа яҙырға теләр ине? Иң аҙ көс талап иткәнен. Дөрөҫөрәге, тулыһынса түгел: һеҙҙең программалау тураһындағы фекерҙәрегеҙ хәҙерге ҡулланған телдәрегеҙ йоғонтоһонда булмаһа, нимә иң аҙ эш булыр ине, шуны. Бындай йоғонто шул тиклем киң таралған булыуы мөмкин, уны еңеү өсөн ҙур тырышлыҡ кәрәк. Беҙҙең кеүек ялҡау йән эйәләренә программаны иң аҙ көс менән нисек күрһәтергә икәнлеге аңлашылып торор кеүек тойола. Ысынында иһә, беҙҙең нимә мөмкин булыуы тураһындағы төшөнсәләребеҙ үҙебеҙ уйлаған тел тарафынан шул тиклем сикләнгән, хатта программаларҙың еңелерәк формулировкалары бик ғәжәп булып күренә. Улар — үҙенән-үҙе килеп сыҡҡан түгел, ә асырға тура килгән нәмә.
Был осраҡта программаның оҙонлоғон уны яҙыу өсөн күпме эш кәрәклеген самалау өсөн ҡулланыу файҙалы бер алым булып тора. Әлбиттә, символдар һанында түгел, ә айырым синтаксик элементтар оҙонлоғонда — асылда, синтаксик ағастың дәүмәлендә. Иң ҡыҫҡа программа иң аҙ эш талап итә тигән фекер бөтөнләй үк дөрөҫ булмауы ихтимал, әммә ул шул тиклем яҡын, шуға күрә иң аҙ эштең тоноҡ маҡсатына ҡарағанда, ҡыҫҡалыҡтың ныҡлы маҡсатына ынтылыу яҡшыраҡ. Ул саҡта тел проекциялау алгоритмы бындайға әйләнә: программаға ҡара һәм «быны тағы ла ҡыҫҡараҡ яҙыу юлы бармы?» тип һора.
Ғәмәлдә, уйҙырма йөҙ йыллыҡ телдә программалар яҙыу һеҙҙең телдең үҙәгенә күпме дәрәжәлә яҡын булыуығыҙға ҡарап төрлөсә эшләйәсәк. Һайрау (сортлау) функцияларын һеҙ хәҙер үк яҙа алаһығыҙ. Әммә йөҙ йылдан ниндәй китапханалар кәрәк буласағын хәҙер алдан әйтеүе ауыр булыр ине. Моғайын, күп кенә китапханалар әлегә хатта булмаған өлкәләр өсөн кәрәк булыр. Мәҫәлән, SETI@home эшләп китһә, беҙгә сит планеталылар менән бәйләнеш өсөн китапханалар кәрәк буласаҡ. Әгәр ҙә улар, әлбиттә, инде XML аша һөйләшерлек дәрәжәлә үҫешмәгән булһалар.
Икенсе яҡтан, минеңсә, һеҙ төп телде бөгөн үк проекциялай алыр инегеҙ. Ысынында иһә, ҡайһы берәүҙәр уның күп өлөшө 1958 йылда уҡ проекцияланған тип әйтергә лә мөмкин.
Әгәр йөҙ йыллыҡ тел бөгөн үк булһа, беҙ унда программа яҙырға теләр инекме? Был һорауға яуап биреүҙең бер юлы — үткәнгә ҡарау. Әгәр хәҙерге заман программалау телдәре 1960 йылда булһа, кемдер уларҙы ҡулланырға теләр инеме?
Ҡайһы бер яҡтан, яуап — юҡ. Хәҙерге заман телдәре 1960 йылда булмаған инфраструктураны күҙ уңында тота. Мәҫәлән, Python кеүек юл башы ҡалдырыуҙары мөһим булған тел принтер терминалдарында бик яҡшы эшләмәҫ ине. Әммә бындай проблемаларҙы бер ситкә ҡуйғанда — мәҫәлән, программаларҙың барыһы ла ҡағыҙҙа ғына яҙылған тип фараз иткәндә — 1960-сы йылдарҙағы программалаусыларға беҙ хәҙер ҡулланған телдәрҙә программа яҙыу оҡшар инеме?
Минеңсә, оҡшар ине. Ҡайһы бер фантазияһы аҙыраҡ булған, программа нимә ул тигән төшөнсәһенә иртә телдәрҙең ҡалдыҡтары һеңгән кешеләрҙең ауырлыҡтары булыр ине. (Күрһәткес арифметикаһын эшләмәйенсә мәғлүмәттәр менән нисек идара итеп булһын? goto операторынан башҡа блок-схемаларҙы нисек тормошҡа ашырып булһын?) Ләкин минеңсә, иң аҡыллы программалаусылар, әгәр ҡулдарында булһа, хәҙерге заман телдәренең өҫтөнлөктәрен тулыһынса файҙалана алыр ине.
Әгәр беҙҙә хәҙер йөҙ йыллыҡ тел булһа, ул һәр хәлдә шәп псевдокод булыр ине. Ә уны программа менән тәьмин итеү яҙыу өсөн ҡулланыу тураһында нимә әйтеп була? Йөҙ йыллыҡ телгә ҡайһы бер ҡушымталар өсөн шәп эшләүсе код етештерергә кәрәк буласаҡ, шуға күрә ул беҙҙең аппарат сараларыбыҙҙа етерлек кимәлдә яҡшы эшләрлек код етештерә алыр ине. Беҙгә йөҙ йылдан һуңғы ҡулланыусыларға ҡарағанда күберәк оптимизация кәңәштәре бирергә тура килер ине, бәлки, әммә был барыбер саф отош булыр ине.
Хәҙер беҙҙә ике фекер бар, һәм уларҙы берләштергәндә, ҡыҙыҡлы мөмкинлектәр асыла: (1) йөҙ йыллыҡ тел, асылда, бөгөн үк проекцияланырға мөмкин, һәм (2) бындай тел булһа, унда бөгөн үк программа яҙыу яҡшы булыр ине. Был идеяларҙың былай теҙелгәнен күргәс: ниңә әле йөҙ йыллыҡ телде хәҙер үк яҙып ҡарамаҫҡа, тип уйламай булмай?
Тел проекциялағанда, минеңсә, шундай маҡсатҡа эйә булыу һәм уны аңлы рәүештә иҫтә тотоу яҡшы. Машина йөрөтөргә өйрәнгәндә, өйрәткән принциптарҙың береһе — автомобилде юлдағы һыҙыҡтар менән капотты тигеҙләп түгел, ә алыҫтағы ниндәйҙер нөктәгә төбәп туралау. Хатта һеҙҙе киләһе ун аҙымда нимә буласағы ғына ҡыҙыҡһындырһа ла, был иң дөрөҫ яуап. Минеңсә, беҙ программалау телдәре менән дә шуны эшләй алабыҙ һәм эшләргә тейешбеҙ.
Иҫкәрмәләр
Минең белеүемсә, Lisp Machine Lisp белдереүҙәр (динамик үҙгәреүсәндәрҙекенән башҡа) бары тик оптимизация кәңәше генә булып тора һәм дөрөҫ программаның мәғәнәһен үҙгәртмәй тигән төшөнсәне тормошҡа ашырған тәүге тел булды. Common Lisp быны асыҡтан-асыҡ билдәләгән тәүге тел булды шикелле.
Бының ҡараламаларын уҡып сыҡҡандары өсөн Тревор Блэквеллға (Trevor Blackwell), Роберт Моррисҡа (Robert Morris) һәм Дэн Гиффинға (Dan Giffin), шулай уҡ PyCon конференцияһында сығыш яһарға саҡырғандары өсөн Гвидо ван Россумға (Guido van Rossum), Джереми Хилтонға (Jeremy Hylton) һәм башҡа Python командаһына рәхмәт белдерәм.