Кіріспе
Бағдарламаны статикалық талдауға қатысты ұсыныс. Компьютерлік ғылымда абстрактілі интерпретация – компьютерлік бағдарламалардың семантикасын шамалаудың дұрыс теориясы, ол реттелген жиынтарға, әсіресе торларға қатысты монотонды функцияларға негізделген. Оны компьютерлік бағдарламаның ішінара орындалуы ретінде қарастыруға болады, ол барлық есептеулерді орындамай-ақ оның семантикасы туралы ақпаратты (мысалы, басқару ағыны, дерек ағыны) алуға мүмкіндік береді. Оның негізгі қолданылуы – формалды статикалық талдау, компьютерлік бағдарламалардың мүмкін болатын орындалуы туралы ақпаратты автоматты түрде алу; мұндай талдаулардың екі негізгі мақсаты бар: компиляторлар ішінде, бағдарламаларды талдау арқылы белгілі бір оңтайландырулар немесе түрлендірулердің қолданылу мүмкіндігін анықтау; қателерді жою немесе бағдарламаларды қателер кластарына қарсы сертификаттау. Абстрактілі интерпретацияны француз компьютерлік ғалымдары Патрик Кузо және Радия Кузо 1970 жылдардың соңында формалдаған.
In computer science, abstract interpretation is a theory of sound approximation of the semantics of computer programs, based on monotonic functions over ordered sets, especially lattices. It can be viewed as a partial execution of a computer program which gains information about its semantics (e. g., control flow, data flow) without performing all the calculations. Its main concrete application is formal static analysis, the automatic extraction of information about the possible executions of computer programs; such analyses have two main usages:
inside compilers, to analyse programs to decide whether certain optimizations or transformations are applicable;
for debugging or even the certification of programs against classes of bugs. Abstract interpretation was formalized by the French computer scientist working couple Patrick Cousot and Radhia Cousot in the late 1970s.
Интуиция
Бұл бөлім нақты әлемдегі, есептеуге қатысы жоқ мысалдар арқылы абстрактілік интерпретацияны түсіндіреді. Конференц-залға жиналған адамдарды қарастырайық. Бөлмедегі әрбір адамға бірегей идентификатор тағайындаңыз, мысалы, Америка Құрама Штаттарындағы әлеуметтік қамсыздандыру нөмірі сияқты. Біреудің қатыспағанын дәлелдеу үшін, оның әлеуметтік қамсыздандыру нөмірі тізімде бар-жоғын тексеру жеткілікті. Екі адамның бірдей нөмірі болмайтындықтан, қатысушының бар-жоқтығын оның нөмірін қарап ғана анықтауға болады. Дегенмен, тізімге тек қатысушылардың аттары енгізілген болуы мүмкін. Егер тізімде адамның аты табылса, ол адамның қатыспағанын сенімді түрде айтуға болады; бірақ егер аты табылса, омонимдердің болу мүмкіндігіне байланысты (мысалы, Джон Смит есімді екі адам) қосымша тексерусіз нақты қорытынды жасау қиын. Бұл дәл емес ақпараттың көп жағдайда жеткілікті екенін ескеру қажет, себебі практикада омонимдер сирек кездеседі. Бірақ, толыққанды қатаңдықпен айтқанда, кімнің бөлмеде болғанын нақты біле алмаймыз; тек олардың болуы мүмкін екенін айта аламыз. Егер іздеп отырған адам қылмыскер болса, дабыл береміз; бірақ жалған дабыл беру қаупі де бар. Бағдарламаларды талдау кезінде де осындай жағдайлар туындауы мүмкін. Егер бізге тек белгілі бір ақпарат қызығушылық тудырса, мысалы, "бөлмеде белгілі бір жастағы адам болды ма?", барлық аттар мен туған күндерін тізімдеудің қажеті жоқ. Қатысушылардың жастарын тізімдеу арқылы қауіпсіз және дәлдікті жоғалтпай шектеу қоюға болады. Егер бұл мәселе тым қиын болса, ең жас және ең үлкен адамның жасын ғана сақтай аламыз. Сұрақ нақты жасқа қатысты болса, онда мұндай қатысушының жоқ екенін сенімді түрде айтуға болады. Әйтпесе, біз жауап бере алмайтынымызды ғана айта аламыз. Есептеуде нақты ақпаратты шекті уақыт пен жад көлемінде алу көбінесе мүмкін емес (Райс теоремасы мен тоқтату мәселесін қараңыз). Абстракция сұрақтарға жалпыланған жауап беруге мүмкіндік береді (мысалы, "әлдеқайда" деп жауап беру, "иә" немесе "жоқ" дегенді білдіреді, егер абстрактілік интерпретация алгоритмі нақты жауапты анықтай алмаса); бұл мәселені жеңілдетеді және автоматты шешімдерге бейімдейді. Маңызды талап – маңызды сұрақтарға жауап беру үшін жеткілікті дәлдікті сақтай отырып, проблемаларды шешуге жететіндей белгісіздікті қосу (мысалы, "бағдарлама құлап қалуы мүмкін бе?" деген сұраққа жауап беру).
Компьютерлік бағдарламалардың тұжырымдамалық интерпретациясы
Бағдарламалау немесе спецификация тілінің негізінде абстрактілік интерпретация – абстракция қатынастары арқылы байланыстырылған бірнеше семантиканы ұсынудан тұрады. Семантика – бағдарламаның мүмкін болатын мінез-құлқының математикалық сипаттамасы. Бағдарламаның нақты орындалуын өте жақын сипаттайтын ең нақты семантика нақты семантика деп аталады. Мысалы, императивті бағдарламалау тілінің нақты семантикасы әр бағдарламаны оның тудыра алатын орындалу іздерінің жиынтығымен байланыстырады – орындалу іздері бағдарламаның орындалуының ықтимал тізбекті күйлері болып табылады; күй әдетте бағдарлама санағышының және жад орындарының (глобалдық, стек және үйінді) мәнінен тұрады. Содан кейін абстрактілірек семантикалар туындырылады; мысалы, орындалулардағы қолжетімді күйлердің жиынтығын ғана қарастыруға болады (бұл шекті іздердегі соңғы күйлерді қарастырумен тең). Статикалық талдаудың мақсаты – белгілі бір сәтте есептеуге болатын семантикалық интерпретацияны алу. Мысалы, бүтін сан айнымалыларын өңдейтін бағдарламаның күйін айнымалылардың нақты мәндерін естен шығарып, тек олардың таңбаларын (+, - немесе 0) сақтап беру арқылы бейнелеуге болады. Кейбір қарапайым операциялар үшін, мысалы, көбейту үшін, мұндай абстракция дәлдікті жоғалтпайды: көбейтіндінің таңбасын алу үшін операндтардың таңбасын білу жеткілікті. Ал кейбір басқа операциялар үшін абстракция дәлдікті жоғалтуы мүмкін: мысалы, операндалары тиісінше оң және теріс болатын қосындының таңбасын білу мүмкін емес. Кейде семантиканы шешімді ету үшін дәлдікті жоғалту қажет (Райс теоремасы мен тоқтау мәселесін қараңыз). Жалпы алғанда, талдаудың дәлдігі мен оның шешімділігі (есептеу мүмкіндігі) немесе тиімділігі (есептеу шығындары) арасында компромисс жасау қажет. Іс жүзінде анықталатын абстракциялар талдауға ұмтылатын бағдарламаның қасиеттеріне және мақсатты бағдарламалар жиынтығына бейімделеді. Компьютерлік бағдарламаларды абстрактілік интерпретация арқылы алғашқы ірі масштабты автоматтандырылған талдау 1996 жылы Ariane 5 зымыранының алғашқы ұшырылысын құлатқан апаттан туындады.