Crc press баспасы Taylor & Francis баспа тобы


Қажеттілігі бойынша шақыру



Pdf көрінісі
бет18/26
Дата20.12.2019
өлшемі6,26 Mb.
#53875
1   ...   14   15   16   17   18   19   20   21   ...   26
Байланысты:
Бағдарламалау тілдеріне кіріспе (1)
corel-draw-zhayly-zhalpy-tusinik, corel-draw-zhayly-zhalpy-tusinik, Jobs and professions

4.4.6 Қажеттілігі бойынша шақыру 
Қажеттілігі бойынша шақыру бұл – атауы бойынша шақыру нұсқа-
сы. Атауы  бойынша шақыруға қарағанда мұнда нақты параметрдің ме-
кенжайы өрнектің әрбір есептелуінде есептеледі, қажеттілігі бойынша 
шақыру бірінші есептеу уақытындағы мәнді кэштейді және өрнекті әр-
бір есептеу кезінде кэштелген мәнді алады. Бірінші есептеу баяуланады. 
Бірақ келесі есептеулер тоқтамайды.
Көптеген  жағдайларда  индекс  4.9-суреттегі  мысалда  көрсетілгендей, 
қайта есептелмесе, мекенжай өзгермейді және теория бойынша қажет-
тілік бойынша шақыру өзін әр ретте мәнді алу қажет етпейтін тиімді 
атау  бойынша  шақыру  ретінде  ұстайды.    Кэштеу  нәтижелері  бір  рет 
есептеледі және келесі жағдайларда көшірме жасалынады. Қажеттілі-
гі бойынша шақыру атауы бойынша шақыру ретінде қаралуы мүмкін, 
одан кейін  мәні бойынша шақыру жүреді, мұнда мән кэштен көшіріледі.
4.15-мысал
Атауы  бойынша  шақыру  мен  қажеттілігі  бойынша  шақыруды  тиімді 
пайдалануды қарапайым мысалда салыстырайық. 4.8-суретте “z1 = (x + 
y) * (x + y) + (x + z) * (x + z);” тағайындау операторының оң жақ бөлігінде
екі рет есептелген x + y және x + екі өрнегі көрсетілген. Атауы бойын-
ша шақыру өрнекті екі рет есептейді, ал қажеттілігі бойынша шақыру
xөрнегін бір рет есептеп,  есептеу нәтижесін кэшке сақтайды. Келесі
жолы ол x + y өрнегімен ұшырасқанда, ол кэштен мәнді алады. Осын-
дай  түрде,  атауы  бойынша  шақыру  x+  z  өрнегін  екі  рет  есептейді,  ал
қажеттілігі бойынша шақыру x + z өрнегінің бірінші пайда болуын есеп-
тейді және есептеу нәтижесін кэшке сақтайды және өрнек келесі пайда
болғанда кэштен мәнді алады.
Қажеттілігі  бойынша  шақыру  бағдарламалаудың  функционалдық  тіл-

