Бағдарламалық кесімдер: анықтамасы, түрлері және қолданылуы
Program slicing
Программдық кесу (program slicing) – кодтағы қателерді табу, бағдарламаны жақсарту, талдау үшін қолданылатын әдіс. Бағдарламаның маңызды бөліктерін анықтайды.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Компьютерлік бағдарламалауда бағдарламаны кесу – бағдарламаның қандай операторлар жиынтығы қызығушылық тудыратын нүктедегі мәндерге әсер ететінін анықтау, яғни бағдарламаның кесіндісін есептеу процесі. Бұл кесу критерийі деп аталады. Бағдарламаны кесу қателердің көзін анықтауды жеңілдету үшін жөндеу жұмыстарында қолданылады. Слайсингтің басқа да қолданыс аяларына бағдарламалық жасақтаманы күтіп-ұстау, оңтайландыру, бағдарламаны талдау және ақпарат ағынын басқару жатады. Кесу техникалары Марк Вайзердің алғашқы анықтамасынан бері қарқынды дамып келеді. Алғашқыда кесу тек статикалық болды, яғни бағдарлама кодына қатысты, басқа ақпаратсыз қолданылды. Богдан Корел мен Януш Ласки динамикалық кесуді ұсынды, ол бағдарламаның нақты орындалуына (берілген орындалу іздеріне) қатысты жұмыс істейді. Кесудің басқа да түрлері бар, мысалы, жол бойынша кесу.
In computer programming, program slicing is the computation of the set of program statements, the program slice, that may affect the values at some point of interest, referred to as a slicing criterion. Program slicing can be used in debugging to locate source of errors more easily. Other applications of slicing include software maintenance, optimization, program analysis, and information flow control. Slicing techniques have been seeing a rapid development since the original definition by Mark Weiser. At first, slicing was only static, i. e., applied on the source code with no other information than the source code. Bogdan Korel and Janusz Laski introduced dynamic slicing, which works on a specific execution of the program (for a given execution trace). Other forms of slicing exist, for instance path slicing.
Статикалық кесу
Вайзердің бастапқы анықтамасына сүйенсек, ресми емес тұрғыда, статикалық бағдарламаның S кесіндісі – бұл P бағдарламасындағы x нұсқауындағы v айнымалысының мәніне әсер етуі мүмкін барлық нұсқаулардың жиынтығы. Кесінді C=(x,v) кесу критерийі үшін анықталады, мұнда x – P бағдарламасындағы нұсқау, ал v – x нұсқауындағы айнымалы. Статикалық кесінді кез келген мүмкін кіріс дерегі үшін x нұсқауындағы v айнымалысының мәніне әсер ететін барлық нұсқауларды қамтиды. Статикалық кесінділер нұсқаулар арасындағы тәуелділіктерді кері бағытта іздеу арқылы есептеледі. Нақтырақ айтқанда, (x,v) статикалық кесіндісін есептеу үшін, бірінші кезекте x нұсқауына дейін v айнымалысының мәніне тікелей әсер ететін барлық нұсқауларды анықтаймыз. Содан кейін, рекурсивті түрде, x нұсқауындағы v айнымалысына әсер ететін әрбір y нұсқауы үшін, v айнымалысына әсер ететін y нұсқауындағы барлық z айнымалыларының кесінділерін есептейміз. Бұл кесінділердің біріктірілуі (x,v) үшін статикалық кесіндіні құрайды.
Based on the original definition of Weiser, informally, a static program slice S consists of all statements in program P that may affect the value of variable v in a statement x. The slice is defined for a slicing criterion C=(x,v) where x is a statement in program P and v is variable in x. A static slice includes all the statements that can affect the value of variable v at statement x for any possible input. Static slices are computed by backtracking dependencies between statements. More specifically, to compute the static slice for (x,v), we first find all statements that can directly affect the value of v before statement x is encountered. Recursively, for each statement y which can affect the value of v in statement x, we compute the slices for all variables z in y that affect the value of v. The union of all those slices is the static slice for (x,v).
Жеңіл алдыңғы статикалық кесу әдісі
Өте жылдам және кеңейтілген, бірақ сәл дәлдігі төмен кесу әдісі бірнеше себеппен өте пайдалы. Дамытушылар өзгерістің әсерін күндер емес, минуттар ішінде бағалауға мүмкіндік беретін өте төмен құн мен практикалық құралға ие болады. Бұл жаңа мүмкіндіктерді енгізуді жоспарлау және өзгерістің жүйенің басқа бөліктерімен қалай байланысты екенін түсіну үшін өте маңызды. Бұл сонымен қатар жүйеге толық, қымбат талдау жасау қажеттігін анықтауға арзан тест жүргізуге мүмкіндік береді. Жылдам кесу әдісі метрикаларды зерттеудің және кесу негізінде тарихты талдаудың жаңа бағыттарын ашады. Яғни, енді кесуді өте үлкен жүйелерде және толық нұсқа тарихында өте қолайлы уақыт шеңберінде жүргізуге болады. Бұл бұрын тым қымбат болған көптеген тәжірибелер мен эмпирикалық зерттеулерге есік ашады.
A very fast and scalable, yet slightly less accurate, slicing approach is extremely useful for a number of reasons. Developers will have a very low cost and practical means to estimate the impact of a change within minutes versus days. This is very important for planning the implementation of new features and understanding how a change is related to other parts of the system. It will also provide an inexpensive test to determine if a full, more expensive, analysis of the system is warranted. A fast slicing approach will open up new avenues of research in metrics and the mining of histories based on slicing. That is, slicing can now be conducted on very large systems and on entire version histories in very practical time frames. This opens the door to a number of experiments and empirical investigations previously too costly to undertake.
Динамикалық кесу
Динамикалық кесу бағдарламаның нақты бір орындалуы туралы ақпаратты қолданады. Динамикалық кесіндіде бағдарламаның кез келген орындалуы үшін айнымалының мәніне ықпал етуі мүмкін барлық операторлар емес, нақты бір орындалу кезінде айнымалының мәніне әсер ететін барлық операторлар кіреді. Статикалық және динамикалық кесу арасындағы айырмашылықты түсіндіру үшін мысал келтірейік. Бағдарлама бөлігінің кішкентай бөлігін қарастырайық, онда if-else блогын қамтитын итерациялық блок бар. Екі блоктан да – if және else – айнымалыға әсер ететін бірнеше оператор бар. Статикалық кесу жағдайында, бағдарламаның нақты бір орындалуына қарамастан, бүкіл бағдарлама қарастырылатындықтан, екі блоктан да әсер ететін операторлар кесіндіге кіреді. Бірақ динамикалық кесу жағдайында біз бағдарламаның нақты бір орындалуын қарастырамыз, онда if блогы орындалады, ал else блогындағы әсер ететін операторлар орындалмайды. Сондықтан, осы нақты орындалу жағдайында динамикалық кесінді тек if блогындағы операторларды ғана қамтиды.
Dynamic slicing makes use of information about a particular execution of a program. A dynamic slice contains all statements that actually affect the value of a variable at a program point for a particular execution of the program rather than all statements that may have affected the value of a variable at a program point for any arbitrary execution of the program. An example to clarify the difference between static and dynamic slicing. Consider a small piece of a program unit, in which there is an iteration block containing an if else block. There are a few statements in both the if and else blocks that have an effect on a variable. In the case of static slicing, since the whole program unit is looked at irrespective of a particular execution of the program, the affected statements in both blocks would be included in the slice. But, in the case of dynamic slicing we consider a particular execution of the program, wherein the if block gets executed and the affected statements in the else block do not get executed. So, that is why in this particular execution case, the dynamic slice would contain only the statements in the if block.