(Бу — 2001 елның 10 маенда MIT'та үткән программалаштыру телләре дизайны буенча панель дискуссиясе өчен язган кайбер язмаларым.)
1. Программалаштыру телләре кешеләр өчен ясала.
Программалаштыру телләре — кешеләрнең санаклар белән сөйләшү ысулы ул. Санак өчен бернинди икелелексез булган теләсә нинди телдә «сөйләшү» бертигез булыр иде. Югары дәрәҗәле телләрнең булу сәбәбе — кешеләрнең машина теле белән эшли алмавында. Программалаштыру телләренең максаты — безнең мескен, көчсез кеше миебезне детальләр ташкыны астында басылып калудан саклау.
Архитекторлар дизайн мәсьәләләренең кайбер төрләре башкаларга караганда шәхсирәк икәнен белә. Иң чиста, иң абстракт дизайн мәсьәләләренең берсе — күперләр проектлау. Анда сезнең эшегез, нигездә, минималь материал сарыф итеп билгеле бер аралыкны тоташтырудан гыйбарәт. Спектрның икенче ягында исә — урындыклар ясау. Урындык ясаучылар үз вакытларын кеше артлары турында уйлап үткәрергә мәҗбүр.
Программа тәэминаты да нәкъ шулай ук төрле була. Челтәр аша мәгълүмат юнәлтү (routing) алгоритмнарын проектлау — күперләр проектлау кебек үк яхшы, абстракт мәсьәлә. Ә менә программалаштыру телләрен проектлау исә урындыклар ясау кебек: монда барысы да кеше көчсезлекләре белән эш итүгә кайтып кала.
Күбебез моны танырга яратмый. Зур математик нәфислеккә ия системалар проектлау күбебезгә кеше көчсезлекләренә яраклашуга караганда күпкә кызыграк тоела. Һәм математик нәфислекнең үз роле бар: кайбер нәфислек төрләре программаларны аңлауны җиңеләйтә. Ләкин нәфислек үз эчендә төп максат түгел.
Һәм телләр кеше көчсезлекләренә яраклаштырылып проектланырга тиеш дигәндә, мин телләр начар программистлар өчен проектланырга тиеш дип әйтмим. Чсынында, сез аны иң яхшы программистлар өчен проектларга тиеш дип саныйм, ләкин иң яхшы программистларның да үз чикләүләре бар. Берәүнең дә бөтен үзгәрүчәннәре бөтен санлы индекслы x хәрефеннән торган телдә программа язасы килмәс дип уйлыйм.
2. Үзегез һәм дусларыгыз өчен проектлагыз.
Программалаштыру телләре тарихына карасагыз, иң яхшыларның күбесе авторларның үзләре куллану өчен эшләнгән телләр булган, ә иң начарларның күбесе исә башка кешеләр куллану өчен проектланган.
Телләр башка кешеләр өчен проектланганда, бу һәрвакыт билгеле бер төркем кешеләр була: телне проектлаучы кебек акыллы булмаган кешеләр. Нәтиҗәдә, сез үзегезгә югарыдан түбән карап сөйләшүче тел аласыз. Cobol — моның иң ачык мисалы, ләкин бик күп телләргә нәкъ менә шул рух сеңгән.
Моның телнең никадәр абстракт булуына бернинди катнашы юк. C теле шактый түбән дәрәҗәле, ләкин ул аны булдырган авторлар үзләре куллансын өчен проектланган, һәм хакерлар аны нәкъ шуңа күрә ярата.
Начар программистлар өчен телләр проектлау файдасына төп дәлил — начар программистлар яхшы программистларга караганда күбрәк булуы. Бәлки, бу чыннан да шулайдыр. Ләкин шул аз санлы яхшы программистлар программа тәэминатының пропорциональ булмаган дәрәҗәдә зур өлешен язалар.
Мине мондый сорау кызыксындыра: иң яхшы хакерларга ошаячак телне ничек проектларга? Минемчә, бу «яхшы программалаштыру телен ничек проектларга?» дигән сорау белән бер үк, ләкин алай булмаса да, ул ким дигәндә кызыклы сорау булып кала.
3. Программистка мөмкин кадәр күбрәк контроль бирегез.
Күп телләр (бигрәк тә башка кешеләр өчен проектланганнары) гувернантка кебек эш итә: алар сезгә үз фикерләре буенча файдалы булмаган нәрсәләрне эшләргә комачауларга тырыша. Мин капма-каршы карашны ошатам: программистка мөмкин кадәр күбрәк контроль бирегез.
Мин Lisp'ны беренче тапкыр өйрәнгәндә, миңа анда иң ошаганы — аның миңа тигез хокуклы партнер итеп каравы иде. Моңа кадәр мин өйрәнгән башка телләрдә тел үзе бар иде һәм шул телдә язылган минем программам бар иде, һәм бу икесе бер-берсеннән бик аерым иде. Әмма Lisp'та мин язган функцияләр һәм макрослар нәкъ шул телне тәшкил иткән нәрсәләр кебек үк иде. Теләсәм, мин телне яңадан яза ала идем. Бу ачык кодлы программа тәэминаты (open-source) кебек үк сокландыргыч иде.
4. Кыскалыкка омтылыгыз.
Кыскалыкны тиешенчә бәяләмиләр һәм хәтта җирәнәләр дә. Ләкин хакерларның күңеленә үтеп керсәгез, аларның моны чыннан да яратуын күрерсез. Хакерларның, мәсәлән, APL'да нибары ике юл код белән искиткеч нәрсәләр эшләп булуы турында сокланып сөйләгәннәрен ничә тапкыр ишеткәнегез бар? Чыннан да акыллы кешеләр ихластан яраткан теләсә нинди нәрсә игътибарга лаек дип саныйм.
Программаларны кыскарту өчен сез эшли алган һәр нәрсә диярлек файдалы дип уйлыйм. Китапханә функцияләре күп булырга тиеш; ачыктан-ачык язылмыйча гына аңлашыла ала торган һәр нәрсә шулай булырга тиеш; синтаксис чиксез дәрәҗәдә кыска булырга тиеш; хәтта элементларның исемнәре дә кыска булырга тиеш.
Һәм программалар гына кыска булырга тиеш түгел. Кулланма (manual) да юка булырга тиеш. Кулланмаларның яхшы гына бер өлешен аңлатмалар, искәрмәләр, кисәтүләр һәм үзенчәлекле очраклар били. Әгәр сез үзегезне кулланманы кыскартырга мәҗбүр итсәгез, иң яхшы очракта сез моны телдә шулкадәр күп аңлатма таләп иткән якларны төзәтү юлы белән башкарасыз.
5. Хакерлыкның нәрсә икәнен таныгыз.
Бик күп кешеләр хакерлыкның математика, яки ким дигәндә табигый фәннәргә охшаш берәр нәрсә булуын тели. Минемчә, хакерлык күбрәк архитектурага охшаган. Архитектура физика белән бәйле, чөнки архитекторлар җимерелеп төшми торган биналар проектларга тиеш, ләкин архитекторларның төп максаты — статика өлкәсендә ачышлар ясау түгел, ә шәп биналар салу.
Хакерлар исә шәп программалар ясарга ярата. Һәм, минемчә, ким дигәндә үзебезнең аңыбызда, бу хезмәт фәнни мәкаләләрнең традицион интеллектуаль кыйммәтенә җиңел генә күчерелмәсә дә, шәп программалар язуның сокланырлык эш икәнен истә тотарга тиешбез. Интеллектуаль яктан караганда, программистлар яратачак тел проектлау — мәкалә бастырып булырлык ниндидер фикерне үз эченә алган котсыз бер тел проектлау кебек үк кыйммәтле эш.
1. Зур китапханәләрне ничек оештырырга?
Китапханәләр программалаштыру телләренең көннән-көн мөһимрәк өлешенә әверелә бара. Алар шулай ук зуррак та була, һәм бу куркыныч булырга мөмкин. Сез теләгән нәрсәне эшләячәк китапханә функциясен табу аны үзегез язуга караганда күбрәк вакытны ала икән, димәк, бу кодның барысы да сезнең кулланмагызны калынайтудан башка бернәрсә дә эшләми. (Symbolics кулланмалары моның ачык мисалы иде.) Шуңа күрә безгә китапханәләрне оештыру ысуллары өстендә эшләргә туры килер дип уйлыйм. Иң яхшысы — аларны программист кирәкле эшне кайсы китапханә чакыруы башкарачагын җиңел чамалый алырлык итеп проектлау булыр иде.
2. Кешеләр чыннан да префикс синтаксисыннан куркамы?
Бу — ачык мәсьәлә, чөнки мин моның турында еллар буе уйландым һәм җавабын һаман белмим. Префикс синтаксисы, математиканы исәпкә алмаганда, миңа бөтенләй табигый тоела. Ләкин Lisp'ның популяр булмавының күп өлеше гади генә ияләшмәгән синтаксиска бәйле булырга да мөмкин. Әгәр бу дөрес булса, аның белән нәрсәдер эшләргәме-юкмы дигән нәрсә — икенче сорау.
3. Серверга нигезләнгән программа тәэминаты өчен нәрсә кирәк?
Киләсе егерме елда язылачак иң кызыклы яңа кушымталарның күбесе веб-кушымталар булачак дип уйлыйм, ягъни алар серверда утыручы һәм сезнең белән веб-браузер аша аралашучы программалар булачак. Һәм мондый программаларны язу өчен безгә кайбер яңа нәрсәләр кирәк булырга мөмкин.
Безгә кирәк булачак бер нәрсә — серверга нигезләнгән кушымталарның яңача чыгарылыш (релиз) рәвешенә ярдәм итү. Өстәл программалары кебек елына бер яки ике зур чыгарылыш ясау урынына, сервер кушымталары бер-бер артлы кечкенә үзгәрешләр сериясе рәвешендә чыгарыла. Сездә көненә биш яки хәтта ун чыгарылыш булырга мөмкин. Һәм кагыйдә буларак, һәркем һәрвакыт иң соңгы версияне кулланачак.
Программаларны хаталарын төзәтерлек (debuggable) итеп проектлап булганын беләсездер бит? Димәк, серверга нигезләнгән программа тәэминаты да шулай ук җиңел үзгәртелә торган (changeable) итеп проектланырга тиеш. Сез аны җиңел үзгәртә алырга, яки ким дигәндә нәрсә кечкенә үзгәреш, ә нәрсә зур үзгәреш икәнен белергә тиешсез.
Сервер программалары өчен файдалы булып чыгарга мөмкин булган тагын бер нәрсә, гаҗәп булса да, continuations (дәвам иттерүләр) булып тора. Веб-кушымталарда сез веб-сессиянең табигый халәтсез (stateless) дөньясында астистемалар (subroutines) эффектын алу өчен continuation-passing style кебек нәрсәне куллана аласыз. Бәлки, әгәр артык кыйммәткә төшмәсә, чын continuations булуы файдалы булыр иде.
4. Тагын нинди яңа абстракцияләр ачыласы калды?
Бу никадәр нигезле өмет икәнен белмим, ләкин үзем шәхсән бик тә теләгән бер нәрсә — беренче класслы функцияләр (first-class functions), рекурсия яки хәтта ачкыч сүзле параметрлар (keyword parameters) кебек зур үзгәреш китерә торган яңа бер абстракция ачу булыр иде. Бу тормышка ашмаслык хыял булырга да мөмкин. Мондый нәрсәләр бик еш ачылмый. Ләкин мин һәрвакыт эзләнүдә.
1. Сез теләсә нинди телне куллана аласыз.
Элек гамәли программалар язу өстәл программаларын язуны аңлата иде. Ә өстәл программаларында кушымтаны операцияләр системасы язылган телдә үк язуга зур омтылыш бар. Һәм шулай итеп, моннан ун ел элек программа язу, нигездә, C телендә программа язуны аңлата иде. Ахыр чиктә бер традиция формалашты: гамәли программалар гадәти булмаган телләрдә язылырга тиеш түгел. Һәм бу традиция шулкадәр озак үсә килде ки, хәтта менеджерлар һәм венчур инвесторлары кебек техник булмаган кешеләр дә моны сеңдерде.
Серверга нигезләнгән программа тәэминаты бу бөтен модельне юкка чыгара. Сервер программалары белән сез үзегез теләгән теләсә нинди телне куллана аласыз. Моны әлегә беркем дә диярлек аңламый (бигрәк тә менеджерлар һәм венчур инвесторлары). Аны бары тик берничә хакер гына аңлый, һәм Perl белән Python кебек яңа, бәйсез телләр турында ишетүебезнең сәбәбе дә нәкъ менә шул. Без Perl һәм Python турында кешеләр аларны Windows кушымталары язу өчен кулланганга күрә ишетмибез.
Программалаштыру телләрен проектлау белән кызыксынучылар буларак, безнең өчен бу хәзер безнең хезмәтебез өчен потенциаль реаль аудитория бар дигәнне аңлата.
2. Тизлек профайлерлардан килә.
Тел проектлаучылар, яисә ким дигәндә телне гамәлгә ашыручылар, тиз эшләүче код ясаучы компиляторлар язарга ярата. Ләкин кулланучылар өчен телләрне тиз иткән нәрсә бу дип уйламыйм. Кнут күптән түгел генә тизлек бары тик берничә критик кысан урында (bottlenecks) гына мөһим булуын күрсәткән иде. Һәм моны эшләп караган һәркем бу урыннарның кайда икәнен алдан чамалап булмавын белә. Җавап — профайлерлар.
Тел проектлаучылар дөрес булмаган мәсьәләне чишә. Кулланучыларга тиз эшләү өчен тестлар (benchmarks) кирәк түгел. Аларга үз программаларының кайсы өлешләрен яңадан язарга кирәклеген күрсәтә алган тел кирәк. Тәҗрибәдә тизлек нәкъ менә шуннан килә. Шуңа күрә телне гамәлгә ашыручылар компиляторны оптимальләштерүгә сарыф итәчәк вакытларының яртысын яхшы профайлер язуга багышласалар, бу гомуми отыш булыр иде.
3. Тел дизайнын алга җибәрү өчен кушымта кирәк.
Бу абсолют кагыйдә булмаска да мөмкин, ләкин иң яхшы телләрнең барысы да алар ярдәмендә языла торган ниндидер кушымта белән бергә үскән кебек. C телен аны система программалаштыру өчен кирәксенгән кешеләр язган. Lisp өлешчә символик дифференциацияләү өчен эшләнгән, һәм Маккарти эшне башларга шулкадәр ашкына иде ки, ул Lisp турындагы беренче мәкаләсендә үк (1960 елда) дифференциацияләү программаларын яза иде.
Кушымтагыз ниндидер яңа мәсьәләне чишсә, бу бигрәк тә яхшы. Бу сезнең телегезне программистларга кирәкле яңа мөмкинлекләргә ия булырга этәрәчәк. Шәхсән мин үзем сервер кушымталарын язу өчен яхшы булачак тел язу белән кызыксынам.
[Панель вакытында Гай Стил дә бу фикерне әйтеп үтте, өстәмә рәвештә кушымта үз телегез өчен компилятор язудан гыйбарәт булмаска тиеш (әгәр телегез махсус компиляторлар язу өчен билгеләнмәгән булса) дигән киңәш бирде.]
4. Тел бер тапкыр кулланыла торган программалар язу өчен яхшы булырга тиеш.
Бер тапкыр кулланыла торган (throwaway) программаның нәрсә икәнен беләсез: ниндидер чикләнгән бурыч өчен тиз генә язган нәрсәне әйтәләр. Әйләнә-тирәгә күз салсагыз, бик күп зур, җитди программаларның бер тапкыр кулланыла торган программалар буларак башланганын күрерсез дип уйлыйм. Программаларның күбесе бер тапкыр кулланыла торган программалар буларак башланган булса, мин бөтенләй гаҗәпләнмәс идем. Димәк, гомумән программа тәэминаты язу өчен яхшы тел ясарга теләсәгез, ул бер тапкыр кулланыла торган программалар язу өчен яхшы булырга тиеш, чөнки бу — күпчелек программа тәэминатының үсү (личинка) этабы.
5. Синтаксис семантика белән бәйле.
Синтаксис белән семантиканы бөтенләй аерым нәрсәләр дип санау гадәткә кергән. Бу шок булып ишетелер, ләкин алар аерым булмаска да мөмкин. Телегездә нәрсә булуын теләвегез аны ничек белдерүегез белән бәйле булырга мөмкин дип уйлыйм.
Күптән түгел Роберт Моррис белән сөйләшкән идем, һәм ул инфикс синтаксислы телләрдә операторларны яңадан йөкләү (operator overloading) күпкә зуррак өстенлек бирә дип билгеләп үтте. Префикс синтаксислы телдә сез билгеләгән теләсә нинди функция асылда оператор булып тора. Әгәр сез үзегез уйлап чыгарган яңа төрле сан өчен плюс билгеләргә теләсәгез, аларны кушу өчен яңа функция генә билгели аласыз. Әгәр сез моны инфикс синтаксислы телдә эшләсәгез, яңадан йөкләнгән операторны куллану белән функция чакыру арасында тышкы яктан зур аерма бар.
1. Яңа программалаштыру телләре.
1970 елларда яңа программалаштыру телләрен проектлау модада иде. Соңгы вакытта алай түгел иде. Ләкин сервер программалары яңа телләрне кабат модага кертәчәк дип уйлыйм. Сервер программалары ярдәмендә сез үзегез теләгән теләсә нинди телне куллана аласыз, шуңа күрә кемдер булган башкалардан чыннан да яхшырак күренгән тел проектласа, тәвәккәлләп аны кулланачак кешеләр табылачак.
2. Вакытны бүлешү (Time-Sharing).
Ричард Келси узган панельдә моны вакыты кабат җиткән идея дип атады, һәм мин аның белән тулысынча килешәм. Минем фаразларымча (һәм Microsoft фаразларынча да, күрәсең), исәпләүләрнең күбесе өстәл санакларыннан ерактагы серверларга күчәчәк. Башкача әйткәндә, вакыт бүлешү кире кайтты. Һәм моңа тел дәрәҗәсендә ярдәм булырга тиеш дип саныйм. Мәсәлән, Ричард белән Джонатан Рис Scheme 48 эчендә процессларны планлаштыруны (process scheduling) гамәлгә ашыру буенча бик күп эш башкарганнарын беләм.
3. Эффективлык.
Соңгы вакытта санаклар ниһаять җитәрлек дәрәҗәдә тизләште кебек тоела башлаган иде. Без байт-код (byte code) турында көннән-көн ешрак ишетә башладык, бу минем өчен ким дигәндә буш циклларыбыз бар дигән хис уята иде. Ләкин сервер программалары белән бездә алай булмас дип уйлыйм. Кемгәдер программа тәэминаты эшли торган серверлар өчен түләргә туры киләчәк, һәм бер машинага хезмәт күрсәтә алган кулланучылар саны аларның төп чыгымнарының бүлүчесе булачак.
Шуңа күрә нәтиҗәлелек, ким дигәндә исәпләү кысанлыкларында, мөһим булачак дип уйлыйм. Бигрәк тә кертү/чыгаруны (i/o) тиз башкару мөһим булачак, чөнки сервер кушымталары бик күп кертү/чыгару ясый.
Ахыр чиктә байт-код җиңүче булмаска да мөмкин. Хәзерге вакытта Sun һәм Microsoft байт-кодлар сугышында бер-берсенә каршы тора кебек. Ләкин алар моны үзләре бу процесс эченә кереп утыру өчен уңайлы урын булганга күрә эшлиләр, байт-код үзе яхшы фикер булганга түгел. Бу бөтен сугыш кыры бөтенләй читтә калып узып китәргә дә мөмкин. Бу хәтта кызык булыр иде.
1. Клиентлар.
Бу бары тик фараз гына, ләкин минем уйлавымча, күпчелек кушымталар өчен җиңүче модель саф серверга нигезләнгән булачак. Һәркемнең сезнең клиентыгыз булачак дигән фаразга таянып программа проектлау — һәркем намуслы булачак дигән өметкә таянып җәмгыять төзү кебек. Бу, әлбәттә, уңайлы булыр иде, ләкин сез моның беркайчан да булмаячагын истә тотарга тиешсез.
Вебка чыгу мөмкинлеге булган төрле җайланмалар бик нык таралыр дип уйлыйм, һәм сез алар турында бары тик гади html һәм формаларга ярдәм итә алалар дип кенә уйлый аласыз. Кесә телефонында браузер булырмы? КПКда (palm pilot) телефон булырмы? Blackberry экраны зуррак булырмы? Gameboy яки сәгатегездә веб карап булырмы? Мин белмим. Һәм әгәр мин барысы да серверда гына булачак дип өметләнсәм, моны белергә дә тиеш түгелмен. Бөтен акылны серверда тоту күпкә ышанычлырак.
2. Объектка юнәлтелгән программалаштыру (OOP).
Бу бәхәсле мәсьәлә икәнен аңлыйм, ләкин мин объектка юнәлтелгән программалаштыруны артык зур казаныш дип санамыйм. Минемчә, бу тәрәзә системалары, симуляцияләр һәм CAD программалары кебек билгеле бер төр мәгълүмат структурасына мохтаҗ кушымталар өчен яхшы модель. Ләкин аның ни өчен бөтен программалаштыру өчен модель булырга тиешлеген аңламыйм.
Зур компанияләрдәге кешеләрнең объектка юнәлтелгән программалаштыруны яратуының бер өлеше — аның эш булып күренгән күп нәрсәне барлыкка китерүендә дип уйлыйм. Табигый рәвештә, әйтик, бөтен саннар исемлеге рәвешендә күрсәтелә ала торган нәрсәне хәзер төрле кирәк-ярак калдык-постыклары һәм ыгы-зыгысы булган класс рәвешендә бирергә мөмкин.
Объектка юнәлтелгән программалаштыруның тагын бер кызыктыргыч ягы шунда: методлар сезгә беренче класслы функцияләрнең кайбер нәтиҗәләрен бирә. Ләкин Lisp программистлары өчен бу күптән билгеле искергән яңалык. Сезнең чын беренче класслы функцияләрегез булганда, барысын да класслар һәм методлар калыбына кертеп кысарга мәҗбүр булмыйча, аларны куелган бурычка туры килгән теләсә нинди рәвештә куллана аласыз.
Тел дизайны өчен бу нәрсә аңлата дигәндә, минемчә, сез телгә объектка юнәлтелгән программалаштыруны артык тирән сеңдерергә тиеш түгелсез. Бәлки, җавап — гомумирәк, төп нигезләр тәкъдим итү һәм кешеләргә үзләре теләгән теләсә нинди объект системаларын китапханәләр рәвешендә проектларга мөмкинлек бирүдәдер.
3. Комитет тарафыннан проектлау.
Телегезнең комитет тарафыннан проектлануы — зур тозак, һәм бу һәркем белгән сәбәпләр аркасында гына түгел. Комитетларның тотрыксыз, чуар, каршылыклы дизайннар китереп чыгаруга тартылуын һәркем белә. Ләкин иң зур куркыныч — аларның куркыныч адымнарга (рискка) бармавында дип уйлыйм. Бер кеше җаваплы булганда, ул комитет беркайчан да ризалашмаячак куркыныч адымнарны ясый ала.
Әмма яхшы тел проектлау өчен тәвәккәлләргә һәм куркыныч адымнар ясарга кирәкме соң? Күпләр тел дизайны — гомуми кабул ителгән акылга нык ябышып торырга тиешле нәрсә дип уйларга мөмкин. Мин алай түгел дип бәхәсләшергә әзер. Кешеләр эшләгән башка барлык нәрсәләрдә дә бүләк тәвәккәллеккә (рискка) пропорциональ. Ни өчен тел дизайны башкача булырга тиеш соң?