190
дерінде, мысалы, Haskell-де пайдаланылады, мұнда өрнекті есептеу ол 
керек болмағанша, кейінге қалдырылады. Қажеттілігі бойынша шақы-
ру өрнек мәнін сақтау және өрнектің басқа орнында пайда болған дәл 
осындай  өрнекті  есептеуді  болдырмау  үшін  нәтиже  мәнін  пайдалану 
есебінен есептеу жылдамдығын арттырады.
4.4.7 Параметрлер түріндегі ішкі бағдарламаларды беру
Lisp, Scheme, Haskell, Ruby және Scala сияқты функционалдық бағдар-
ламасы парадигмасын қолдайтын тілдер және ALGOL және Pascal си-
яқты  бағдарламалаудың  императивті  тілдері  параметрлер  түріндегі 
функциялардың/ішкі  бағдарламалардың  берілуін  қолдайды.  Параме-
трлер түріндегі функцияларды беру функцияның бірінші нұсқаулығы-
на арналған сілтемелерді және санды тексеруге арналған тиісті ортаға 
сілтемені және орындау уақытындағы аргументтер  типтерін қамтиды. 
Бұлар деректер типі қатаң статикалық бақылаудағы тілдер үшін күрделі 
саналады,  мұнда  деректе  элементтерінің  типі  компиляция  уақытында 
жарияланады, себебі әр түрлі ішкі бағдарламалар орындау уақытында 
әр  түрлі  сауалдар  арқылы  шақырылуы  мүмкін,  ал  компиляция  уақы-
тындағы кодты талдау шақырылатын функциямен алынған аргументтер 
типін қамтитын орта параметр түрінде берілген функциялардың аргу-
менттер типі мен ортасына сәйкес келуін тексеру қажет.
Деректер типтері динамикалық бақыланатын бағдарламалаудың функ-
ционалдық тілдерінде осындай проблемалар туындамайды, себебі де-
ректер типтерін тексеру орындау уақытында жүзеге асырылады.
4.4.8 Бөлінген есептеулерге арналған параметрлерді беру
Бөлінген  есептеу  әр  түрлі  процессорлардан  қашықтықтан  процедура-
ларды шақыруды қажет етеді. Бұл әр түрлі ішкі бағдарламалар әр түр-
лі  мекенжайлық  кеңістіктерде  орындалатындығын  білдіреді.  Бөлінген 
есептеу параметрлерді берудің үш типін пайдаланады: (1) жылжу бой-
ынша  шақыру,  сондай-ақ  көшірме  бойынша  шақыру  деп  аталады;  (2) 
сілтеме бойынша шақыру; және (3) келуі бойынша шақыру, сондай-ақ 
көшіру/қалпына келтіру бойынша шақыру деп аталады. Параметрлерді 
берудің осы тетіктері бағдарламалау тілдерін бір процессорлы іске асы-
ру нәтижесі бойынша мәні бойынша шақыру, сілтеме бойынша шақы-
ру, нәтиже бойынша шақырудың мекенжайлық-кеңістіктік ұқсастықта 
бөлінеді.  Қашықтық  процедурасын  шақыру  өрнекті  есептеуді,  объект 
көшірмесін қашықтық торабына ауыстыруды және оны формалды пара-
метрмен байланыстыру, қашықтық процедурасын есептеу және шақы-
ратын процедураға кері нәтижені немесе объектіні қайтаруды қамтиды. 

191
Келуі  бойынша  шақыру  қашықтық  процессордағы  объектінің  көшір-
месін  жасайды  және  шақырылатын  процедураны  сәтті  аяқтаған  соң 
уақытша кері көшіреді. 
Орнын  ауыстыру  бойынша  қашықтық  процессорында  шақырылатын 
процедураны есептеуге арналған объектінің көшірмесін жасайды.Бірақ 
объект кері көшірмейді. Келуі бойынша шақыру нәтиже мәні бойынша 
шақыруға ұқсас, ал орнын ауыстыруы бойынша шақыру мәні бойынша 
шақыруға ұқсас. Сілтеме  бойынша шақыру күрделі объектіге арналған 
сілтемені көшіреді. 
Шақыратын  процедура  процедурасынан  шақырылатын  процедурасы-
ның  қашықтық  процедурасына  объект  мекенжайын  беру  өткізгіштік 
қабілетке  арналған  шығындардағы  бөлінген  есептеудегі  біршама 
шығындармен және жүйелік ішкі бағдарламалардың шоғырланған ме-
кенжайлық  кеңістік  арқылы  өтуімен  байланысты.  Сілтеме  бойынша 
шақырудағы осындай шығындарға қарамастан, объектіге сілтемені де-
ректерді беруге арналған қосымша шығындарсыз бөлінген процессор-
лар арасындағы жеңіл берілуі мүмкін басымдығы бар. 
Emerald  бөлінген бағдарламалау тілі параметрлерді берудің үш схема-
сын пайдаланады, соның ішінде сілтеме бойынша шақыруды, келуі бой-
ынша шақыруды және орын ауыстыру бойынша шақыруды пайдалана-
ды Параллельді бағдарламалауға арналған бөлінген есептеуге арналған 
параметрлерді беру 8-тарауда қайта қаралады
4.5 Жанама әсерлер 
Процедураларда  ғаламдық  ауыспалының,  жергілікті  емес  ауыспалы-
ның, шақырушы процедулар  мен ұзақ уақытты деректер объектілер ор-
тасына арналған сілтемелердің болуы себепті жергілікті емес ауыспалы 
құрған жад блоктарына рұқсаты бар. Жанама әсер шақырылатын ішкі 
бағдарламадан  артық  өмір  сүретін  әсер  ретінде  анықталады.  Жанама 
әсер (1) жад ұяшығында өтетін, жергілікті ауыспалы құрған ортаға қа-
тысты емес және процедураның осы сәтінде есептейтін жаңарулардан; 
(2) сыртқы ортамен қадағаланатын өзара әрекеттен, мысалы, файлға не-
месе ағынға жазу; немесе
(3) тыйым  салудың  пайда  болуынан  туындайды.  Тиісті  жергілікті
ауыспалы  блокта  туындаған  өзгерістер  процедураны  орындаған  соң 
тоқтаса, ішкі бағдарламадан артық өмір сүрген жадтың басқа блокта-
рындағы өзгерістер, тұрақты объектілердегі, динамикалық объектілер-
дегі, деректердің рекурсивті құрылымдарындағы өзгерістер осы сәтте 
есептеліп жатқан процедура аяқталса да, сақталады. 
Жанама әсерлерге негізделген бағдарламалау нәтижені императивті тіл-

