Кіріспе

Бағдарламалық жасақтаманы бағдарламалауды оңтайландыру тәсілі

Есептеу техникасында, мемоизация – компьютерлік бағдарламаларды жылдамдету үшін негізгі арналған оптимизациялау тәсілі. Бұл тәсіл қымбат функция шақыруларының нәтижелерін сақтап, сол функция таза болса, бірдей кіріс мәліметтері кезінде сақталған нәтижені қайтару арқылы жұмыс істейді. Мемоизация жылдамдық артудан басқа мақсаттар үшін де, мысалы, қарапайым өзара рекурсивті түсіп келу синтаксистік талдауында қолданылған. Бұл кэштеудің бір түрі, буферлеу және бет алмастыру сияқты басқа кэштеу түрлерінен ерекшеленеді. Кейбір логикалық бағдарламалау тілдерінде мемоизация кестелеу деп те аталады.

Этимология

Мемоизация термині 1968 жылы Дональд Мичимен енгізілген. Ол латынша memorandum сөзінен туындаған ("есте сақтауға арналған"), американдық ағылшын тілінде көбінесе memo деп қысқартылады, демек, "функцияның нәтижесін есте сақтауға айналдыру" мағынасын білдіреді. Мемоизациялау мен жаттау ұғымдары шатастырылуы мүмкін (олар этимологиялық жақтан байланысты болғандықтан), бірақ мемоизациялау есептеу саласында нақты мағынаға ие.

Функционалдық бағдарламалау

Мемоизация функционалдық бағдарламалау тілдерінің компиляторларында кеңінен қолданылады, олар көбінесе аргументтерді атау бойынша бағалау стратегиясын пайдаланады. Аргумент мәндерін есептеуге байланысты қосымша шығындарды болдырмау үшін, осы тілдердің компиляторлары аргумент мәндерін есептеу үшін thunk деп аталатын қосымша функцияларды жиі пайдаланады және осы функцияларды қайта есептеуден аулақ болу үшін жадта сақтайды.

Талдаушылар

Жоғарыдан төменге қарай талдаушы екіжақты контекстсіз грамматикаға (CFG) қатысты екіжақты кірісті талдауды бастағанда, CFG-нің барлық баламаларын сынап көру үшін барлық мүмкін талдау ағаштарын жасау үшін қадамдардың экспоненциалдық саны (кірістің ұзындығына қатысты) қажет болуы мүмкін. Бұл үшін экспоненциалды жад кеңістігі қажет. Мемоизацияны 1991 жылы Питер Норвиг талдау стратегиясы ретінде зерттеді. Ол Эрли алгоритміне (1970) динамикалық бағдарламалау мен күй жиынтықтарын пайдалануға ұқсас алгоритмнің және Кокке, Янгер және Касамидің CYK алгоритміндегі кестелердің экспоненциалдық уақыт күрделілігі проблемасын шешу үшін қарапайым кері рекурсивті түсіру талдаушысына автоматты мемоизацияны енгізу арқылы жасалуы мүмкін екенін көрсетті. Фрост негізгі мемоизацияланған талдау комбинаторларын CFG-ның орындалатын сипаттамалары ретінде күрделі талдауларды құру үшін құрылыс блоктары ретінде пайдалануға болатынын көрсетті. Мемоизацияны 1995 жылы Марк Джонсон мен Йохен Дёрре қайтадан талдау аясында зерттеді. 2002 жылы Брайан Форд оны Packrat parsing деп аталатын формада терең зерттеді. 2007 жылы Фрост, Хафиз және Каллаган жоғарыдан төменге қарай талдау алгоритмін сипаттады, ол артық есептеулерді болдырмау үшін мемоизацияны қолданады, соның арқасында кез келген екіжақты CFG түрін көп уақытта (сол рекурсивті грамматикалар үшін Θ(n4) және сол рекурсивті емес грамматикалар үшін Θ(n3)) орналастыруға болады. Олардың жоғарыдан төменге қарай талдау алгоритмі "жинақы бейнелеу" және "жергілікті түсініксіздіктерді топтастыру" арқылы потенциалды экспоненциалды екіжақты талдау ағаштары үшін көп мөлшерде жадты қажет етеді. Олардың жинақы бейнелеуі Томитаның төменнен жоғары қарай талдаудың жинақы бейнелеуімен салыстыруға болады. Олардың мемоизацияны пайдалануы тек бір кіріс позициясына бірнеше рет талдаушы қолданылған кезде бұрын есептелген нәтижелерді алумен ғана шектелмейді (бұл көп уақытты талап ету үшін маңызды); ол келесі қосымша тапсырмаларды орындау үшін мамандандырылған: Мемоизация процесі (бұл кез-келген талдаушыны орындаудың айналасындағы "wrapper" ретінде қаралуы мүмкін) кіріс ұзындығы мен ағымдағы кіріс позициясына қатысты тереңдік шектеулерін енгізе отырып, үнемі өсіп келе жатқан тікелей сол рекурсивті талдауды қамтиды. Алгоритмнің меморандумдық кестесінің "іздеу" процедурасы сонымен қатар сақталған нәтиженің есептеу контекстін талдаушының ағымдағы контексімен салыстыру арқылы сақталған нәтиженің қайта пайдалануға қабілеттілігін анықтайды. Бұл контексттік салыстыру - жанама (немесе жасырын) сол жақ рекурсияны орналастырудың кілті. Мемотабельді сәтті іздеуді орындаған кезде, толық нәтиже жиынтығын қайтарудың орнына, процесс тек нақты нәтижеге сілтемелерді қайтарады және ақыр соңында жалпы есептеуді жылдамдатады. Мемотабельді жаңарту кезінде мемоизация процесі (потенциалды экспоненциалды) екіжақты нәтижелерді топтастырады және көп мөлшерде жадты талап етуді қамтамасыз етеді. Фрост, Хафиз және Каллаган PADL08-де алгоритмнің жүзеге асырылуын Haskell-те жоғары реттік функциялар жиынтығы (парсерлік комбинаторлар деп аталады) ретінде сипаттады, бұл CFG-ның тікелей орындалатын сипаттамаларын тіл процессорлары ретінде құруға мүмкіндік береді. Олардың көп уақыттық алгоритмінің "жоғарыдан төменге қарай талдаумен" "кез келген екіжақты CFG" түрін орналастыруға қабілеттілігінің маңызы табиғи тіл өңдеу кезінде синтаксис пен семантика талдауына қатысты өте маңызды. X SAIGA сайтында алгоритм мен іске асыру туралы егжей-тегжейлі ақпарат бар. Норвиг талдаушының қуатын мемоизация арқылы арттырғанмен, кеңейтілген талдаушы әлі де Эрли алгоритмі сияқты уақыт жағынан күрделі болды, бұл жылдамдықты оңтайландырудан басқа нәрсе үшін мемоизацияны қолдану жағдайын көрсетеді. Джонсон мен Дёрре.