Программалауда деректер бірнеше атаумен сақталуы мүмкін. Алиасинг – жадтағы дерекке түрлі айнымалылар арқылы қолжету, бағдарламаны түсінуді қиындатады.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Бір дерек орнының бірнеше атауы
Multiple names for the same data location
Компьютерлік есептеулерде, атаулау (aliasing) – жадтағы дерек орнына бағдарламадағы әртүрлі символдық атаулар арқылы қол жеткізіле алатын жағдайды сипаттайды. Осылайша, деректерді бір атау арқылы өзгерту, сол дерекке байланысты барлық атаулардың мәнін өзгертеді, бұл бағдарламашының күтпегені болуы мүмкін. Нәтижесінде, атаулау бағдарламаларды түсінуді, талдауды және оңтайландыруды айтарлықтай қиындатады. Атаулауды талдаушылар бағдарламалардағы атаулауды түсінуге көмектесетін пайдалы ақпаратты анықтауға және есептеуге арналған.
In computing, aliasing describes a situation in which a data location in memory can be accessed through different symbolic names in the program. Thus, modifying the data through one name implicitly modifies the values associated with all aliased names, which may not be expected by the programmer. As a result, aliasing makes it particularly difficult to understand, analyze and optimize programs. Aliasing analysers intend to make and compute useful information for understanding aliasing in programs.
Аталық сілтемелер
Алиазингтің тағы бір түрі, жадыдағы бір орынға бірнеше атаумен (мысалы, көрсеткіштер арқылы) сілтеме жасауға мүмкіндік беретін кез келген тілде кездесуі мүмкін. Бұл көрсеткіш аргументтерін қабылдайтын функциялар үшін жиі кездесетін мәселе, және олардың алиазингке төзімділігі (немесе төзімсіздігі) туралы ақпарат мұқият жазылуы керек, әсіресе оларға берілген жад аймақтарымен күрделі операциялар жасайтын функциялар үшін.
Another variety of aliasing can occur in any language that can refer to one location in memory with more than one name (for example, with pointers). This is a common problem with functions that accept pointer arguments, and their tolerance (or the lack thereof) for aliasing must be carefully documented, particularly for functions that perform complex manipulations on memory areas passed to them.
Оптимизациялаумен қайшылықтар
Оптимизаторлар көбінесе атау алмасу мүмкін болғанда, айнымалылар туралы консервативті шарттар қоюға мәжбүр болады. Мысалы, айнымалының мәнін білу (мысалы, 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 опциясы қолданылады.
Optimizers often have to make conservative assumptions about variables when aliasing is possible. For example, knowing the value of a variable (such as x is 5) normally allows certain optimizations (such as constant propagation). However, the compiler cannot use this information after an assignment to another variable (for example, in C, *y = 10) because it could be that *y is an alias of x. This could be the case after an assignment like y = &x. As an effect of this assignment to *y, the value of x would be changed as well, so propagating the information that x is 5 to the statements following *y = 10 would be potentially wrong (if *y is indeed an alias of x). However, if there is information about pointers, the constant propagation process could make a query like: can x be an alias of *y? Then, if the answer is no, x = 5 can be propagated safely. Another optimization impacted by aliasing is code reordering. If the compiler decides that x is not aliased by *y, then code that uses or changes the value of x can be moved before the assignment *y = 10, if this would improve scheduling or enable more loop optimizations to be carried out. To enable such optimizations in a predictable manner, the ISO standard for the C programming language (including its newer C99 edition, see section 6.5, paragraph 7) specifies that it is illegal (with some exceptions) to access the same memory location using pointers of different types. A compiler may therefore assume that such pointers do not alias. This rule, known as the strict aliasing rule, sometimes allows for impressive increases in performance, but has been known to break some otherwise valid code. Several software projects intentionally violate this portion of the C99 standard. For example, Python 2. x did so to implement reference counting, and required changes to the basic object structs in Python 3 to enable this optimization. The Linux kernel does this because strict aliasing causes problems with optimization of inlined code. In such cases, when compiled with gcc, the option fno strict aliasing is invoked to prevent unwanted optimizations that could yield unexpected code.