192
дердегі шақырушы ішкі бағдарламаға кері нәтиже беру үшін пайдаланы-
лады. Бірақ, егер жад блогы шақырылатын ішкі бағдарламада жадтан 
тыс жедел есептеу арқылы жүйесіз өзгерсе, онда басқа бағдарламалық 
блоктар жад ұяшығының зақымдалғанын білмей, қасақана зақымдалған 
мәнді пайдалануы мүмкін. Бұл дұрыс емес есептеу нәтижесіне алып ке-
летін, болжап болмайтын нәтижеге алып келеді.
Жанама  әсердің  маңызды  проблемаларыны  бірі  –  коммутативтілік-
ті жоғалту. Коммутативтілік бұл – қосу және көбейту сияқты өрнекті 
есептеу кезіндегі көптеген операторлардың негізгі қасиеті. e1 + e2 өрнегі 
берілді, e1 және e2 екі өрнегі де жадтың бастапқы блогының мәнін есеп-
теу арқылы анықталады және олар жад блогын өзгертпеуі тиіс. Соған 
қарамастан, егер e1 немесе e2 өрнегін есептеу кезінде жанама әсер орын 
алса, онда бастапқы жад блогы e1 немесе e2 өрнегін есептегеннен кейін 
өзгереді, ал келесі есептелетін өрнек 4.16-мысалында көрсетілгендей, 
өрнекте айырмашылығы бар мәнді бере отырып,  жадтың жаңа блогын-
дағы мәнді есептейтін болады. 
4.16-мысал
square_sum  шақырылатын  функциясы  параметрлерін  беруге  арналған 
сілтеме бойынша шақыруды пайдаланатын келесі бағдарламаны қара-
стырайық.
square_sum функциясы x және y екі ауыспалысының шаршы дәрежелей-
ді, алынған мәнді қосады және алынған нәтижені басты бағдарламаны 
кері жібереді.  Бірақ ол x және y нақты параметрлерін 9-дан 16-ға дей-
інгі мәндерге деструктивті жаңартады. Қайтқан соң, x мәні square_sum 
функциясының  орындау  нәтижесіне  қосылады,  В  мәні    34-ке  тең,  ол 
x+square_sum(xy)  өрнегін ауыстыру кезінде алынатын 28 мәнінен ай-
ырмашылығы бар.
program main
{ integer A, B, x, y; 
  x = 3; y = 4;
A = square_sum(&x, &y) + x; % A 28-дің орнына 34 болады
B = x + y;% B 7-нің орнына 25 болады 
print(A, B, x, y);
}
function integer square_sum(integer *x, *y);
*x = *x * *x; *y = *y * *y; % тағайындау x және y ауыспалысын өзгер-

