Кіріспе

Компьютерлік бағдарламалау және компьютерлік ғылымда "максималды жұту" немесе "ең ұзақ сәйкестік" қағидасы, қандай да бір құрылымды жасағанда, қолжетімді кірістің мүмкіндігінше көп бөлігін пайдалануды білдіреді. Бұл терминді алғаш рет R. G. G. Cattell компиляторлар үшін код генераторларын автоматты түрде тудыру туралы докторлық диссертациясында қолданған.

Қолдану

Мысалы, көптеген бағдарламалау тілдерінің лексикалық синтаксисі токендерді кіріс ағынынан мүмкін болатын ең көптеген таңбалардан құрастыруды қажет етеді. Бұл [a z]+ (бір немесе бірнеше кіші әріп) сияқты, кеңінен қолданылатын тұрақты өрнектердегі туа біткен екіұштылық мәселесін шешу үшін жасалады. Бұл термин компиляторларда нұсқауды таңдау кезеңінде "плитка салу" әдісін сипаттау үшін де қолданылады – аралық тілде бағдарламаны бейнелейтін құрылымдық ағашты сызықтық машиналық кодқа қалай түрлендіру керектігін анықтау. Ағаштың толық кіші бөлігі бір машиналық нұсқауға айналуы мүмкін, ал мәселе – ағашты бір-біріне қабаттаспайтын "плиткаларға" бөлу, олардың әрқайсысы бір машиналық нұсқауды көрсетеді. Тиімді стратегия – кез келген сәтте мүмкін болатын ең үлкен кіші ағаштың плиткасын жасау, бұл "максималды жұту" деп аталады.

Кемшіліктері

Кейбір жағдайларда "максималды жұту" қанағаттандырмас немесе түсініксіз нәтижелерге алып келеді. Мысалы, C бағдарламалау тілінде x=y/*z; (ешқандай бос орынсыз) жазбасы, синтаксистік қатеге себеп болуы мүмкін, себебі /* таңбалар тізбегі (көзінде жоқ) кейінірек, тікелей байланысы жоқ нақты түсіндірменің */ аяқталу белгісімен аяқталған немесе аяқталмаған түсіндірмені бастайды (C-дегі түсіндірмелер ішкі түсіндірмелерді қолдамайды). Бұл жазбаның мақсаты – y мәнін z көрсеткішінің мәніне бөлу нәтижесін x айнымалысына тағайындау еді; мұндай код жарамды болар еді. Бұл бос орынды пайдалану арқылы немесе x=y/(*z); арқылы көрсетілуі мүмкін. Тағы бір мысал, C++ тілінде, шаблонды мамандандыру синтаксисінде < және > «бұрыштық жақшалар» таңбаларын қолданады, бірақ екі тізбектелген > таңбалары оңға жылдыру операторы >> ретінде түсіндіріледі. C++11 нұсқасына дейін келесі код талдау қатесін тудыратын еді, себебі оңға жылдыру операторының белгісі екі тік бұрыштық жақша белгісінің орнына кездеседі: std::vector<std::vector<int>> my mat 11; //C++03-те қате, C++11-де дұрыс. std::vector<std::vector<int> > my mat 03; //C++03 немесе C++11 тілінде дұрыс. 2011 жылдың тамызында қабылданған C++11 стандарты грамматиканы оңға жылдыру белгісін (Java-дағыдай) тік бұрыштық жақшалар жұбымен теңдестіретіндей етіп өзгертіп, грамматиканы күрделендірді, бірақ максималды жұту принципін қолдануға мүмкіндік берді. Шаблондарда <:: тізбегі пайда болуы мүмкін болғандықтан, ең көп мөлшерде жұту ережесіне ерекшелік қосу қажет болды. Мұндай жағдайда, егер тізбекке : немесе > белгісі еріп келмесе, < белгісі <:: белгісінің бөлігі ретінде емес, жеке < белгісі ретінде түсіндіріледі.

Баламалар

Бағдарламалау тілдерін зерттеушілер де максмалды мунч принципін басқа лексикалық түсініктілікті жою тактикаларымен алмастыруға немесе толықтыруға жауап берді. Бір тәсіл – "кейінге шектеулерді" пайдалану, яғни ең ұзын сәйкестікті тікелей таңдаудың орнына жарамды сәйкестіктен кейін келетін таңбаларға шектеу қою. Мысалы, [a z]+ үлгісіне сәйкес келетін тізбектерден кейін әліпбилік таңба келмейді деп ереже қойса, бұл осы реттегі өрнек үшін максмалды мунч принципімен бірдей нәтиже береді. (Реттегі өрнектер контекстінде максмалды мунч принципі "ашкөздік" деп аталады және "жалқаулыққа" қарама-қарсы қойылады.) Тағы бір тәсіл – максмалды мунч принципін сақтап, оны басқа принципке, мысалы, контекстке бағындыру (мысалы, Java-дағы оңға жылдыру операторы, жалпылама өрнектер контекстінде синтаксистік жарамсыздыққа байланысты сәйкес келмейді).