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