193
теді
return(*x + *y);
}
4.5.1 Аттар біріктіру және жанама әсерлер
Аттар біріктіру бір жад ұяшығындағы екі идентификатордың немесе бір 
жад ұяшығына бағыттайтын екі көрсеткіштің болуы ретінде анықтала-
ды. Егер бір ауыспалыға мән берілсе, басқа ауыспалы автоматты түр-
де жаңарады. Бұл егер, бағдарламашы бүркеншік аттау туралы білмесе 
немесе  шақырылатын  ішкі  бағдарлама  шақыратын  ішкі  бағдарлама-
дан бөлек есептелсе, қатты әсер ету мүмкін. Оны 4.17-мысалда талдап 
көрейік.
4.17-мысал.
Келесі  бағдарламада  атаудың  қосарлануымен  байланысты  туында-
уы  мүмкін  бағдарламаның  болжап  болмайтын  дағдысын  көрсету  ат-
тар  біріктіру  мен  сілтеме  бойынша  шақырудың  үйлесуі  сипатталады. 
Бір-біріне тәуелсіз main және swap екі бағдарламалық блогы да дұрыс 
орындалады.  Бұл  блоктар  бөлек  есептеліп,  кейіннен  қосылуы  мүмкін 
немесе swap (ауыстыру) бастапқы кодты білмей басқа модульден жүк-
телуі мүмкін.
Басты бағдарлама swap ішкі бағдарламасын екі рет шақырады: (1) бірін-
ші  шақыруда  ол    екі  әртүлі  жад  ұяшықтарында  сақтаулы  мәнді  ауы-
стырады және (2) екінші рет ол бір жад ұяшығының мәнін өзгертеді. 
Ауысудың ішкі бағдарламасы ауыстырылуы қажет кез-келген жергілікті 
ауыспалыны пайдалануды болдырмау үшін стандартты емес жазылған. 
Оның  орнына  ол  арифметикалық  өрнекті  пайдаланады.  Жаңа    x  мәні 
ескі xескі + yескі  мәніне тең. Жаңа y мәні xжаңа – yескі → xескі + yе-
скі – yескі → xескі мәніне тең, ал жаңа x мәні xескі + yескі– yжаңа → 
xескі+yескі – xескі→ yескі  мәніне тең.
Ішкі бағдарлама қатесіз у және z мәндерін ауыстыратыны белгілі. Бірақ 
е z мәндерін ауыстырады. swap(&x, &x) шақырылса,екі формалды пара-
метр де жадтың бір ұяшығына жатады және *x= *x+ *бірінші тағайын-
дау операторы  х нақты параметрінің мәнін екі еселейді. Екінші тағай-
ындау  операторы  х  нақты  параметрінің  жад  ұяшығында  0-ді  сақтай 
отырып, өзінен мәнді азайтады. 
program main
{ integer x, y,z;
x = 3; y = 4; z = 5;
swap(&y, &z); % y және z мәндерін ауыстыру

194
swap(&x, &x); % жад ұяшығында 0-ді сақтау
x – болжап болмайтын сипат
print(x, y, z) % x 0-ге тең болады; Y = 5 және z = 4
}
subprogram swap(integer *x, *y);
*x = *x + *y;
*y = *x - *y;
*x = *x - *y;
}
Бірнеше көрсеткіштер бір құрылымды жадтың динамикалық аймағына 
бағыттаса, онда бір көрсеткішті алу, сол көрсеткішті қайта пайдалану 
үшін жад ұяшығын немесе 4.10-суретте көрсетілгендей жадты тазалау-
ды көрсетеді. 
4.10-суретте  P  және  Q  екі  көрсеткіші  көрсеткіш  тізімінің  екі  әр  түр-
лі  бөлігін  бағыттайды:  Р  деректер  басын,  ал  Q  деректердің  бірнеше 
ұяшығын  көрсетеді.  Р  көрсеткішін  алған  соң,  көрсеткіштердің  тұтас 
тізімі  қайта  пайдалану  үшін  жарамды  болады,  жадты  тазалау  бағдар-
ламасы оны қайта пайдаланатын болады, ал жад ұяшықтары басқа де-
ректердің динамикалық құрылымына берілетін болады. Осылайша, жад 
ұяшығы зақымдалады, ал  бағдарлама қатемен орындалатын болады.
Жад блогында қажетсіз өзгерістер туындататын басқа проблема  - орын-
дау  уақытында  деректер  абстракциясының  шекараларының  бұзылуы, 
оны  мекенжайлық  арифметика,  сондай-ақ  деректер  құрылымының 
жоғарғы  шекарасынан  шығатын  массив  немесе  векторға  рұқсат  ала-
тын  индекс  мәні  тудыруы  мүмкін.  Мысалы,  егер  біз    a[100]  массивін 
жарияласақ және орындау уақытында  i индексті ауыспалысының мәні 
130 болса, онда a[i] деректер құрылымына бөлінген a[100] жад шекара-
сынан өтіп, қайтадан қате мәнді алып келеді.
Shared data-structure - Ортақ деректер құрылымы
4.10-сурет.  Деректер құрылымын біріге пайдаланатын көрсеткіштер.

