Кіріспе

Бір дерек орнының бірнеше атауы

Компьютерлік есептеулерде, атаулау (aliasing) – жадтағы дерек орнына бағдарламадағы әртүрлі символдық атаулар арқылы қол жеткізіле алатын жағдайды сипаттайды. Осылайша, деректерді бір атау арқылы өзгерту, сол дерекке байланысты барлық атаулардың мәнін өзгертеді, бұл бағдарламашының күтпегені болуы мүмкін. Нәтижесінде, атаулау бағдарламаларды түсінуді, талдауды және оңтайландыруды айтарлықтай қиындатады. Атаулауды талдаушылар бағдарламалардағы атаулауды түсінуге көмектесетін пайдалы ақпаратты анықтауға және есептеуге арналған.

Аталық сілтемелер

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

Оптимизациялаумен қайшылықтар

Оптимизаторлар көбінесе атау алмасу мүмкін болғанда, айнымалылар туралы консервативті шарттар қоюға мәжбүр болады. Мысалы, айнымалының мәнін білу (мысалы, x = 5) әдетте белгілі бір оңтайландыруларға мүмкіндік береді (мысалы, тұрақты тарату). Дегенмен, компилятор бұл ақпаратты басқа айнымалыға бергеннен кейін (мысалы, C тілінде *y = 10) пайдалана алмайды, себебі *y, x-тің атау тегі болуы мүмкін. Бұл, мысалы, y = &x тапсырмасынан кейін болуы мүмкін. *y-ге жасалған осы тапсырманың нәтижесінде x-тің мәні де өзгеруі мүмкін, сондықтан x = 5 ақпаратын *y = 10-нан кейін келетін операторларға тарату қате болуы мүмкін (егер *y шын мәнінде x-тің атау тегі болса). Бірақ, егер сілтемелер туралы ақпарат болса, тұрақты тарату процесі мынандай сұрақ қоя алады: x, *y-тің атау тегі болуы мүмкін бе? Егер жауап "жоқ" болса, x = 5 ақпаратын қауіпсіз түрде таратуға болады. Атау алмасудың тағы бір әсеріне ұшырайтын оңтайландыру – кодты қайта реттеу. Егер компилятор x-тің *y-мен атау тегі емес екенін анықтаса, онда x-тің мәнін пайдаланатын немесе өзгертетін кодты *y = 10 тапсырмасының алдына жылжытуға болады, егер бұл орындалу жоспарын жақсартатын болса немесе циклдарды оңтайландыруға көбірек мүмкіндік берсе. Мұндай оңтайландыруларды болжауға мүмкіндік беру үшін C бағдарламалау тіліне арналған ISO стандарты (оның ішінде жаңа C99 нұсқасы, 6.5-тараудың 7-тармағын қараңыз) әртүрлі типтегі көрсеткіштерді пайдаланып бір жад орнына қол жеткізудің заңсыз екенін (кейбір ерекшеліктермен) көрсетеді. Сондықтан компилятор мұндай көрсеткіштердің атау тегі емес екенін болжауы мүмкін. Бұл қатаң атау ережесі деп аталады және кейде өнімділіктің айтарлықтай артуына мүмкіндік береді, бірақ кейде жарамды кодтың жұмысын бұзуы мүмкін. Көптеген бағдарламалық жобалар C99 стандартының осы бөлігін қасақана бұзады. Мысалы, Python 2.x нұсқасы сілтеме санауын жүзеге асыру үшін осылай істеді, ал Python 3 нұсқасында осы оңтайландыруды қосу үшін негізгі объект құрылымдарына өзгерістер енгізілді. Linux ядросы да осылай істейді, себебі қатаң атау ережесі инлайн кодты оңтайландыруда проблема тудырады. Мұндай жағдайларда, gcc компиляторымен құрастырылғанда, күтпеген кодты тудыруы мүмкін қажетсіз оңтайландыруды болдырмау үшін fno-strict-aliasing опциясы қолданылады.