195
4.5.2 Жанама әсерлерді реттеу
Бағдарламаның дұрыс орындалмауына алып келетін, жанама әсерлердің 
пайда болуының әр түрлі себептері бар. Бұл себептерге: (1)көріну ай-
мағы жергілікті болып табылмайтын ауыспалыдағы жедел жадтан тыс 
есептеу, (2) мекенжай арифметикасы, (3) жадта көрсеткіштерді тәуел-
сіз орналастыру және олардың деректер құрылымын тәуелсіз көрсету 
мүмкіншілігі және (4) көріну аймақтары жергілікті емес ауыспалының 
немесе деректер объектілерінің деструктивті жаңару  жатады. Жанама 
әсерлермен  байланысты  проблемаларды  шешудің  бірнеше  тәсілдері 
бар. Тәсілдер тіл деңгейінде шектеуді, ал бағдарламалаудың реттелген 
тәсілді қамтамасыз етуі тиіс. Мына  тәсілдер бар: 
1. Бағдарламаның тәртібі: Жедел жадтан тыс есептеуге арналған жер-
гілікті  ауыспалыны  пайдалану.  Көріну  аймақтары  жергілікті  ортадан
тыс шығатын ауыспалылар ақпаратты беру үшін ғана өзгеруі мүмкін.
Бүгінгі  күні  бұл  -    көріну  аймағы  жергілікті  ортадан  тыс  шығатын
ауыспалының  өзгерістерінен  байланысты  туындаған  қажетсіз  жанама
әсерлерді басқарудың ең танымал тәсілі.
2. Мекенжайлық  арифметикадан  бас  тарту:  Көрсеткіштер  қандай  да
бір арифметикалық әрекеттерге ұшырамайды. Бұл орындау уақытында
деректердің элементінен тыс көрсеткіштің шығу типі бұзылған жағдай-
ға жатады
3. Тәуелсіз көрсеткіштерден бас тарту: Көрсеткіштер деректердің ре-
курсивті құрылымын және бағдарлама ішіндегі объектіні көрсету кезін-
де ғана жариялануы мүмкін. Бұл деректердің әр түрлі типтерінің үйле-
спейтін әрекеттерінің проблемасын шешеді.
4. Деструктивті  жаңарудан  бас  тарту:  ауыспалыларды  бағдарлама-
лық  бойынша  мәнмен  тек  бір  рет  қана  байланыстыруға  болады.  Де-
структивті жаңару бұл  шақырылатын ішкі бағдарламадағы жад блогын-
дағы өзгерістердің басты себебі болса, онда осы жанама әрекеттің көзін
жою қажет. Аталған проблеманы шешу деклартивтік тілдердің алдыңғы
нұсқаларында  сыналды.  Мәнді  тағайындау  қасиеті  бір  рет:  (1)  жадты
қайта пайдалануды шектейді; (2) ауыспалыны артық құру себебі болып
табылады;  және  (3)  әр  циклде  индекстік  ауыспалыны  деструктивтік
жаңартуды қажет ететін итерацияны қолдаудың жоқтығынан бағдарла-
малаудың рекурсивті стилін пайдаланады.
5. Өзгеретін объектілерді шектеп пайдалану рекурсивті бағдарламалау-
дың бірнеше қызғылықты стильдерінде және декларативті бағдарлама-
лау тілдерінде итераторларды пайдалануда көрініс табады. Итераторлар
соңында көптеген заманауи тілдерден алынған, себебі  олар бөлшектер

196
деңгейі туралы ақпаратты жасыру деңгейін қамтамасыз етеді. 
4.5.3 Маңызды мысал
Осы тарауда мәні бойынша шақыру, сілтеме бойынша шақыру, нәтиже 
мәні  бойынша  шақыру  пайдаланылатын  бағдарламалауға  болжалды 
мысал және атаудың қосарлануымен туындаған ұяшық қатесін пайда-
лану қалай жүретіні туралы сипатталады. Сілтеме бойынша шақыруда 
нақты параметр алдында  
мекенжайдың берілетіндігін білдіретін “&” белгісі қойылады және фор-
малды параметрдің алдында нақты параметрдегі мәнге рұқсатты қамта-
масыз ету үшін атауды білдіретін “*” белгісі қойылады. Нақты параметр 
алдында “#” символдың болуы параметрлерді беру нәтиже мәні бойын-
ша шақыруды пайдаланатынын білдіреді. 
“$”  символының  орналасуы  параметрдің  нәтиже  бойынша  шақыру 
көмегімен  берілетіндігін  білдіреді.  4.11-суретте  main  бағдарламасы  
және  messy    ішкі  бағдарламасы  мысалында  параметрлерді  берудің  әр 
түрлі тетіктерінің әсер етуі көрсетілген.
Messy  ішкі  бағдарламасын  шақырған  соң  ауыспалы  a[1]  ауыспалы-
сы нәтиже бойынша шақыру арқылы беріледі, a[2] ауыспалысы сілте-
ме  бойынша  шақыру  көмегімен  беріледі,  j  ауыспалысы  үшінші  және 
төртінші аргументте сілтеме бойынша шақыру көмегімен беріледі,  a[3
бесінші аргументі нәтиже мәні бойынша шақыру көмегімен беріледі, ал 
k ауыспалысы нәтиже бойынша шақыру көмегімен беріледі. 
A формалды параметрі a[1] ауыспалысының 10-дық берілген мәнін ала-
ды, B формалды параметрі a[2] нақты параметріне көрсеткіш болып та-
былады,  ал C және D формалды параметрлері j нақты параметрінің жад 
ұяшығын көрсетеді.
 C және D формалды параметрлері бір жад ұяшығын білдіретіндіктен, 
формалды параметрінің жад ұяшығында сақтауды көрсеткіштің жад 
ұяшығындағы мәндердің өзгерісі *D мәнінің өзгеруіне және керісінше 
алып келеді.
E формалды параметрі a[1]= 10 мәнінің көшірмесін алады. F формал-
ды параметріне 0 мәні беріледі, себебі нәтиже бойынша шақыру мәнді 
көшірмейді.
Бірінші оператор  a[2] 10 нақты параметрінің мәнін алады және j = 
нақты параметрінің мәні 10-ға тең болатындай етіп оларды жинайды. 
Екінші оператор а j = 0 нақты параметрінің мәнін алады және 10 деген 
мән берілген (a[3] мәнінің көшірмесі) E мәнін қосады және 0 деген мән 
берілген F мәні 10 мәнін алу үшін a[2] нақты параметінің жад ұяшығына 
кері жазылады. Үшінші оператор A және E ауыспалыларының мәндерін 

197
санайды, оларды 20 мәнін алу үшін қосады және  j нақты ауыспалысы-
ның жад блогында сақтайды.
Төртінші оператор j нақты параметрінің мәнін есептейді және нақты 
параметрінің жад ұяшығында сақтайтын 0 мәнін алу үшін j нақты пара-
метрінің мәнін азайтады.
  Бесінші  оператор  a[2]  нақты  параметрінің  мәні  мен  j  нақты  параме-
трінің  мәнін  есептейді  және  Е  ауыспалысына  берілетін  10  мәнін  алу 
үшін оларды қосады. Соңғы оператор 10 мәні тағайындалған Е ауыспа-
лысының мәнін есептейді. 
program main( )
{ integer i, j, k, a[6];
  i = 0; j = 0; k = 2;
for (i = 1; i =< 5; i++) a[i] = 10; 
messy(a[1], &a[2], &j, &j, #a[3], $k);
}
subprogram messy(integer  A, *B, *C, *D, E, F)
A = *B + *C;  % A = мағына(a[2]) +мағына(j) = 10 + 0 = 10
*B = *D + E + F; % a[2] = мағына(j) + мағына(E) + мағына(F) = 0 + 10 +
0 =10
*C = A + E; % j = мағына(A) + мағына(E) = 10 + 10 = 20
*D = *C – *D; % j = мағына(j) – мағына(j) =  20 – 20 = 0
E = *B + *C;  % E = мағына(a[2]) + мағына(j) = 10 + 0 = 10
F = E + A; % F = мағына(E) + мағына(A) = 10 + 10 = 20
}
}
subprogram messy(integer  A, *B, *C, *D, E, F)
A = *B + *C;  % A = (мағына) значение(a[2]) +( мағына) значение(j) = 
10 + 0 = 10
*B = *D + E + F; % a[2] = (мағына) значение(j) + (мағына) значение(E) +
(мағына) значение(F) = 0 + 10 + 0 =10
*C = A + E; % j = (мағына) значение(A) + (мағына) значение(E) = 10 +
10 = 20
*D = *C – *D; % j = (мағына) значение(j) – (мағына) значение(j) =  20 –
20 = 0
E = *B + *C;  % E = (мағына) значение(a[2]) + (мағына) значение(j) = 10
+ 0 = 10

198
F = E + A; % F = (мағына) значение(E) + (мағына) значение(A) = 10 + 10 
= 20
}
СУРЕТ  4.11     Параметрлер ықпалы мен аттар біріктіруінің үйлесімділі-
гінің мысалы
Ауыспалы А-ға 10-ға тең мағынаны қосады, және 20 алынған мағынаны  
ауыспалы  F қосады.
messy  процедурасы  аяқталғаннан  кейін  кері  тек  ауыспалы  E  және  
мағыналары ғана көшіріледі.  Ауыспалы  E мағынасы  a[3] нақты па-
раметрінің жадысының ұяшығына, ал ауыспалы  мағынасы К  нақты 
параметрінің  жадысының  ұяшығына  көшіріледі.    Нақты  мағыналары 
болып табылады:  i = 0, j = 0, k = 20, a[0] = 10, a[1] = 10, a[2] = 10, a[3] = 
10, a[4] = 10, a[5] = 10.
4.6 Ерекше жағдайларды өңдеу
Бағдарламаны орындау кезіндегі басты мәселелердің бірі болып табысты 
аяқтау және  “filenotfound” (“файл табылмады”), “invalidmemoryaccess” 
(“жадыға жол берілмейтін айналым”), “divide by zero” (“нөлге бөлу”), 
“unable to open a file” (“файлды ашу мүмкін емес”) немесе  “array out 
of bounds” (“массивтың шектен шығуы”)  тәрізді жарамсыз қателердің 
салдарынан  күрт  үзілудің  алдын  алу  табылады.  Көп  жағдайларда  қа-
телер    мәліметтерге  байланысты  болады,  және  қисынды  қателерге 
жатқызылмайды. Кей жағдайларда, қателер кіріс мәліметтерінен немесе 
жүйенің жағдайына байланысты пайда болуы мүмкін. Мұндай жағдай-
ларда бағдарламаның, ресурстарды блоктай отырып, мерзімінен бұрын 
аяқталудың  орнына,  файлдер,  буферлер  және  құрылғыны  қосу/шыға-
ру  тәрізді  пайдаланушымен  үлестірілген  барлық  ресурстардан  босап, 
аяқталу мүмкіндігі бар.
Қате    жүйелі  болуы  мүмкін,  мысалы,  “filenotfound”  (“файл  табылма-
ды”), немесе пайдаланушылық. Қателер, команда соңында қайталана-
тын, бағдарламалардың үзілуі- тұзақ көмегімен операциялық жүйемен 
түзетілуі мүмкін. Алайда, тұзақтар операциялық жүйенің деңгейінде бо-
лады, және қате жағдайды анықтай алмайды. Бағдарлама уақытысынан 
бұрын аяқталмайтындай, қате жағдайды анықтау үшін, бағдарламалау 
тілінде, бағдарламалық құрылғымен анықталатын, ерекше жағдайлар-
ды өңдеушіні құру қажет.
Ерекше жағдайларды өңдеу (қателерді) – пайда болу себебінен есептеу 
нәтижесі қатені құрайтын болатын, патологиялық жағдайды араңдата-

199
тын немесе бағдарламаны мерзімінен бұрын үзе алатын,  қате немесе 
жағымсыз жағдайға жауап ретінде  әрекеттер қабылдайтын,  бағдарла-
малау тілінің деңгейіндегі абстракция. Ерекше жағдайлар жүйелі немесе  
пайдаланушы болуы мүмкін.  Ерекше жағдайлар ұсталынатын, тілдер 
пайдаланушымен анықталған ерекше жағдайларды ұстана алады. Жан-
жақты ерекше жағдайлар, ерекше жағдайларды өңдеушіде тексеріледі. 
Пайдаланушымен  анықталатын,  ерекше  жағдайлардың  өңдеушісін 
ерекшее жағдайлардың түрі ретінде хабарлау қажет. Ерекше жағдай-
лар түрі– бұл, туындалатын қосалқы бағдарламалардың тізбегінде қо-
салқы бағдарламамен айналымда тексерілетін,  статистикалық қисынды 
ауыспалы . Әр түрлі тілдер, ерекше жағдайларды өңдеушілермен, және 
оны туындататын шаралар арасындағы  ерекше жағдайлардың көрерлігі 
саласындағы өңдеудің әр түрлі тетіктерін қолданады. Бір сызба ерекше 
жағдайларды  өңдеушінің  қосалқы  бағдарламасына  ерекше  жағдайды 
беру үшін мағынасы бойынша шақыруды пайдалануды қарастырады.
Егер  де  ерекше  жағдайлар  өңдеушісі    ерекше  жағдайлардың  күйінің 
белгісін растай алса, онда тиісті бағдарлама немесе орнатылған коман-
далардың реттілігі орындалатын болады. Ерекше жағдайлардың тиісті 
өңдеушісі  болмаған  жағдайда,  басқару  жоғары  деңгейдегі  шақырыла-
тын  келесі  қосалқы  бағдарламаға    беріледі.  Басқаруды  келесі  деңгей-
ге беру алдында қосымша блок орындалады, оның артынан сақталған 
finally”  сөзі  ереді.  Ақырғы  блоктың  хабарламасының  міндетті  емес 
екендігіне назар аударыңыз.
Егер  де  басқарма  осы  деңгейде  тиісті  өңдеушісін  тапса,  онда  ерекше 
жағдайларды өңдеуші орындалады. Әйтпесе, үдеріс қайталанады, және 
басқарма  басты  бағдарламаға  ауыспайынша,  туындатушы  қосалқы 
бағдарламалар тізбегіндегі келесі деңгейге басқарма ауысады. Егере де 
ерекше жағдайлардың тиісті өңдеушісі табылмаса, онда бағдарламаның 
басты  пішініне қол жетілгеннен кейін, бағдарлама аяқталады.
Әр түрлі тілдер  ерекше жағдайлардың  өңдеушісі үшін әр түрлі синтак-
сиспен сипатталады  (exception-handlers). Ерекше жағдайлардың  өңде-
ушісінің абстрактілі ұғымы  келесідей көрінеді:
<кеңейтілген оператор>::= try<оператор>

Достарыңызбен бөлісу:
1   ...   14   15   16   17   18   19   20   21   ...   26




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет